diff --git a/.gitignore b/.gitignore index 04bd2992d..fba705d6f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ AssetStoreTools/ Library/ Temp/ UnityVS/ +FluidFlow/ +ShaderlabVS/ BetterShaders/ BetterShaders.meta FlipbookGames/ diff --git a/UMAProject/Assets/ShaderlabVS.meta b/UMAProject/Assets/ShaderlabVS.meta new file mode 100644 index 000000000..9b50503d5 --- /dev/null +++ b/UMAProject/Assets/ShaderlabVS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bb6585bef13e642ef8ea6ddde1791c26 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Addressables - Read Me Now - updated.pdf b/UMAProject/Assets/UMA/Addressables - Read Me Now - updated.pdf new file mode 100644 index 000000000..ffc9b85fe Binary files /dev/null and b/UMAProject/Assets/UMA/Addressables - Read Me Now - updated.pdf differ diff --git a/UMAProject/Assets/UMA/Addressables - Read Me Now - updated.pdf.meta b/UMAProject/Assets/UMA/Addressables - Read Me Now - updated.pdf.meta new file mode 100644 index 000000000..3e09432be --- /dev/null +++ b/UMAProject/Assets/UMA/Addressables - Read Me Now - updated.pdf.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 204be8b3f487ba44b96c2c36f52b2e22 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormalColormask_Compositer.surfshader b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormalColormask_Compositer.surfshader new file mode 100644 index 000000000..29b9631d4 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormalColormask_Compositer.surfshader @@ -0,0 +1,381 @@ +BEGIN_OPTIONS + ShaderName "UMA/Compositing/Albedo_NormalMask_ColorMask" + Stackable "False" + DisableGBufferPass "True" // disable gbuffer pass + Workflow "Metallic +END_OPTIONS + +BEGIN_PROPERTIES + + [BetterHeader(Material Specific)] + _OverlayCount ("OverlayCount", Float) = 0 + _ColorModulation ("Color Modulation", Range(0,2)) = 1 + _MetallicModulation ("Metallic Level", Range(0,2)) = 1 + _SmoothnessModulation ("Smoothness Level", Range(0,2)) = 1 + + [GroupRollout(Base Overlay)] + [Group(Base Overlay)][NoScaleOffset]_Albedo("Albedo", 2D) = "white" {} + [Group(Base Overlay)][NoScaleOffset]_NormalMask("NormalMask", 2D) = "bump" {} + [Group(Base Overlay)][NoScaleOffset]_ColorMask("ColorMask", 2D) = "black" {} + // no AlphaMask for the base. + [Group(Base Overlay)]_Tile0_0 ("Tile0_0", Float) = 1 + [Group(Base Overlay)]_Tile0_1 ("Tile0_1", Float) = 1 + [Group(Base Overlay)]_Tile0_2 ("Tile0_2", Float) = 1 + [Group(Base Overlay)]_NormalStrength0("Normal Strength 0", Range(0,2)) = 1 + [Group(Base Overlay)]_RedColor0 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_GreenColor0 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_BlueColor0 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_AlphaColor0 ("AlphaColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_Tint0_0 ("Tint 0_0",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_1 ("Tint 0_1",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_2 ("Tint 0_2",Color) = (1,1,1,1) + [Group(Base Overlay)]_Add0_0 ("Add 0_0",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_1 ("Add 0_1",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_2 ("Add 0_2",Color) = (0,0,0,0) + + [GroupRollout(Overlay 1)] + [Group(Overlay 1)][NoScaleOffset]_Albedo1("Albedo1", 2D) = "white" {} + [Group(Overlay 1)][NoScaleOffset]_NormalMask1("NormalMask1", 2D) = "bump" {} + [Group(Overlay 1)][NoScaleOffset]_ColorMask1("ColorMask1", 2D) = "black" {} + [Group(Overlay 1)][NoScaleOffset]_AlphaMask1("Mask1", 2D) = "white" {} + [Group(Overlay 1)]_Tile1_0 ("Tile1_0", Float) = 1 + [Group(Overlay 1)]_Tile1_1 ("Tile1_1", Float) = 1 + [Group(Overlay 1)]_Tile1_2 ("Tile1_2", Float) = 1 + [Group(Overlay 1)]_NormalStrength1("Normal Strength 1", Range(0,2)) = 1 + [Group(Overlay 1)]_RedColor1 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_GreenColor1 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_BlueColor1 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_AlphaColor1 ("AlphaColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_Tint1_0 ("Tint 1_0",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_1 ("Tint 1_1",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_2 ("Tint 1_2",Color) = (1,1,1,1) + [Group(Overlay 1)]_Add1_0 ("Add 1_0",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_1 ("Add 1_1",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_2 ("Add 1_2",Color) = (0,0,0,0) + + [GroupRollout(Overlay 2)] + [Group(Overlay 2)][NoScaleOffset]_Albedo2("Albedo2", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_NormalMask2("NormalMask2", 2D) = "bump" {} + [Group(Overlay 2)][NoScaleOffset]_ColorMask2("ColorMask2", 2D) = "black" {} + [Group(Overlay 2)][NoScaleOffset]_AlphaMask2("Mask2", 2D) = "white" {} + [Group(Overlay 2)]_Tile2_0 ("Tile2_0", Float) = 1 + [Group(Overlay 2)]_Tile2_1 ("Tile2_1", Float) = 1 + [Group(Overlay 2)]_Tile2_2 ("Tile2_2", Float) = 1 + [Group(Overlay 2)]_NormalStrength2("Normal Strength 2", Range(0,2)) = 1 + [Group(Overlay 2)]_RedColor2 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_GreenColor2 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_BlueColor2 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_AlphaColor2 ("AlphaColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_Tint2_0 ("Tint 2_0",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_1 ("Tint 2_1",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_2 ("Tint 2_2",Color) = (1,1,1,1) + [Group(Overlay 2)]_Add2_0 ("Add 2_0",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_1 ("Add 2_1",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_2 ("Add 2_2",Color) = (0,0,0,0) + + // Overlay 3 + [GroupRollout(Overlay 3)] + [Group(Overlay 3)][NoScaleOffset]_Albedo3("Albedo3", 2D) = "white" {} + [Group(Overlay 3)][NoScaleOffset]_NormalMask3("NormalMask3", 2D) = "bump" {} + [Group(Overlay 3)][NoScaleOffset]_ColorMask3("ColorMask3", 2D) = "black" {} + [Group(Overlay 3)][NoScaleOffset]_AlphaMask3("Mask3", 2D) = "white" {} + [Group(Overlay 3)]_Tile3_0 ("Tile3_0", Float) = 1 + [Group(Overlay 3)]_Tile3_1 ("Tile3_1", Float) = 1 + [Group(Overlay 3)]_Tile3_2 ("Tile3_2", Float) = 1 + [Group(Overlay 3)]_NormalStrength3("Normal Strength 3", Range(0,2)) = 1 + [Group(Overlay 3)]_RedColor3 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_GreenColor3 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_BlueColor3 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_AlphaColor3 ("AlphaColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_Tint3_0 ("Tint 3_0",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_1 ("Tint 3_1",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_2 ("Tint 3_2",Color) = (1,1,1,1) + [Group(Overlay 3)]_Add3_0 ("Add 3_0",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_1 ("Add 3_1",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_2 ("Add 3_2",Color) = (0,0,0,0) + + /* This is what they should be + half4 Tiles[4][3]; + half4 Tints[4][3]; + half4 Adds[4][3]; + half4 RedColor[4]; + half4 GreenColor[4]; + half4 BlueColor[4]; + half4 AlphaColor[4]; + half NormalStrength[4]; */ + +END_PROPERTIES + + +// Any variables you want to have in the per material CBuffer go here. +BEGIN_CBUFFER + + half _OverlayCount; + half _ColorModulation; + half _SmoothnessModulation; + half _MetallicModulation; + + // These should ALL BE IN ARRAYS!!!!! + // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST + // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!! + // so until I can write a utility to save/restore these, but only in edit time, this is what they will be. + half _Tile0_0; + half _Tile0_1; + half _Tile0_2; + half4 _RedColor0; + half4 _GreenColor0; + half4 _BlueColor0; + half4 _AlphaColor0; + half _NormalStrength0; + half4 _Tint0_0; + half4 _Tint0_1; + half4 _Tint0_2; + half4 _Add0_0; + half4 _Add0_1; + half4 _Add0_2; + half4 _HasTextures0; + + half _Tile1_0; + half _Tile1_1; + half _Tile1_2; + half4 _RedColor1; + half4 _GreenColor1; + half4 _BlueColor1; + half4 _AlphaColor1; + half _NormalStrength1; + half4 _Tint1_0; + half4 _Tint1_1; + half4 _Tint1_2; + half4 _Add1_0; + half4 _Add1_1; + half4 _Add1_2; + half4 _HasTextures1; + + half _Tile2_0; + half _Tile2_1; + half _Tile2_2; + half4 _RedColor2; + half4 _GreenColor2; + half4 _BlueColor2; + half4 _AlphaColor2; + half _NormalStrength2; + half4 _Tint2_0; + half4 _Tint2_1; + half4 _Tint2_2; + half4 _Add2_0; + half4 _Add2_1; + half4 _Add2_2; + half4 _HasTextures2; + + half _Tile3_0; + half _Tile3_1; + half _Tile3_2; + half4 _RedColor3; + half4 _GreenColor3; + half4 _BlueColor3; + half4 _AlphaColor3; + half _NormalStrength3; + half4 _Tint3_0; + half4 _Tint3_1; + half4 _Tint3_2; + half4 _Add3_0; + half4 _Add3_1; + half4 _Add3_2; + half4 _HasTextures3; +END_CBUFFER + + +// if you are writing a subshader, any defines that should be set on the main +// shader are defined here +//BEGIN_DEFINES +// #define _SIMPLELIT 1 // compile as SimpleLit shader in URP, or as BlinPhong in standard +//END_DEFINES + + +// All code goes here + +BEGIN_CODE + + TEXTURE2D(_Albedo); + SAMPLER(sampler_Albedo); + TEXTURE2D(_NormalMask); + TEXTURE2D(_ColorMask); + + + TEXTURE2D(_Albedo1); + TEXTURE2D(_NormalMask1); + TEXTURE2D(_AlphaMask1); + TEXTURE2D(_ColorMask1); + + TEXTURE2D(_Albedo2); + TEXTURE2D(_NormalMask2); + TEXTURE2D(_AlphaMask2); + TEXTURE2D(_ColorMask2); + + TEXTURE2D(_Albedo3); + TEXTURE2D(_NormalMask3); + TEXTURE2D(_AlphaMask3); + TEXTURE2D(_ColorMask3); + + // MaskedNormal Format + // R = Smooth + // G = Normal Y + // B = Metallic + // A = Normal X + + half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor ) + { + if (values.r > 0) + { + half3 newcol = base_c.rgb * RedColor.rgb; + base_c.rgb = lerp(base_c,newcol,values.r).rgb; + } + if (values.g > 0) + { + half3 newcol = base_c * GreenColor.rgb; + base_c.rgb = lerp(base_c,newcol,values.g).rgb; + } + if (values.b > 0) + { + half3 newcol = base_c * BlueColor.rgb; + base_c.rgb = lerp(base_c,newcol,values.b).rgb; + } + if (values.a > 0) + { + half3 newcol = base_c * AlphaColor.rgb; + base_c.rgb = lerp(base_c,newcol,values.a).rgb; + } + + return base_c; + } + + void SurfaceFunction(inout Surface o, ShaderData d) + { + // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used) + float2 auv = d.texcoord0.xy * _Tile0_0; + float2 nuv = d.texcoord0.xy * _Tile0_1; + float2 cuv = d.texcoord0.xy * _Tile0_2; + + half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv); + half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0; + base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0); + + half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1; + half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0); + + half base_smooth = basepackednormal.r; + half base_Metallic = basepackednormal.b; + o.Alpha = base_c.a; + + + if (_OverlayCount > 1) + { + float2 auv = d.texcoord0.xy * _Tile1_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile1_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv); + add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1); + // + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile1_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1; + half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1); + half add_smooth = addpackednormal.r; + half add_Metallic = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + // + } + + + if (_OverlayCount > 2) + { + float2 auv = d.texcoord0.xy * _Tile2_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile2_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv); + add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2); + // + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile2_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1; + half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2); + half add_smooth = addpackednormal.r; + half add_Metallic = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + // + } + + if (_OverlayCount > 3) + { + float2 auv = d.texcoord0.xy * _Tile3_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile3_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv); + add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3); + // + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile3_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1; + half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2); + half add_smooth = addpackednormal.r; + half add_Metallic = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + // + } + + o.Albedo = base_c * _ColorModulation; + o.Normal = base_n; + o.Metallic = base_Metallic * _MetallicModulation; + o.Smoothness = base_smooth * _SmoothnessModulation; + } + +END_CODE + diff --git a/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormalColormask_Compositer.surfshader.meta b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormalColormask_Compositer.surfshader.meta new file mode 100644 index 000000000..0e378b747 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormalColormask_Compositer.surfshader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f22cdbe3d4714f24fb6384dae29a4947 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: ed1b96e11e9064957833ce8c01da6f92, type: 3} diff --git a/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer.surfshader b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer.surfshader new file mode 100644 index 000000000..0a49ac395 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer.surfshader @@ -0,0 +1,291 @@ +BEGIN_OPTIONS + ShaderName "UMA/Compositing/2_Albedo_PackedMask" + Stackable "False" + DisableGBufferPass "True" // disable gbuffer pass + Workflow "Metallic +END_OPTIONS + +BEGIN_PROPERTIES + + [BetterHeader(Material Specific)] + _OverlayCount ("OverlayCount", Float) = 0 + _ColorModulation ("Color Modulation", Range(0,2)) = 1 + _OcclusionModulation ("Occlusion Level", Range(0,2)) = 1 + _SmoothnessModulation ("Smoothness Level", Range(0,2)) = 1 + _Metallic("Metallic", Range(0,1)) = 0 + + [Enum(Off,0,Front,1,Back,2)]_CullMode("Culling Mode", Float) = 2 + [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1 + + [GroupRollout(Base Overlay)] + [Group(Base Overlay)][NoScaleOffset]_Albedo("Albedo", 2D) = "white" {} + [Group(Base Overlay)][NoScaleOffset]_NormalMask("NormalMask", 2D) = "bump" {} + // no AlphaMask for the base. + [Group(Base Overlay)]_Tile0_0 ("Tile0_0", Float) = 1 + [Group(Base Overlay)]_Tile0_1 ("Tile0_1", Float) = 1 + [Group(Base Overlay)]_NormalStrength0("Normal Strength 0", Range(0,2)) = 1 + [Group(Base Overlay)]_Tint0_0 ("Tint 0_0",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_1 ("Tint 0_1",Color) = (1,1,1,1) + [Group(Base Overlay)]_Add0_0 ("Add 0_0",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_1 ("Add 0_1",Color) = (0,0,0,0) + + [GroupRollout(Overlay 1)] + [Group(Overlay 1)][NoScaleOffset]_Albedo1("Albedo1", 2D) = "white" {} + [Group(Overlay 1)][NoScaleOffset]_NormalMask1("NormalMask1", 2D) = "bump" {} + [Group(Overlay 1)][NoScaleOffset]_AlphaMask1("Mask1", 2D) = "white" {} + [Group(Overlay 1)]_Tile1_0 ("Tile1_0", Float) = 1 + [Group(Overlay 1)]_Tile1_1 ("Tile1_1", Float) = 1 + [Group(Overlay 1)]_NormalStrength1("Normal Strength 1", Range(0,2)) = 1 + [Group(Overlay 1)]_Tint1_0 ("Tint 1_0",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_1 ("Tint 1_1",Color) = (1,1,1,1) + [Group(Overlay 1)]_Add1_0 ("Add 1_0",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_1 ("Add 1_1",Color) = (0,0,0,0) + + [GroupRollout(Overlay 2)] + [Group(Overlay 2)][NoScaleOffset]_Albedo2("Albedo2", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_NormalMask2("NormalMask2", 2D) = "bump" {} + [Group(Overlay 2)][NoScaleOffset]_AlphaMask2("Mask2", 2D) = "white" {} + [Group(Overlay 2)]_Tile2_0 ("Tile2_0", Float) = 1 + [Group(Overlay 2)]_Tile2_1 ("Tile2_1", Float) = 1 + [Group(Overlay 2)]_NormalStrength2("Normal Strength 2", Range(0,2)) = 1 + [Group(Overlay 2)]_Tint2_0 ("Tint 2_0",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_1 ("Tint 2_1",Color) = (1,1,1,1) + [Group(Overlay 2)]_Add2_0 ("Add 2_0",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_1 ("Add 2_1",Color) = (0,0,0,0) + + // Overlay 3 + [GroupRollout(Overlay 3)] + [Group(Overlay 3)][NoScaleOffset]_Albedo3("Albedo3", 2D) = "white" {} + [Group(Overlay 3)][NoScaleOffset]_NormalMask3("NormalMask3", 2D) = "bump" {} + [Group(Overlay 3)][NoScaleOffset]_AlphaMask3("Mask3", 2D) = "white" {} + [Group(Overlay 3)]_Tile3_0 ("Tile3_0", Float) = 1 + [Group(Overlay 3)]_Tile3_1 ("Tile3_1", Float) = 1 + [Group(Overlay 3)]_NormalStrength3("Normal Strength 3", Range(0,2)) = 1 + [Group(Overlay 3)]_Tint3_0 ("Tint 3_0",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_1 ("Tint 3_1",Color) = (1,1,1,1) + [Group(Overlay 3)]_Add3_0 ("Add 3_0",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_1 ("Add 3_1",Color) = (0,0,0,0) + +END_PROPERTIES + + +BEGIN_PASS("All") + Cull [_CullMode] +END_PASS + +// Any variables you want to have in the per material CBuffer go here. +BEGIN_CBUFFER + + half _OverlayCount; + half _ColorModulation; + half _SmoothnessModulation; + half _OcclusionModulation; + half _Metallic; + + float _DoubleSidedNormalMode; + + // These should ALL BE IN ARRAYS!!!!! + // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST + // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!! + // so until I can write a utility to save/restore these, but only in edit time, this is what they will be. + half _Tile0_0; + half _Tile0_1; + half _NormalStrength0; + half4 _Tint0_0; + half4 _Tint0_1; + half4 _Add0_0; + half4 _Add0_1; + half4 _HasTextures0; + + half _Tile1_0; + half _Tile1_1; + half _NormalStrength1; + half4 _Tint1_0; + half4 _Tint1_1; + half4 _Add1_0; + half4 _Add1_1; + half4 _HasTextures1; + + half _Tile2_0; + half _Tile2_1; + half _NormalStrength2; + half4 _Tint2_0; + half4 _Tint2_1; + half4 _Add2_0; + half4 _Add2_1; + half4 _HasTextures2; + + half _Tile3_0; + half _Tile3_1; + half _NormalStrength3; + half4 _Tint3_0; + half4 _Tint3_1; + half4 _Add3_0; + half4 _Add3_1; + half4 _HasTextures3; +END_CBUFFER + + +// if you are writing a subshader, any defines that should be set on the main +// shader are defined here +//BEGIN_DEFINES +// #define _SIMPLELIT 1 // compile as SimpleLit shader in URP, or as BlinPhong in standard +//END_DEFINES + + +// All code goes here + +BEGIN_CODE + + TEXTURE2D(_Albedo); + SAMPLER(sampler_Albedo); + TEXTURE2D(_NormalMask); + + TEXTURE2D(_Albedo1); + TEXTURE2D(_NormalMask1); + TEXTURE2D(_AlphaMask1); + + TEXTURE2D(_Albedo2); + TEXTURE2D(_NormalMask2); + TEXTURE2D(_AlphaMask2); + + TEXTURE2D(_Albedo3); + TEXTURE2D(_NormalMask3); + TEXTURE2D(_AlphaMask3); + + // Packed Format + // R = Smooth + // G = Normal Y + // B = Occlusion + // A = Normal X + + half3 UMAUnpackBLSScaleNormal(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.ag * 2 - 1); + #if (SHADER_TARGET >= 30) + // SM2.0: normal scaler is not supported + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + + void SurfaceFunction(inout Surface o, ShaderData d) + { + // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used) + float2 auv = d.texcoord0.xy * _Tile0_0; + float2 nuv = d.texcoord0.xy * _Tile0_1; + + half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0; + half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1; + half3 base_n = UMAUnpackBLSScaleNormal(basepackednormal,_NormalStrength0); + + half base_smooth = basepackednormal.r; + half base_Occlusion = basepackednormal.b; + o.Alpha = base_c.a; + + + if (_OverlayCount > 1) + { + float2 auv = d.texcoord0.xy * _Tile1_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0; + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile1_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1; + half3 add_n = UMAUnpackBLSScaleNormal(addpackednormal,_NormalStrength1); + half add_smooth = addpackednormal.r; + half add_Occlusion = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Occlusion = (addpackednormal.b * alpha) + (base_Occlusion * oneminus); + // + } + + + if (_OverlayCount > 2) + { + float2 auv = d.texcoord0.xy * _Tile2_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0; + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile2_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1; + half3 add_n = UMAUnpackBLSScaleNormal(addpackednormal,_NormalStrength2); + half add_smooth = addpackednormal.r; + half add_Occlusion = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Occlusion = (addpackednormal.b * alpha) + (base_Occlusion * oneminus); + // + } + + if (_OverlayCount > 3) + { + float2 auv = d.texcoord0.xy * _Tile3_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0; + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile3_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1; + half3 add_n = UMAUnpackBLSScaleNormal(addpackednormal,_NormalStrength2); + half add_smooth = addpackednormal.r; + half add_Occlusion = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Occlusion = (addpackednormal.b * alpha) + (base_Occlusion * oneminus); + // + } + + o.Albedo = base_c * _ColorModulation; + o.Normal = base_n; + o.Occlusion = base_Occlusion * _OcclusionModulation; + o.Smoothness = base_smooth * _SmoothnessModulation; + o.Metallic = _Metallic; + + if (_DoubleSidedNormalMode == 0) + { + o.Normal *= d.isFrontFace ? 1 : -1; + } + else if (_DoubleSidedNormalMode == 1) + { + o.Normal.z *= d.isFrontFace ? 1 : -1; + } + } + +END_CODE + diff --git a/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer.surfshader.meta b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer.surfshader.meta new file mode 100644 index 000000000..256fc25f0 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer.surfshader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e03404c6cbdd84c49a7102cc33112d7e +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: ed1b96e11e9064957833ce8c01da6f92, type: 3} diff --git a/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission.surfshader b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission.surfshader new file mode 100644 index 000000000..60b2eb138 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission.surfshader @@ -0,0 +1,323 @@ +BEGIN_OPTIONS + ShaderName "UMA/Compositing/2_Albedo_PackedMask_Emission" + Stackable "False" + DisableGBufferPass "True" // disable gbuffer pass + Workflow "Metallic +END_OPTIONS + +BEGIN_PROPERTIES + + [BetterHeader(Material Specific)] + _OverlayCount ("OverlayCount", Float) = 0 + _ColorModulation ("Color Modulation", Range(0,2)) = 1 + _OcclusionModulation ("Occlusion Level", Range(0,2)) = 1 + _SmoothnessModulation ("Smoothness Level", Range(0,2)) = 1 + _EmissionModulation("Emission Level", Range(0,2)) = 1 + _Metallic("Metallic", Range(0,1)) = 0 + + [Enum(Off,0,Front,1,Back,2)]_CullMode("Culling Mode", Float) = 2 + [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1 + + [GroupRollout(Base Overlay)] + [Group(Base Overlay)][NoScaleOffset]_Albedo("Albedo", 2D) = "white" {} + [Group(Base Overlay)][NoScaleOffset]_NormalMask("NormalMask", 2D) = "bump" {} + [Group(Base Overlay)][NoScaleOffset]_Emmission("Emission", 2D) = "black" {} + // no AlphaMask for the base. + [Group(Base Overlay)]_Tile0_0 ("Tile0_0", Float) = 1 + [Group(Base Overlay)]_Tile0_1 ("Tile0_1", Float) = 1 + [Group(Base Overlay)]_NormalStrength0("Normal Strength 0", Range(0,2)) = 1 + [Group(Base Overlay)]_Tint0_0 ("Tint 0_0",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_1 ("Tint 0_1",Color) = (1,1,1,1) + [Group(Base Overlay)]_Add0_0 ("Add 0_0",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_1 ("Add 0_1",Color) = (0,0,0,0) + + [GroupRollout(Overlay 1)] + [Group(Overlay 1)][NoScaleOffset]_Albedo1("Albedo1", 2D) = "white" {} + [Group(Overlay 1)][NoScaleOffset]_NormalMask1("NormalMask1", 2D) = "bump" {} + [Group(Overlay 1)][NoScaleOffset]_AlphaMask1("Mask1", 2D) = "white" {} + [Group(Overlay 1)][NoScaleOffset]_Emmission1("Emission1", 2D) = "black" {} + [Group(Overlay 1)]_Tile1_0 ("Tile1_0", Float) = 1 + [Group(Overlay 1)]_Tile1_1 ("Tile1_1", Float) = 1 + [Group(Overlay 1)]_NormalStrength1("Normal Strength 1", Range(0,2)) = 1 + [Group(Overlay 1)]_Tint1_0 ("Tint 1_0",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_1 ("Tint 1_1",Color) = (1,1,1,1) + [Group(Overlay 1)]_Add1_0 ("Add 1_0",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_1 ("Add 1_1",Color) = (0,0,0,0) + + [GroupRollout(Overlay 2)] + [Group(Overlay 2)][NoScaleOffset]_Albedo2("Albedo2", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_NormalMask2("NormalMask2", 2D) = "bump" {} + [Group(Overlay 2)][NoScaleOffset]_AlphaMask2("Mask2", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_Emmission2("Emission2", 2D) = "black" {} + + [Group(Overlay 2)]_Tile2_0 ("Tile2_0", Float) = 1 + [Group(Overlay 2)]_Tile2_1 ("Tile2_1", Float) = 1 + [Group(Overlay 2)]_NormalStrength2("Normal Strength 2", Range(0,2)) = 1 + [Group(Overlay 2)]_Tint2_0 ("Tint 2_0",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_1 ("Tint 2_1",Color) = (1,1,1,1) + [Group(Overlay 2)]_Add2_0 ("Add 2_0",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_1 ("Add 2_1",Color) = (0,0,0,0) + + // Overlay 3 + [GroupRollout(Overlay 3)] + [Group(Overlay 3)][NoScaleOffset]_Albedo3("Albedo3", 2D) = "white" {} + [Group(Overlay 3)][NoScaleOffset]_NormalMask3("NormalMask3", 2D) = "bump" {} + [Group(Overlay 3)][NoScaleOffset]_AlphaMask3("Mask3", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_Emmission3("Emission3", 2D) = "black" {} + + [Group(Overlay 3)]_Tile3_0 ("Tile3_0", Float) = 1 + [Group(Overlay 3)]_Tile3_1 ("Tile3_1", Float) = 1 + [Group(Overlay 3)]_NormalStrength3("Normal Strength 3", Range(0,2)) = 1 + [Group(Overlay 3)]_Tint3_0 ("Tint 3_0",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_1 ("Tint 3_1",Color) = (1,1,1,1) + [Group(Overlay 3)]_Add3_0 ("Add 3_0",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_1 ("Add 3_1",Color) = (0,0,0,0) + +END_PROPERTIES + + +BEGIN_PASS("All") + Cull [_CullMode] +END_PASS + +// Any variables you want to have in the per material CBuffer go here. +BEGIN_CBUFFER + + half _OverlayCount; + half _ColorModulation; + half _SmoothnessModulation; + half _OcclusionModulation; + half _EmissionModulation; + half _Metallic; + + float _DoubleSidedNormalMode; + + // These should ALL BE IN ARRAYS!!!!! + // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST + // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!! + // so until I can write a utility to save/restore these, but only in edit time, this is what they will be. + half _Tile0_0; + half _Tile0_1; + half _Tile0_2; + half _NormalStrength0; + half4 _Tint0_0; + half4 _Tint0_1; + half4 _Tint0_2; + half4 _Add0_0; + half4 _Add0_1; + half4 _Add0_2; + half4 _HasTextures0; + + half _Tile1_0; + half _Tile1_1; + half _Tile1_2; + half _NormalStrength1; + half4 _Tint1_0; + half4 _Tint1_1; + half4 _Tint1_2; + half4 _Add1_0; + half4 _Add1_1; + half4 _Add1_2; + half4 _HasTextures1; + + half _Tile2_0; + half _Tile2_1; + half _Tile2_2; + half _NormalStrength2; + half4 _Tint2_0; + half4 _Tint2_1; + half4 _Tint2_2; + half4 _Add2_0; + half4 _Add2_1; + half4 _Add2_2; + half4 _HasTextures2; + + half _Tile3_0; + half _Tile3_1; + half _Tile3_2; + half _NormalStrength3; + half4 _Tint3_0; + half4 _Tint3_1; + half4 _Tint3_2; + half4 _Add3_0; + half4 _Add3_1; + half4 _Add3_2; + half4 _HasTextures3; +END_CBUFFER + + +// if you are writing a subshader, any defines that should be set on the main +// shader are defined here +//BEGIN_DEFINES +// #define _SIMPLELIT 1 // compile as SimpleLit shader in URP, or as BlinPhong in standard +//END_DEFINES + + +// All code goes here + +BEGIN_CODE + + TEXTURE2D(_Albedo); + SAMPLER(sampler_Albedo); + TEXTURE2D(_NormalMask); + TEXTURE2D(_Emission); + + TEXTURE2D(_Albedo1); + TEXTURE2D(_NormalMask1); + TEXTURE2D(_AlphaMask1); + TEXTURE2D(_Emission1); + + TEXTURE2D(_Albedo2); + TEXTURE2D(_NormalMask2); + TEXTURE2D(_AlphaMask2); + TEXTURE2D(_Emission2); + + TEXTURE2D(_Albedo3); + TEXTURE2D(_NormalMask3); + TEXTURE2D(_AlphaMask3); + TEXTURE2D(_Emission3); + + // Packed Format + // R = Smooth + // G = Normal Y + // B = Occlusion + // A = Normal X + + half3 UMAUnpackBLSScaleNormal(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.ag * 2 - 1); + #if (SHADER_TARGET >= 30) + // SM2.0: normal scaler is not supported + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + + void SurfaceFunction(inout Surface o, ShaderData d) + { + // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used) + float2 auv = d.texcoord0.xy * _Tile0_0; + float2 nuv = d.texcoord0.xy * _Tile0_1; + + half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0; + half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1; + half4 base_emission = (SAMPLE_TEXTURE2D(_Emission,sampler_Albedo, auv) * _Tint0_2) + _Add0_2; + half3 base_n = UMAUnpackBLSScaleNormal(basepackednormal,_NormalStrength0); + half base_smooth = basepackednormal.r; + half base_Occlusion = basepackednormal.b; + o.Alpha = base_c.a; + + + if (_OverlayCount > 1) + { + float2 auv = d.texcoord0.xy * _Tile1_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0; + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile1_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1; + + half3 add_n = UMAUnpackBLSScaleNormal(addpackednormal,_NormalStrength1); + half add_smooth = addpackednormal.r; + half add_Occlusion = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Occlusion = (addpackednormal.b * alpha) + (base_Occlusion * oneminus); + + half4 addemission = (SAMPLE_TEXTURE2D(_Emission1,sampler_Albedo, auv) * _Tint1_2) + _Add1_2; + base_emission = (addemission * alpha) + (base_emission * oneminus); + } + + + if (_OverlayCount > 2) + { + float2 auv = d.texcoord0.xy * _Tile2_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0; + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile2_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1; + half3 add_n = UMAUnpackBLSScaleNormal(addpackednormal,_NormalStrength2); + half add_smooth = addpackednormal.r; + half add_Occlusion = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Occlusion = (addpackednormal.b * alpha) + (base_Occlusion * oneminus); + // + half4 addemission = (SAMPLE_TEXTURE2D(_Emission2,sampler_Albedo, auv) * _Tint2_2) + _Add2_2; + base_emission = (addemission * alpha) + (base_emission * oneminus); + } + + if (_OverlayCount > 3) + { + float2 auv = d.texcoord0.xy * _Tile3_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0; + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile3_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1; + half3 add_n = UMAUnpackBLSScaleNormal(addpackednormal,_NormalStrength2); + half add_smooth = addpackednormal.r; + half add_Occlusion = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Occlusion = (addpackednormal.b * alpha) + (base_Occlusion * oneminus); + // + half4 addemission = (SAMPLE_TEXTURE2D(_Emission3,sampler_Albedo, auv) * _Tint3_2) + _Add3_2; + base_emission = (addemission * alpha) + (base_emission * oneminus); + } + + o.Albedo = base_c * _ColorModulation; + o.Emission = base_emission * _EmissionModulation; + o.Normal = base_n; + o.Occlusion = base_Occlusion * _OcclusionModulation; + o.Smoothness = base_smooth * _SmoothnessModulation; + o.Metallic = _Metallic; + + if (_DoubleSidedNormalMode == 0) + { + o.Normal *= d.isFrontFace ? 1 : -1; + } + else if (_DoubleSidedNormalMode == 1) + { + o.Normal.z *= d.isFrontFace ? 1 : -1; + } + } + +END_CODE + diff --git a/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission.surfshader.meta b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission.surfshader.meta new file mode 100644 index 000000000..78868037c --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission.surfshader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 63b646d7493170b4ab640e8812fae336 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: ed1b96e11e9064957833ce8c01da6f92, type: 3} diff --git a/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission_Cutoff.surfshader b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission_Cutoff.surfshader new file mode 100644 index 000000000..adcaa01c2 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission_Cutoff.surfshader @@ -0,0 +1,328 @@ +BEGIN_OPTIONS + ShaderName "UMA/Compositing/2_Albedo_PackedMask_Emission_Cutout" + Stackable "False" + DisableGBufferPass "True" // disable gbuffer pass + Workflow "Metallic +END_OPTIONS + +BEGIN_PROPERTIES + + [BetterHeader(Material Specific)] + _OverlayCount ("OverlayCount", Float) = 0 + _ColorModulation ("Color Modulation", Range(0,2)) = 1 + _OcclusionModulation ("Occlusion Level", Range(0,2)) = 1 + _SmoothnessModulation ("Smoothness Level", Range(0,2)) = 1 + _EmissionModulation("Emission Level", Range(0,2)) = 1 + _Metallic("Metallic", Range(0,1)) = 0 + _Cutoff("Alpha cutoff", Range(0,1)) = 0.5 + + [Enum(Off,0,Front,1,Back,2)]_CullMode("Culling Mode", Float) = 2 + [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1 + + [GroupRollout(Base Overlay)] + [Group(Base Overlay)][NoScaleOffset]_Albedo("Albedo", 2D) = "white" {} + [Group(Base Overlay)][NoScaleOffset]_NormalMask("NormalMask", 2D) = "bump" {} + [Group(Base Overlay)][NoScaleOffset]_Emmission("Emission", 2D) = "black" {} + // no AlphaMask for the base. + [Group(Base Overlay)]_Tile0_0 ("Tile0_0", Float) = 1 + [Group(Base Overlay)]_Tile0_1 ("Tile0_1", Float) = 1 + [Group(Base Overlay)]_NormalStrength0("Normal Strength 0", Range(0,2)) = 1 + [Group(Base Overlay)]_Tint0_0 ("Tint 0_0",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_1 ("Tint 0_1",Color) = (1,1,1,1) + [Group(Base Overlay)]_Add0_0 ("Add 0_0",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_1 ("Add 0_1",Color) = (0,0,0,0) + + [GroupRollout(Overlay 1)] + [Group(Overlay 1)][NoScaleOffset]_Albedo1("Albedo1", 2D) = "white" {} + [Group(Overlay 1)][NoScaleOffset]_NormalMask1("NormalMask1", 2D) = "bump" {} + [Group(Overlay 1)][NoScaleOffset]_AlphaMask1("Mask1", 2D) = "white" {} + [Group(Overlay 1)][NoScaleOffset]_Emmission1("Emission1", 2D) = "black" {} + [Group(Overlay 1)]_Tile1_0 ("Tile1_0", Float) = 1 + [Group(Overlay 1)]_Tile1_1 ("Tile1_1", Float) = 1 + [Group(Overlay 1)]_NormalStrength1("Normal Strength 1", Range(0,2)) = 1 + [Group(Overlay 1)]_Tint1_0 ("Tint 1_0",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_1 ("Tint 1_1",Color) = (1,1,1,1) + [Group(Overlay 1)]_Add1_0 ("Add 1_0",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_1 ("Add 1_1",Color) = (0,0,0,0) + + [GroupRollout(Overlay 2)] + [Group(Overlay 2)][NoScaleOffset]_Albedo2("Albedo2", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_NormalMask2("NormalMask2", 2D) = "bump" {} + [Group(Overlay 2)][NoScaleOffset]_AlphaMask2("Mask2", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_Emmission2("Emission2", 2D) = "black" {} + + [Group(Overlay 2)]_Tile2_0 ("Tile2_0", Float) = 1 + [Group(Overlay 2)]_Tile2_1 ("Tile2_1", Float) = 1 + [Group(Overlay 2)]_NormalStrength2("Normal Strength 2", Range(0,2)) = 1 + [Group(Overlay 2)]_Tint2_0 ("Tint 2_0",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_1 ("Tint 2_1",Color) = (1,1,1,1) + [Group(Overlay 2)]_Add2_0 ("Add 2_0",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_1 ("Add 2_1",Color) = (0,0,0,0) + + // Overlay 3 + [GroupRollout(Overlay 3)] + [Group(Overlay 3)][NoScaleOffset]_Albedo3("Albedo3", 2D) = "white" {} + [Group(Overlay 3)][NoScaleOffset]_NormalMask3("NormalMask3", 2D) = "bump" {} + [Group(Overlay 3)][NoScaleOffset]_AlphaMask3("Mask3", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_Emmission3("Emission3", 2D) = "black" {} + + [Group(Overlay 3)]_Tile3_0 ("Tile3_0", Float) = 1 + [Group(Overlay 3)]_Tile3_1 ("Tile3_1", Float) = 1 + [Group(Overlay 3)]_NormalStrength3("Normal Strength 3", Range(0,2)) = 1 + [Group(Overlay 3)]_Tint3_0 ("Tint 3_0",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_1 ("Tint 3_1",Color) = (1,1,1,1) + [Group(Overlay 3)]_Add3_0 ("Add 3_0",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_1 ("Add 3_1",Color) = (0,0,0,0) + +END_PROPERTIES + + +BEGIN_PASS("All") + Cull [_CullMode] +END_PASS + +// Any variables you want to have in the per material CBuffer go here. +BEGIN_CBUFFER + + half _OverlayCount; + half _ColorModulation; + half _SmoothnessModulation; + half _OcclusionModulation; + half _EmissionModulation; + half _Metallic; + half _Cutoff; + + float _DoubleSidedNormalMode; + + // These should ALL BE IN ARRAYS!!!!! + // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST + // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!! + // so until I can write a utility to save/restore these, but only in edit time, this is what they will be. + half _Tile0_0; + half _Tile0_1; + half _Tile0_2; + half _NormalStrength0; + half4 _Tint0_0; + half4 _Tint0_1; + half4 _Tint0_2; + half4 _Add0_0; + half4 _Add0_1; + half4 _Add0_2; + half4 _HasTextures0; + + half _Tile1_0; + half _Tile1_1; + half _Tile1_2; + half _NormalStrength1; + half4 _Tint1_0; + half4 _Tint1_1; + half4 _Tint1_2; + half4 _Add1_0; + half4 _Add1_1; + half4 _Add1_2; + half4 _HasTextures1; + + half _Tile2_0; + half _Tile2_1; + half _Tile2_2; + half _NormalStrength2; + half4 _Tint2_0; + half4 _Tint2_1; + half4 _Tint2_2; + half4 _Add2_0; + half4 _Add2_1; + half4 _Add2_2; + half4 _HasTextures2; + + half _Tile3_0; + half _Tile3_1; + half _Tile3_2; + half _NormalStrength3; + half4 _Tint3_0; + half4 _Tint3_1; + half4 _Tint3_2; + half4 _Add3_0; + half4 _Add3_1; + half4 _Add3_2; + half4 _HasTextures3; +END_CBUFFER + + +// if you are writing a subshader, any defines that should be set on the main +// shader are defined here +//BEGIN_DEFINES +// #define _SIMPLELIT 1 // compile as SimpleLit shader in URP, or as BlinPhong in standard +//END_DEFINES + + +// All code goes here + +BEGIN_CODE + + TEXTURE2D(_Albedo); + SAMPLER(sampler_Albedo); + TEXTURE2D(_NormalMask); + TEXTURE2D(_Emission); + + TEXTURE2D(_Albedo1); + TEXTURE2D(_NormalMask1); + TEXTURE2D(_AlphaMask1); + TEXTURE2D(_Emission1); + + TEXTURE2D(_Albedo2); + TEXTURE2D(_NormalMask2); + TEXTURE2D(_AlphaMask2); + TEXTURE2D(_Emission2); + + TEXTURE2D(_Albedo3); + TEXTURE2D(_NormalMask3); + TEXTURE2D(_AlphaMask3); + TEXTURE2D(_Emission3); + + // Packed Format + // R = Smooth + // G = Normal Y + // B = Occlusion + // A = Normal X + + half3 UMAUnpackBLSScaleNormal(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.ag * 2 - 1); + #if (SHADER_TARGET >= 30) + // SM2.0: normal scaler is not supported + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + + void SurfaceFunction(inout Surface o, ShaderData d) + { + // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used) + float2 auv = d.texcoord0.xy * _Tile0_0; + float2 nuv = d.texcoord0.xy * _Tile0_1; + + half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0; + half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1; + half4 base_emission = (SAMPLE_TEXTURE2D(_Emission,sampler_Albedo, auv) * _Tint0_2) + _Add0_2; + half3 base_n = UMAUnpackBLSScaleNormal(basepackednormal,_NormalStrength0); + half base_smooth = basepackednormal.r; + half base_Occlusion = basepackednormal.b; + + clip(base_c.a - _Cutoff); + + o.Alpha = base_c.a; + + + if (_OverlayCount > 1) + { + float2 auv = d.texcoord0.xy * _Tile1_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0; + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile1_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1; + + half3 add_n = UMAUnpackBLSScaleNormal(addpackednormal,_NormalStrength1); + half add_smooth = addpackednormal.r; + half add_Occlusion = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Occlusion = (addpackednormal.b * alpha) + (base_Occlusion * oneminus); + + half4 addemission = (SAMPLE_TEXTURE2D(_Emission1,sampler_Albedo, auv) * _Tint1_2) + _Add1_2; + base_emission = (addemission * alpha) + (base_emission * oneminus); + } + + + if (_OverlayCount > 2) + { + float2 auv = d.texcoord0.xy * _Tile2_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0; + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile2_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1; + half3 add_n = UMAUnpackBLSScaleNormal(addpackednormal,_NormalStrength2); + half add_smooth = addpackednormal.r; + half add_Occlusion = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Occlusion = (addpackednormal.b * alpha) + (base_Occlusion * oneminus); + // + half4 addemission = (SAMPLE_TEXTURE2D(_Emission2,sampler_Albedo, auv) * _Tint2_2) + _Add2_2; + base_emission = (addemission * alpha) + (base_emission * oneminus); + } + + if (_OverlayCount > 3) + { + float2 auv = d.texcoord0.xy * _Tile3_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0; + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile3_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1; + half3 add_n = UMAUnpackBLSScaleNormal(addpackednormal,_NormalStrength2); + half add_smooth = addpackednormal.r; + half add_Occlusion = addpackednormal.b; + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.r * alpha) + (base_smooth * oneminus); + base_Occlusion = (addpackednormal.b * alpha) + (base_Occlusion * oneminus); + // + half4 addemission = (SAMPLE_TEXTURE2D(_Emission3,sampler_Albedo, auv) * _Tint3_2) + _Add3_2; + base_emission = (addemission * alpha) + (base_emission * oneminus); + } + + o.Albedo = base_c * _ColorModulation; + o.Emission = base_emission * _EmissionModulation; + o.Normal = base_n; + o.Occlusion = base_Occlusion * _OcclusionModulation; + o.Smoothness = base_smooth * _SmoothnessModulation; + o.Metallic = _Metallic; + + if (_DoubleSidedNormalMode == 0) + { + o.Normal *= d.isFrontFace ? 1 : -1; + } + else if (_DoubleSidedNormalMode == 1) + { + o.Normal.z *= d.isFrontFace ? 1 : -1; + } + } + +END_CODE + diff --git a/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission_Cutoff.surfshader.meta b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission_Cutoff.surfshader.meta new file mode 100644 index 000000000..f232ed63a --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/2_AlbedoNormal_Compositer_Emission_Cutoff.surfshader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ea52d9e98c22e8c439cd051341a17657 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: ed1b96e11e9064957833ce8c01da6f92, type: 3} diff --git a/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer.surfshader b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer.surfshader new file mode 100644 index 000000000..d636a6b1f --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer.surfshader @@ -0,0 +1,414 @@ +BEGIN_OPTIONS + ShaderName "UMA/Compositing/Albedo_NormalMask_ColorMask" + Stackable "False" + DisableGBufferPass "True" // disable gbuffer pass + Workflow "Metallic" +END_OPTIONS + + // MaskedNormal format + // R = Normal X + // G = Normal Y + // B = Metallic + // A = Smooth + + // ColorMask format + // R = Amount to colorize using the _RedColor value + // G = Amount to colorize using the _GreenColor value + // B = Amount to colorize using the _BlueColor value + // A = Emissive amount + +BEGIN_PROPERTIES + + [BetterHeader(Material Specific)] + _OverlayCount ("OverlayCount", Float) = 0 + _ColorModulation ("Color Modulation", Range(0,2)) = 1 + _MetallicModulation ("Metallic Level", Range(0,2)) = 1 + _SmoothnessModulation ("Smoothness Level", Range(0,2)) = 1 + _EmissiveModulation ("Emissive Level", Range(0,2)) = 1 + + [Enum(Off,0,Front,1,Back,2)]_CullMode("Culling Mode", Float) = 2 + [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1 + + [GroupRollout(Base Overlay)] + [Group(Base Overlay)][NoScaleOffset]_Albedo("Albedo", 2D) = "white" {} + [Message(A NormalMask is encoded as follows R Normal_X G Normal_Y B Metallic_Level A Smoothness_Level)] + [BetterHeader(Normal Mask)] + [Group(Base Overlay)][NoScaleOffset]_NormalMask("NormalMask", 2D) = "bump" {} + [Group(Base Overlay)][NoScaleOffset]_ColorMask("ColorMask", 2D) = "black" {} + // no AlphaMask for the base. + [Group(Base Overlay)]_Tile0_0 ("Tile0_0", Float) = 1 + [Group(Base Overlay)]_Tile0_1 ("Tile0_1", Float) = 1 + [Group(Base Overlay)]_Tile0_2 ("Tile0_2", Float) = 1 + [Group(Base Overlay)]_NormalStrength0("Normal Strength 0", Range(0,2)) = 1 + [Group(Base Overlay)]_RedColor0 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_GreenColor0 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_BlueColor0 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_Tint0_0 ("Tint 0_0",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_1 ("Tint 0_1",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_2 ("Tint 0_2",Color) = (1,1,1,1) + [Group(Base Overlay)]_Add0_0 ("Add 0_0",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_1 ("Add 0_1",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_2 ("Add 0_2",Color) = (0,0,0,0) + + [GroupRollout(Overlay 1)] + [Group(Overlay 1)][NoScaleOffset]_Albedo1("Albedo1", 2D) = "white" {} + [Group(Overlay 1)][NoScaleOffset]_NormalMask1("NormalMask1", 2D) = "bump" {} + [Group(Overlay 1)][NoScaleOffset]_ColorMask1("ColorMask1", 2D) = "black" {} + [Group(Overlay 1)][NoScaleOffset]_AlphaMask1("Mask1", 2D) = "white" {} + [Group(Overlay 1)]_Tile1_0 ("Tile1_0", Float) = 1 + [Group(Overlay 1)]_Tile1_1 ("Tile1_1", Float) = 1 + [Group(Overlay 1)]_Tile1_2 ("Tile1_2", Float) = 1 + [Group(Overlay 1)]_NormalStrength1("Normal Strength 1", Range(0,2)) = 1 + [Group(Overlay 1)]_RedColor1 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_GreenColor1 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_BlueColor1 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_Tint1_0 ("Tint 1_0",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_1 ("Tint 1_1",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_2 ("Tint 1_2",Color) = (1,1,1,1) + [Group(Overlay 1)]_Add1_0 ("Add 1_0",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_1 ("Add 1_1",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_2 ("Add 1_2",Color) = (0,0,0,0) + + [GroupRollout(Overlay 2)] + [Group(Overlay 2)][NoScaleOffset]_Albedo2("Albedo2", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_NormalMask2("NormalMask2", 2D) = "bump" {} + [Group(Overlay 2)][NoScaleOffset]_ColorMask2("ColorMask2", 2D) = "black" {} + [Group(Overlay 2)][NoScaleOffset]_AlphaMask2("Mask2", 2D) = "white" {} + [Group(Overlay 2)]_Tile2_0 ("Tile2_0", Float) = 1 + [Group(Overlay 2)]_Tile2_1 ("Tile2_1", Float) = 1 + [Group(Overlay 2)]_Tile2_2 ("Tile2_2", Float) = 1 + [Group(Overlay 2)]_NormalStrength2("Normal Strength 2", Range(0,2)) = 1 + [Group(Overlay 2)]_RedColor2 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_GreenColor2 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_BlueColor2 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_Tint2_0 ("Tint 2_0",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_1 ("Tint 2_1",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_2 ("Tint 2_2",Color) = (1,1,1,1) + [Group(Overlay 2)]_Add2_0 ("Add 2_0",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_1 ("Add 2_1",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_2 ("Add 2_2",Color) = (0,0,0,0) + + // Overlay 3 + [GroupRollout(Overlay 3)] + [Group(Overlay 3)][NoScaleOffset]_Albedo3("Albedo3", 2D) = "white" {} + [Group(Overlay 3)][NoScaleOffset]_NormalMask3("NormalMask3", 2D) = "bump" {} + [Group(Overlay 3)][NoScaleOffset]_ColorMask3("ColorMask3", 2D) = "black" {} + [Group(Overlay 3)][NoScaleOffset]_AlphaMask3("Mask3", 2D) = "white" {} + [Group(Overlay 3)]_Tile3_0 ("Tile3_0", Float) = 1 + [Group(Overlay 3)]_Tile3_1 ("Tile3_1", Float) = 1 + [Group(Overlay 3)]_Tile3_2 ("Tile3_2", Float) = 1 + [Group(Overlay 3)]_NormalStrength3("Normal Strength 3", Range(0,2)) = 1 + [Group(Overlay 3)]_RedColor3 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_GreenColor3 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_BlueColor3 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_AlphaColor3 ("AlphaColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_Tint3_0 ("Tint 3_0",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_1 ("Tint 3_1",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_2 ("Tint 3_2",Color) = (1,1,1,1) + [Group(Overlay 3)]_Add3_0 ("Add 3_0",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_1 ("Add 3_1",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_2 ("Add 3_2",Color) = (0,0,0,0) + + /* This is what they should be + half4 Tiles[4][3]; + half4 Tints[4][3]; + half4 Adds[4][3]; + half4 RedColor[4]; + half4 GreenColor[4]; + half4 BlueColor[4]; + half NormalStrength[4]; */ + +END_PROPERTIES + +BEGIN_PASS("All") + Cull [_CullMode] +END_PASS + +// Any variables you want to have in the per material CBuffer go here. +BEGIN_CBUFFER + + half _OverlayCount; + half _ColorModulation; + half _SmoothnessModulation; + half _MetallicModulation; + half _EmissiveModulation; + + float _DoubleSidedNormalMode; + + + // These should ALL BE IN ARRAYS!!!!! + // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST + // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!! + // so until I can write a utility to save/restore these, but only in edit time, this is what they will be. + half _Tile0_0; + half _Tile0_1; + half _Tile0_2; + half4 _RedColor0; + half4 _GreenColor0; + half4 _BlueColor0; + half _NormalStrength0; + half4 _Tint0_0; + half4 _Tint0_1; + half4 _Tint0_2; + half4 _Add0_0; + half4 _Add0_1; + half4 _Add0_2; + half4 _HasTextures0; + + half _Tile1_0; + half _Tile1_1; + half _Tile1_2; + half4 _RedColor1; + half4 _GreenColor1; + half4 _BlueColor1; + half _NormalStrength1; + half4 _Tint1_0; + half4 _Tint1_1; + half4 _Tint1_2; + half4 _Add1_0; + half4 _Add1_1; + half4 _Add1_2; + half4 _HasTextures1; + + half _Tile2_0; + half _Tile2_1; + half _Tile2_2; + half4 _RedColor2; + half4 _GreenColor2; + half4 _BlueColor2; + half _NormalStrength2; + half4 _Tint2_0; + half4 _Tint2_1; + half4 _Tint2_2; + half4 _Add2_0; + half4 _Add2_1; + half4 _Add2_2; + half4 _HasTextures2; + + half _Tile3_0; + half _Tile3_1; + half _Tile3_2; + half4 _RedColor3; + half4 _GreenColor3; + half4 _BlueColor3; + half _NormalStrength3; + half4 _Tint3_0; + half4 _Tint3_1; + half4 _Tint3_2; + half4 _Add3_0; + half4 _Add3_1; + half4 _Add3_2; + half4 _HasTextures3; +END_CBUFFER + + +// if you are writing a subshader, any defines that should be set on the main +// shader are defined here +//BEGIN_DEFINES +// #define _SIMPLELIT 1 // compile as SimpleLit shader in URP, or as BlinPhong in standard +//END_DEFINES + + +// All code goes here + +BEGIN_CODE + + TEXTURE2D(_Albedo); + SAMPLER(sampler_Albedo); + TEXTURE2D(_NormalMask); + TEXTURE2D(_ColorMask); + + + TEXTURE2D(_Albedo1); + TEXTURE2D(_NormalMask1); + TEXTURE2D(_AlphaMask1); + TEXTURE2D(_ColorMask1); + + TEXTURE2D(_Albedo2); + TEXTURE2D(_NormalMask2); + TEXTURE2D(_AlphaMask2); + TEXTURE2D(_ColorMask2); + + TEXTURE2D(_Albedo3); + TEXTURE2D(_NormalMask3); + TEXTURE2D(_AlphaMask3); + TEXTURE2D(_ColorMask3); + + + + half3 UMAUnpackScaleNormal(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + // SM2.0: normal scaler is not supported + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + + + half4 ColorizeRGB(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor) + { + half4 Colors; + + if (length(values.rgb)==0.0f) + { + Colors.rgb = 0; + Colors.a = base_c.a; + } + else + { + half3 ColorPerc = normalize(values.rgb); + + half3 ColorRed = base_c.rgb * RedColor.rgb; + half3 ColorGreen = base_c.rgb * GreenColor.rgb; + half3 ColorBlue = base_c.rgb * BlueColor.rgb; + + Colors.rgb = (ColorRed.rgb * ColorPerc.r) + (ColorGreen.rgb * ColorPerc.g) + (ColorBlue.rgb * ColorPerc.b); + Colors.a = base_c.a; + } + return Colors; + } + + void SurfaceFunction(inout Surface o, ShaderData d) + { + // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used) + float2 auv = d.texcoord0.xy * _Tile0_0; + float2 nuv = d.texcoord0.xy * _Tile0_1; + float2 cuv = d.texcoord0.xy * _Tile0_2; + + half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv); + half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0; + + base_c = base_c * ColorizeRGB(base_c, mask, _RedColor0, _GreenColor0, _BlueColor0); + + half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1; + half3 base_n = UMAUnpackScaleNormal(basepackednormal,_NormalStrength0); + + half base_smooth = basepackednormal.a; + half base_Metallic = basepackednormal.b; + half base_Emissive = mask.a; + + o.Alpha = base_c.a; + + // There are IF/ELSE comments in here + // that I want to stay to remind me that I + // want to add that functionality later + if (_OverlayCount > 1) + { + float2 auv = d.texcoord0.xy * _Tile1_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile1_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv); + add_c = ColorizeRGB(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1); + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile1_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1; + half3 add_n = UMAUnpackScaleNormal(addpackednormal,_NormalStrength1); + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + base_Emissive = (addmask.a * alpha) + (base_Emissive * oneminus); + // + } + + + if (_OverlayCount > 2) + { + float2 auv = d.texcoord0.xy * _Tile2_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile2_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv); + add_c = ColorizeRGB(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2); + // + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile2_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1; + half3 add_n = UMAUnpackScaleNormal(addpackednormal,_NormalStrength2); + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + base_Emissive = (addmask.a * alpha) + (base_Emissive * oneminus); + // + } + + if (_OverlayCount > 3) + { + float2 auv = d.texcoord0.xy * _Tile3_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile3_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv); + add_c = ColorizeRGB(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3); + // + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile3_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1; + half3 add_n = UMAUnpackScaleNormal(addpackednormal,_NormalStrength2); + + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + base_Emissive = (addmask.a * alpha) + (base_Emissive * oneminus); + // + } + + o.Albedo = base_c * _ColorModulation; + o.Normal = base_n; + o.Metallic = base_Metallic * _MetallicModulation; + o.Smoothness = base_smooth * _SmoothnessModulation; + o.Emission = base_Emissive * _EmissiveModulation; + if (_DoubleSidedNormalMode == 0) + { + o.Normal *= d.isFrontFace ? 1 : -1; + } + else if (_DoubleSidedNormalMode == 1) + { + o.Normal.z *= d.isFrontFace ? 1 : -1; + } + } + +END_CODE + diff --git a/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer.surfshader.meta b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer.surfshader.meta new file mode 100644 index 000000000..09164dced --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer.surfshader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: bc3282599af992a4cb42a04a09c36f75 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: ed1b96e11e9064957833ce8c01da6f92, type: 3} diff --git a/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer_sp.umaShaderPack b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer_sp.umaShaderPack new file mode 100644 index 000000000..d6e8b55e3 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer_sp.umaShaderPack @@ -0,0 +1 @@ +{"MonoBehaviour":{"m_Enabled":true,"m_EditorHideFlags":0,"m_Name":"","m_EditorClassIdentifier":"","entries":[{"srpTarget":2,"UnityVersionMin":20194,"UnityVersionMax":20201,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2020.3.8f1\n// Render Pipeline: HDRP2019\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Albedo_NormalMask_ColorMask\"\n{\n Properties\n {\n \n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n\n [GroupRollout(Cullmode)]\n [Group(Cullmode)]_Cull(\"__cull\", Float) = 2.0\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_Albedo(\"Albedo\", 2D) = \"white\" {}\n [Group(Base Overlay)][NoScaleOffset]_NormalMask(\"NormalMask\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_ColorMask(\"ColorMask\", 2D) = \"black\" {}\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_AlphaColor0 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_Albedo1(\"Albedo1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_NormalMask1(\"NormalMask1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_ColorMask1(\"ColorMask1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n\t[Group(Overlay 1)]_RedColor1 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_GreenColor1 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_BlueColor1 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_AlphaColor1 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_Albedo2(\"Albedo2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_NormalMask2(\"NormalMask2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_ColorMask2(\"ColorMask2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n\t[Group(Overlay 2)]_RedColor2 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_GreenColor2 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_BlueColor2 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_AlphaColor2 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_Albedo3(\"Albedo3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_NormalMask3(\"NormalMask3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_ColorMask3(\"ColorMask3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n\t[Group(Overlay 3)]_RedColor3 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_GreenColor3 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_BlueColor3 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_AlphaColor3 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n /* This is what they should be \n half4 Tiles[4][3];\n\thalf4 Tints[4][3];\n\thalf4 Adds[4][3];\n half4 RedColor[4];\n half4 GreenColor[4];\n half4 BlueColor[4];\n half4 AlphaColor[4];\n half NormalStrength[4]; */\n\n\n\n\n [HideInInspector] _StencilRef(\"Vector1 \", Int) = 0\n [HideInInspector] _StencilWriteMask(\"Vector1 \", Int) = 3\n [HideInInspector] _StencilRefDepth(\"Vector1 \", Int) = 0\n [HideInInspector] _StencilWriteMaskDepth(\"Vector1 \", Int) = 32\n [HideInInspector] _StencilRefMV(\"Vector1 \", Int) = 128\n [HideInInspector] _StencilWriteMaskMV(\"Vector1 \", Int) = 128\n [HideInInspector] _StencilRefDistortionVec(\"Vector1 \", Int) = 64\n [HideInInspector] _StencilWriteMaskDistortionVec(\"Vector1 \", Int) = 64\n [HideInInspector] _StencilWriteMaskGBuffer(\"Vector1 \", Int) = 3\n [HideInInspector] _StencilRefGBuffer(\"Vector1 \", Int) = 2\n [HideInInspector] _ZTestGBuffer(\"Vector1 \", Int) = 4\n [HideInInspector] [ToggleUI] _RequireSplitLighting(\"Boolean\", Float) = 0\n [HideInInspector] [ToggleUI] _ReceivesSSR(\"Boolean\", Float) = 1\n [HideInInspector] _SurfaceType(\"Vector1 \", Float) = 0\n [HideInInspector] [ToggleUI] _ZWrite(\"Boolean\", Float) = 0\n [HideInInspector] _TransparentSortPriority(\"Vector1 \", Int) = 0\n [HideInInspector] _ZTestDepthEqualForOpaque(\"Vector1 \", Int) = 4\n [HideInInspector] [Enum(UnityEngine.Rendering.CompareFunction)] _ZTestTransparent(\"Vector1\", Float) = 4\n [HideInInspector] [ToggleUI] _TransparentBackfaceEnable(\"Boolean\", Float) = 0\n [HideInInspector] [ToggleUI] _AlphaCutoffEnable(\"Boolean\", Float) = 0\n [HideInInspector] [ToggleUI] _UseShadowThreshold(\"Boolean\", Float) = 0\n [HideInInspector] _BlendMode(\"Float\", Float) = 0\n }\n SubShader\n {\n Tags { \"RenderPipeline\"=\"HDRenderPipeline\" \"RenderPipeline\" = \"HDRenderPipeline\" \"RenderType\" = \"HDLitShader\" \"Queue\" = \"Geometry+225\" }\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"Forward\"\n Tags { \"LightMode\" = \"Forward\" }\n\n \n \n \n \n // Stencil setup\n Stencil\n {\n WriteMask [_StencilWriteMask]\n Ref [_StencilRef]\n Comp Always\n Pass Replace\n }\n \n ColorMask [_ColorMaskTransparentVel] 1\n\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n \n //#pragma multi_compile_local _ _ALPHATEST_ON\n \n // #pragma multi_compile _ LOD_FADE_CROSSFADE\n \n //#pragma shader_feature _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADDITIVE _BLENDMODE_PRE_MULTIPLY\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_FORWARD\n #define _PASSFORWARD 1\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n \n #pragma multi_compile _ DEBUG_DISPLAY\n #pragma multi_compile _ LIGHTMAP_ON\n #pragma multi_compile _ DIRLIGHTMAP_COMBINED\n #pragma multi_compile _ DYNAMICLIGHTMAP_ON\n #pragma multi_compile _ SHADOWS_SHADOWMASK\n #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT\n #pragma multi_compile USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST\n #pragma multi_compile SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH\n #define REQUIRE_DEPTH_TEXTURE\n \n\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n \n // define FragInputs structure\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl\"\n #endif\n\n\n \n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #ifdef DEBUG_DISPLAY\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n \n #if (SHADERPASS == SHADERPASS_FORWARD)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n \n #define HAS_LIGHTLOOP\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #else\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n // Used by SceneSelectionPass\n int _ObjectId;\n int _PassValue;\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _StencilRef;\n float _StencilWriteMask;\n float _StencilRefDepth;\n float _StencilWriteMaskDepth;\n float _StencilRefMV;\n float _StencilWriteMaskMV;\n float _StencilRefDistortionVec;\n float _StencilWriteMaskDistortionVec;\n float _StencilWriteMaskGBuffer;\n float _StencilRefGBuffer;\n float _ZTestGBuffer;\n float _RequireSplitLighting;\n float _ReceivesSSR;\n float _ZWrite;\n float _TransparentSortPriority;\n float _ZTestDepthEqualForOpaque;\n float _ZTestTransparent;\n float _TransparentBackfaceEnable;\n float _AlphaCutoffEnable;\n float _UseShadowThreshold;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\nstruct VaryingsToPS\n{\n VertexToPixel vmesh;\n #ifdef VARYINGS_NEED_PASS\n VaryingsPassToPS vpass;\n #endif\n};\n\nstruct PackedVaryingsToPS\n{\n #ifdef VARYINGS_NEED_PASS\n PackedVaryingsPassToPS vpass;\n #endif\n VertexToPixel vmesh;\n\n UNITY_VERTEX_OUTPUT_STEREO\n};\n\nPackedVaryingsToPS PackVaryingsToPS(VaryingsToPS input)\n{\n PackedVaryingsToPS output = (PackedVaryingsToPS)0;\n output.vmesh = input.vmesh;\n #ifdef VARYINGS_NEED_PASS\n output.vpass = PackVaryingsPassToPS(input.vpass);\n #endif\n\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n return output;\n}\n\n\n\n\nVertexToPixel VertMesh(VertexData input)\n{\n VertexToPixel output = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n\n \n ChainModifyVertex(input, output, _Time);\n\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n return output;\n}\n\n\n#if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\nvoid MeshDecalsPositionZBias(inout VaryingsToPS input)\n{\n#if defined(UNITY_REVERSED_Z)\n input.vmesh.pos.z -= _DecalMeshDepthBias;\n#else\n input.vmesh.pos.z += _DecalMeshDepthBias;\n#endif\n}\n#endif\n\n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n// This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\nfloat unity_OneOverOutputBoost;\nfloat unity_MaxOutputValue;\n\nCBUFFER_START(UnityMetaPass)\n// x = use uv1 as raster position\n// y = use uv2 as raster position\nbool4 unity_MetaVertexControl;\n\n// x = return albedo\n// y = return normal\nbool4 unity_MetaFragmentControl;\nCBUFFER_END\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS output = (VaryingsToPS)0;\n output.vmesh = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output.vmesh);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.vmesh.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n#ifdef VARYINGS_NEED_POSITION_WS\n output.vmesh.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz);\n#endif\n\n#ifdef VARYINGS_NEED_TANGENT_TO_WORLD\n // Normal is required for triplanar mapping\n output.vmesh.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.vmesh.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n#endif\n\n output.vmesh.texcoord0 = inputMesh.texcoord0;\n output.vmesh.texcoord1 = inputMesh.texcoord1;\n output.vmesh.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.vmesh.texcoord3 = inputMesh.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vmesh.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return PackVaryingsToPS(output);\n}\n#else\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS varyingsType;\n varyingsType.vmesh = VertMesh(inputMesh);\n #if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\n MeshDecalsPositionZBias(varyingsType);\n #endif\n return PackVaryingsToPS(varyingsType);\n}\n\n#endif\n\n\n\n \n\n \n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n \n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n \n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n \n #ifdef _HAS_REFRACTION\n if (_EnableSSRefraction)\n {\n // surfaceData.ior = surfaceDescription.RefractionIndex;\n // surfaceData.transmittanceColor = surfaceDescription.RefractionColor;\n // surfaceData.atDistance = surfaceDescription.RefractionDistance;\n \n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n \n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n // surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n\n \n // tangent-space normal\n float3 normalTS = float3(0.0f, 0.0f, 1.0f);\n normalTS = surfaceDescription.Normal;\n \n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(normalTS, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = normalTS; \n #endif\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n // surfaceData.tangentWS = TransformTangentToWorld(surfaceDescription.Tangent, fragInputs.tangentToWorld);\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n #if VERSION_GREATER_EQUAL(10,2)\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceData.geomNormalWS, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData.geomNormalWS, surfaceData);\n #else\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData);\n #endif\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #ifdef _ENABLE_GEOMETRIC_SPECULAR_AA\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // uint3 fadeMaskSeed = asuint((int3)(V * _ScreenSize.xyx)); // Quantize V to _ScreenSize values\n // LODDitheringTransition(fadeMaskSeed, unity_LODFade.x);\n //#endif\n \n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n \n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = posInput.deviceDepth;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n \n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceDescription.Distortion;\n //builtinData.distortionBlur = surfaceDescription.DistortionBlur;\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #else\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #endif\n \n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n }\n \n \n void Frag(PackedVaryingsToPS packedInput,\n #ifdef OUTPUT_SPLIT_LIGHTING\n out float4 outColor : SV_Target0, // outSpecularLighting\n out float4 outDiffuseLighting : SV_Target1,\n OUTPUT_SSSBUFFER(outSSSBuffer)\n #else\n out float4 outColor : SV_Target0\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n , out float4 outMotionVec : SV_Target1\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif // OUTPUT_SPLIT_LIGHTING\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n // Init outMotionVector here to solve compiler warning (potentially unitialized variable)\n // It is init to the value of forceNoMotion (with 2.0)\n outMotionVec = float4(2.0, 0.0, 0.0, 0.0);\n #endif\n\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);\n FragInputs input = BuildFragInputs(packedInput.vmesh);\n\n // We need to readapt the SS position as our screen space positions are for a low res buffer, but we try to access a full res buffer.\n input.positionSS.xy = _OffScreenRendering > 0 ? (input.positionSS.xy * _OffScreenDownsampleFactor) : input.positionSS.xy;\n\n uint2 tileIndex = uint2(input.positionSS.xy) / GetTileSize();\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, tileIndex);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(packedInput.vmesh, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n\n PreLightData preLightData = GetPreLightData(V, posInput, bsdfData);\n\n outColor = float4(0.0, 0.0, 0.0, 0.0);\n\n // We need to skip lighting when doing debug pass because the debug pass is done before lighting so some buffers may not be properly initialized potentially causing crashes on PS4.\n\n #ifdef DEBUG_DISPLAY\n // Init in debug display mode to quiet warning\n #ifdef OUTPUT_SPLIT_LIGHTING\n outDiffuseLighting = 0;\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #endif\n\n \n\n // Same code in ShaderPassForwardUnlit.shader\n // Reminder: _DebugViewMaterialArray[i]\n // i==0 -> the size used in the buffer\n // i>0 -> the index used (0 value means nothing)\n // The index stored in this buffer could either be\n // - a gBufferIndex (always stored in _DebugViewMaterialArray[1] as only one supported)\n // - a property index which is different for each kind of material even if reflecting the same thing (see MaterialSharedProperty)\n bool viewMaterial = false;\n int bufferSize = int(_DebugViewMaterialArray[0]);\n if (bufferSize != 0)\n {\n bool needLinearToSRGB = false;\n float3 result = float3(1.0, 0.0, 1.0);\n\n // Loop through the whole buffer\n // Works because GetSurfaceDataDebug will do nothing if the index is not a known one\n for (int index = 1; index <= bufferSize; index++)\n {\n int indexMaterialProperty = int(_DebugViewMaterialArray[index]);\n\n // skip if not really in use\n if (indexMaterialProperty != 0)\n {\n viewMaterial = true;\n\n GetPropertiesDataDebug(indexMaterialProperty, result, needLinearToSRGB);\n GetVaryingsDataDebug(indexMaterialProperty, input, result, needLinearToSRGB);\n GetBuiltinDataDebug(indexMaterialProperty, builtinData, result, needLinearToSRGB);\n GetSurfaceDataDebug(indexMaterialProperty, surfaceData, result, needLinearToSRGB);\n GetBSDFDataDebug(indexMaterialProperty, bsdfData, result, needLinearToSRGB);\n }\n }\n\n // TEMP!\n // For now, the final blit in the backbuffer performs an sRGB write\n // So in the meantime we apply the inverse transform to linear data to compensate.\n if (!needLinearToSRGB)\n result = SRGBToLinear(max(0, result));\n\n outColor = float4(result, 1.0);\n }\n\n if (!viewMaterial)\n {\n if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_DIFFUSE_COLOR || _DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_SPECULAR_COLOR)\n {\n float3 result = float3(0.0, 0.0, 0.0);\n\n GetPBRValidatorDebug(surfaceData, result);\n\n outColor = float4(result, 1.0f);\n }\n else if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_TRANSPARENCY_OVERDRAW)\n {\n float4 result = _DebugTransparencyOverdrawWeight * float4(TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_A);\n outColor = result;\n }\n else\n #endif\n {\n #ifdef _SURFACE_TYPE_TRANSPARENT\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_TRANSPARENT;\n #else\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_OPAQUE;\n #endif\n\n float3 diffuseLighting;\n float3 specularLighting;\n\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n {\n LightLoopOutput lightLoopOutput;\n LightLoop(V, posInput, preLightData, bsdfData, builtinData, featureFlags, lightLoopOutput);\n\n // Alias\n diffuseLighting = lightLoopOutput.diffuseLighting;\n specularLighting = lightLoopOutput.specularLighting;\n }\n #else\n {\n LightLoop(V, posInput, preLightData, bsdfData, builtinData, featureFlags, diffuseLighting, specularLighting);\n }\n #endif\n\n diffuseLighting *= GetCurrentExposureMultiplier();\n specularLighting *= GetCurrentExposureMultiplier();\n\n #ifdef OUTPUT_SPLIT_LIGHTING\n if (_EnableSubsurfaceScattering != 0 && ShouldOutputSplitLighting(bsdfData))\n {\n outColor = float4(specularLighting, 1.0);\n outDiffuseLighting = float4(TagLightingForSSS(diffuseLighting), 1.0);\n }\n else\n {\n outColor = float4(diffuseLighting + specularLighting, 1.0);\n outDiffuseLighting = 0;\n }\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #else\n outColor = ApplyBlendMode(diffuseLighting, specularLighting, builtinData.opacity);\n outColor = EvaluateAtmosphericScattering(posInput, V, outColor);\n #endif\n\n ChainFinalColorForward(l, d, outColor);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n VaryingsPassToPS inputPass = UnpackVaryingsPassToPS(packedInput.vpass);\n bool forceNoMotion = any(unity_MotionVectorsParams.yw == 0.0);\n // outMotionVec is already initialize at the value of forceNoMotion (see above)\n if (!forceNoMotion)\n {\n float2 motionVec = CalculateMotionVector(inputPass.positionCS, inputPass.previousPositionCS);\n EncodeMotionVector(motionVec * 0.5, outMotionVec);\n outMotionVec.zw = 1.0;\n }\n #endif\n }\n\n #ifdef DEBUG_DISPLAY\n }\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"ShadowCaster\"\n Tags { \"LightMode\" = \"ShadowCaster\" }\n\n \n\n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n\n ZClip [_ZClip]\n ZWrite On\n ZTest LEqual\n\n ColorMask 0\n\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n //#pragma shader_feature _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _ _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_SHADOWS\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSSHADOW 1\n\n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n //-------------------------------------------------------------------------------------\n // Defines\n //-------------------------------------------------------------------------------------\n \n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n \n // define FragInputs structure\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl\"\n #endif\n\n\n \n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #ifdef DEBUG_DISPLAY\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n \n #if (SHADERPASS == SHADERPASS_FORWARD)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n \n #define HAS_LIGHTLOOP\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #else\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n // Used by SceneSelectionPass\n int _ObjectId;\n int _PassValue;\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n UNITY_VERTEX_OUTPUT_STEREO\n };\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n\n float _StencilRef;\n float _StencilWriteMask;\n float _StencilRefDepth;\n float _StencilWriteMaskDepth;\n float _StencilRefMV;\n float _StencilWriteMaskMV;\n float _StencilRefDistortionVec;\n float _StencilWriteMaskDistortionVec;\n float _StencilWriteMaskGBuffer;\n float _StencilRefGBuffer;\n float _ZTestGBuffer;\n float _RequireSplitLighting;\n float _ReceivesSSR;\n float _ZWrite;\n float _TransparentSortPriority;\n float _ZTestDepthEqualForOpaque;\n float _ZTestTransparent;\n float _TransparentBackfaceEnable;\n float _AlphaCutoffEnable;\n float _UseShadowThreshold;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\nstruct VaryingsToPS\n{\n VertexToPixel vmesh;\n #ifdef VARYINGS_NEED_PASS\n VaryingsPassToPS vpass;\n #endif\n};\n\nstruct PackedVaryingsToPS\n{\n #ifdef VARYINGS_NEED_PASS\n PackedVaryingsPassToPS vpass;\n #endif\n VertexToPixel vmesh;\n\n UNITY_VERTEX_OUTPUT_STEREO\n};\n\nPackedVaryingsToPS PackVaryingsToPS(VaryingsToPS input)\n{\n PackedVaryingsToPS output = (PackedVaryingsToPS)0;\n output.vmesh = input.vmesh;\n #ifdef VARYINGS_NEED_PASS\n output.vpass = PackVaryingsPassToPS(input.vpass);\n #endif\n\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n return output;\n}\n\n\n\n\nVertexToPixel VertMesh(VertexData input)\n{\n VertexToPixel output = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n\n \n ChainModifyVertex(input, output, _Time);\n\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n return output;\n}\n\n\n#if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\nvoid MeshDecalsPositionZBias(inout VaryingsToPS input)\n{\n#if defined(UNITY_REVERSED_Z)\n input.vmesh.pos.z -= _DecalMeshDepthBias;\n#else\n input.vmesh.pos.z += _DecalMeshDepthBias;\n#endif\n}\n#endif\n\n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n// This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\nfloat unity_OneOverOutputBoost;\nfloat unity_MaxOutputValue;\n\nCBUFFER_START(UnityMetaPass)\n// x = use uv1 as raster position\n// y = use uv2 as raster position\nbool4 unity_MetaVertexControl;\n\n// x = return albedo\n// y = return normal\nbool4 unity_MetaFragmentControl;\nCBUFFER_END\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS output = (VaryingsToPS)0;\n output.vmesh = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output.vmesh);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.vmesh.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n#ifdef VARYINGS_NEED_POSITION_WS\n output.vmesh.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz);\n#endif\n\n#ifdef VARYINGS_NEED_TANGENT_TO_WORLD\n // Normal is required for triplanar mapping\n output.vmesh.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.vmesh.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n#endif\n\n output.vmesh.texcoord0 = inputMesh.texcoord0;\n output.vmesh.texcoord1 = inputMesh.texcoord1;\n output.vmesh.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.vmesh.texcoord3 = inputMesh.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vmesh.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return PackVaryingsToPS(output);\n}\n#else\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS varyingsType;\n varyingsType.vmesh = VertMesh(inputMesh);\n #if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\n MeshDecalsPositionZBias(varyingsType);\n #endif\n return PackVaryingsToPS(varyingsType);\n}\n\n#endif\n\n\n\n \n\n \n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n \n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n \n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n \n #ifdef _HAS_REFRACTION\n if (_EnableSSRefraction)\n {\n // surfaceData.ior = surfaceDescription.RefractionIndex;\n // surfaceData.transmittanceColor = surfaceDescription.RefractionColor;\n // surfaceData.atDistance = surfaceDescription.RefractionDistance;\n \n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n \n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n // surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n\n \n // tangent-space normal\n float3 normalTS = float3(0.0f, 0.0f, 1.0f);\n normalTS = surfaceDescription.Normal;\n \n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(normalTS, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = normalTS; \n #endif\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n // surfaceData.tangentWS = TransformTangentToWorld(surfaceDescription.Tangent, fragInputs.tangentToWorld);\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n #if VERSION_GREATER_EQUAL(10,2)\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceData.geomNormalWS, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData.geomNormalWS, surfaceData);\n #else\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData);\n #endif\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #ifdef _ENABLE_GEOMETRIC_SPECULAR_AA\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // uint3 fadeMaskSeed = asuint((int3)(V * _ScreenSize.xyx)); // Quantize V to _ScreenSize values\n // LODDitheringTransition(fadeMaskSeed, unity_LODFade.x);\n //#endif\n \n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n \n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = posInput.deviceDepth;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n \n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceDescription.Distortion;\n //builtinData.distortionBlur = surfaceDescription.DistortionBlur;\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #else\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #endif\n \n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n }\n \n\n\n void Frag( PackedVaryingsToPS packedInput\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #ifdef WRITE_MSAA_DEPTH\n , out float1 depthColor : SV_Target1\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When only WRITE_MSAA_DEPTH is define and not WRITE_NORMAL_BUFFER it mean we are Unlit and only need depth, but we still have normal buffer binded\n , out float4 outNormalBuffer : SV_Target0\n , out float1 depthColor : SV_Target1\n #elif defined(SCENESELECTIONPASS)\n , out float4 outColor : SV_Target0\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);\n FragInputs input = BuildFragInputs(packedInput.vmesh);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n \n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(packedInput.vmesh, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), posInput.positionSS, outNormalBuffer);\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When we are MSAA depth only without normal buffer\n // Due to the binding order of these two render targets, we need to have them both declared\n outNormalBuffer = float4(0.0, 0.0, 0.0, 1.0);\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #elif defined(SCENESELECTIONPASS)\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #endif\n }\n\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"META\"\n Tags { \"LightMode\" = \"META\" }\n \n Cull Off\n \n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n //#pragma shader_feature _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _ _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_LIGHT_TRANSPORT\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define REQUIRE_DEPTH_TEXTURE\n #define _PASSMETA 1\n\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n\n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n \n // define FragInputs structure\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl\"\n #endif\n\n\n \n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #ifdef DEBUG_DISPLAY\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n \n #if (SHADERPASS == SHADERPASS_FORWARD)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n \n #define HAS_LIGHTLOOP\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #else\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n // Used by SceneSelectionPass\n int _ObjectId;\n int _PassValue;\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n\n float _StencilRef;\n float _StencilWriteMask;\n float _StencilRefDepth;\n float _StencilWriteMaskDepth;\n float _StencilRefMV;\n float _StencilWriteMaskMV;\n float _StencilRefDistortionVec;\n float _StencilWriteMaskDistortionVec;\n float _StencilWriteMaskGBuffer;\n float _StencilRefGBuffer;\n float _ZTestGBuffer;\n float _RequireSplitLighting;\n float _ReceivesSSR;\n float _ZWrite;\n float _TransparentSortPriority;\n float _ZTestDepthEqualForOpaque;\n float _ZTestTransparent;\n float _TransparentBackfaceEnable;\n float _AlphaCutoffEnable;\n float _UseShadowThreshold;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\nstruct VaryingsToPS\n{\n VertexToPixel vmesh;\n #ifdef VARYINGS_NEED_PASS\n VaryingsPassToPS vpass;\n #endif\n};\n\nstruct PackedVaryingsToPS\n{\n #ifdef VARYINGS_NEED_PASS\n PackedVaryingsPassToPS vpass;\n #endif\n VertexToPixel vmesh;\n\n UNITY_VERTEX_OUTPUT_STEREO\n};\n\nPackedVaryingsToPS PackVaryingsToPS(VaryingsToPS input)\n{\n PackedVaryingsToPS output = (PackedVaryingsToPS)0;\n output.vmesh = input.vmesh;\n #ifdef VARYINGS_NEED_PASS\n output.vpass = PackVaryingsPassToPS(input.vpass);\n #endif\n\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n return output;\n}\n\n\n\n\nVertexToPixel VertMesh(VertexData input)\n{\n VertexToPixel output = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n\n \n ChainModifyVertex(input, output, _Time);\n\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n return output;\n}\n\n\n#if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\nvoid MeshDecalsPositionZBias(inout VaryingsToPS input)\n{\n#if defined(UNITY_REVERSED_Z)\n input.vmesh.pos.z -= _DecalMeshDepthBias;\n#else\n input.vmesh.pos.z += _DecalMeshDepthBias;\n#endif\n}\n#endif\n\n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n// This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\nfloat unity_OneOverOutputBoost;\nfloat unity_MaxOutputValue;\n\nCBUFFER_START(UnityMetaPass)\n// x = use uv1 as raster position\n// y = use uv2 as raster position\nbool4 unity_MetaVertexControl;\n\n// x = return albedo\n// y = return normal\nbool4 unity_MetaFragmentControl;\nCBUFFER_END\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS output = (VaryingsToPS)0;\n output.vmesh = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output.vmesh);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.vmesh.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n#ifdef VARYINGS_NEED_POSITION_WS\n output.vmesh.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz);\n#endif\n\n#ifdef VARYINGS_NEED_TANGENT_TO_WORLD\n // Normal is required for triplanar mapping\n output.vmesh.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.vmesh.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n#endif\n\n output.vmesh.texcoord0 = inputMesh.texcoord0;\n output.vmesh.texcoord1 = inputMesh.texcoord1;\n output.vmesh.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.vmesh.texcoord3 = inputMesh.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vmesh.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return PackVaryingsToPS(output);\n}\n#else\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS varyingsType;\n varyingsType.vmesh = VertMesh(inputMesh);\n #if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\n MeshDecalsPositionZBias(varyingsType);\n #endif\n return PackVaryingsToPS(varyingsType);\n}\n\n#endif\n\n\n\n \n\n \n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n \n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n \n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n \n #ifdef _HAS_REFRACTION\n if (_EnableSSRefraction)\n {\n // surfaceData.ior = surfaceDescription.RefractionIndex;\n // surfaceData.transmittanceColor = surfaceDescription.RefractionColor;\n // surfaceData.atDistance = surfaceDescription.RefractionDistance;\n \n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n \n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n // surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n\n \n // tangent-space normal\n float3 normalTS = float3(0.0f, 0.0f, 1.0f);\n normalTS = surfaceDescription.Normal;\n \n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(normalTS, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = normalTS; \n #endif\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n // surfaceData.tangentWS = TransformTangentToWorld(surfaceDescription.Tangent, fragInputs.tangentToWorld);\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n #if VERSION_GREATER_EQUAL(10,2)\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceData.geomNormalWS, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData.geomNormalWS, surfaceData);\n #else\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData);\n #endif\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #ifdef _ENABLE_GEOMETRIC_SPECULAR_AA\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // uint3 fadeMaskSeed = asuint((int3)(V * _ScreenSize.xyx)); // Quantize V to _ScreenSize values\n // LODDitheringTransition(fadeMaskSeed, unity_LODFade.x);\n //#endif\n \n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n \n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = posInput.deviceDepth;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n \n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceDescription.Distortion;\n //builtinData.distortionBlur = surfaceDescription.DistortionBlur;\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #else\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #endif\n \n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n }\n\n\n float4 Frag(PackedVaryingsToPS packedInput\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n\n ) : SV_Target\n {\n FragInputs input = BuildFragInputs(packedInput.vmesh);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(packedInput.vmesh, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n // no debug apply during light transport pass\n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n LightTransportData lightTransportData = GetLightTransportData(surfaceData, builtinData, bsdfData);\n\n // This shader is call two times. Once for getting emissiveColor, the other time to get diffuseColor\n // We use unity_MetaFragmentControl to make the distinction.\n float4 res = float4(0.0, 0.0, 0.0, 1.0);\n\n if (unity_MetaFragmentControl.x)\n {\n // Apply diffuseColor Boost from LightmapSettings.\n // put abs here to silent a warning, no cost, no impact as color is assume to be positive.\n res.rgb = clamp(pow(abs(lightTransportData.diffuseColor), saturate(unity_OneOverOutputBoost)), 0, unity_MaxOutputValue);\n }\n\n if (unity_MetaFragmentControl.y)\n {\n // emissive use HDR format\n res.rgb = lightTransportData.emissiveColor;\n }\n\n return res;\n }\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"SceneSelectionPass\"\n Tags { \"LightMode\" = \"SceneSelectionPass\" }\n \n ColorMask 0\n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n \n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n //#pragma shader_feature _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _ _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #define SCENESELECTIONPASS\n #pragma editor_sync_compilation\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSSCENESELECT 1\n\n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n \n // define FragInputs structure\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl\"\n #endif\n\n\n \n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #ifdef DEBUG_DISPLAY\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n \n #if (SHADERPASS == SHADERPASS_FORWARD)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n \n #define HAS_LIGHTLOOP\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #else\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n // Used by SceneSelectionPass\n int _ObjectId;\n int _PassValue;\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n UNITY_VERTEX_OUTPUT_STEREO\n };\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n\n float _StencilRef;\n float _StencilWriteMask;\n float _StencilRefDepth;\n float _StencilWriteMaskDepth;\n float _StencilRefMV;\n float _StencilWriteMaskMV;\n float _StencilRefDistortionVec;\n float _StencilWriteMaskDistortionVec;\n float _StencilWriteMaskGBuffer;\n float _StencilRefGBuffer;\n float _ZTestGBuffer;\n float _RequireSplitLighting;\n float _ReceivesSSR;\n float _ZWrite;\n float _TransparentSortPriority;\n float _ZTestDepthEqualForOpaque;\n float _ZTestTransparent;\n float _TransparentBackfaceEnable;\n float _AlphaCutoffEnable;\n float _UseShadowThreshold;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\nstruct VaryingsToPS\n{\n VertexToPixel vmesh;\n #ifdef VARYINGS_NEED_PASS\n VaryingsPassToPS vpass;\n #endif\n};\n\nstruct PackedVaryingsToPS\n{\n #ifdef VARYINGS_NEED_PASS\n PackedVaryingsPassToPS vpass;\n #endif\n VertexToPixel vmesh;\n\n UNITY_VERTEX_OUTPUT_STEREO\n};\n\nPackedVaryingsToPS PackVaryingsToPS(VaryingsToPS input)\n{\n PackedVaryingsToPS output = (PackedVaryingsToPS)0;\n output.vmesh = input.vmesh;\n #ifdef VARYINGS_NEED_PASS\n output.vpass = PackVaryingsPassToPS(input.vpass);\n #endif\n\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n return output;\n}\n\n\n\n\nVertexToPixel VertMesh(VertexData input)\n{\n VertexToPixel output = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n\n \n ChainModifyVertex(input, output, _Time);\n\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n return output;\n}\n\n\n#if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\nvoid MeshDecalsPositionZBias(inout VaryingsToPS input)\n{\n#if defined(UNITY_REVERSED_Z)\n input.vmesh.pos.z -= _DecalMeshDepthBias;\n#else\n input.vmesh.pos.z += _DecalMeshDepthBias;\n#endif\n}\n#endif\n\n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n// This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\nfloat unity_OneOverOutputBoost;\nfloat unity_MaxOutputValue;\n\nCBUFFER_START(UnityMetaPass)\n// x = use uv1 as raster position\n// y = use uv2 as raster position\nbool4 unity_MetaVertexControl;\n\n// x = return albedo\n// y = return normal\nbool4 unity_MetaFragmentControl;\nCBUFFER_END\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS output = (VaryingsToPS)0;\n output.vmesh = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output.vmesh);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.vmesh.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n#ifdef VARYINGS_NEED_POSITION_WS\n output.vmesh.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz);\n#endif\n\n#ifdef VARYINGS_NEED_TANGENT_TO_WORLD\n // Normal is required for triplanar mapping\n output.vmesh.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.vmesh.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n#endif\n\n output.vmesh.texcoord0 = inputMesh.texcoord0;\n output.vmesh.texcoord1 = inputMesh.texcoord1;\n output.vmesh.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.vmesh.texcoord3 = inputMesh.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vmesh.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return PackVaryingsToPS(output);\n}\n#else\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS varyingsType;\n varyingsType.vmesh = VertMesh(inputMesh);\n #if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\n MeshDecalsPositionZBias(varyingsType);\n #endif\n return PackVaryingsToPS(varyingsType);\n}\n\n#endif\n\n\n\n \n\n \n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n \n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n \n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n \n #ifdef _HAS_REFRACTION\n if (_EnableSSRefraction)\n {\n // surfaceData.ior = surfaceDescription.RefractionIndex;\n // surfaceData.transmittanceColor = surfaceDescription.RefractionColor;\n // surfaceData.atDistance = surfaceDescription.RefractionDistance;\n \n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n \n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n // surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n\n \n // tangent-space normal\n float3 normalTS = float3(0.0f, 0.0f, 1.0f);\n normalTS = surfaceDescription.Normal;\n \n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(normalTS, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = normalTS; \n #endif\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n // surfaceData.tangentWS = TransformTangentToWorld(surfaceDescription.Tangent, fragInputs.tangentToWorld);\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n #if VERSION_GREATER_EQUAL(10,2)\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceData.geomNormalWS, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData.geomNormalWS, surfaceData);\n #else\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData);\n #endif\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #ifdef _ENABLE_GEOMETRIC_SPECULAR_AA\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // uint3 fadeMaskSeed = asuint((int3)(V * _ScreenSize.xyx)); // Quantize V to _ScreenSize values\n // LODDitheringTransition(fadeMaskSeed, unity_LODFade.x);\n //#endif\n \n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n \n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = posInput.deviceDepth;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n \n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceDescription.Distortion;\n //builtinData.distortionBlur = surfaceDescription.DistortionBlur;\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #else\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #endif\n \n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n }\n \n\n \n void Frag( PackedVaryingsToPS packedInput\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #ifdef WRITE_MSAA_DEPTH\n , out float1 depthColor : SV_Target1\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When only WRITE_MSAA_DEPTH is define and not WRITE_NORMAL_BUFFER it mean we are Unlit and only need depth, but we still have normal buffer binded\n , out float4 outNormalBuffer : SV_Target0\n , out float1 depthColor : SV_Target1\n #elif defined(SCENESELECTIONPASS)\n , out float4 outColor : SV_Target0\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);\n FragInputs input = BuildFragInputs(packedInput.vmesh);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(packedInput.vmesh, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), posInput.positionSS, outNormalBuffer);\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When we are MSAA depth only without normal buffer\n // Due to the binding order of these two render targets, we need to have them both declared\n outNormalBuffer = float4(0.0, 0.0, 0.0, 1.0);\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #elif defined(SCENESELECTIONPASS)\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"DepthOnly\"\n Tags { \"LightMode\" = \"DepthOnly\" }\n \n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n \n \n ZWrite On\n \n \n // Stencil setup\n Stencil\n {\n WriteMask [_StencilWriteMaskDepth]\n Ref [_StencilRefDepth]\n Comp Always\n Pass Replace\n }\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n \n //#pragma multi_compile_local _ _ALPHATEST_ON\n \n // #pragma multi_compile _ LOD_FADE_CROSSFADE\n \n //#pragma shader_feature _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _ _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #pragma multi_compile _ WRITE_NORMAL_BUFFER\n #pragma multi_compile _ WRITE_MSAA_DEPTH\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSDEPTH 1\n\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n \n // define FragInputs structure\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl\"\n #endif\n\n\n \n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #ifdef DEBUG_DISPLAY\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n \n #if (SHADERPASS == SHADERPASS_FORWARD)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n \n #define HAS_LIGHTLOOP\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #else\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n // Used by SceneSelectionPass\n int _ObjectId;\n int _PassValue;\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _StencilRef;\n float _StencilWriteMask;\n float _StencilRefDepth;\n float _StencilWriteMaskDepth;\n float _StencilRefMV;\n float _StencilWriteMaskMV;\n float _StencilRefDistortionVec;\n float _StencilWriteMaskDistortionVec;\n float _StencilWriteMaskGBuffer;\n float _StencilRefGBuffer;\n float _ZTestGBuffer;\n float _RequireSplitLighting;\n float _ReceivesSSR;\n float _ZWrite;\n float _TransparentSortPriority;\n float _ZTestDepthEqualForOpaque;\n float _ZTestTransparent;\n float _TransparentBackfaceEnable;\n float _AlphaCutoffEnable;\n float _UseShadowThreshold;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\nstruct VaryingsToPS\n{\n VertexToPixel vmesh;\n #ifdef VARYINGS_NEED_PASS\n VaryingsPassToPS vpass;\n #endif\n};\n\nstruct PackedVaryingsToPS\n{\n #ifdef VARYINGS_NEED_PASS\n PackedVaryingsPassToPS vpass;\n #endif\n VertexToPixel vmesh;\n\n UNITY_VERTEX_OUTPUT_STEREO\n};\n\nPackedVaryingsToPS PackVaryingsToPS(VaryingsToPS input)\n{\n PackedVaryingsToPS output = (PackedVaryingsToPS)0;\n output.vmesh = input.vmesh;\n #ifdef VARYINGS_NEED_PASS\n output.vpass = PackVaryingsPassToPS(input.vpass);\n #endif\n\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n return output;\n}\n\n\n\n\nVertexToPixel VertMesh(VertexData input)\n{\n VertexToPixel output = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n\n \n ChainModifyVertex(input, output, _Time);\n\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n return output;\n}\n\n\n#if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\nvoid MeshDecalsPositionZBias(inout VaryingsToPS input)\n{\n#if defined(UNITY_REVERSED_Z)\n input.vmesh.pos.z -= _DecalMeshDepthBias;\n#else\n input.vmesh.pos.z += _DecalMeshDepthBias;\n#endif\n}\n#endif\n\n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n// This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\nfloat unity_OneOverOutputBoost;\nfloat unity_MaxOutputValue;\n\nCBUFFER_START(UnityMetaPass)\n// x = use uv1 as raster position\n// y = use uv2 as raster position\nbool4 unity_MetaVertexControl;\n\n// x = return albedo\n// y = return normal\nbool4 unity_MetaFragmentControl;\nCBUFFER_END\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS output = (VaryingsToPS)0;\n output.vmesh = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output.vmesh);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.vmesh.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n#ifdef VARYINGS_NEED_POSITION_WS\n output.vmesh.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz);\n#endif\n\n#ifdef VARYINGS_NEED_TANGENT_TO_WORLD\n // Normal is required for triplanar mapping\n output.vmesh.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.vmesh.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n#endif\n\n output.vmesh.texcoord0 = inputMesh.texcoord0;\n output.vmesh.texcoord1 = inputMesh.texcoord1;\n output.vmesh.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.vmesh.texcoord3 = inputMesh.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vmesh.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return PackVaryingsToPS(output);\n}\n#else\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS varyingsType;\n varyingsType.vmesh = VertMesh(inputMesh);\n #if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\n MeshDecalsPositionZBias(varyingsType);\n #endif\n return PackVaryingsToPS(varyingsType);\n}\n\n#endif\n\n\n\n \n\n \n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n \n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n \n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n \n #ifdef _HAS_REFRACTION\n if (_EnableSSRefraction)\n {\n // surfaceData.ior = surfaceDescription.RefractionIndex;\n // surfaceData.transmittanceColor = surfaceDescription.RefractionColor;\n // surfaceData.atDistance = surfaceDescription.RefractionDistance;\n \n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n \n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n // surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n\n \n // tangent-space normal\n float3 normalTS = float3(0.0f, 0.0f, 1.0f);\n normalTS = surfaceDescription.Normal;\n \n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(normalTS, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = normalTS; \n #endif\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n // surfaceData.tangentWS = TransformTangentToWorld(surfaceDescription.Tangent, fragInputs.tangentToWorld);\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n #if VERSION_GREATER_EQUAL(10,2)\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceData.geomNormalWS, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData.geomNormalWS, surfaceData);\n #else\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData);\n #endif\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #ifdef _ENABLE_GEOMETRIC_SPECULAR_AA\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // uint3 fadeMaskSeed = asuint((int3)(V * _ScreenSize.xyx)); // Quantize V to _ScreenSize values\n // LODDitheringTransition(fadeMaskSeed, unity_LODFade.x);\n //#endif\n \n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n \n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = posInput.deviceDepth;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n \n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceDescription.Distortion;\n //builtinData.distortionBlur = surfaceDescription.DistortionBlur;\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #else\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #endif\n \n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n }\n\n\n void Frag( PackedVaryingsToPS packedInput\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #ifdef WRITE_MSAA_DEPTH\n , out float1 depthColor : SV_Target1\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When only WRITE_MSAA_DEPTH is define and not WRITE_NORMAL_BUFFER it mean we are Unlit and only need depth, but we still have normal buffer binded\n , out float4 outNormalBuffer : SV_Target0\n , out float1 depthColor : SV_Target1\n #elif defined(SCENESELECTIONPASS)\n , out float4 outColor : SV_Target0\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);\n FragInputs input = BuildFragInputs(packedInput.vmesh);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(packedInput.vmesh, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n // to prevent stripping\n surfaceData.normalWS *= saturate(l.Albedo.r + 9999);\n\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), posInput.positionSS, outNormalBuffer);\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When we are MSAA depth only without normal buffer\n // Due to the binding order of these two render targets, we need to have them both declared\n outNormalBuffer = float4(0.0, 0.0, 0.0, 1.0);\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #elif defined(SCENESELECTIONPASS)\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #endif\n }\n\n ENDHLSL\n }\n\n\n \n\n\n\n }\n \n \n \n}\n"},{"srpTarget":0,"UnityVersionMin":20194,"UnityVersionMax":30000,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2020.3.8f1\n// Render Pipeline: Standard\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Albedo_NormalMask_ColorMask\"\n{\n Properties\n {\n \n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n\n [GroupRollout(Cullmode)]\n [Group(Cullmode)]_Cull(\"__cull\", Float) = 2.0\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_Albedo(\"Albedo\", 2D) = \"white\" {}\n [Group(Base Overlay)][NoScaleOffset]_NormalMask(\"NormalMask\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_ColorMask(\"ColorMask\", 2D) = \"black\" {}\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_AlphaColor0 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_Albedo1(\"Albedo1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_NormalMask1(\"NormalMask1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_ColorMask1(\"ColorMask1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n\t[Group(Overlay 1)]_RedColor1 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_GreenColor1 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_BlueColor1 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_AlphaColor1 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_Albedo2(\"Albedo2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_NormalMask2(\"NormalMask2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_ColorMask2(\"ColorMask2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n\t[Group(Overlay 2)]_RedColor2 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_GreenColor2 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_BlueColor2 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_AlphaColor2 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_Albedo3(\"Albedo3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_NormalMask3(\"NormalMask3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_ColorMask3(\"ColorMask3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n\t[Group(Overlay 3)]_RedColor3 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_GreenColor3 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_BlueColor3 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_AlphaColor3 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n /* This is what they should be \n half4 Tiles[4][3];\n\thalf4 Tints[4][3];\n\thalf4 Adds[4][3];\n half4 RedColor[4];\n half4 GreenColor[4];\n half4 BlueColor[4];\n half4 AlphaColor[4];\n half NormalStrength[4]; */\n\n\n\n }\n SubShader\n {\n Tags { \"RenderType\" = \"Opaque\" \"Queue\" = \"Geometry\" }\n\n \n \n Pass\n {\n\t\t Name \"FORWARD\"\n\t\t Tags { \"LightMode\" = \"ForwardBase\" }\n \n Cull[_Cull]\n\n\n CGPROGRAM\n // compile directives\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n #pragma multi_compile_instancing\n #pragma multi_compile_fog\n #pragma multi_compile_fwdbase\n #include \"HLSLSupport.cginc\"\n #define UNITY_INSTANCED_LOD_FADE\n #define UNITY_INSTANCED_SH\n #define UNITY_INSTANCED_LIGHTMAPSTS\n\n #include \"UnityShaderVariables.cginc\"\n #include \"UnityShaderUtilities.cginc\"\n // -------- variant for: \n\n #include \"UnityCG.cginc\"\n #include \"Lighting.cginc\"\n #include \"UnityPBSLighting.cginc\"\n #include \"AutoLight.cginc\"\n #define SHADER_PASS SHADERPASS_FORWARD\n #define _PASSFORWARD 1\n\n \n\n\n #define _STANDARD 1\n// If your looking in here and thinking WTF, yeah, I know. These are taken from the SRPs, to allow us to use the same\n// texturing library they use. However, since they are not included in the standard pipeline by default, there is no\n// way to include them in and they have to be inlined, since someone could copy this shader onto another machine without\n// Better Shaders installed. Unfortunate, but I'd rather do this and have a nice library for texture sampling instead\n// of the patchy one Unity provides being inlined/emulated in HDRP/URP. Strangely, PSSL and XBoxOne libraries are not\n// included in the standard SRP code, but they are in tons of Unity own projects on the web, so I grabbed them from there.\n\n#if defined(SHADER_API_GAMECORE)\n\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\t#define ASSIGN_SAMPLER(samplerName, samplerValue) samplerName = samplerValue\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define SAMPLE_DEPTH_TEXTURE(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2).r\n\t#define SAMPLE_DEPTH_TEXTURE_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod).r\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_XBOXONE)\n\t\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_PSSL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.GetLOD(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RW_Texture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RW_Texture2D_Array textureName\n\t#define RW_TEXTURE3D(type, textureName) RW_Texture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n\n#elif defined(SHADER_API_D3D11)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_METAL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_VULKAN)\n// This file assume SHADER_API_VULKAN is defined\n\t// TODO: This is a straight copy from D3D11.hlsl. Go through all this stuff and adjust where needed.\n\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_SWITCH)\n\t// This file assume SHADER_API_SWITCH is defined\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_GLCORE)\n\n\t// OpenGL 4.1 SM 5.0 https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 46)\n\t#define OPENGL4_1_SM5 1\n\t#else\n\t#define OPENGL4_1_SM5 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\n\t#if OPENGL4_1_SM5\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#endif\n\n\n\t#elif defined(SHADER_API_GLES3)\n\n\t// GLES 3.1 + AEP shader feature https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 40)\n\t#define GLES3_1_AEP 1\n\t#else\n\t#define GLES3_1_AEP 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#if GLES3_1_AEP\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\t#else\n\t#define RW_TEXTURE2D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\t#endif\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#if GLES3_1_AEP\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\t#endif\n\n\n#elif defined(SHADER_API_GLES)\n\n\n\t#define uint int\n\n\t#define rcp(x) 1.0 / (x)\n\t#define ddx_fine ddx\n\t#define ddy_fine ddy\n\t#define asfloat\n\t#define asuint(x) asint(x)\n\t#define f32tof16\n\t#define f16tof32\n\n\t#define ERROR_ON_UNSUPPORTED_FUNCTION(funcName) #error #funcName is not supported on GLES 2.0\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) #error calculate Level of Detail not supported in GLES2\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) samplerCUBE textureName // No support to texture2DArray\n\t#define TEXTURECUBE(textureName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY(textureName) samplerCUBE textureName // No supoport to textureCubeArray and can't emulate with texture2DArray\n\t#define TEXTURE3D(textureName) sampler3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) sampler2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_FLOAT(textureName) samplerCUBE_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_FLOAT(textureName) sampler3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) sampler2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_HALF(textureName) samplerCUBE_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_HALF(textureName) sampler3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\t#define TEXTURECUBE_SHADOW(textureName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\n\t#define RW_TEXTURE2D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\n\t#define SAMPLER(samplerName)\n\t#define SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURE3D_PARAM(textureName, samplerName) sampler3D textureName\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) tex2D(textureName, coord2)\n\n\t#if (SHADER_TARGET >= 30)\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) tex2Dlod(textureName, float4(coord2, 0, lod))\n\t#else\n\t // No lod support. Very poor approximation with bias.\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, lod)\n\t#endif\n\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) tex2Dbias(textureName, float4(coord2, 0, bias))\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_LOD)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_GRAD)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) texCUBE(textureName, coord3)\n\t// No lod support. Very poor approximation with bias.\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) texCUBEbias(textureName, float4(coord3, bias))\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) tex3D(textureName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE3D_LOD)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) SHADOW2D_SAMPLE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_SHADOW)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) SHADOWCUBE_SAMPLE(textureName, samplerName, coord4)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_SHADOW)\n\n\n\t// Not supported. Can't define as error because shader library is calling these functions.\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D)\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D_LOD)\n\n\t// Gather not supported. Fallback to regular texture sampling.\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\n#else\n#error unsupported shader api\n#endif\n\n\n\n\n// default flow control attributes\n#ifndef UNITY_BRANCH\n# define UNITY_BRANCH\n#endif\n#ifndef UNITY_FLATTEN\n# define UNITY_FLATTEN\n#endif\n#ifndef UNITY_UNROLL\n# define UNITY_UNROLL\n#endif\n#ifndef UNITY_UNROLLX\n# define UNITY_UNROLLX(_x)\n#endif\n#ifndef UNITY_LOOP\n# define UNITY_LOOP\n#endif\n\n\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n UNITY_POSITION(pos);\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n float4 lmap : TEXCOORD8;\n #if UNITY_SHOULD_SAMPLE_SH\n half3 sh : TEXCOORD9; // SH\n #endif\n #ifdef LIGHTMAP_ON\n UNITY_LIGHTING_COORDS(10,11)\n UNITY_FOG_COORDS(12)\n #else\n UNITY_FOG_COORDS(10)\n UNITY_SHADOW_COORDS(11)\n #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD19;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD20;\n // #endif\n\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef UNITY_MATRIX_I_M\n\n #define UNITY_MATRIX_I_M unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)UNITY_MATRIX_M, transpose(mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)UNITY_MATRIX_V, norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n \n\n \n\n \n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n UNITY_SETUP_INSTANCE_ID(v);\n VertexToPixel o;\n UNITY_INITIALIZE_OUTPUT(VertexToPixel,o);\n UNITY_TRANSFER_INSTANCE_ID(v,o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.pos = UnityObjectToClipPos(v.vertex);\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos);\n // #endif\n\n o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;\n o.worldNormal = UnityObjectToWorldNormal(v.normal);\n o.worldTangent.xyz = UnityObjectToWorldDir(v.tangent.xyz);\n fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;\n o.worldTangent.w = tangentSign;\n\n #ifdef DYNAMICLIGHTMAP_ON\n o.lmap.zw = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n #endif\n #ifdef LIGHTMAP_ON\n o.lmap.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n #endif\n\n // SH/ambient and vertex lights\n #ifndef LIGHTMAP_ON\n #if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL\n o.sh = 0;\n // Approximated illumination from non-important point lights\n #ifdef VERTEXLIGHT_ON\n o.sh += Shade4PointLights (\n unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,\n unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,\n unity_4LightAtten0, o.worldPos, o.worldNormal);\n #endif\n o.sh = ShadeSHPerVertex (o.worldNormal, o.sh);\n #endif\n #endif // !LIGHTMAP_ON\n\n UNITY_TRANSFER_LIGHTING(o,v.texcoord1.xy); // pass shadow and, possibly, light cookie coordinates to pixel shader\n #ifdef FOG_COMBINED_WITH_TSPACE\n UNITY_TRANSFER_FOG_COMBINED_WITH_TSPACE(o,o.pos); // pass fog coordinates to pixel shader\n #elif defined FOG_COMBINED_WITH_WORLD_POS\n UNITY_TRANSFER_FOG_COMBINED_WITH_WORLD_POS(o,o.pos); // pass fog coordinates to pixel shader\n #else\n UNITY_TRANSFER_FOG(o,o.pos); // pass fog coordinates to pixel shader\n #endif\n\n return o;\n }\n\n \n\n // fragment shader\n fixed4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n // prepare and unpack data\n #ifdef FOG_COMBINED_WITH_TSPACE\n UNITY_EXTRACT_FOG_FROM_TSPACE(IN);\n #elif defined FOG_COMBINED_WITH_WORLD_POS\n UNITY_EXTRACT_FOG_FROM_WORLD_POS(IN);\n #else\n UNITY_EXTRACT_FOG(IN);\n #endif\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n \n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n \n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n\n #ifndef USING_DIRECTIONAL_LIGHT\n fixed3 lightDir = normalize(UnityWorldSpaceLightDir(d.worldSpacePosition));\n #else\n fixed3 lightDir = _WorldSpaceLightPos0.xyz;\n #endif\n float3 worldViewDir = normalize(UnityWorldSpaceViewDir(d.worldSpacePosition));\n\n // compute lighting & shadowing factor\n UNITY_LIGHT_ATTENUATION(atten, IN, d.worldSpacePosition)\n\n #if _USESPECULAR || _USESPECULARWORKFLOW || _SPECULARFROMMETALLIC\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;\n #else\n SurfaceOutputStandardSpecular o;\n #endif\n o.Specular = l.Specular;\n o.Occlusion = l.Occlusion;\n o.Smoothness = l.Smoothness;\n #elif _BDRFLAMBERT || _BDRF3 || _SIMPLELIT\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutput o = (SurfaceOutput)0;\n #else\n SurfaceOutput o;\n #endif\n\n o.Specular = l.Specular;\n o.Gloss = l.Smoothness;\n _SpecColor.rgb = l.Specular; // fucking hell Unity, wtf..\n #else\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutputStandard o = (SurfaceOutputStandard)0;\n #else\n SurfaceOutputStandard o;\n #endif\n o.Smoothness = l.Smoothness;\n o.Metallic = l.Metallic;\n o.Occlusion = l.Occlusion;\n #endif\n\n o.Albedo = l.Albedo;\n o.Emission = l.Emission;\n o.Alpha = l.Alpha;\n #if _WORLDSPACENORMAL\n o.Normal = l.Normal;\n #else\n o.Normal = normalize(TangentToWorldSpace(d, l.Normal));\n #endif\n\n fixed4 c = 0;\n // Setup lighting environment\n UnityGI gi;\n UNITY_INITIALIZE_OUTPUT(UnityGI, gi);\n gi.indirect.diffuse = 0;\n gi.indirect.specular = 0;\n gi.light.color = _LightColor0.rgb;\n gi.light.dir = lightDir;\n // Call GI (lightmaps/SH/reflections) lighting function\n UnityGIInput giInput;\n UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);\n giInput.light = gi.light;\n giInput.worldPos = d.worldSpacePosition;\n giInput.worldViewDir = worldViewDir;\n giInput.atten = atten;\n #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)\n giInput.lightmapUV = IN.lmap;\n #else\n giInput.lightmapUV = 0.0;\n #endif\n #if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL\n giInput.ambient = IN.sh;\n #else\n giInput.ambient.rgb = 0.0;\n #endif\n giInput.probeHDR[0] = unity_SpecCube0_HDR;\n giInput.probeHDR[1] = unity_SpecCube1_HDR;\n #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION)\n giInput.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending\n #endif\n #ifdef UNITY_SPECCUBE_BOX_PROJECTION\n giInput.boxMax[0] = unity_SpecCube0_BoxMax;\n giInput.probePosition[0] = unity_SpecCube0_ProbePosition;\n giInput.boxMax[1] = unity_SpecCube1_BoxMax;\n giInput.boxMin[1] = unity_SpecCube1_BoxMin;\n giInput.probePosition[1] = unity_SpecCube1_ProbePosition;\n #endif\n\n \n\n #if defined(_OVERRIDE_SHADOWMASK)\n float4 mulColor = saturate(dot(l.ShadowMask, unity_OcclusionMaskSelector));\n gi.light.color = mulColor;\n giInput.light.color = mulColor;\n #endif\n\n #if _UNLIT\n c.rgb = l.Albedo;\n c.a = l.Alpha;\n #elif _BDRF3 || _SIMPLELIT\n LightingBlinnPhong_GI(o, giInput, gi);\n #if defined(_OVERRIDE_BAKEDGI)\n gi.indirect.diffuse = l.DiffuseGI;\n gi.indirect.specular = l.SpecularGI;\n #endif\n c += LightingBlinnPhong (o, d.worldSpaceViewDir, gi);\n #elif _USESPECULAR || _USESPECULARWORKFLOW || _SPECULARFROMMETALLIC\n LightingStandardSpecular_GI(o, giInput, gi);\n #if defined(_OVERRIDE_BAKEDGI)\n gi.indirect.diffuse = l.DiffuseGI;\n gi.indirect.specular = l.SpecularGI;\n #endif\n c += LightingStandardSpecular (o, d.worldSpaceViewDir, gi);\n #else\n LightingStandard_GI(o, giInput, gi);\n #if defined(_OVERRIDE_BAKEDGI)\n gi.indirect.diffuse = l.DiffuseGI;\n gi.indirect.specular = l.SpecularGI;\n #endif\n c += LightingStandard (o, d.worldSpaceViewDir, gi);\n #endif\n\n c.rgb += o.Emission;\n\n ChainFinalColorForward(l, d, c);\n\n #if !DISABLEFOG\n UNITY_APPLY_FOG(_unity_fogCoord, c); // apply fog\n #endif\n \n\n return c;\n }\n\n ENDCG\n\n }\n\n\n \n \n\n\t // ---- forward rendering additive lights pass:\n\t Pass\n {\n\t\t Name \"FORWARD\"\n\t\t Tags { \"LightMode\" = \"ForwardAdd\" }\n\t\t ZWrite Off Blend One One\n \n Cull[_Cull]\n\n\n CGPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // compile directives\n #pragma target 3.0\n #pragma multi_compile_instancing\n #pragma multi_compile_fog\n #pragma skip_variants INSTANCING_ON\n #pragma multi_compile_fwdadd_fullshadows\n #include \"HLSLSupport.cginc\"\n #define UNITY_INSTANCED_LOD_FADE\n #define UNITY_INSTANCED_SH\n #define UNITY_INSTANCED_LIGHTMAPSTS\n #include \"UnityShaderVariables.cginc\"\n #include \"UnityShaderUtilities.cginc\"\n\n\n #include \"UnityCG.cginc\"\n #include \"Lighting.cginc\"\n #include \"UnityPBSLighting.cginc\"\n #include \"AutoLight.cginc\"\n\n \n\n #define _PASSFORWARD 1\n #define _PASSFORWARDADD 1\n\n \n\n\n #define _STANDARD 1\n// If your looking in here and thinking WTF, yeah, I know. These are taken from the SRPs, to allow us to use the same\n// texturing library they use. However, since they are not included in the standard pipeline by default, there is no\n// way to include them in and they have to be inlined, since someone could copy this shader onto another machine without\n// Better Shaders installed. Unfortunate, but I'd rather do this and have a nice library for texture sampling instead\n// of the patchy one Unity provides being inlined/emulated in HDRP/URP. Strangely, PSSL and XBoxOne libraries are not\n// included in the standard SRP code, but they are in tons of Unity own projects on the web, so I grabbed them from there.\n\n#if defined(SHADER_API_GAMECORE)\n\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\t#define ASSIGN_SAMPLER(samplerName, samplerValue) samplerName = samplerValue\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define SAMPLE_DEPTH_TEXTURE(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2).r\n\t#define SAMPLE_DEPTH_TEXTURE_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod).r\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_XBOXONE)\n\t\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_PSSL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.GetLOD(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RW_Texture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RW_Texture2D_Array textureName\n\t#define RW_TEXTURE3D(type, textureName) RW_Texture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n\n#elif defined(SHADER_API_D3D11)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_METAL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_VULKAN)\n// This file assume SHADER_API_VULKAN is defined\n\t// TODO: This is a straight copy from D3D11.hlsl. Go through all this stuff and adjust where needed.\n\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_SWITCH)\n\t// This file assume SHADER_API_SWITCH is defined\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_GLCORE)\n\n\t// OpenGL 4.1 SM 5.0 https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 46)\n\t#define OPENGL4_1_SM5 1\n\t#else\n\t#define OPENGL4_1_SM5 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\n\t#if OPENGL4_1_SM5\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#endif\n\n\n\t#elif defined(SHADER_API_GLES3)\n\n\t// GLES 3.1 + AEP shader feature https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 40)\n\t#define GLES3_1_AEP 1\n\t#else\n\t#define GLES3_1_AEP 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#if GLES3_1_AEP\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\t#else\n\t#define RW_TEXTURE2D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\t#endif\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#if GLES3_1_AEP\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\t#endif\n\n\n#elif defined(SHADER_API_GLES)\n\n\n\t#define uint int\n\n\t#define rcp(x) 1.0 / (x)\n\t#define ddx_fine ddx\n\t#define ddy_fine ddy\n\t#define asfloat\n\t#define asuint(x) asint(x)\n\t#define f32tof16\n\t#define f16tof32\n\n\t#define ERROR_ON_UNSUPPORTED_FUNCTION(funcName) #error #funcName is not supported on GLES 2.0\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) #error calculate Level of Detail not supported in GLES2\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) samplerCUBE textureName // No support to texture2DArray\n\t#define TEXTURECUBE(textureName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY(textureName) samplerCUBE textureName // No supoport to textureCubeArray and can't emulate with texture2DArray\n\t#define TEXTURE3D(textureName) sampler3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) sampler2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_FLOAT(textureName) samplerCUBE_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_FLOAT(textureName) sampler3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) sampler2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_HALF(textureName) samplerCUBE_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_HALF(textureName) sampler3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\t#define TEXTURECUBE_SHADOW(textureName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\n\t#define RW_TEXTURE2D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\n\t#define SAMPLER(samplerName)\n\t#define SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURE3D_PARAM(textureName, samplerName) sampler3D textureName\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) tex2D(textureName, coord2)\n\n\t#if (SHADER_TARGET >= 30)\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) tex2Dlod(textureName, float4(coord2, 0, lod))\n\t#else\n\t // No lod support. Very poor approximation with bias.\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, lod)\n\t#endif\n\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) tex2Dbias(textureName, float4(coord2, 0, bias))\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_LOD)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_GRAD)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) texCUBE(textureName, coord3)\n\t// No lod support. Very poor approximation with bias.\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) texCUBEbias(textureName, float4(coord3, bias))\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) tex3D(textureName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE3D_LOD)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) SHADOW2D_SAMPLE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_SHADOW)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) SHADOWCUBE_SAMPLE(textureName, samplerName, coord4)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_SHADOW)\n\n\n\t// Not supported. Can't define as error because shader library is calling these functions.\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D)\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D_LOD)\n\n\t// Gather not supported. Fallback to regular texture sampling.\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\n#else\n#error unsupported shader api\n#endif\n\n\n\n\n// default flow control attributes\n#ifndef UNITY_BRANCH\n# define UNITY_BRANCH\n#endif\n#ifndef UNITY_FLATTEN\n# define UNITY_FLATTEN\n#endif\n#ifndef UNITY_UNROLL\n# define UNITY_UNROLL\n#endif\n#ifndef UNITY_UNROLLX\n# define UNITY_UNROLLX(_x)\n#endif\n#ifndef UNITY_LOOP\n# define UNITY_LOOP\n#endif\n\n\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n UNITY_POSITION(pos); // must be named pos because Unity does stupid macro stuff\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n \n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n UNITY_LIGHTING_COORDS(8,9)\n UNITY_FOG_COORDS(10)\n\n \n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD18;\n // #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n\n };\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef UNITY_MATRIX_I_M\n\n #define UNITY_MATRIX_I_M unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)UNITY_MATRIX_M, transpose(mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)UNITY_MATRIX_V, norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n \n\n \n\n \n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n \n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n UNITY_SETUP_INSTANCE_ID(v);\n VertexToPixel o;\n UNITY_INITIALIZE_OUTPUT(VertexToPixel,o);\n UNITY_TRANSFER_INSTANCE_ID(v,o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.pos = UnityObjectToClipPos(v.vertex);\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos);\n // #endif\n\n o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;\n o.worldNormal = UnityObjectToWorldNormal(v.normal);\n o.worldTangent.xyz = UnityObjectToWorldDir(v.tangent.xyz);\n fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;\n o.worldTangent.w = tangentSign;\n\n UNITY_TRANSFER_LIGHTING(o, v.texcoord1.xy); // pass shadow and, possibly, light cookie coordinates to pixel shader\n UNITY_TRANSFER_FOG(o,o.pos); // pass fog coordinates to pixel shader\n\n return o;\n }\n\n \n\n // fragment shader\n fixed4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n // prepare and unpack data\n\n #ifdef FOG_COMBINED_WITH_TSPACE\n UNITY_EXTRACT_FOG_FROM_TSPACE(IN);\n #elif defined FOG_COMBINED_WITH_WORLD_POS\n UNITY_EXTRACT_FOG_FROM_WORLD_POS(IN);\n #else\n UNITY_EXTRACT_FOG(IN);\n #endif\n\n\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n\n #ifndef USING_DIRECTIONAL_LIGHT\n fixed3 lightDir = normalize(UnityWorldSpaceLightDir(d.worldSpacePosition));\n #else\n fixed3 lightDir = _WorldSpaceLightPos0.xyz;\n #endif\n float3 worldViewDir = normalize(UnityWorldSpaceViewDir(d.worldSpacePosition));\n\n #if _USESPECULAR || _USESPECULARWORKFLOW || _SPECULARFROMMETALLIC\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;\n #else\n SurfaceOutputStandardSpecular o;\n #endif\n o.Specular = l.Specular;\n o.Occlusion = l.Occlusion;\n o.Smoothness = l.Smoothness;\n #elif _BDRFLAMBERT || _BDRF3 || _SIMPLELIT\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutput o = (SurfaceOutput)0;\n #else\n SurfaceOutput o;\n #endif\n\n o.Specular = l.SpecularPower;\n o.Gloss = l.Smoothness;\n _SpecColor.rgb = l.Specular; // fucking hell Unity, wtf..\n #else\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutputStandard o = (SurfaceOutputStandard)0;\n #else\n SurfaceOutputStandard o;\n #endif\n o.Smoothness = l.Smoothness;\n o.Metallic = l.Metallic;\n o.Occlusion = l.Occlusion;\n #endif\n\n \n o.Albedo = l.Albedo;\n o.Emission = l.Emission;\n o.Alpha = l.Alpha;\n\n #if _WORLDSPACENORMAL\n o.Normal = l.Normal;\n #else\n o.Normal = normalize(TangentToWorldSpace(d, l.Normal));\n #endif\n\n\n\n UNITY_LIGHT_ATTENUATION(atten, IN, d.worldSpacePosition)\n half4 c = 0;\n\n // Setup lighting environment\n UnityGI gi;\n UNITY_INITIALIZE_OUTPUT(UnityGI, gi);\n gi.indirect.diffuse = 0;\n gi.indirect.specular = 0;\n gi.light.color = _LightColor0.rgb;\n gi.light.dir = lightDir;\n gi.light.color *= atten;\n\n #if defined(_OVERRIDE_SHADOWMASK)\n float4 mulColor = saturate(dot(l.ShadowMask, unity_OcclusionMaskSelector));\n gi.light.color = mulColor;\n #endif\n\n #if _USESPECULAR\n c += LightingStandardSpecular (o, worldViewDir, gi);\n #elif _BDRF3 || _SIMPLELIT\n c += LightingBlinnPhong (o, d.worldSpaceViewDir, gi);\n #else\n c += LightingStandard (o, worldViewDir, gi);\n #endif\n \n\n ChainFinalColorForward(l, d, c);\n\n #if !DISABLEFOG\n UNITY_APPLY_FOG(_unity_fogCoord, c); // apply fog\n #endif\n #if !_ALPHABLEND_ON\n UNITY_OPAQUE_ALPHA(c.a);\n #endif\n \n return c;\n }\n\n ENDCG\n\n }\n\n \n\t Pass {\n\t\t Name \"ShadowCaster\"\n\t\t Tags { \"LightMode\" = \"ShadowCaster\" }\n\t\t ZWrite On ZTest LEqual\n\n Cull[_Cull]\n\n\n CGPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n // compile directives\n #pragma target 3.0\n #pragma multi_compile_instancing\n #pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2\n #pragma multi_compile_shadowcaster\n #include \"HLSLSupport.cginc\"\n #define UNITY_INSTANCED_LOD_FADE\n #define UNITY_INSTANCED_SH\n #define UNITY_INSTANCED_LIGHTMAPSTS\n #include \"UnityShaderVariables.cginc\"\n #include \"UnityShaderUtilities.cginc\"\n\n #include \"UnityCG.cginc\"\n #include \"Lighting.cginc\"\n #include \"UnityPBSLighting.cginc\"\n\n #define _PASSSHADOW 1\n\n \n\n\n #define _STANDARD 1\n// If your looking in here and thinking WTF, yeah, I know. These are taken from the SRPs, to allow us to use the same\n// texturing library they use. However, since they are not included in the standard pipeline by default, there is no\n// way to include them in and they have to be inlined, since someone could copy this shader onto another machine without\n// Better Shaders installed. Unfortunate, but I'd rather do this and have a nice library for texture sampling instead\n// of the patchy one Unity provides being inlined/emulated in HDRP/URP. Strangely, PSSL and XBoxOne libraries are not\n// included in the standard SRP code, but they are in tons of Unity own projects on the web, so I grabbed them from there.\n\n#if defined(SHADER_API_GAMECORE)\n\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\t#define ASSIGN_SAMPLER(samplerName, samplerValue) samplerName = samplerValue\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define SAMPLE_DEPTH_TEXTURE(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2).r\n\t#define SAMPLE_DEPTH_TEXTURE_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod).r\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_XBOXONE)\n\t\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_PSSL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.GetLOD(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RW_Texture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RW_Texture2D_Array textureName\n\t#define RW_TEXTURE3D(type, textureName) RW_Texture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n\n#elif defined(SHADER_API_D3D11)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_METAL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_VULKAN)\n// This file assume SHADER_API_VULKAN is defined\n\t// TODO: This is a straight copy from D3D11.hlsl. Go through all this stuff and adjust where needed.\n\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_SWITCH)\n\t// This file assume SHADER_API_SWITCH is defined\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_GLCORE)\n\n\t// OpenGL 4.1 SM 5.0 https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 46)\n\t#define OPENGL4_1_SM5 1\n\t#else\n\t#define OPENGL4_1_SM5 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\n\t#if OPENGL4_1_SM5\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#endif\n\n\n\t#elif defined(SHADER_API_GLES3)\n\n\t// GLES 3.1 + AEP shader feature https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 40)\n\t#define GLES3_1_AEP 1\n\t#else\n\t#define GLES3_1_AEP 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#if GLES3_1_AEP\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\t#else\n\t#define RW_TEXTURE2D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\t#endif\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#if GLES3_1_AEP\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\t#endif\n\n\n#elif defined(SHADER_API_GLES)\n\n\n\t#define uint int\n\n\t#define rcp(x) 1.0 / (x)\n\t#define ddx_fine ddx\n\t#define ddy_fine ddy\n\t#define asfloat\n\t#define asuint(x) asint(x)\n\t#define f32tof16\n\t#define f16tof32\n\n\t#define ERROR_ON_UNSUPPORTED_FUNCTION(funcName) #error #funcName is not supported on GLES 2.0\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) #error calculate Level of Detail not supported in GLES2\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) samplerCUBE textureName // No support to texture2DArray\n\t#define TEXTURECUBE(textureName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY(textureName) samplerCUBE textureName // No supoport to textureCubeArray and can't emulate with texture2DArray\n\t#define TEXTURE3D(textureName) sampler3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) sampler2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_FLOAT(textureName) samplerCUBE_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_FLOAT(textureName) sampler3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) sampler2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_HALF(textureName) samplerCUBE_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_HALF(textureName) sampler3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\t#define TEXTURECUBE_SHADOW(textureName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\n\t#define RW_TEXTURE2D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\n\t#define SAMPLER(samplerName)\n\t#define SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURE3D_PARAM(textureName, samplerName) sampler3D textureName\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) tex2D(textureName, coord2)\n\n\t#if (SHADER_TARGET >= 30)\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) tex2Dlod(textureName, float4(coord2, 0, lod))\n\t#else\n\t // No lod support. Very poor approximation with bias.\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, lod)\n\t#endif\n\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) tex2Dbias(textureName, float4(coord2, 0, bias))\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_LOD)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_GRAD)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) texCUBE(textureName, coord3)\n\t// No lod support. Very poor approximation with bias.\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) texCUBEbias(textureName, float4(coord3, bias))\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) tex3D(textureName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE3D_LOD)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) SHADOW2D_SAMPLE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_SHADOW)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) SHADOWCUBE_SAMPLE(textureName, samplerName, coord4)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_SHADOW)\n\n\n\t// Not supported. Can't define as error because shader library is calling these functions.\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D)\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D_LOD)\n\n\t// Gather not supported. Fallback to regular texture sampling.\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\n#else\n#error unsupported shader api\n#endif\n\n\n\n\n// default flow control attributes\n#ifndef UNITY_BRANCH\n# define UNITY_BRANCH\n#endif\n#ifndef UNITY_FLATTEN\n# define UNITY_FLATTEN\n#endif\n#ifndef UNITY_UNROLL\n# define UNITY_UNROLL\n#endif\n#ifndef UNITY_UNROLLX\n# define UNITY_UNROLLX(_x)\n#endif\n#ifndef UNITY_LOOP\n# define UNITY_LOOP\n#endif\n\n\n\n\n\n \n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n V2F_SHADOW_CASTER; // may declare TEXCOORD0 for the wonderfully named .vec\n float3 worldPos : TEXCOORD1;\n float3 worldNormal : TEXCOORD2;\n float4 worldTangent : TEXCOORD3;\n float4 texcoord0 : TEXCOORD4;\n // float4 texcoord1 : TEXCOORD5;\n // float4 texcoord2 : TEXCOORD6;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD7;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD8;\n // #endif\n \n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD16;\n // #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef UNITY_MATRIX_I_M\n\n #define UNITY_MATRIX_I_M unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)UNITY_MATRIX_M, transpose(mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)UNITY_MATRIX_V, norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n \n\n \n\n \n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n UNITY_SETUP_INSTANCE_ID(v);\n VertexToPixel o;\n UNITY_INITIALIZE_OUTPUT(VertexToPixel,o);\n UNITY_TRANSFER_INSTANCE_ID(v,o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n\n \n\n o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;\n o.worldNormal = UnityObjectToWorldNormal(v.normal);\n o.worldTangent.xyz = UnityObjectToWorldDir(v.tangent.xyz);\n fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;\n float3 worldBinormal = cross(o.worldNormal, o.worldTangent.xyz) * tangentSign;\n o.worldTangent.w = tangentSign;\n\n // sets o.pos, so do screenpos after.\n TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos);\n // #endif\n\n return o;\n }\n\n \n\n // fragment shader\n fixed4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n // prepare and unpack data\n\n #ifdef FOG_COMBINED_WITH_TSPACE\n UNITY_EXTRACT_FOG_FROM_TSPACE(IN);\n #elif defined FOG_COMBINED_WITH_WORLD_POS\n UNITY_EXTRACT_FOG_FROM_WORLD_POS(IN);\n #else\n UNITY_EXTRACT_FOG(IN);\n #endif\n\n #ifndef USING_DIRECTIONAL_LIGHT\n fixed3 lightDir = normalize(UnityWorldSpaceLightDir(IN.worldPos));\n #else\n fixed3 lightDir = _WorldSpaceLightPos0.xyz;\n #endif\n\n \n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n SHADOW_CASTER_FRAGMENT(IN)\n }\n\n\n ENDCG\n\n }\n\n \n\t // ---- meta information extraction pass:\n\t Pass\n {\n\t\t Name \"Meta\"\n\t\t Tags { \"LightMode\" = \"Meta\" }\n\t\t Cull Off\n\n Cull[_Cull]\n\n\n CGPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // compile directives\n #pragma target 3.0\n #pragma multi_compile_instancing\n #pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2\n #pragma shader_feature EDITOR_VISUALIZATION\n\n #include \"HLSLSupport.cginc\"\n #define UNITY_INSTANCED_LOD_FADE\n #define UNITY_INSTANCED_SH\n #define UNITY_INSTANCED_LIGHTMAPSTS\n #include \"UnityShaderVariables.cginc\"\n #include \"UnityShaderUtilities.cginc\"\n\n #include \"UnityCG.cginc\"\n #include \"Lighting.cginc\"\n #include \"UnityPBSLighting.cginc\"\n #include \"UnityMetaPass.cginc\"\n\n #define _PASSMETA 1\n\n \n\n\n #define _STANDARD 1\n// If your looking in here and thinking WTF, yeah, I know. These are taken from the SRPs, to allow us to use the same\n// texturing library they use. However, since they are not included in the standard pipeline by default, there is no\n// way to include them in and they have to be inlined, since someone could copy this shader onto another machine without\n// Better Shaders installed. Unfortunate, but I'd rather do this and have a nice library for texture sampling instead\n// of the patchy one Unity provides being inlined/emulated in HDRP/URP. Strangely, PSSL and XBoxOne libraries are not\n// included in the standard SRP code, but they are in tons of Unity own projects on the web, so I grabbed them from there.\n\n#if defined(SHADER_API_GAMECORE)\n\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\t#define ASSIGN_SAMPLER(samplerName, samplerValue) samplerName = samplerValue\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define SAMPLE_DEPTH_TEXTURE(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2).r\n\t#define SAMPLE_DEPTH_TEXTURE_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod).r\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_XBOXONE)\n\t\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_PSSL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.GetLOD(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RW_Texture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RW_Texture2D_Array textureName\n\t#define RW_TEXTURE3D(type, textureName) RW_Texture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n\n#elif defined(SHADER_API_D3D11)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_METAL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_VULKAN)\n// This file assume SHADER_API_VULKAN is defined\n\t// TODO: This is a straight copy from D3D11.hlsl. Go through all this stuff and adjust where needed.\n\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_SWITCH)\n\t// This file assume SHADER_API_SWITCH is defined\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_GLCORE)\n\n\t// OpenGL 4.1 SM 5.0 https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 46)\n\t#define OPENGL4_1_SM5 1\n\t#else\n\t#define OPENGL4_1_SM5 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\n\t#if OPENGL4_1_SM5\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#endif\n\n\n\t#elif defined(SHADER_API_GLES3)\n\n\t// GLES 3.1 + AEP shader feature https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 40)\n\t#define GLES3_1_AEP 1\n\t#else\n\t#define GLES3_1_AEP 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#if GLES3_1_AEP\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\t#else\n\t#define RW_TEXTURE2D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\t#endif\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#if GLES3_1_AEP\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\t#endif\n\n\n#elif defined(SHADER_API_GLES)\n\n\n\t#define uint int\n\n\t#define rcp(x) 1.0 / (x)\n\t#define ddx_fine ddx\n\t#define ddy_fine ddy\n\t#define asfloat\n\t#define asuint(x) asint(x)\n\t#define f32tof16\n\t#define f16tof32\n\n\t#define ERROR_ON_UNSUPPORTED_FUNCTION(funcName) #error #funcName is not supported on GLES 2.0\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) #error calculate Level of Detail not supported in GLES2\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) samplerCUBE textureName // No support to texture2DArray\n\t#define TEXTURECUBE(textureName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY(textureName) samplerCUBE textureName // No supoport to textureCubeArray and can't emulate with texture2DArray\n\t#define TEXTURE3D(textureName) sampler3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) sampler2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_FLOAT(textureName) samplerCUBE_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_FLOAT(textureName) sampler3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) sampler2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_HALF(textureName) samplerCUBE_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_HALF(textureName) sampler3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\t#define TEXTURECUBE_SHADOW(textureName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\n\t#define RW_TEXTURE2D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\n\t#define SAMPLER(samplerName)\n\t#define SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURE3D_PARAM(textureName, samplerName) sampler3D textureName\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) tex2D(textureName, coord2)\n\n\t#if (SHADER_TARGET >= 30)\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) tex2Dlod(textureName, float4(coord2, 0, lod))\n\t#else\n\t // No lod support. Very poor approximation with bias.\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, lod)\n\t#endif\n\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) tex2Dbias(textureName, float4(coord2, 0, bias))\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_LOD)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_GRAD)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) texCUBE(textureName, coord3)\n\t// No lod support. Very poor approximation with bias.\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) texCUBEbias(textureName, float4(coord3, bias))\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) tex3D(textureName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE3D_LOD)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) SHADOW2D_SAMPLE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_SHADOW)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) SHADOWCUBE_SAMPLE(textureName, samplerName, coord4)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_SHADOW)\n\n\n\t// Not supported. Can't define as error because shader library is calling these functions.\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D)\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D_LOD)\n\n\t// Gather not supported. Fallback to regular texture sampling.\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\n#else\n#error unsupported shader api\n#endif\n\n\n\n\n// default flow control attributes\n#ifndef UNITY_BRANCH\n# define UNITY_BRANCH\n#endif\n#ifndef UNITY_FLATTEN\n# define UNITY_FLATTEN\n#endif\n#ifndef UNITY_UNROLL\n# define UNITY_UNROLL\n#endif\n#ifndef UNITY_UNROLLX\n# define UNITY_UNROLLX(_x)\n#endif\n#ifndef UNITY_LOOP\n# define UNITY_LOOP\n#endif\n\n\n\n\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n UNITY_POSITION(pos);\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n #ifdef EDITOR_VISUALIZATION\n float2 vizUV : TEXCOORD8;\n float4 lightCoord : TEXCOORD9;\n #endif\n\n \n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD17;\n // #endif\n\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef UNITY_MATRIX_I_M\n\n #define UNITY_MATRIX_I_M unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)UNITY_MATRIX_M, transpose(mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)UNITY_MATRIX_V, norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n \n\n \n\n \n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n UNITY_SETUP_INSTANCE_ID(v);\n VertexToPixel o;\n UNITY_INITIALIZE_OUTPUT(VertexToPixel,o);\n UNITY_TRANSFER_INSTANCE_ID(v,o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n\n o.pos = UnityMetaVertexPosition(v.vertex, v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #ifdef EDITOR_VISUALIZATION\n o.vizUV = 0;\n o.lightCoord = 0;\n if (unity_VisualizationMode == EDITORVIZ_TEXTURE)\n o.vizUV = UnityMetaVizUV(unity_EditorViz_UVIndex, v.texcoord0.xy, v.texcoord1.xy, v.texcoord2.xy, unity_EditorViz_Texture_ST);\n else if (unity_VisualizationMode == EDITORVIZ_SHOWLIGHTMASK)\n {\n o.vizUV = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n o.lightCoord = mul(unity_EditorViz_WorldToLight, mul(unity_ObjectToWorld, float4(v.vertex.xyz, 1)));\n }\n #endif\n\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos);\n // #endif\n\n o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;\n o.worldNormal = UnityObjectToWorldNormal(v.normal);\n o.worldTangent.xyz = UnityObjectToWorldDir(v.tangent.xyz);\n fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;\n o.worldTangent.w = tangentSign;\n\n return o;\n }\n\n \n\n // fragment shader\n fixed4 Frag (VertexToPixel IN\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n\n #ifdef FOG_COMBINED_WITH_TSPACE\n UNITY_EXTRACT_FOG_FROM_TSPACE(IN);\n #elif defined FOG_COMBINED_WITH_WORLD_POS\n UNITY_EXTRACT_FOG_FROM_WORLD_POS(IN);\n #else\n UNITY_EXTRACT_FOG(IN);\n #endif\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n\n Surface l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n \n ChainSurfaceFunction(l, d);\n\n UnityMetaInput metaIN;\n UNITY_INITIALIZE_OUTPUT(UnityMetaInput, metaIN);\n metaIN.Albedo = l.Albedo;\n metaIN.Emission = l.Emission;\n \n #if _USESPECULAR\n metaIN.SpecularColor = l.Specular;\n #endif\n\n #ifdef EDITOR_VISUALIZATION\n metaIN.VizUV = IN.vizUV;\n metaIN.LightCoord = IN.lightCoord;\n #endif\n return UnityMetaFragment(metaIN);\n }\n ENDCG\n\n }\n\n \n\n\n\n }\n \n \n \n}\n"},{"srpTarget":1,"UnityVersionMin":20194,"UnityVersionMax":20201,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2020.3.8f1\n// Render Pipeline: URP2019\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Albedo_NormalMask_ColorMask\"\n{\n Properties\n {\n \n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n\n [GroupRollout(Cullmode)]\n [Group(Cullmode)]_Cull(\"__cull\", Float) = 2.0\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_Albedo(\"Albedo\", 2D) = \"white\" {}\n [Group(Base Overlay)][NoScaleOffset]_NormalMask(\"NormalMask\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_ColorMask(\"ColorMask\", 2D) = \"black\" {}\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_AlphaColor0 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_Albedo1(\"Albedo1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_NormalMask1(\"NormalMask1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_ColorMask1(\"ColorMask1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n\t[Group(Overlay 1)]_RedColor1 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_GreenColor1 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_BlueColor1 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_AlphaColor1 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_Albedo2(\"Albedo2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_NormalMask2(\"NormalMask2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_ColorMask2(\"ColorMask2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n\t[Group(Overlay 2)]_RedColor2 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_GreenColor2 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_BlueColor2 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_AlphaColor2 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_Albedo3(\"Albedo3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_NormalMask3(\"NormalMask3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_ColorMask3(\"ColorMask3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n\t[Group(Overlay 3)]_RedColor3 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_GreenColor3 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_BlueColor3 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_AlphaColor3 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n /* This is what they should be \n half4 Tiles[4][3];\n\thalf4 Tints[4][3];\n\thalf4 Adds[4][3];\n half4 RedColor[4];\n half4 GreenColor[4];\n half4 BlueColor[4];\n half4 AlphaColor[4];\n half NormalStrength[4]; */\n\n\n\n }\n SubShader\n {\n Tags { \"RenderPipeline\"=\"UniversalPipeline\" \"RenderType\" = \"Opaque\" \"Queue\" = \"Geometry\" }\n\n \n \n Pass\n {\n Name \"Universal Forward\"\n Tags \n { \n \"LightMode\" = \"UniversalForward\"\n }\n Blend One Zero, One Zero\nCull Back\nZTest LEqual\nZWrite On\n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_fog\n #pragma multi_compile_instancing\n \n // Keywords\n #pragma multi_compile _ LIGHTMAP_ON\n #pragma multi_compile _ DIRLIGHTMAP_COMBINED\n #pragma multi_compile _ _MAIN_LIGHT_SHADOWS\n #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE\n #pragma multi_compile _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS _ADDITIONAL_OFF\n #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS\n #pragma multi_compile _ _SHADOWS_SOFT\n #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE\n\n // GraphKeywords: \n\n\n #define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #define SHADER_PASS SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD\n\n #define _PASSFORWARD 1\n\n \n\n\n #define _URP 1\n\n\n // this has to be here or specular color will be ignored. Not in SG code\n #if _SIMPLELIT\n #define _SPECULAR_COLOR\n #endif\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n float4 fogFactorAndVertexLight : TEXCOORD10;\n float4 shadowCoord : TEXCOORD11;\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1, v.texcoord2, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD\n OUTPUT_LIGHTMAP_UV(v.texcoord1, unity_LightmapST, o.lightmapUV);\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #ifdef _MAIN_LIGHT_SHADOWS\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #if defined(_USESPECULAR) || _SIMPLELIT\n float3 specular = l.Specular;\n float metallic = 1;\n #else \n float3 specular = 0;\n float metallic = l.Metallic;\n #endif\n\n \n InputData inputData;\n\n inputData.positionWS = IN.worldPos;\n #if _WORLDSPACENORMAL\n inputData.normalWS = l.Normal;\n #else\n inputData.normalWS = normalize(TangentToWorldSpace(d, l.Normal));\n #endif\n \n inputData.viewDirectionWS = SafeNormalize(d.worldSpaceViewDir);\n\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n inputData.shadowCoord = IN.shadowCoord;\n #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)\n inputData.shadowCoord = TransformWorldToShadowCoord(IN.worldPos);\n #else\n inputData.shadowCoord = float4(0, 0, 0, 0);\n #endif\n\n inputData.fogCoord = IN.fogFactorAndVertexLight.x;\n inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw;\n #if defined(_OVERRIDE_BAKEDGI)\n inputData.bakedGI = l.DiffuseGI;\n l.Emission += l.SpecularGI;\n #else\n inputData.bakedGI = SAMPLE_GI(IN.lightmapUV, IN.sh, inputData.normalWS);\n #endif\n\n #if !_UNLIT\n #if _SIMPLELIT\n half4 color = UniversalFragmentBlinnPhong(\n inputData,\n l.Albedo,\n float4(specular * l.Smoothness, 0),\n l.SpecularPower * 128,\n l.Emission,\n l.Alpha);\n color.a = l.Alpha;\n #elif _BAKEDLIT\n half4 color = color = UniversalFragmentBakedLit(inputData, l.Albedo, l.Alpha, normalTS);\n #else\n half4 color = UniversalFragmentPBR(\n inputData,\n l.Albedo,\n metallic,\n specular,\n l.Smoothness,\n l.Occlusion,\n l.Emission,\n l.Alpha); \n #endif\n\n #else\n half4 color = half4(l.Albedo, l.Alpha);\n #endif\n\n #if _UNLITFOG && !DISABLEFOG\n color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x);\n #endif\n\n ChainFinalColorForward(l, d, color);\n\n return color;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"ShadowCaster\"\n Tags \n { \n \"LightMode\" = \"ShadowCaster\"\n }\n \n // Render State\n Blend One Zero, One Zero\n Cull Back\n ZTest LEqual\n ZWrite On\n // ColorMask: \n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_instancing\n \n #define _NORMAL_DROPOFF_TS 1\n #define ATTRIBUTES_NEED_NORMAL\n #define ATTRIBUTES_NEED_TANGENT\n #define SHADERPASS_SHADOWCASTER\n #define _PASSSHADOW 1\n\n \n\n\n #define _URP 1\n\n\n\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n float4 fogFactorAndVertexLight : TEXCOORD10;\n float4 shadowCoord : TEXCOORD11;\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1, v.texcoord2, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD\n OUTPUT_LIGHTMAP_UV(v.texcoord1, unity_LightmapST, o.lightmapUV);\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #ifdef _MAIN_LIGHT_SHADOWS\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n return 0;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"DepthOnly\"\n Tags \n { \n \"LightMode\" = \"DepthOnly\"\n }\n \n // Render State\n Blend One Zero, One Zero\n Cull Back\n ZTest LEqual\n ZWrite On\n ColorMask 0\n \n Cull[_Cull]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #define _NORMAL_DROPOFF_TS 1\n #define ATTRIBUTES_NEED_NORMAL\n #define ATTRIBUTES_NEED_TANGENT\n #define SHADERPASS_DEPTHONLY\n\n #pragma target 3.0\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_instancing\n\n \n\n\n #define _URP 1\n\n\n #define _PASSDEPTH 1\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n float4 fogFactorAndVertexLight : TEXCOORD10;\n float4 shadowCoord : TEXCOORD11;\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1, v.texcoord2, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD\n OUTPUT_LIGHTMAP_UV(v.texcoord1, unity_LightmapST, o.lightmapUV);\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #ifdef _MAIN_LIGHT_SHADOWS\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n return 0;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"Meta\"\n Tags \n { \n \"LightMode\" = \"Meta\"\n }\n\n // Render State\n Cull Off\n // ColorMask: \n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n \n #define SHADERPASS_META\n #define _PASSMETA 1\n\n\n \n\n\n #define _URP 1\n\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n float4 fogFactorAndVertexLight : TEXCOORD10;\n float4 shadowCoord : TEXCOORD11;\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1, v.texcoord2, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD\n OUTPUT_LIGHTMAP_UV(v.texcoord1, unity_LightmapST, o.lightmapUV);\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #ifdef _MAIN_LIGHT_SHADOWS\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n\n Surface l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n MetaInput metaInput = (MetaInput)0;\n metaInput.Albedo = l.Albedo;\n metaInput.Emission = l.Emission;\n\n return MetaFragment(metaInput);\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n // Name: \n Tags \n { \n \"LightMode\" = \"Universal2D\"\n }\n \n // Render State\n Blend One Zero, One Zero\n Cull Back\n ZTest LEqual\n ZWrite On\n // ColorMask: \n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_instancing\n \n #define SHADERPASS_2D\n\n \n\n\n #define _URP 1\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n \n\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n float4 fogFactorAndVertexLight : TEXCOORD10;\n float4 shadowCoord : TEXCOORD11;\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1, v.texcoord2, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD\n OUTPUT_LIGHTMAP_UV(v.texcoord1, unity_LightmapST, o.lightmapUV);\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #ifdef _MAIN_LIGHT_SHADOWS\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n\n Surface l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n \n half4 color = half4(l.Albedo, l.Alpha);\n\n return color;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n\n\n\n }\n \n \n \n}\n"},{"srpTarget":2,"UnityVersionMin":20202,"UnityVersionMax":20221,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2020.3.8f1\n// Render Pipeline: HDRP2020\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Albedo_NormalMask_ColorMask\"\n{\n Properties\n {\n \n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n\n [GroupRollout(Cullmode)]\n [Group(Cullmode)]_Cull(\"__cull\", Float) = 2.0\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_Albedo(\"Albedo\", 2D) = \"white\" {}\n [Group(Base Overlay)][NoScaleOffset]_NormalMask(\"NormalMask\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_ColorMask(\"ColorMask\", 2D) = \"black\" {}\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_AlphaColor0 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_Albedo1(\"Albedo1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_NormalMask1(\"NormalMask1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_ColorMask1(\"ColorMask1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n\t[Group(Overlay 1)]_RedColor1 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_GreenColor1 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_BlueColor1 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_AlphaColor1 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_Albedo2(\"Albedo2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_NormalMask2(\"NormalMask2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_ColorMask2(\"ColorMask2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n\t[Group(Overlay 2)]_RedColor2 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_GreenColor2 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_BlueColor2 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_AlphaColor2 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_Albedo3(\"Albedo3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_NormalMask3(\"NormalMask3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_ColorMask3(\"ColorMask3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n\t[Group(Overlay 3)]_RedColor3 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_GreenColor3 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_BlueColor3 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_AlphaColor3 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n /* This is what they should be \n half4 Tiles[4][3];\n\thalf4 Tints[4][3];\n\thalf4 Adds[4][3];\n half4 RedColor[4];\n half4 GreenColor[4];\n half4 BlueColor[4];\n half4 AlphaColor[4];\n half NormalStrength[4]; */\n\n\n\n\n [HideInInspector]_RenderQueueType(\"Float\", Float) = 1\n [HideInInspector][ToggleUI]_AddPrecomputedVelocity(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_DepthOffsetEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentWritingMotionVec(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaCutoffEnable(\"Boolean\", Float) = 0\n [HideInInspector]_TransparentSortPriority(\"_TransparentSortPriority\", Float) = 0\n [HideInInspector][ToggleUI]_UseShadowThreshold(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentDepthPrepassEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentDepthPostpassEnable(\"Boolean\", Float) = 0\n [HideInInspector]_SurfaceType(\"Float\", Float) = 0\n [HideInInspector]_BlendMode(\"Float\", Float) = 0\n [HideInInspector]_SrcBlend(\"Float\", Float) = 1\n [HideInInspector]_DstBlend(\"Float\", Float) = 0\n [HideInInspector]_AlphaSrcBlend(\"Float\", Float) = 1\n [HideInInspector]_AlphaDstBlend(\"Float\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaToMask(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaToMaskInspectorValue(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_ZWrite(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_TransparentZWrite(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_EnableFogOnTransparent(\"Boolean\", Float) = 1\n [HideInInspector]_ZTestDepthEqualForOpaque(\"Float\", Int) = 4\n [HideInInspector][Enum(UnityEngine.Rendering.CompareFunction)]_ZTestTransparent(\"Float\", Float) = 4\n [HideInInspector][ToggleUI]_TransparentBackfaceEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_RequireSplitLighting(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_ReceivesSSR(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_ReceivesSSRTransparent(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_EnableBlendModePreserveSpecularLighting(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_SupportDecals(\"Boolean\", Float) = 1\n [HideInInspector]_StencilRef(\"Float\", Int) = 0\n [HideInInspector]_StencilWriteMask(\"Float\", Int) = 6\n [HideInInspector]_StencilRefDepth(\"Float\", Int) = 8\n [HideInInspector]_StencilWriteMaskDepth(\"Float\", Int) = 8\n [HideInInspector]_StencilRefMV(\"Float\", Int) = 40\n [HideInInspector]_StencilWriteMaskMV(\"Float\", Int) = 40\n [HideInInspector]_StencilRefDistortionVec(\"Float\", Int) = 4\n [HideInInspector]_StencilWriteMaskDistortionVec(\"Float\", Int) = 4\n [HideInInspector]_StencilWriteMaskGBuffer(\"Float\", Int) = 14\n [HideInInspector]_StencilRefGBuffer(\"Float\", Int) = 10\n [HideInInspector]_ZTestGBuffer(\"Float\", Int) = 4\n [HideInInspector][ToggleUI]_RayTracing(\"Boolean\", Float) = 0\n [HideInInspector][Enum(None, 0, Box, 1, Sphere, 2, Thin, 3)]_RefractionModel(\"Float\", Float) = 0\n [HideInInspector][NoScaleOffset]unity_Lightmaps(\"unity_Lightmaps\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_LightmapsInd(\"unity_LightmapsInd\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_ShadowMasks(\"unity_ShadowMasks\", 2DArray) = \"\" {}\n }\n SubShader\n {\n Tags { \"RenderPipeline\" = \"HDRenderPipeline\" \"RenderType\" = \"HDLitShader\" \"Queue\" = \"Geometry+225\" }\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"Forward\"\n Tags { \"LightMode\" = \"Forward\" }\n\n \n \n Stencil\n {\n WriteMask [_StencilWriteMask]\n Ref [_StencilRef]\n CompFront Always\n PassFront Replace\n CompBack Always\n PassBack Replace\n }\n \n ColorMask [_ColorMaskTransparentVel] 1\n\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n #pragma multi_compile _ DEBUG_DISPLAY\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n #pragma multi_compile _ LIGHTMAP_ON\n #pragma multi_compile _ DIRLIGHTMAP_COMBINED\n #pragma multi_compile _ DYNAMICLIGHTMAP_ON\n #pragma multi_compile _ SHADOWS_SHADOWMASK\n #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT\n #pragma multi_compile SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH\n #pragma multi_compile SCREEN_SPACE_SHADOWS_OFF SCREEN_SPACE_SHADOWS_ON\n #pragma multi_compile USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_FORWARD\n #define SUPPORT_BLENDMODE_PRESERVE_SPECULAR_LIGHTING\n #define HAS_LIGHTLOOP\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define _PASSFORWARD 1\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n #define VT_BUFFER_TARGET SV_Target1\n #define EXTRA_BUFFER_TARGET SV_Target2\n #else\n #define EXTRA_BUFFER_TARGET SV_Target1\n #endif\n\n\n\n\n void Frag(VertexToPixel v2p,\n #ifdef OUTPUT_SPLIT_LIGHTING\n out float4 outColor : SV_Target0, // outSpecularLighting\n #ifdef UNITY_VIRTUAL_TEXTURING\n out float4 outVTFeedback : VT_BUFFER_TARGET,\n #endif\n out float4 outDiffuseLighting : EXTRA_BUFFER_TARGET,\n OUTPUT_SSSBUFFER(outSSSBuffer)\n #else\n out float4 outColor : SV_Target0\n #ifdef UNITY_VIRTUAL_TEXTURING\n ,out float4 outVTFeedback : VT_BUFFER_TARGET\n #endif\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n , out float4 outMotionVec : EXTRA_BUFFER_TARGET\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif // OUTPUT_SPLIT_LIGHTING\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n // Init outMotionVector here to solve compiler warning (potentially unitialized variable)\n // It is init to the value of forceNoMotion (with 2.0)\n outMotionVec = float4(2.0, 0.0, 0.0, 0.0);\n #endif\n\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2p);\n FragInputs input = BuildFragInputs(v2p);\n\n // We need to readapt the SS position as our screen space positions are for a low res buffer, but we try to access a full res buffer.\n input.positionSS.xy = _OffScreenRendering > 0 ? (input.positionSS.xy * _OffScreenDownsampleFactor) : input.positionSS.xy;\n\n uint2 tileIndex = uint2(input.positionSS.xy) / GetTileSize();\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, tileIndex);\n\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2p, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n \n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n\n PreLightData preLightData = GetPreLightData(V, posInput, bsdfData);\n\n outColor = float4(0.0, 0.0, 0.0, 0.0);\n\n // We need to skip lighting when doing debug pass because the debug pass is done before lighting so some buffers may not be properly initialized potentially causing crashes on PS4.\n\n #ifdef DEBUG_DISPLAY\n // Init in debug display mode to quiet warning\n #ifdef OUTPUT_SPLIT_LIGHTING\n outDiffuseLighting = 0;\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #endif\n\n \n\n // Same code in ShaderPassForwardUnlit.shader\n // Reminder: _DebugViewMaterialArray[i]\n // i==0 -> the size used in the buffer\n // i>0 -> the index used (0 value means nothing)\n // The index stored in this buffer could either be\n // - a gBufferIndex (always stored in _DebugViewMaterialArray[1] as only one supported)\n // - a property index which is different for each kind of material even if reflecting the same thing (see MaterialSharedProperty)\n bool viewMaterial = false;\n int bufferSize = _DebugViewMaterialArray[0].x;\n if (bufferSize != 0)\n {\n bool needLinearToSRGB = false;\n float3 result = float3(1.0, 0.0, 1.0);\n\n // Loop through the whole buffer\n // Works because GetSurfaceDataDebug will do nothing if the index is not a known one\n for (int index = 1; index <= bufferSize; index++)\n {\n int indexMaterialProperty = _DebugViewMaterialArray[index].x;\n\n // skip if not really in use\n if (indexMaterialProperty != 0)\n {\n viewMaterial = true;\n\n GetPropertiesDataDebug(indexMaterialProperty, result, needLinearToSRGB);\n GetVaryingsDataDebug(indexMaterialProperty, input, result, needLinearToSRGB);\n GetBuiltinDataDebug(indexMaterialProperty, builtinData, posInput, result, needLinearToSRGB);\n GetSurfaceDataDebug(indexMaterialProperty, surfaceData, result, needLinearToSRGB);\n GetBSDFDataDebug(indexMaterialProperty, bsdfData, result, needLinearToSRGB);\n }\n }\n\n // TEMP!\n // For now, the final blit in the backbuffer performs an sRGB write\n // So in the meantime we apply the inverse transform to linear data to compensate.\n if (!needLinearToSRGB)\n result = SRGBToLinear(max(0, result));\n\n outColor = float4(result, 1.0);\n }\n\n if (!viewMaterial)\n {\n if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_DIFFUSE_COLOR || _DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_SPECULAR_COLOR)\n {\n float3 result = float3(0.0, 0.0, 0.0);\n\n GetPBRValidatorDebug(surfaceData, result);\n\n outColor = float4(result, 1.0f);\n }\n else if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_TRANSPARENCY_OVERDRAW)\n {\n float4 result = _DebugTransparencyOverdrawWeight * float4(TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_A);\n outColor = result;\n }\n else\n #endif\n {\n #ifdef _SURFACE_TYPE_TRANSPARENT\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_TRANSPARENT;\n #else\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_OPAQUE;\n #endif\n\n LightLoopOutput lightLoopOutput;\n LightLoop(V, posInput, preLightData, bsdfData, builtinData, featureFlags, lightLoopOutput);\n\n float3 diffuseLighting = lightLoopOutput.diffuseLighting;\n float3 specularLighting = lightLoopOutput.specularLighting;\n\n diffuseLighting *= GetCurrentExposureMultiplier();\n specularLighting *= GetCurrentExposureMultiplier();\n\n #ifdef OUTPUT_SPLIT_LIGHTING\n if (_EnableSubsurfaceScattering != 0 && ShouldOutputSplitLighting(bsdfData))\n {\n outColor = float4(specularLighting, 1.0);\n outDiffuseLighting = float4(TagLightingForSSS(diffuseLighting), 1.0);\n }\n else\n {\n outColor = float4(diffuseLighting + specularLighting, 1.0);\n outDiffuseLighting = 0;\n }\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #else\n outColor = ApplyBlendMode(diffuseLighting, specularLighting, builtinData.opacity);\n outColor = EvaluateAtmosphericScattering(posInput, V, outColor);\n #endif\n\n ChainFinalColorForward(l, d, outColor);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n bool forceNoMotion = any(unity_MotionVectorsParams.yw == 0.0);\n // outMotionVec is already initialize at the value of forceNoMotion (see above)\n if (!forceNoMotion)\n {\n float2 motionVec = CalculateMotionVector(v2p.motionVectorCS, v2p.previousPositionCS);\n EncodeMotionVector(motionVec * 0.5, outMotionVec);\n outMotionVec.zw = 1.0;\n }\n #endif\n }\n\n #ifdef DEBUG_DISPLAY\n }\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n outVTFeedback = builtinData.vtPackedFeedback;\n #endif\n }\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"ShadowCaster\"\n Tags { \"LightMode\" = \"ShadowCaster\" }\n\n \n\n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n ZWrite On\n ColorMask 0\n ZClip [_ZClip]\n \n\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_SHADOWS\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSSHADOW 1\n\n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n //-------------------------------------------------------------------------------------\n // Defines\n //-------------------------------------------------------------------------------------\n \n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n \n\n #if defined(WRITE_NORMAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target2\n #elif defined(WRITE_NORMAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target1\n #else\n #define SV_TARGET_DECAL SV_Target0\n #endif\n\n\n void Frag( VertexToPixel v2f\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n\n #if defined(_DEPTHOFFSET_ON) && !defined(SCENEPICKINGPASS)\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n \n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n #endif\n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n\n\n }\n\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"DepthOnly\"\n Tags { \"LightMode\" = \"DepthOnly\" }\n \n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n \n \n ZWrite On\n \n \n // Stencil setup\n Stencil\n {\n WriteMask [_StencilWriteMaskDepth]\n Ref [_StencilRefDepth]\n Comp Always\n Pass Replace\n }\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n \n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #pragma multi_compile _ WRITE_NORMAL_BUFFER\n #pragma multi_compile _ WRITE_MSAA_DEPTH\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSDEPTH 1\n\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n #if defined(WRITE_NORMAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target2\n #elif defined(WRITE_NORMAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target1\n #else\n #define SV_TARGET_DECAL SV_Target0\n #endif\n\n\n void Frag( VertexToPixel v2p\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n\n #if defined(_DEPTHOFFSET_ON) && !defined(SCENEPICKINGPASS)\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2p);\n FragInputs input = BuildFragInputs(v2p);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n \n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2p, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n // to prevent stripping\n surfaceData.normalWS *= saturate(l.Albedo.r + 9999);\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2p.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n \n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n #endif\n\n }\n\n\n\n ENDHLSL\n }\n\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"META\"\n Tags { \"LightMode\" = \"META\" }\n \n Cull Off\n \n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_LIGHT_TRANSPORT\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define REQUIRE_DEPTH_TEXTURE\n #define _PASSMETA 1\n\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n\n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n float4 Frag(VertexToPixel v2f\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n // no debug apply during light transport pass\n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n LightTransportData lightTransportData = GetLightTransportData(surfaceData, builtinData, bsdfData);\n\n // This shader is call two times. Once for getting emissiveColor, the other time to get diffuseColor\n // We use unity_MetaFragmentControl to make the distinction.\n float4 res = float4(0.0, 0.0, 0.0, 1.0);\n\n if (unity_MetaFragmentControl.x)\n {\n // Apply diffuseColor Boost from LightmapSettings.\n // put abs here to silent a warning, no cost, no impact as color is assume to be positive.\n res.rgb = clamp(pow(abs(lightTransportData.diffuseColor), saturate(unity_OneOverOutputBoost)), 0, unity_MaxOutputValue);\n }\n\n if (unity_MetaFragmentControl.y)\n {\n // emissive use HDR format\n res.rgb = lightTransportData.emissiveColor;\n }\n\n return res;\n }\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"SceneSelectionPass\"\n Tags { \"LightMode\" = \"SceneSelectionPass\" }\n \n Cull Off\n ColorMask 0\n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n #pragma multi_compile_instancing\n #pragma editor_sync_compilation\n #pragma instancing_options renderinglayer\n \n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define SCENESELECTIONPASS\n #define _PASSSCENESELECT 1\n\n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n\n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n \n\n \n void Frag( VertexToPixel IN\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #ifdef WRITE_MSAA_DEPTH\n , out float1 depthColor : SV_Target1\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When only WRITE_MSAA_DEPTH is define and not WRITE_NORMAL_BUFFER it mean we are Unlit and only need depth, but we still have normal buffer binded\n , out float4 outNormalBuffer : SV_Target0\n , out float1 depthColor : SV_Target1\n #elif defined(SCENESELECTIONPASS)\n , out float4 outColor : SV_Target0\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n FragInputs input = BuildFragInputs(IN);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(IN, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), posInput.positionSS, outNormalBuffer);\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When we are MSAA depth only without normal buffer\n // Due to the binding order of these two render targets, we need to have them both declared\n outNormalBuffer = float4(0.0, 0.0, 0.0, 1.0);\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n #elif defined(SCENESELECTIONPASS)\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n Name \"ScenePickingPass\"\n Tags\n {\n \"LightMode\" = \"Picking\"\n }\n \n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n #pragma multi_compile_instancing\n #pragma editor_sync_compilation\n #pragma instancing_options renderinglayer\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n \n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #define SCENEPICKINGPASS\n\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/PickingSpaceTransforms.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n void Frag( VertexToPixel v2f\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n \n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2p.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n \n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n #endif\n\n\n }\n\n ENDHLSL\n }\n\n Pass\n {\n Name \"MotionVectors\"\n Tags\n {\n \"LightMode\" = \"MotionVectors\"\n }\n \n // Render State\n Cull Back\n ZWrite On\n Stencil\n {\n WriteMask [_StencilWriteMaskMV]\n Ref [_StencilRefMV]\n CompFront Always\n PassFront Replace\n CompBack Always\n PassBack Replace\n }\n\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n\n #pragma multi_compile _ WRITE_MSAA_DEPTH\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n #pragma multi_compile _ WRITE_NORMAL_BUFFER\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n\n #define SHADERPASS SHADERPASS_MOTION_VECTORS\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define VARYINGS_NEED_PASS\n #define _PASSMOTIONVECTOR 1\n\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n#if defined(WRITE_DECAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n#define SV_TARGET_NORMAL SV_Target3\n#elif defined(WRITE_DECAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n#define SV_TARGET_NORMAL SV_Target2\n#else\n#define SV_TARGET_NORMAL SV_Target1\n#endif\n\n// Caution: Motion vector pass is different from Depth prepass, it render normal buffer last instead of decal buffer last\n// and thus, we force a write of 0 if _DISABLE_DECALS so we always write in the decal buffer.\n// This is required as we can't make distinction between deferred (write normal buffer) and forward (write normal buffer)\n// in the context of the motion vector pass. The cost is acceptable as it is only do object with motion vector (usualy skin object)\n// that most of the time use Forward Material (so are already writing motion vector data).\n// So note that here unlike for depth prepass we don't check && !defined(_DISABLE_DECALS)\nvoid Frag( VertexToPixel v2f\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n , out float4 outMotionVector : SV_Target1\n #ifdef WRITE_DECAL_BUFFER\n , out float4 outDecalBuffer : SV_Target2\n #endif\n #else\n // When no MSAA, the motion vector is always the first buffer\n , out float4 outMotionVector : SV_Target0\n #ifdef WRITE_DECAL_BUFFER\n , out float4 outDecalBuffer : SV_Target1\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_TARGET_NORMAL\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n\n FragInputs input = BuildFragInputs(v2f);\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n #ifdef _DEPTHOFFSET_ON\n v2f.motionVectorCS.w += builtinData.depthOffset;\n v2f.previousPositionCS.w += builtinData.depthOffset;\n #endif\n\n // TODO: How to allow overriden motion vector from GetSurfaceAndBuiltinData ?\n float2 motionVector = CalculateMotionVector(v2f.motionVectorCS, v2f.previousPositionCS);\n\n // Convert from Clip space (-1..1) to NDC 0..1 space.\n // Note it doesn't mean we don't have negative value, we store negative or positive offset in NDC space.\n // Note: ((positionCS * 0.5 + 0.5) - (v2f.previousPositionCS * 0.5 + 0.5)) = (motionVector * 0.5)\n EncodeMotionVector(motionVector * 0.5, outMotionVector);\n\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n\n // Setting the motionVector to a value more than 2 set as a flag for \"force no motion\". This is valid because, given that the velocities are in NDC,\n // a value of >1 can never happen naturally, unless explicitely set. \n if (forceNoMotion)\n outMotionVector = float4(2.0, 0.0, 0.0, 0.0);\n\n // Depth and Alpha to coverage\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif\n #endif\n\n // Normal Buffer Processing\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER)\n DecalPrepassData decalPrepassData;\n // Force a write in decal buffer even if decal is disab. This is a neutral value which have no impact for later pass\n #ifdef _DISABLE_DECALS\n ZERO_INITIALIZE(DecalPrepassData, decalPrepassData);\n #else\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n #endif\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n Name \"FullScreenDebug\"\n Tags\n {\n \"LightMode\" = \"FullScreenDebug\"\n }\n \n // Render State\n Cull Back\n ZTest LEqual\n ZWrite Off\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n\n #define SHADERPASS SHADERPASS_FULL_SCREEN_DEBUG\n #define _PASSFULLSCREENDEBUG 1\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n#define DEBUG_DISPLAY\n#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/FullScreenDebug.hlsl\"\n\n #if !defined(_DEPTHOFFSET_ON)\n [earlydepthstencil] // quad overshading debug mode writes to UAV\n #endif\n void Frag(VertexToPixel v2f\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz);\n\n #ifdef PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER\n if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_QUAD_OVERDRAW)\n {\n IncrementQuadOverdrawCounter(posInput.positionSS.xy, input.primitiveID);\n }\n #endif\n }\n\n ENDHLSL\n }\n\n \n\n\n \n }\n\n \n \n \n}\n"},{"srpTarget":2,"UnityVersionMin":20212,"UnityVersionMax":30000,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2020.3.8f1\n// Render Pipeline: HDRP2021\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Albedo_NormalMask_ColorMask\"\n{\n Properties\n {\n \n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n\n [GroupRollout(Cullmode)]\n [Group(Cullmode)]_Cull(\"__cull\", Float) = 2.0\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_Albedo(\"Albedo\", 2D) = \"white\" {}\n [Group(Base Overlay)][NoScaleOffset]_NormalMask(\"NormalMask\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_ColorMask(\"ColorMask\", 2D) = \"black\" {}\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_AlphaColor0 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_Albedo1(\"Albedo1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_NormalMask1(\"NormalMask1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_ColorMask1(\"ColorMask1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n\t[Group(Overlay 1)]_RedColor1 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_GreenColor1 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_BlueColor1 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_AlphaColor1 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_Albedo2(\"Albedo2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_NormalMask2(\"NormalMask2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_ColorMask2(\"ColorMask2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n\t[Group(Overlay 2)]_RedColor2 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_GreenColor2 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_BlueColor2 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_AlphaColor2 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_Albedo3(\"Albedo3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_NormalMask3(\"NormalMask3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_ColorMask3(\"ColorMask3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n\t[Group(Overlay 3)]_RedColor3 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_GreenColor3 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_BlueColor3 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_AlphaColor3 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n /* This is what they should be \n half4 Tiles[4][3];\n\thalf4 Tints[4][3];\n\thalf4 Adds[4][3];\n half4 RedColor[4];\n half4 GreenColor[4];\n half4 BlueColor[4];\n half4 AlphaColor[4];\n half NormalStrength[4]; */\n\n\n\n\n [HideInInspector]_RenderQueueType(\"Float\", Float) = 1\n [HideInInspector][ToggleUI]_AddPrecomputedVelocity(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_DepthOffsetEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentWritingMotionVec(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaCutoffEnable(\"Boolean\", Float) = 0\n [HideInInspector]_TransparentSortPriority(\"_TransparentSortPriority\", Float) = 0\n [HideInInspector][ToggleUI]_UseShadowThreshold(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentDepthPrepassEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentDepthPostpassEnable(\"Boolean\", Float) = 0\n [HideInInspector]_SurfaceType(\"Float\", Float) = 0\n [HideInInspector]_BlendMode(\"Float\", Float) = 0\n [HideInInspector]_SrcBlend(\"Float\", Float) = 1\n [HideInInspector]_DstBlend(\"Float\", Float) = 0\n [HideInInspector]_AlphaSrcBlend(\"Float\", Float) = 1\n [HideInInspector]_AlphaDstBlend(\"Float\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaToMask(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaToMaskInspectorValue(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_ZWrite(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_TransparentZWrite(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_EnableFogOnTransparent(\"Boolean\", Float) = 1\n [HideInInspector]_ZTestDepthEqualForOpaque(\"Float\", Int) = 4\n [HideInInspector][Enum(UnityEngine.Rendering.CompareFunction)]_ZTestTransparent(\"Float\", Float) = 4\n [HideInInspector][ToggleUI]_TransparentBackfaceEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_RequireSplitLighting(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_ReceivesSSR(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_ReceivesSSRTransparent(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_EnableBlendModePreserveSpecularLighting(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_SupportDecals(\"Boolean\", Float) = 1\n [HideInInspector]_StencilRef(\"Float\", Int) = 0\n [HideInInspector]_StencilWriteMask(\"Float\", Int) = 6\n [HideInInspector]_StencilRefDepth(\"Float\", Int) = 8\n [HideInInspector]_StencilWriteMaskDepth(\"Float\", Int) = 8\n [HideInInspector]_StencilRefMV(\"Float\", Int) = 40\n [HideInInspector]_StencilWriteMaskMV(\"Float\", Int) = 40\n [HideInInspector]_StencilRefDistortionVec(\"Float\", Int) = 4\n [HideInInspector]_StencilWriteMaskDistortionVec(\"Float\", Int) = 4\n [HideInInspector]_StencilWriteMaskGBuffer(\"Float\", Int) = 14\n [HideInInspector]_StencilRefGBuffer(\"Float\", Int) = 10\n [HideInInspector]_ZTestGBuffer(\"Float\", Int) = 4\n [HideInInspector][ToggleUI]_RayTracing(\"Boolean\", Float) = 0\n [HideInInspector][Enum(None, 0, Box, 1, Sphere, 2, Thin, 3)]_RefractionModel(\"Float\", Float) = 0\n [HideInInspector][NoScaleOffset]unity_Lightmaps(\"unity_Lightmaps\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_LightmapsInd(\"unity_LightmapsInd\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_ShadowMasks(\"unity_ShadowMasks\", 2DArray) = \"\" {}\n }\n SubShader\n {\n Tags { \"RenderPipeline\" = \"HDRenderPipeline\" \"RenderType\" = \"HDLitShader\" \"Queue\" = \"Geometry+225\" }\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"Forward\"\n Tags { \"LightMode\" = \"Forward\" }\n\n \n \n Stencil\n {\n WriteMask [_StencilWriteMask]\n Ref [_StencilRef]\n CompFront Always\n PassFront Replace\n CompBack Always\n PassBack Replace\n }\n \n ColorMask [_ColorMaskTransparentVel] 1\n\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n #pragma multi_compile _ DEBUG_DISPLAY\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n #pragma multi_compile _ LIGHTMAP_ON\n #pragma multi_compile _ DIRLIGHTMAP_COMBINED\n #pragma multi_compile_fragment PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2\n #pragma multi_compile_raytracing PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2\n #pragma multi_compile _ DYNAMICLIGHTMAP_ON\n #pragma multi_compile_fragment _ SHADOWS_SHADOWMASK\n #pragma multi_compile_raytracing _ SHADOWS_SHADOWMASK\n #pragma multi_compile_fragment DECALS_OFF DECALS_3RT DECALS_4RT\n #pragma multi_compile_fragment _ DECAL_SURFACE_GRADIENT\n #pragma multi_compile_fragment SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH SHADOW_VERY_HIGH\n #pragma multi_compile_fragment SCREEN_SPACE_SHADOWS_OFF SCREEN_SPACE_SHADOWS_ON\n #pragma multi_compile_fragment USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST\n \n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_FORWARD\n #define SUPPORT_BLENDMODE_PRESERVE_SPECULAR_LIGHTING\n #define HAS_LIGHTLOOP\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define _PASSFORWARD 1\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n #define VT_BUFFER_TARGET SV_Target1\n #define EXTRA_BUFFER_TARGET SV_Target2\n #else\n #define EXTRA_BUFFER_TARGET SV_Target1\n #endif\n\n\n\n\n void Frag(VertexToPixel v2p,\n #ifdef OUTPUT_SPLIT_LIGHTING\n out float4 outColor : SV_Target0, // outSpecularLighting\n #ifdef UNITY_VIRTUAL_TEXTURING\n out float4 outVTFeedback : VT_BUFFER_TARGET,\n #endif\n out float4 outDiffuseLighting : EXTRA_BUFFER_TARGET,\n OUTPUT_SSSBUFFER(outSSSBuffer)\n #else\n out float4 outColor : SV_Target0\n #ifdef UNITY_VIRTUAL_TEXTURING\n ,out float4 outVTFeedback : VT_BUFFER_TARGET\n #endif\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n , out float4 outMotionVec : EXTRA_BUFFER_TARGET\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif // OUTPUT_SPLIT_LIGHTING\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n // Init outMotionVector here to solve compiler warning (potentially unitialized variable)\n // It is init to the value of forceNoMotion (with 2.0)\n outMotionVec = float4(2.0, 0.0, 0.0, 0.0);\n #endif\n\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2p);\n FragInputs input = BuildFragInputs(v2p);\n\n // We need to readapt the SS position as our screen space positions are for a low res buffer, but we try to access a full res buffer.\n input.positionSS.xy = _OffScreenRendering > 0 ? (input.positionSS.xy * _OffScreenDownsampleFactor) : input.positionSS.xy;\n\n uint2 tileIndex = uint2(input.positionSS.xy) / GetTileSize();\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, tileIndex);\n\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2p, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n \n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n\n PreLightData preLightData = GetPreLightData(V, posInput, bsdfData);\n\n outColor = float4(0.0, 0.0, 0.0, 0.0);\n\n // We need to skip lighting when doing debug pass because the debug pass is done before lighting so some buffers may not be properly initialized potentially causing crashes on PS4.\n\n #ifdef DEBUG_DISPLAY\n // Init in debug display mode to quiet warning\n #ifdef OUTPUT_SPLIT_LIGHTING\n outDiffuseLighting = 0;\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #endif\n\n \n\n // Same code in ShaderPassForwardUnlit.shader\n // Reminder: _DebugViewMaterialArray[i]\n // i==0 -> the size used in the buffer\n // i>0 -> the index used (0 value means nothing)\n // The index stored in this buffer could either be\n // - a gBufferIndex (always stored in _DebugViewMaterialArray[1] as only one supported)\n // - a property index which is different for each kind of material even if reflecting the same thing (see MaterialSharedProperty)\n bool viewMaterial = false;\n int bufferSize = _DebugViewMaterialArray[0].x;\n if (bufferSize != 0)\n {\n bool needLinearToSRGB = false;\n float3 result = float3(1.0, 0.0, 1.0);\n\n // Loop through the whole buffer\n // Works because GetSurfaceDataDebug will do nothing if the index is not a known one\n for (int index = 1; index <= bufferSize; index++)\n {\n int indexMaterialProperty = _DebugViewMaterialArray[index].x;\n\n // skip if not really in use\n if (indexMaterialProperty != 0)\n {\n viewMaterial = true;\n\n GetPropertiesDataDebug(indexMaterialProperty, result, needLinearToSRGB);\n GetVaryingsDataDebug(indexMaterialProperty, input, result, needLinearToSRGB);\n GetBuiltinDataDebug(indexMaterialProperty, builtinData, posInput, result, needLinearToSRGB);\n GetSurfaceDataDebug(indexMaterialProperty, surfaceData, result, needLinearToSRGB);\n GetBSDFDataDebug(indexMaterialProperty, bsdfData, result, needLinearToSRGB);\n }\n }\n\n // TEMP!\n // For now, the final blit in the backbuffer performs an sRGB write\n // So in the meantime we apply the inverse transform to linear data to compensate.\n if (!needLinearToSRGB)\n result = SRGBToLinear(max(0, result));\n\n outColor = float4(result, 1.0);\n }\n\n if (!viewMaterial)\n {\n if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_DIFFUSE_COLOR || _DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_SPECULAR_COLOR)\n {\n float3 result = float3(0.0, 0.0, 0.0);\n\n GetPBRValidatorDebug(surfaceData, result);\n\n outColor = float4(result, 1.0f);\n }\n else if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_TRANSPARENCY_OVERDRAW)\n {\n float4 result = _DebugTransparencyOverdrawWeight * float4(TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_A);\n outColor = result;\n }\n else\n #endif\n {\n #ifdef _SURFACE_TYPE_TRANSPARENT\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_TRANSPARENT;\n #else\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_OPAQUE;\n #endif\n\n LightLoopOutput lightLoopOutput;\n LightLoop(V, posInput, preLightData, bsdfData, builtinData, featureFlags, lightLoopOutput);\n\n float3 diffuseLighting = lightLoopOutput.diffuseLighting;\n float3 specularLighting = lightLoopOutput.specularLighting;\n\n diffuseLighting *= GetCurrentExposureMultiplier();\n specularLighting *= GetCurrentExposureMultiplier();\n\n #ifdef OUTPUT_SPLIT_LIGHTING\n if (_EnableSubsurfaceScattering != 0 && ShouldOutputSplitLighting(bsdfData))\n {\n outColor = float4(specularLighting, 1.0);\n outDiffuseLighting = float4(TagLightingForSSS(diffuseLighting), 1.0);\n }\n else\n {\n outColor = float4(diffuseLighting + specularLighting, 1.0);\n outDiffuseLighting = 0;\n }\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #else\n outColor = ApplyBlendMode(diffuseLighting, specularLighting, builtinData.opacity);\n outColor = EvaluateAtmosphericScattering(posInput, V, outColor);\n #endif\n\n ChainFinalColorForward(l, d, outColor);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n bool forceNoMotion = any(unity_MotionVectorsParams.yw == 0.0);\n // outMotionVec is already initialize at the value of forceNoMotion (see above)\n if (!forceNoMotion)\n {\n float2 motionVec = CalculateMotionVector(v2p.motionVectorCS, v2p.previousPositionCS);\n EncodeMotionVector(motionVec * 0.5, outMotionVec);\n outMotionVec.zw = 1.0;\n }\n #endif\n }\n\n #ifdef DEBUG_DISPLAY\n }\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n outVTFeedback = builtinData.vtPackedFeedback;\n #endif\n }\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"ShadowCaster\"\n Tags { \"LightMode\" = \"ShadowCaster\" }\n\n \n\n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n ZWrite On\n ColorMask 0\n ZClip [_ZClip]\n \n\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_SHADOWS\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSSHADOW 1\n\n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n //-------------------------------------------------------------------------------------\n // Defines\n //-------------------------------------------------------------------------------------\n \n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n \n\n #if defined(WRITE_NORMAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target2\n #elif defined(WRITE_NORMAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target1\n #else\n #define SV_TARGET_DECAL SV_Target0\n #endif\n\n\n void Frag( VertexToPixel v2f\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n\n #if defined(_DEPTHOFFSET_ON) && !defined(SCENEPICKINGPASS)\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n \n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n #endif\n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n\n\n }\n\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"DepthOnly\"\n Tags { \"LightMode\" = \"DepthOnly\" }\n \n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n \n \n ZWrite On\n \n \n // Stencil setup\n Stencil\n {\n WriteMask [_StencilWriteMaskDepth]\n Ref [_StencilRefDepth]\n Comp Always\n Pass Replace\n }\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n \n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #pragma multi_compile _ WRITE_NORMAL_BUFFER\n #pragma multi_compile _ WRITE_MSAA_DEPTH\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSDEPTH 1\n\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n #if defined(WRITE_NORMAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target2\n #elif defined(WRITE_NORMAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target1\n #else\n #define SV_TARGET_DECAL SV_Target0\n #endif\n\n\n void Frag( VertexToPixel v2p\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n\n #if defined(_DEPTHOFFSET_ON) && !defined(SCENEPICKINGPASS)\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2p);\n FragInputs input = BuildFragInputs(v2p);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n \n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2p, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n // to prevent stripping\n surfaceData.normalWS *= saturate(l.Albedo.r + 9999);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2p.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n \n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n #endif\n\n }\n\n\n\n ENDHLSL\n }\n\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"META\"\n Tags { \"LightMode\" = \"META\" }\n \n Cull Off\n \n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n\n \n #pragma multi_compile_instancing\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_LIGHT_TRANSPORT\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define REQUIRE_DEPTH_TEXTURE\n #define _PASSMETA 1\n\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n\n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n float4 Frag(VertexToPixel v2f\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n // no debug apply during light transport pass\n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n LightTransportData lightTransportData = GetLightTransportData(surfaceData, builtinData, bsdfData);\n\n // This shader is call two times. Once for getting emissiveColor, the other time to get diffuseColor\n // We use unity_MetaFragmentControl to make the distinction.\n float4 res = float4(0.0, 0.0, 0.0, 1.0);\n\n if (unity_MetaFragmentControl.x)\n {\n // Apply diffuseColor Boost from LightmapSettings.\n // put abs here to silent a warning, no cost, no impact as color is assume to be positive.\n res.rgb = clamp(pow(abs(lightTransportData.diffuseColor), saturate(unity_OneOverOutputBoost)), 0, unity_MaxOutputValue);\n }\n\n if (unity_MetaFragmentControl.y)\n {\n // emissive use HDR format\n res.rgb = lightTransportData.emissiveColor;\n }\n\n return res;\n }\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"SceneSelectionPass\"\n Tags { \"LightMode\" = \"SceneSelectionPass\" }\n \n Cull Off\n ColorMask 0\n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n #pragma multi_compile_instancing\n #pragma editor_sync_compilation\n #pragma instancing_options renderinglayer\n \n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define SCENESELECTIONPASS\n #define _PASSSCENESELECT 1\n\n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n\n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n \n\n \n void Frag( VertexToPixel IN\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #ifdef WRITE_MSAA_DEPTH\n , out float1 depthColor : SV_Target1\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When only WRITE_MSAA_DEPTH is define and not WRITE_NORMAL_BUFFER it mean we are Unlit and only need depth, but we still have normal buffer binded\n , out float4 outNormalBuffer : SV_Target0\n , out float1 depthColor : SV_Target1\n #elif defined(SCENESELECTIONPASS)\n , out float4 outColor : SV_Target0\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n FragInputs input = BuildFragInputs(IN);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(IN, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), posInput.positionSS, outNormalBuffer);\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When we are MSAA depth only without normal buffer\n // Due to the binding order of these two render targets, we need to have them both declared\n outNormalBuffer = float4(0.0, 0.0, 0.0, 1.0);\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n #elif defined(SCENESELECTIONPASS)\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n Name \"ScenePickingPass\"\n Tags\n {\n \"LightMode\" = \"Picking\"\n }\n \n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n #pragma multi_compile_instancing\n #pragma editor_sync_compilation\n #pragma instancing_options renderinglayer\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n \n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #define SCENEPICKINGPASS\n\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/PickingSpaceTransforms.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n void Frag( VertexToPixel v2f\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n \n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2p.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n \n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n #endif\n\n\n }\n\n ENDHLSL\n }\n\n Pass\n {\n Name \"MotionVectors\"\n Tags\n {\n \"LightMode\" = \"MotionVectors\"\n }\n \n // Render State\n Cull Back\n ZWrite On\n Stencil\n {\n WriteMask [_StencilWriteMaskMV]\n Ref [_StencilRefMV]\n CompFront Always\n PassFront Replace\n CompBack Always\n PassBack Replace\n }\n\n Cull[_Cull]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n\n #pragma multi_compile _ WRITE_MSAA_DEPTH\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n #pragma multi_compile _ WRITE_NORMAL_BUFFER\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n\n #define SHADERPASS SHADERPASS_MOTION_VECTORS\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define VARYINGS_NEED_PASS\n #define _PASSMOTIONVECTOR 1\n\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n#if defined(WRITE_DECAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n#define SV_TARGET_NORMAL SV_Target3\n#elif defined(WRITE_DECAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n#define SV_TARGET_NORMAL SV_Target2\n#else\n#define SV_TARGET_NORMAL SV_Target1\n#endif\n\n// Caution: Motion vector pass is different from Depth prepass, it render normal buffer last instead of decal buffer last\n// and thus, we force a write of 0 if _DISABLE_DECALS so we always write in the decal buffer.\n// This is required as we can't make distinction between deferred (write normal buffer) and forward (write normal buffer)\n// in the context of the motion vector pass. The cost is acceptable as it is only do object with motion vector (usualy skin object)\n// that most of the time use Forward Material (so are already writing motion vector data).\n// So note that here unlike for depth prepass we don't check && !defined(_DISABLE_DECALS)\nvoid Frag( VertexToPixel v2f\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n , out float4 outMotionVector : SV_Target1\n #ifdef WRITE_DECAL_BUFFER\n , out float4 outDecalBuffer : SV_Target2\n #endif\n #else\n // When no MSAA, the motion vector is always the first buffer\n , out float4 outMotionVector : SV_Target0\n #ifdef WRITE_DECAL_BUFFER\n , out float4 outDecalBuffer : SV_Target1\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_TARGET_NORMAL\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n\n FragInputs input = BuildFragInputs(v2f);\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n #ifdef _DEPTHOFFSET_ON\n v2f.motionVectorCS.w += builtinData.depthOffset;\n v2f.previousPositionCS.w += builtinData.depthOffset;\n #endif\n\n // TODO: How to allow overriden motion vector from GetSurfaceAndBuiltinData ?\n float2 motionVector = CalculateMotionVector(v2f.motionVectorCS, v2f.previousPositionCS);\n\n // Convert from Clip space (-1..1) to NDC 0..1 space.\n // Note it doesn't mean we don't have negative value, we store negative or positive offset in NDC space.\n // Note: ((positionCS * 0.5 + 0.5) - (v2f.previousPositionCS * 0.5 + 0.5)) = (motionVector * 0.5)\n EncodeMotionVector(motionVector * 0.5, outMotionVector);\n\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n\n // Setting the motionVector to a value more than 2 set as a flag for \"force no motion\". This is valid because, given that the velocities are in NDC,\n // a value of >1 can never happen naturally, unless explicitely set. \n if (forceNoMotion)\n outMotionVector = float4(2.0, 0.0, 0.0, 0.0);\n\n // Depth and Alpha to coverage\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif\n #endif\n\n // Normal Buffer Processing\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER)\n DecalPrepassData decalPrepassData;\n // Force a write in decal buffer even if decal is disab. This is a neutral value which have no impact for later pass\n #ifdef _DISABLE_DECALS\n ZERO_INITIALIZE(DecalPrepassData, decalPrepassData);\n #else\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n #endif\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n Name \"FullScreenDebug\"\n Tags\n {\n \"LightMode\" = \"FullScreenDebug\"\n }\n \n // Render State\n Cull Back\n ZTest LEqual\n ZWrite Off\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n\n #define SHADERPASS SHADERPASS_FULL_SCREEN_DEBUG\n #define _PASSFULLSCREENDEBUG 1\n \n \n\n\n #define _HDRP 1\n\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n#define DEBUG_DISPLAY\n#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/FullScreenDebug.hlsl\"\n\n #if !defined(_DEPTHOFFSET_ON)\n [earlydepthstencil] // quad overshading debug mode writes to UAV\n #endif\n void Frag(VertexToPixel v2f\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz);\n\n #ifdef PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER\n if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_QUAD_OVERDRAW)\n {\n IncrementQuadOverdrawCounter(posInput.positionSS.xy, input.primitiveID);\n }\n #endif\n }\n\n ENDHLSL\n }\n\n \n\n\n \n }\n\n \n \n \n}\n"},{"srpTarget":1,"UnityVersionMin":20202,"UnityVersionMax":30000,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2020.3.8f1\n// Render Pipeline: URP2020\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Albedo_NormalMask_ColorMask\"\n{\n Properties\n {\n [HideInInspector][NoScaleOffset]unity_Lightmaps(\"unity_Lightmaps\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_LightmapsInd(\"unity_LightmapsInd\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_ShadowMasks(\"unity_ShadowMasks\", 2DArray) = \"\" {}\n \n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n\n [GroupRollout(Cullmode)]\n [Group(Cullmode)]_Cull(\"__cull\", Float) = 2.0\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_Albedo(\"Albedo\", 2D) = \"white\" {}\n [Group(Base Overlay)][NoScaleOffset]_NormalMask(\"NormalMask\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_ColorMask(\"ColorMask\", 2D) = \"black\" {}\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_AlphaColor0 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_Albedo1(\"Albedo1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_NormalMask1(\"NormalMask1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_ColorMask1(\"ColorMask1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n\t[Group(Overlay 1)]_RedColor1 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_GreenColor1 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_BlueColor1 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 1)]_AlphaColor1 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_Albedo2(\"Albedo2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_NormalMask2(\"NormalMask2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_ColorMask2(\"ColorMask2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n\t[Group(Overlay 2)]_RedColor2 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_GreenColor2 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_BlueColor2 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 2)]_AlphaColor2 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_Albedo3(\"Albedo3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_NormalMask3(\"NormalMask3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_ColorMask3(\"ColorMask3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n\t[Group(Overlay 3)]_RedColor3 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_GreenColor3 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_BlueColor3 (\"BlueColor\", Color) = (1, 1, 1, 1)\n\t[Group(Overlay 3)]_AlphaColor3 (\"AlphaColor\", Color) = (1, 1, 1, 1)\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n /* This is what they should be \n half4 Tiles[4][3];\n\thalf4 Tints[4][3];\n\thalf4 Adds[4][3];\n half4 RedColor[4];\n half4 GreenColor[4];\n half4 BlueColor[4];\n half4 AlphaColor[4];\n half NormalStrength[4]; */\n\n\n\n }\n SubShader\n {\n Tags { \"RenderPipeline\"=\"UniversalPipeline\" \"RenderType\" = \"Opaque\" \"UniversalMaterialType\" = \"Lit\" \"Queue\" = \"Geometry\" }\n\n \n\n \n Pass\n {\n Name \"Universal Forward\"\n Tags \n { \n \"LightMode\" = \"UniversalForward\"\n }\n Cull Back\n Blend One Zero\n ZTest LEqual\n ZWrite On\n\n Blend One Zero, One Zero\nCull Back\nZTest LEqual\nZWrite On\n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_fog\n #pragma multi_compile_instancing\n #pragma multi_compile _ DOTS_INSTANCING_ON\n \n // Keywords\n #pragma multi_compile _ _SCREEN_SPACE_OCCLUSION\n #pragma multi_compile _ LIGHTMAP_ON\n #pragma multi_compile _ DIRLIGHTMAP_COMBINED\n #pragma multi_compile _ _MAIN_LIGHT_SHADOWS\n #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE\n #pragma multi_compile _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS _ADDITIONAL_OFF\n #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS\n #pragma multi_compile _ _SHADOWS_SOFT\n #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING\n #pragma multi_compile _ SHADOWS_SHADOWMASK\n // GraphKeywords: \n\n #define SHADER_PASS SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD\n #define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #define _PASSFORWARD 1\n \n\n \n\n\n #define _URP 1\n\n\n // this has to be here or specular color will be ignored. Not in SG code\n #if _SIMPLELIT\n #define _SPECULAR_COLOR\n #endif\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n float4 fogFactorAndVertexLight : TEXCOORD10;\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n float4 shadowCoord : TEXCOORD11;\n #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD || _PASSGBUFFER\n float2 uv1 = v.texcoord1.xy;\n OUTPUT_LIGHTMAP_UV(uv1, unity_LightmapST, o.lightmapUV);\n // o.texcoord1.xy = uv1;\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #if _USESPECULAR || _SIMPLELIT\n float3 specular = l.Specular;\n float metallic = 1;\n #else \n float3 specular = 0;\n float metallic = l.Metallic;\n #endif\n\n\n \n \n InputData inputData;\n\n inputData.positionWS = IN.worldPos;\n #if _WORLDSPACENORMAL\n inputData.normalWS = l.Normal;\n #else\n inputData.normalWS = normalize(TangentToWorldSpace(d, l.Normal));\n #endif\n\n inputData.viewDirectionWS = SafeNormalize(d.worldSpaceViewDir);\n\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n inputData.shadowCoord = IN.shadowCoord;\n #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)\n inputData.shadowCoord = TransformWorldToShadowCoord(IN.worldPos);\n #else\n inputData.shadowCoord = float4(0, 0, 0, 0);\n #endif\n\n inputData.fogCoord = IN.fogFactorAndVertexLight.x;\n inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw;\n #if defined(_OVERRIDE_BAKEDGI)\n inputData.bakedGI = l.DiffuseGI;\n l.Emission += l.SpecularGI;\n #else\n inputData.bakedGI = SAMPLE_GI(IN.lightmapUV, IN.sh, inputData.normalWS);\n #endif\n inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.pos);\n #if !_BAKEDLIT\n inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUV);\n\n #if defined(_OVERRIDE_SHADOWMASK)\n float4 mulColor = saturate(dot(l.ShadowMask, _MainLightOcclusionProbes)); //unity_OcclusionMaskSelector));\n inputData.shadowMask = mulColor;\n #endif\n #endif\n\n #if !_UNLIT\n #if _SIMPLELIT\n half4 color = UniversalFragmentBlinnPhong(\n inputData,\n l.Albedo,\n float4(specular * l.Smoothness, 0),\n l.SpecularPower * 128,\n l.Emission,\n l.Alpha);\n color.a = l.Alpha;\n #elif _BAKEDLIT\n color = UniversalFragmentBakedLit(inputData, l.Albedo, l.Alpha, normalTS);\n #else\n\n \n SurfaceData surface = (SurfaceData)0;\n surface.albedo = l.Albedo;\n surface.metallic = saturate(metallic);\n surface.specular = specular;\n surface.smoothness = saturate(l.Smoothness),\n surface.occlusion = l.Occlusion,\n surface.emission = l.Emission,\n surface.alpha = saturate(l.Alpha);\n surface.clearCoatMask = 0;\n surface.clearCoatSmoothness = 1;\n\n #ifdef _CLEARCOAT\n surface.clearCoatMask = saturate(l.CoatMask);\n surface.clearCoatSmoothness = saturate(l.CoatSmoothness);\n #endif\n\n half4 color = UniversalFragmentPBR(inputData, surface);\n\n #endif\n\n #else\n half4 color = half4(l.Albedo, l.Alpha);\n \n #endif\n\n #if !DISABLEFOG\n color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x);\n #endif\n ChainFinalColorForward(l, d, color);\n\n return color;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n \n Pass\n {\n Name \"ShadowCaster\"\n Tags \n { \n \"LightMode\" = \"ShadowCaster\"\n }\n \n // Render State\n Blend One Zero, One Zero\n Cull Back\n ZTest LEqual\n ZWrite On\n // ColorMask: \n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_instancing\n \n #define _NORMAL_DROPOFF_TS 1\n #define ATTRIBUTES_NEED_NORMAL\n #define ATTRIBUTES_NEED_TANGENT\n #define SHADERPASS_SHADOWCASTER\n #define _PASSSHADOW 1\n\n \n\n\n #define _URP 1\n\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n float4 fogFactorAndVertexLight : TEXCOORD10;\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n float4 shadowCoord : TEXCOORD11;\n #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD || _PASSGBUFFER\n float2 uv1 = v.texcoord1.xy;\n OUTPUT_LIGHTMAP_UV(uv1, unity_LightmapST, o.lightmapUV);\n // o.texcoord1.xy = uv1;\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n return 0;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"DepthOnly\"\n Tags \n { \n \"LightMode\" = \"DepthOnly\"\n }\n \n // Render State\n Blend One Zero, One Zero\n Cull Back\n ZTest LEqual\n ZWrite On\n ColorMask 0\n \n Cull[_Cull]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n\n #define SHADERPASS_DEPTHONLY\n #define _PASSDEPTH 1\n\n #pragma target 3.0\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_instancing\n #pragma multi_compile _ DOTS_INSTANCING_ON\n\n \n\n\n #define _URP 1\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n float4 fogFactorAndVertexLight : TEXCOORD10;\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n float4 shadowCoord : TEXCOORD11;\n #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD || _PASSGBUFFER\n float2 uv1 = v.texcoord1.xy;\n OUTPUT_LIGHTMAP_UV(uv1, unity_LightmapST, o.lightmapUV);\n // o.texcoord1.xy = uv1;\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n return 0;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"Meta\"\n Tags \n { \n \"LightMode\" = \"Meta\"\n }\n\n // Render State\n Cull Off\n // ColorMask: \n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n \n #define SHADERPASS_META\n #define _PASSMETA 1\n\n\n \n\n\n #define _URP 1\n\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n float4 fogFactorAndVertexLight : TEXCOORD10;\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n float4 shadowCoord : TEXCOORD11;\n #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD || _PASSGBUFFER\n float2 uv1 = v.texcoord1.xy;\n OUTPUT_LIGHTMAP_UV(uv1, unity_LightmapST, o.lightmapUV);\n // o.texcoord1.xy = uv1;\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n\n Surface l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n MetaInput metaInput = (MetaInput)0;\n metaInput.Albedo = l.Albedo;\n metaInput.Emission = l.Emission;\n\n return MetaFragment(metaInput);\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"DepthNormals\"\n Tags\n {\n \"LightMode\" = \"DepthNormals\"\n }\n \n // Render State\n Cull Back\n Blend One Zero\n ZTest LEqual\n ZWrite On\n\n Cull[_Cull]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_fog\n #pragma multi_compile_instancing\n #pragma multi_compile _ DOTS_INSTANCING_ON\n \n #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY\n #define _PASSDEPTH 1\n #define _PASSDEPTHNORMALS 1\n\n\n \n\n\n #define _URP 1\n\n\n // this has to be here or specular color will be ignored. Not in SG code\n #if _SIMPLELIT\n #define _SPECULAR_COLOR\n #endif\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n float4 fogFactorAndVertexLight : TEXCOORD10;\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n float4 shadowCoord : TEXCOORD11;\n #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n\thalf4 _AlphaColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n\thalf4 _RedColor1;\n\thalf4 _GreenColor1;\n\thalf4 _BlueColor1;\n\thalf4 _AlphaColor1;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n\thalf4 _RedColor2;\n\thalf4 _GreenColor2;\n\thalf4 _BlueColor2;\n\thalf4 _AlphaColor2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n\thalf4 _RedColor3;\n\thalf4 _GreenColor3;\n\thalf4 _BlueColor3;\n\thalf4 _AlphaColor3;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_Albedo);\n SAMPLER(sampler_Albedo);\n TEXTURE2D(_NormalMask);\n TEXTURE2D(_ColorMask);\n\n\n TEXTURE2D(_Albedo1);\n TEXTURE2D(_NormalMask1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_ColorMask1);\n\n TEXTURE2D(_Albedo2);\n TEXTURE2D(_NormalMask2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_ColorMask2);\n\n TEXTURE2D(_Albedo3);\n TEXTURE2D(_NormalMask3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_ColorMask3);\n\n // MaskedNormal Format\n // R = Normal X\n // G = Normal Y\n // B = Metallic\n // A = Smooth\n\n half4 Colorize(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor, half4 AlphaColor )\n\t{ \n\t if (values.r > 0)\n\t\t{\n\t\t half3 newcol = base_c.rgb * RedColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.r).rgb; \n\t\t}\n\t if (values.g > 0)\n\t\t{\n\t\t half3 newcol = base_c * GreenColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.g).rgb; \n\t\t}\n\t if (values.b > 0)\n\t\t{\n\t\t half3 newcol = base_c * BlueColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.b).rgb; \n\t\t}\n\t\tif (values.a > 0)\n\t\t{\n\t\t half3 newcol = base_c * AlphaColor.rgb;\n\t\t base_c.rgb = lerp(base_c,newcol,values.a).rgb; \n\t\t}\n\n\t\treturn base_c;\n\t}\n\n // Local version of UnpackScaleNormal that assumes channels XY and Shader Model >= 3.0\n half3 UnpackScaleNormalLocal(half4 packednormal, half bumpScale)\n {\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1);\n normal.xy *= bumpScale;\n normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0;\n base_c = Colorize(base_c,mask,_RedColor0,_GreenColor0,_BlueColor0,_AlphaColor0);\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormalLocal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = basepackednormal.a;\n\t half base_Metallic = basepackednormal.b;\n\t o.Alpha = base_c.a; \n\n\n\t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1,_AlphaColor1);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n\t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2,_AlphaColor2);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n // IF HASALPHAMASK\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a;\n half oneminus = 1.0f - alpha;\n // ELSE\n // alpha = 1.0f\n // oneminus = 0.0f;\n //\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0;\n\n // if HASCOLORMASK\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv);\n add_c = Colorize(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3,_AlphaColor3);\n //\n\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n // IF HASNORMAL\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormalLocal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus);\n //\n \t }\n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n\n\n\n \n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n // d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n \n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD || _PASSGBUFFER\n float2 uv1 = v.texcoord1.xy;\n OUTPUT_LIGHTMAP_UV(uv1, unity_LightmapST, o.lightmapUV);\n // o.texcoord1.xy = uv1;\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n return float4(PackNormalOctRectEncode(TransformWorldToViewDir(d.worldSpaceNormal, true)), 0.0, 0.0);\n\n }\n\n ENDHLSL\n\n }\n\n\n \n\n\n \n\n }\n \n \n \n}\n"}],"betterShader":{"fileID":-6465566751694194690,"guid":"35c2395e1370b784a989b0761ac1b66d","type":3},"betterShaderPath":"Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer.surfshader","optionOverrides":{"shaderName":"","useCustomEditor":false,"customEditor":"","fallback":{"instanceID":0}}}} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer_sp.umaShaderPack.meta b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer_sp.umaShaderPack.meta new file mode 100644 index 000000000..95b8f2b77 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Compositer_sp.umaShaderPack.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 00a785c0ebde240458a088cf1a70ac00 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 432996ca1b2bd36408bd150d34f9b6ca, type: 3} diff --git a/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Cutout_Compositer.surfshader b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Cutout_Compositer.surfshader new file mode 100644 index 000000000..a520f657b --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Cutout_Compositer.surfshader @@ -0,0 +1,423 @@ +BEGIN_OPTIONS + ShaderName "UMA/Compositing/Albedo_NormalMask_ColorMask_Cutout" + Stackable "False" + DisableGBufferPass "True" // disable gbuffer pass + Workflow "Metallic" + Tags { "RenderType" = "Opaque" "Queue" = "Geometry+100" } +END_OPTIONS + + // MaskedNormal format + // R = Normal X + // G = Normal Y + // B = Metallic + // A = Smooth + + // ColorMask format + // R = Amount to colorize using the _RedColor value + // G = Amount to colorize using the _GreenColor value + // B = Amount to colorize using the _BlueColor value + // A = Emissive amount + +BEGIN_PROPERTIES + + [BetterHeader(Material Specific)] + _OverlayCount ("OverlayCount", Float) = 0 + _ColorModulation ("Color Modulation", Range(0,2)) = 1 + _MetallicModulation ("Metallic Level", Range(0,2)) = 1 + _SmoothnessModulation ("Smoothness Level", Range(0,2)) = 1 + _EmissiveModulation ("Emissive Level", Range(0,2)) = 1 + _Cutoff("Alpha Cutoff", Range(0,1)) = 0.5 + + [Enum(Off,0,Front,1,Back,2)]_CullMode("Culling Mode", Float) = 2 + [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1 + + [GroupRollout(Base Overlay)] + [Group(Base Overlay)][NoScaleOffset]_Albedo("Albedo", 2D) = "white" {} + [Message(A NormalMask is encoded as follows R Normal_X G Normal_Y B Metallic_Level A Smoothness_Level)] + [BetterHeader(Normal Mask)] + [Group(Base Overlay)][NoScaleOffset]_NormalMask("NormalMask", 2D) = "bump" {} + [Group(Base Overlay)][NoScaleOffset]_ColorMask("ColorMask", 2D) = "black" {} + // no AlphaMask for the base. + [Group(Base Overlay)]_Tile0_0 ("Tile0_0", Float) = 1 + [Group(Base Overlay)]_Tile0_1 ("Tile0_1", Float) = 1 + [Group(Base Overlay)]_Tile0_2 ("Tile0_2", Float) = 1 + [Group(Base Overlay)]_NormalStrength0("Normal Strength 0", Range(0,2)) = 1 + [Group(Base Overlay)]_RedColor0 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_GreenColor0 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_BlueColor0 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_Tint0_0 ("Tint 0_0",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_1 ("Tint 0_1",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_2 ("Tint 0_2",Color) = (1,1,1,1) + [Group(Base Overlay)]_Add0_0 ("Add 0_0",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_1 ("Add 0_1",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_2 ("Add 0_2",Color) = (0,0,0,0) + + [GroupRollout(Overlay 1)] + [Group(Overlay 1)][NoScaleOffset]_Albedo1("Albedo1", 2D) = "white" {} + [Group(Overlay 1)][NoScaleOffset]_NormalMask1("NormalMask1", 2D) = "bump" {} + [Group(Overlay 1)][NoScaleOffset]_ColorMask1("ColorMask1", 2D) = "black" {} + [Group(Overlay 1)][NoScaleOffset]_AlphaMask1("Mask1", 2D) = "white" {} + [Group(Overlay 1)]_Tile1_0 ("Tile1_0", Float) = 1 + [Group(Overlay 1)]_Tile1_1 ("Tile1_1", Float) = 1 + [Group(Overlay 1)]_Tile1_2 ("Tile1_2", Float) = 1 + [Group(Overlay 1)]_NormalStrength1("Normal Strength 1", Range(0,2)) = 1 + [Group(Overlay 1)]_RedColor1 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_GreenColor1 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_BlueColor1 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_Tint1_0 ("Tint 1_0",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_1 ("Tint 1_1",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_2 ("Tint 1_2",Color) = (1,1,1,1) + [Group(Overlay 1)]_Add1_0 ("Add 1_0",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_1 ("Add 1_1",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_2 ("Add 1_2",Color) = (0,0,0,0) + + [GroupRollout(Overlay 2)] + [Group(Overlay 2)][NoScaleOffset]_Albedo2("Albedo2", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_NormalMask2("NormalMask2", 2D) = "bump" {} + [Group(Overlay 2)][NoScaleOffset]_ColorMask2("ColorMask2", 2D) = "black" {} + [Group(Overlay 2)][NoScaleOffset]_AlphaMask2("Mask2", 2D) = "white" {} + [Group(Overlay 2)]_Tile2_0 ("Tile2_0", Float) = 1 + [Group(Overlay 2)]_Tile2_1 ("Tile2_1", Float) = 1 + [Group(Overlay 2)]_Tile2_2 ("Tile2_2", Float) = 1 + [Group(Overlay 2)]_NormalStrength2("Normal Strength 2", Range(0,2)) = 1 + [Group(Overlay 2)]_RedColor2 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_GreenColor2 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_BlueColor2 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_Tint2_0 ("Tint 2_0",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_1 ("Tint 2_1",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_2 ("Tint 2_2",Color) = (1,1,1,1) + [Group(Overlay 2)]_Add2_0 ("Add 2_0",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_1 ("Add 2_1",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_2 ("Add 2_2",Color) = (0,0,0,0) + + // Overlay 3 + [GroupRollout(Overlay 3)] + [Group(Overlay 3)][NoScaleOffset]_Albedo3("Albedo3", 2D) = "white" {} + [Group(Overlay 3)][NoScaleOffset]_NormalMask3("NormalMask3", 2D) = "bump" {} + [Group(Overlay 3)][NoScaleOffset]_ColorMask3("ColorMask3", 2D) = "black" {} + [Group(Overlay 3)][NoScaleOffset]_AlphaMask3("Mask3", 2D) = "white" {} + [Group(Overlay 3)]_Tile3_0 ("Tile3_0", Float) = 1 + [Group(Overlay 3)]_Tile3_1 ("Tile3_1", Float) = 1 + [Group(Overlay 3)]_Tile3_2 ("Tile3_2", Float) = 1 + [Group(Overlay 3)]_NormalStrength3("Normal Strength 3", Range(0,2)) = 1 + [Group(Overlay 3)]_RedColor3 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_GreenColor3 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_BlueColor3 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_AlphaColor3 ("AlphaColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_Tint3_0 ("Tint 3_0",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_1 ("Tint 3_1",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_2 ("Tint 3_2",Color) = (1,1,1,1) + [Group(Overlay 3)]_Add3_0 ("Add 3_0",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_1 ("Add 3_1",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_2 ("Add 3_2",Color) = (0,0,0,0) + + /* This is what they should be + half4 Tiles[4][3]; + half4 Tints[4][3]; + half4 Adds[4][3]; + half4 RedColor[4]; + half4 GreenColor[4]; + half4 BlueColor[4]; + half NormalStrength[4]; */ + +END_PROPERTIES + +BEGIN_PASS("All") + Cull [_CullMode] +END_PASS + +// Any variables you want to have in the per material CBuffer go here. +BEGIN_CBUFFER + + half _OverlayCount; + half _ColorModulation; + half _SmoothnessModulation; + half _MetallicModulation; + half _EmissiveModulation; + half _Cutoff; + + float _DoubleSidedNormalMode; + + + // These should ALL BE IN ARRAYS!!!!! + // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST + // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!! + // so until I can write a utility to save/restore these, but only in edit time, this is what they will be. + half _Tile0_0; + half _Tile0_1; + half _Tile0_2; + half4 _RedColor0; + half4 _GreenColor0; + half4 _BlueColor0; + half _NormalStrength0; + half4 _Tint0_0; + half4 _Tint0_1; + half4 _Tint0_2; + half4 _Add0_0; + half4 _Add0_1; + half4 _Add0_2; + half4 _HasTextures0; + + half _Tile1_0; + half _Tile1_1; + half _Tile1_2; + half4 _RedColor1; + half4 _GreenColor1; + half4 _BlueColor1; + half _NormalStrength1; + half4 _Tint1_0; + half4 _Tint1_1; + half4 _Tint1_2; + half4 _Add1_0; + half4 _Add1_1; + half4 _Add1_2; + half4 _HasTextures1; + + half _Tile2_0; + half _Tile2_1; + half _Tile2_2; + half4 _RedColor2; + half4 _GreenColor2; + half4 _BlueColor2; + half _NormalStrength2; + half4 _Tint2_0; + half4 _Tint2_1; + half4 _Tint2_2; + half4 _Add2_0; + half4 _Add2_1; + half4 _Add2_2; + half4 _HasTextures2; + + half _Tile3_0; + half _Tile3_1; + half _Tile3_2; + half4 _RedColor3; + half4 _GreenColor3; + half4 _BlueColor3; + half _NormalStrength3; + half4 _Tint3_0; + half4 _Tint3_1; + half4 _Tint3_2; + half4 _Add3_0; + half4 _Add3_1; + half4 _Add3_2; + half4 _HasTextures3; +END_CBUFFER + + +// if you are writing a subshader, any defines that should be set on the main +// shader are defined here +//BEGIN_DEFINES +// #define _SIMPLELIT 1 // compile as SimpleLit shader in URP, or as BlinPhong in standard +//END_DEFINES + + +// All code goes here + +BEGIN_CODE + + TEXTURE2D(_Albedo); + SAMPLER(sampler_Albedo); + TEXTURE2D(_NormalMask); + TEXTURE2D(_ColorMask); + + + TEXTURE2D(_Albedo1); + TEXTURE2D(_NormalMask1); + TEXTURE2D(_AlphaMask1); + TEXTURE2D(_ColorMask1); + + TEXTURE2D(_Albedo2); + TEXTURE2D(_NormalMask2); + TEXTURE2D(_AlphaMask2); + TEXTURE2D(_ColorMask2); + + TEXTURE2D(_Albedo3); + TEXTURE2D(_NormalMask3); + TEXTURE2D(_AlphaMask3); + TEXTURE2D(_ColorMask3); + + + + half3 UMAUnpackScaleNormal(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + // SM2.0: normal scaler is not supported + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + + + half4 ColorizeRGB(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor) + { + half4 Colors; + + if (length(values.rgb)==0.0f) + { + Colors.rgb = 0; + Colors.a = base_c.a; + } + else + { + half3 ColorPerc = normalize(values.rgb); + + half3 ColorRed = base_c.rgb * RedColor.rgb; + half3 ColorGreen = base_c.rgb * GreenColor.rgb; + half3 ColorBlue = base_c.rgb * BlueColor.rgb; + + Colors.rgb = (ColorRed.rgb * ColorPerc.r) + (ColorGreen.rgb * ColorPerc.g) + (ColorBlue.rgb * ColorPerc.b); + Colors.a = base_c.a; + } + return Colors; + } + + void SurfaceFunction(inout Surface o, ShaderData d) + { + // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used) + float2 auv = d.texcoord0.xy * _Tile0_0; + float2 nuv = d.texcoord0.xy * _Tile0_1; + float2 cuv = d.texcoord0.xy * _Tile0_2; + + half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv); + half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0; + + base_c = base_c * ColorizeRGB(base_c, mask, _RedColor0, _GreenColor0, _BlueColor0); + + half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1; + half3 base_n = UMAUnpackScaleNormal(basepackednormal,_NormalStrength0); + + half base_smooth = basepackednormal.a; + half base_Metallic = basepackednormal.b; + half base_Emissive = mask.a; + + o.Alpha = base_c.a; + + // if we're not opaque enough, discard the pixel + if (o.Alpha<_Cutoff) + { + discard; + } + + // There are IF/ELSE comments in here + // that I want to stay to remind me that I + // want to add that functionality later + if (_OverlayCount > 1) + { + float2 auv = d.texcoord0.xy * _Tile1_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile1_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv); + add_c = ColorizeRGB(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1); + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile1_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1; + half3 add_n = UMAUnpackScaleNormal(addpackednormal,_NormalStrength1); + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + base_Emissive = (addmask.a * alpha) + (base_Emissive * oneminus); + // + } + + + if (_OverlayCount > 2) + { + float2 auv = d.texcoord0.xy * _Tile2_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile2_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv); + add_c = ColorizeRGB(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2); + // + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile2_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1; + half3 add_n = UMAUnpackScaleNormal(addpackednormal,_NormalStrength2); + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + base_Emissive = (addmask.a * alpha) + (base_Emissive * oneminus); + // + } + + if (_OverlayCount > 3) + { + float2 auv = d.texcoord0.xy * _Tile3_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile3_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv); + add_c = ColorizeRGB(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3); + // + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile3_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1; + half3 add_n = UMAUnpackScaleNormal(addpackednormal,_NormalStrength2); + + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + base_Emissive = (addmask.a * alpha) + (base_Emissive * oneminus); + // + } + + o.Albedo = base_c * _ColorModulation; + o.Normal = base_n; + o.Metallic = base_Metallic * _MetallicModulation; + o.Smoothness = base_smooth * _SmoothnessModulation; + o.Emission = base_Emissive * _EmissiveModulation; + if (_DoubleSidedNormalMode == 0) + { + o.Normal *= d.isFrontFace ? 1 : -1; + } + else if (_DoubleSidedNormalMode == 1) + { + o.Normal.z *= d.isFrontFace ? 1 : -1; + } + } + +END_CODE + diff --git a/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Cutout_Compositer.surfshader.meta b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Cutout_Compositer.surfshader.meta new file mode 100644 index 000000000..3cc6101a4 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/AlbedoNormalColormask_Cutout_Compositer.surfshader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 96a1ea1a3b1dec0409673d0de0d94900 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: ed1b96e11e9064957833ce8c01da6f92, type: 3} diff --git a/UMAProject/Assets/UMA/CompositingShaders/AlbedoPackedMapBLS_Compositer.surfshader b/UMAProject/Assets/UMA/CompositingShaders/AlbedoPackedMapBLS_Compositer.surfshader new file mode 100644 index 000000000..bcdbeeab1 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/AlbedoPackedMapBLS_Compositer.surfshader @@ -0,0 +1,418 @@ +BEGIN_OPTIONS + ShaderName "UMA/Compositing/Albedo_PackedMap_ColorMask" + Stackable "False" + DisableGBufferPass "True" // disable gbuffer pass + Workflow "Metallic" +END_OPTIONS + + //Just so I'm completely clear, it looks to me that your main materials has two textures - an Albedo (with Alpha), and a Packed Map. + // The PackedMap has Smoothness/NormalY/Occlusion/NormalX. Metallic is not mapped, but instead taken from a range (0-1). + // Smoothness/normals need to be scalable. The emission material has an additional emission texture, and it needs to be scalable also. + + // Packed Format + // R = Smooth + // G = Normal Y + // B = Occlusion + // A = Normal X + + // ColorMask format + // R = Amount to colorize using the _RedColor value + // G = Amount to colorize using the _GreenColor value + // B = Amount to colorize using the _BlueColor value + // A = Emissive amount + +BEGIN_PROPERTIES + + [BetterHeader(Material Specific)] + _OverlayCount ("OverlayCount", Float) = 0 + _ColorModulation ("Color Modulation", Range(0,2)) = 1 + _MetallicModulation ("Metallic Level", Range(0,2)) = 1 + _SmoothnessModulation ("Smoothness Level", Range(0,2)) = 1 + _EmissiveModulation ("Emissive Level", Range(0,2)) = 1 + + [Enum(Off,0,Front,1,Back,2)]_CullMode("Culling Mode", Float) = 2 + [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1 + + [GroupRollout(Base Overlay)] + [Group(Base Overlay)][NoScaleOffset]_Albedo("Albedo", 2D) = "white" {} + [Message(A NormalMask is encoded as follows R Normal_X G Normal_Y B Metallic_Level A Smoothness_Level)] + [BetterHeader(Normal Mask)] + [Group(Base Overlay)][NoScaleOffset]_NormalMask("NormalMask", 2D) = "bump" {} + [Group(Base Overlay)][NoScaleOffset]_ColorMask("ColorMask", 2D) = "black" {} + // no AlphaMask for the base. + [Group(Base Overlay)]_Tile0_0 ("Tile0_0", Float) = 1 + [Group(Base Overlay)]_Tile0_1 ("Tile0_1", Float) = 1 + [Group(Base Overlay)]_Tile0_2 ("Tile0_2", Float) = 1 + [Group(Base Overlay)]_NormalStrength0("Normal Strength 0", Range(0,2)) = 1 + [Group(Base Overlay)]_RedColor0 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_GreenColor0 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_BlueColor0 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Base Overlay)]_Tint0_0 ("Tint 0_0",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_1 ("Tint 0_1",Color) = (1,1,1,1) + [Group(Base Overlay)]_Tint0_2 ("Tint 0_2",Color) = (1,1,1,1) + [Group(Base Overlay)]_Add0_0 ("Add 0_0",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_1 ("Add 0_1",Color) = (0,0,0,0) + [Group(Base Overlay)]_Add0_2 ("Add 0_2",Color) = (0,0,0,0) + + [GroupRollout(Overlay 1)] + [Group(Overlay 1)][NoScaleOffset]_Albedo1("Albedo1", 2D) = "white" {} + [Group(Overlay 1)][NoScaleOffset]_NormalMask1("NormalMask1", 2D) = "bump" {} + [Group(Overlay 1)][NoScaleOffset]_ColorMask1("ColorMask1", 2D) = "black" {} + [Group(Overlay 1)][NoScaleOffset]_AlphaMask1("Mask1", 2D) = "white" {} + [Group(Overlay 1)]_Tile1_0 ("Tile1_0", Float) = 1 + [Group(Overlay 1)]_Tile1_1 ("Tile1_1", Float) = 1 + [Group(Overlay 1)]_Tile1_2 ("Tile1_2", Float) = 1 + [Group(Overlay 1)]_NormalStrength1("Normal Strength 1", Range(0,2)) = 1 + [Group(Overlay 1)]_RedColor1 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_GreenColor1 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_BlueColor1 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 1)]_Tint1_0 ("Tint 1_0",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_1 ("Tint 1_1",Color) = (1,1,1,1) + [Group(Overlay 1)]_Tint1_2 ("Tint 1_2",Color) = (1,1,1,1) + [Group(Overlay 1)]_Add1_0 ("Add 1_0",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_1 ("Add 1_1",Color) = (0,0,0,0) + [Group(Overlay 1)]_Add1_2 ("Add 1_2",Color) = (0,0,0,0) + + [GroupRollout(Overlay 2)] + [Group(Overlay 2)][NoScaleOffset]_Albedo2("Albedo2", 2D) = "white" {} + [Group(Overlay 2)][NoScaleOffset]_NormalMask2("NormalMask2", 2D) = "bump" {} + [Group(Overlay 2)][NoScaleOffset]_ColorMask2("ColorMask2", 2D) = "black" {} + [Group(Overlay 2)][NoScaleOffset]_AlphaMask2("Mask2", 2D) = "white" {} + [Group(Overlay 2)]_Tile2_0 ("Tile2_0", Float) = 1 + [Group(Overlay 2)]_Tile2_1 ("Tile2_1", Float) = 1 + [Group(Overlay 2)]_Tile2_2 ("Tile2_2", Float) = 1 + [Group(Overlay 2)]_NormalStrength2("Normal Strength 2", Range(0,2)) = 1 + [Group(Overlay 2)]_RedColor2 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_GreenColor2 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_BlueColor2 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 2)]_Tint2_0 ("Tint 2_0",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_1 ("Tint 2_1",Color) = (1,1,1,1) + [Group(Overlay 2)]_Tint2_2 ("Tint 2_2",Color) = (1,1,1,1) + [Group(Overlay 2)]_Add2_0 ("Add 2_0",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_1 ("Add 2_1",Color) = (0,0,0,0) + [Group(Overlay 2)]_Add2_2 ("Add 2_2",Color) = (0,0,0,0) + + // Overlay 3 + [GroupRollout(Overlay 3)] + [Group(Overlay 3)][NoScaleOffset]_Albedo3("Albedo3", 2D) = "white" {} + [Group(Overlay 3)][NoScaleOffset]_NormalMask3("NormalMask3", 2D) = "bump" {} + [Group(Overlay 3)][NoScaleOffset]_ColorMask3("ColorMask3", 2D) = "black" {} + [Group(Overlay 3)][NoScaleOffset]_AlphaMask3("Mask3", 2D) = "white" {} + [Group(Overlay 3)]_Tile3_0 ("Tile3_0", Float) = 1 + [Group(Overlay 3)]_Tile3_1 ("Tile3_1", Float) = 1 + [Group(Overlay 3)]_Tile3_2 ("Tile3_2", Float) = 1 + [Group(Overlay 3)]_NormalStrength3("Normal Strength 3", Range(0,2)) = 1 + [Group(Overlay 3)]_RedColor3 ("RedColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_GreenColor3 ("GreenColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_BlueColor3 ("BlueColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_AlphaColor3 ("AlphaColor", Color) = (1, 1, 1, 1) + [Group(Overlay 3)]_Tint3_0 ("Tint 3_0",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_1 ("Tint 3_1",Color) = (1,1,1,1) + [Group(Overlay 3)]_Tint3_2 ("Tint 3_2",Color) = (1,1,1,1) + [Group(Overlay 3)]_Add3_0 ("Add 3_0",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_1 ("Add 3_1",Color) = (0,0,0,0) + [Group(Overlay 3)]_Add3_2 ("Add 3_2",Color) = (0,0,0,0) + + /* This is what they should be + half4 Tiles[4][3]; + half4 Tints[4][3]; + half4 Adds[4][3]; + half4 RedColor[4]; + half4 GreenColor[4]; + half4 BlueColor[4]; + half NormalStrength[4]; */ + +END_PROPERTIES + +BEGIN_PASS("All") + Cull [_CullMode] +END_PASS + +// Any variables you want to have in the per material CBuffer go here. +BEGIN_CBUFFER + + half _OverlayCount; + half _ColorModulation; + half _SmoothnessModulation; + half _MetallicModulation; + half _EmissiveModulation; + + float _DoubleSidedNormalMode; + + + // These should ALL BE IN ARRAYS!!!!! + // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST + // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!! + // so until I can write a utility to save/restore these, but only in edit time, this is what they will be. + half _Tile0_0; + half _Tile0_1; + half _Tile0_2; + half4 _RedColor0; + half4 _GreenColor0; + half4 _BlueColor0; + half _NormalStrength0; + half4 _Tint0_0; + half4 _Tint0_1; + half4 _Tint0_2; + half4 _Add0_0; + half4 _Add0_1; + half4 _Add0_2; + half4 _HasTextures0; + + half _Tile1_0; + half _Tile1_1; + half _Tile1_2; + half4 _RedColor1; + half4 _GreenColor1; + half4 _BlueColor1; + half _NormalStrength1; + half4 _Tint1_0; + half4 _Tint1_1; + half4 _Tint1_2; + half4 _Add1_0; + half4 _Add1_1; + half4 _Add1_2; + half4 _HasTextures1; + + half _Tile2_0; + half _Tile2_1; + half _Tile2_2; + half4 _RedColor2; + half4 _GreenColor2; + half4 _BlueColor2; + half _NormalStrength2; + half4 _Tint2_0; + half4 _Tint2_1; + half4 _Tint2_2; + half4 _Add2_0; + half4 _Add2_1; + half4 _Add2_2; + half4 _HasTextures2; + + half _Tile3_0; + half _Tile3_1; + half _Tile3_2; + half4 _RedColor3; + half4 _GreenColor3; + half4 _BlueColor3; + half _NormalStrength3; + half4 _Tint3_0; + half4 _Tint3_1; + half4 _Tint3_2; + half4 _Add3_0; + half4 _Add3_1; + half4 _Add3_2; + half4 _HasTextures3; +END_CBUFFER + + +// if you are writing a subshader, any defines that should be set on the main +// shader are defined here +//BEGIN_DEFINES +// #define _SIMPLELIT 1 // compile as SimpleLit shader in URP, or as BlinPhong in standard +//END_DEFINES + + +// All code goes here + +BEGIN_CODE + + TEXTURE2D(_Albedo); + SAMPLER(sampler_Albedo); + TEXTURE2D(_NormalMask); + TEXTURE2D(_ColorMask); + + + TEXTURE2D(_Albedo1); + TEXTURE2D(_NormalMask1); + TEXTURE2D(_AlphaMask1); + TEXTURE2D(_ColorMask1); + + TEXTURE2D(_Albedo2); + TEXTURE2D(_NormalMask2); + TEXTURE2D(_AlphaMask2); + TEXTURE2D(_ColorMask2); + + TEXTURE2D(_Albedo3); + TEXTURE2D(_NormalMask3); + TEXTURE2D(_AlphaMask3); + TEXTURE2D(_ColorMask3); + + + + half3 UMAUnpackScaleNormal(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + // SM2.0: normal scaler is not supported + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + + + half4 ColorizeRGB(half4 base_c, half4 values, half4 RedColor, half4 GreenColor, half4 BlueColor) + { + half4 Colors; + + if (length(values.rgb)==0.0f) + { + Colors.rgb = 0; + Colors.a = base_c.a; + } + else + { + half3 ColorPerc = normalize(values.rgb); + + half3 ColorRed = base_c.rgb * RedColor.rgb; + half3 ColorGreen = base_c.rgb * GreenColor.rgb; + half3 ColorBlue = base_c.rgb * BlueColor.rgb; + + Colors.rgb = (ColorRed.rgb * ColorPerc.r) + (ColorGreen.rgb * ColorPerc.g) + (ColorBlue.rgb * ColorPerc.b); + Colors.a = base_c.a; + } + return Colors; + } + + void SurfaceFunction(inout Surface o, ShaderData d) + { + // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used) + float2 auv = d.texcoord0.xy * _Tile0_0; + float2 nuv = d.texcoord0.xy * _Tile0_1; + float2 cuv = d.texcoord0.xy * _Tile0_2; + + half4 mask = SAMPLE_TEXTURE2D(_ColorMask,sampler_Albedo,cuv); + half4 base_c = (SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, auv) * _Tint0_0)+_Add0_0; + + base_c = base_c * ColorizeRGB(base_c, mask, _RedColor0, _GreenColor0, _BlueColor0); + + half4 basepackednormal = (SAMPLE_TEXTURE2D(_NormalMask, sampler_Albedo,nuv) * _Tint0_1) + _Add0_1; + half3 base_n = UMAUnpackScaleNormal(basepackednormal,_NormalStrength0); + + half base_smooth = basepackednormal.a; + half base_Metallic = basepackednormal.b; + half base_Emissive = mask.a; + + o.Alpha = base_c.a; + + // There are IF/ELSE comments in here + // that I want to stay to remind me that I + // want to add that functionality later + if (_OverlayCount > 1) + { + float2 auv = d.texcoord0.xy * _Tile1_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo1, sampler_Albedo, auv) * _Tint1_0) + _Add1_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile1_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask1,sampler_Albedo, cuv); + add_c = ColorizeRGB(add_c,addmask,_RedColor1,_GreenColor1,_BlueColor1); + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile1_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint1_1) + _Add1_1; + half3 add_n = UMAUnpackScaleNormal(addpackednormal,_NormalStrength1); + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + base_Emissive = (addmask.a * alpha) + (base_Emissive * oneminus); + // + } + + + if (_OverlayCount > 2) + { + float2 auv = d.texcoord0.xy * _Tile2_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo2, sampler_Albedo, auv)* _Tint2_0) + _Add2_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile2_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask2,sampler_Albedo, cuv); + add_c = ColorizeRGB(add_c,addmask,_RedColor2,_GreenColor2,_BlueColor2); + // + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile2_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask2, sampler_Albedo,nuv) * _Tint2_1) + _Add2_1; + half3 add_n = UMAUnpackScaleNormal(addpackednormal,_NormalStrength2); + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + base_Emissive = (addmask.a * alpha) + (base_Emissive * oneminus); + // + } + + if (_OverlayCount > 3) + { + float2 auv = d.texcoord0.xy * _Tile3_0; + + // IF HASALPHAMASK + half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_Albedo, auv).a; + half oneminus = 1.0f - alpha; + // ELSE + // alpha = 1.0f + // oneminus = 0.0f; + // + + half4 add_c = (SAMPLE_TEXTURE2D(_Albedo3, sampler_Albedo, auv)* _Tint3_0) + _Add3_0; + + // if HASCOLORMASK + float2 cuv = d.texcoord0.xy * _Tile3_2; + half4 addmask = SAMPLE_TEXTURE2D(_ColorMask3,sampler_Albedo, cuv); + add_c = ColorizeRGB(add_c,addmask,_RedColor3,_GreenColor3,_BlueColor3); + // + + base_c = (add_c * alpha) + (base_c * oneminus); + + // IF HASNORMAL + float2 nuv = d.texcoord0.xy * _Tile3_1; + half4 addpackednormal = (SAMPLE_TEXTURE2D(_NormalMask1, sampler_Albedo,nuv) * _Tint3_1) + _Add3_1; + half3 add_n = UMAUnpackScaleNormal(addpackednormal,_NormalStrength2); + + base_n = (add_n * alpha) + (base_n * oneminus); + base_smooth = (addpackednormal.a * alpha) + (base_smooth * oneminus); + base_Metallic = (addpackednormal.b * alpha) + (base_Metallic * oneminus); + base_Emissive = (addmask.a * alpha) + (base_Emissive * oneminus); + // + } + + o.Albedo = base_c * _ColorModulation; + o.Normal = base_n; + o.Metallic = base_Metallic * _MetallicModulation; + o.Smoothness = base_smooth * _SmoothnessModulation; + o.Emission = base_Emissive * _EmissiveModulation; + if (_DoubleSidedNormalMode == 0) + { + o.Normal *= d.isFrontFace ? 1 : -1; + } + else if (_DoubleSidedNormalMode == 1) + { + o.Normal.z *= d.isFrontFace ? 1 : -1; + } + } + +END_CODE + diff --git a/UMAProject/Assets/UMA/CompositingShaders/AlbedoPackedMapBLS_Compositer.surfshader.meta b/UMAProject/Assets/UMA/CompositingShaders/AlbedoPackedMapBLS_Compositer.surfshader.meta new file mode 100644 index 000000000..48194b337 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/AlbedoPackedMapBLS_Compositer.surfshader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 66a555ed6588dc947bff1b1eeb580502 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: ed1b96e11e9064957833ce8c01da6f92, type: 3} diff --git a/UMAProject/Assets/UMA/CompositingShaders/DiffuseNormalMetallic_Compositer_ShadePack.umaShaderPack b/UMAProject/Assets/UMA/CompositingShaders/DiffuseNormalMetallic_Compositer_ShadePack.umaShaderPack new file mode 100644 index 000000000..27b4333d7 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/DiffuseNormalMetallic_Compositer_ShadePack.umaShaderPack @@ -0,0 +1 @@ +{"MonoBehaviour":{"m_Enabled":true,"m_EditorHideFlags":0,"m_Name":"","m_EditorClassIdentifier":"","entries":[{"srpTarget":2,"UnityVersionMin":20194,"UnityVersionMax":20201,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2021.3.20f1\n// Render Pipeline: HDRP2019\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Diffuse_Normal_Metallic_Compositer\"\n{\n Properties\n {\n \n\n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n _HalfLambertStrength (\"Lambert(0), HalfLambert(1)\", Range(0,4)) = 1\n // _EmissiveModulation (\"Emissive Level\", Range(0,2)) = 1\n\n [Enum(Off,0,Front,1,Back,2)]_CullMode(\"Culling Mode\", Float) = 2\n [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode(\"Double sided normal mode\", Float) = 1\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_BaseMap(\"BaseMap\", 2D) = \"white\" {}\n [Message(A _BumpMap is encoded as follows R Normal_X G Normal_Y B Metallic_Level A Smoothness_Level)] \n [BetterHeader(Normal Mask)]\n [Group(Base Overlay)][NoScaleOffset]_BumpMap(\"_BumpMap\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_MetallicGlossMap(\"_MetallicGlossMap\", 2D) = \"black\" {}\n\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_BaseMap1(\"BaseMap1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_BumpMap1(\"_BumpMap1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_MetallicGlossMap1(\"_MetallicGlossMap1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_BaseMap2(\"BaseMap2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_BumpMap2(\"_BumpMap2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_MetallicGlossMap2(\"_MetallicGlossMap2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_BaseMap3(\"BaseMap3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_BumpMap3(\"_BumpMap3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_MetallicGlossMap3(\"_MetallicGlossMap3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n\n\n [HideInInspector] _StencilRef(\"Vector1 \", Int) = 0\n [HideInInspector] _StencilWriteMask(\"Vector1 \", Int) = 3\n [HideInInspector] _StencilRefDepth(\"Vector1 \", Int) = 0\n [HideInInspector] _StencilWriteMaskDepth(\"Vector1 \", Int) = 32\n [HideInInspector] _StencilRefMV(\"Vector1 \", Int) = 128\n [HideInInspector] _StencilWriteMaskMV(\"Vector1 \", Int) = 128\n [HideInInspector] _StencilRefDistortionVec(\"Vector1 \", Int) = 64\n [HideInInspector] _StencilWriteMaskDistortionVec(\"Vector1 \", Int) = 64\n [HideInInspector] _StencilWriteMaskGBuffer(\"Vector1 \", Int) = 3\n [HideInInspector] _StencilRefGBuffer(\"Vector1 \", Int) = 2\n [HideInInspector] _ZTestGBuffer(\"Vector1 \", Int) = 4\n [HideInInspector] [ToggleUI] _RequireSplitLighting(\"Boolean\", Float) = 0\n [HideInInspector] [ToggleUI] _ReceivesSSR(\"Boolean\", Float) = 1\n [HideInInspector] _SurfaceType(\"Vector1 \", Float) = 0\n [HideInInspector] [ToggleUI] _ZWrite(\"Boolean\", Float) = 0\n [HideInInspector] _TransparentSortPriority(\"Vector1 \", Int) = 0\n [HideInInspector] _ZTestDepthEqualForOpaque(\"Vector1 \", Int) = 4\n [HideInInspector] [Enum(UnityEngine.Rendering.CompareFunction)] _ZTestTransparent(\"Vector1\", Float) = 4\n [HideInInspector] [ToggleUI] _TransparentBackfaceEnable(\"Boolean\", Float) = 0\n [HideInInspector] [ToggleUI] _AlphaCutoffEnable(\"Boolean\", Float) = 0\n [HideInInspector] [ToggleUI] _UseShadowThreshold(\"Boolean\", Float) = 0\n [HideInInspector] _BlendMode(\"Float\", Float) = 0\n }\n SubShader\n {\n Tags { \"RenderPipeline\"=\"HDRenderPipeline\" \"RenderPipeline\" = \"HDRenderPipeline\" \"RenderType\" = \"HDLitShader\" \"Queue\" = \"Geometry+225\" }\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"Forward\"\n Tags { \"LightMode\" = \"Forward\" }\n\n \n \n \n \n // Stencil setup\n Stencil\n {\n WriteMask [_StencilWriteMask]\n Ref [_StencilRef]\n Comp Always\n Pass Replace\n }\n \n ColorMask [_ColorMaskTransparentVel] 1\n\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n \n //#pragma multi_compile_local _ _ALPHATEST_ON\n \n // #pragma multi_compile _ LOD_FADE_CROSSFADE\n \n //#pragma shader_feature _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADDITIVE _BLENDMODE_PRE_MULTIPLY\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_FORWARD\n #define _PASSFORWARD 1\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n \n #pragma multi_compile _ DEBUG_DISPLAY\n #pragma multi_compile _ LIGHTMAP_ON\n #pragma multi_compile _ DIRLIGHTMAP_COMBINED\n #pragma multi_compile _ DYNAMICLIGHTMAP_ON\n #pragma multi_compile _ SHADOWS_SHADOWMASK\n #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT\n #pragma multi_compile USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST\n #pragma multi_compile SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH\n #define REQUIRE_DEPTH_TEXTURE\n \n\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n \n // define FragInputs structure\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl\"\n #endif\n\n\n \n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #ifdef DEBUG_DISPLAY\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n \n #if (SHADERPASS == SHADERPASS_FORWARD)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n \n #define HAS_LIGHTLOOP\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #else\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n // Used by SceneSelectionPass\n int _ObjectId;\n int _PassValue;\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _StencilRef;\n float _StencilWriteMask;\n float _StencilRefDepth;\n float _StencilWriteMaskDepth;\n float _StencilRefMV;\n float _StencilWriteMaskMV;\n float _StencilRefDistortionVec;\n float _StencilWriteMaskDistortionVec;\n float _StencilWriteMaskGBuffer;\n float _StencilRefGBuffer;\n float _ZTestGBuffer;\n float _RequireSplitLighting;\n float _ReceivesSSR;\n float _ZWrite;\n float _TransparentSortPriority;\n float _ZTestDepthEqualForOpaque;\n float _ZTestTransparent;\n float _TransparentBackfaceEnable;\n float _AlphaCutoffEnable;\n float _UseShadowThreshold;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\nstruct VaryingsToPS\n{\n VertexToPixel vmesh;\n #ifdef VARYINGS_NEED_PASS\n VaryingsPassToPS vpass;\n #endif\n};\n\nstruct PackedVaryingsToPS\n{\n #ifdef VARYINGS_NEED_PASS\n PackedVaryingsPassToPS vpass;\n #endif\n VertexToPixel vmesh;\n\n UNITY_VERTEX_OUTPUT_STEREO\n};\n\nPackedVaryingsToPS PackVaryingsToPS(VaryingsToPS input)\n{\n PackedVaryingsToPS output = (PackedVaryingsToPS)0;\n output.vmesh = input.vmesh;\n #ifdef VARYINGS_NEED_PASS\n output.vpass = PackVaryingsPassToPS(input.vpass);\n #endif\n\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n return output;\n}\n\n\n\n\nVertexToPixel VertMesh(VertexData input)\n{\n VertexToPixel output = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n\n \n ChainModifyVertex(input, output, _Time);\n\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n return output;\n}\n\n\n#if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\nvoid MeshDecalsPositionZBias(inout VaryingsToPS input)\n{\n#if defined(UNITY_REVERSED_Z)\n input.vmesh.pos.z -= _DecalMeshDepthBias;\n#else\n input.vmesh.pos.z += _DecalMeshDepthBias;\n#endif\n}\n#endif\n\n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n// This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\nfloat unity_OneOverOutputBoost;\nfloat unity_MaxOutputValue;\n\nCBUFFER_START(UnityMetaPass)\n// x = use uv1 as raster position\n// y = use uv2 as raster position\nbool4 unity_MetaVertexControl;\n\n// x = return albedo\n// y = return normal\nbool4 unity_MetaFragmentControl;\nCBUFFER_END\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS output = (VaryingsToPS)0;\n output.vmesh = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output.vmesh);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.vmesh.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n#ifdef VARYINGS_NEED_POSITION_WS\n output.vmesh.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz);\n#endif\n\n#ifdef VARYINGS_NEED_TANGENT_TO_WORLD\n // Normal is required for triplanar mapping\n output.vmesh.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.vmesh.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n#endif\n\n output.vmesh.texcoord0 = inputMesh.texcoord0;\n output.vmesh.texcoord1 = inputMesh.texcoord1;\n output.vmesh.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.vmesh.texcoord3 = inputMesh.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vmesh.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return PackVaryingsToPS(output);\n}\n#else\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS varyingsType;\n varyingsType.vmesh = VertMesh(inputMesh);\n #if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\n MeshDecalsPositionZBias(varyingsType);\n #endif\n return PackVaryingsToPS(varyingsType);\n}\n\n#endif\n\n\n\n \n\n \n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n \n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n \n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n \n #ifdef _HAS_REFRACTION\n if (_EnableSSRefraction)\n {\n // surfaceData.ior = surfaceDescription.RefractionIndex;\n // surfaceData.transmittanceColor = surfaceDescription.RefractionColor;\n // surfaceData.atDistance = surfaceDescription.RefractionDistance;\n \n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n \n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n // surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n\n \n // tangent-space normal\n float3 normalTS = float3(0.0f, 0.0f, 1.0f);\n normalTS = surfaceDescription.Normal;\n \n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(normalTS, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = normalTS; \n #endif\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n // surfaceData.tangentWS = TransformTangentToWorld(surfaceDescription.Tangent, fragInputs.tangentToWorld);\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n #if VERSION_GREATER_EQUAL(10,2)\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceData.geomNormalWS, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData.geomNormalWS, surfaceData);\n #else\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData);\n #endif\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #ifdef _ENABLE_GEOMETRIC_SPECULAR_AA\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // uint3 fadeMaskSeed = asuint((int3)(V * _ScreenSize.xyx)); // Quantize V to _ScreenSize values\n // LODDitheringTransition(fadeMaskSeed, unity_LODFade.x);\n //#endif\n \n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n \n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = posInput.deviceDepth;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n \n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceDescription.Distortion;\n //builtinData.distortionBlur = surfaceDescription.DistortionBlur;\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #else\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #endif\n \n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n }\n \n \n void Frag(PackedVaryingsToPS packedInput,\n #ifdef OUTPUT_SPLIT_LIGHTING\n out float4 outColor : SV_Target0, // outSpecularLighting\n out float4 outDiffuseLighting : SV_Target1,\n OUTPUT_SSSBUFFER(outSSSBuffer)\n #else\n out float4 outColor : SV_Target0\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n , out float4 outMotionVec : SV_Target1\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif // OUTPUT_SPLIT_LIGHTING\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n // Init outMotionVector here to solve compiler warning (potentially unitialized variable)\n // It is init to the value of forceNoMotion (with 2.0)\n outMotionVec = float4(2.0, 0.0, 0.0, 0.0);\n #endif\n\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);\n FragInputs input = BuildFragInputs(packedInput.vmesh);\n\n // We need to readapt the SS position as our screen space positions are for a low res buffer, but we try to access a full res buffer.\n input.positionSS.xy = _OffScreenRendering > 0 ? (input.positionSS.xy * _OffScreenDownsampleFactor) : input.positionSS.xy;\n\n uint2 tileIndex = uint2(input.positionSS.xy) / GetTileSize();\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, tileIndex);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(packedInput.vmesh, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n\n PreLightData preLightData = GetPreLightData(V, posInput, bsdfData);\n\n outColor = float4(0.0, 0.0, 0.0, 0.0);\n\n // We need to skip lighting when doing debug pass because the debug pass is done before lighting so some buffers may not be properly initialized potentially causing crashes on PS4.\n\n #ifdef DEBUG_DISPLAY\n // Init in debug display mode to quiet warning\n #ifdef OUTPUT_SPLIT_LIGHTING\n outDiffuseLighting = 0;\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #endif\n\n \n\n // Same code in ShaderPassForwardUnlit.shader\n // Reminder: _DebugViewMaterialArray[i]\n // i==0 -> the size used in the buffer\n // i>0 -> the index used (0 value means nothing)\n // The index stored in this buffer could either be\n // - a gBufferIndex (always stored in _DebugViewMaterialArray[1] as only one supported)\n // - a property index which is different for each kind of material even if reflecting the same thing (see MaterialSharedProperty)\n bool viewMaterial = false;\n int bufferSize = int(_DebugViewMaterialArray[0]);\n if (bufferSize != 0)\n {\n bool needLinearToSRGB = false;\n float3 result = float3(1.0, 0.0, 1.0);\n\n // Loop through the whole buffer\n // Works because GetSurfaceDataDebug will do nothing if the index is not a known one\n for (int index = 1; index <= bufferSize; index++)\n {\n int indexMaterialProperty = int(_DebugViewMaterialArray[index]);\n\n // skip if not really in use\n if (indexMaterialProperty != 0)\n {\n viewMaterial = true;\n\n GetPropertiesDataDebug(indexMaterialProperty, result, needLinearToSRGB);\n GetVaryingsDataDebug(indexMaterialProperty, input, result, needLinearToSRGB);\n GetBuiltinDataDebug(indexMaterialProperty, builtinData, result, needLinearToSRGB);\n GetSurfaceDataDebug(indexMaterialProperty, surfaceData, result, needLinearToSRGB);\n GetBSDFDataDebug(indexMaterialProperty, bsdfData, result, needLinearToSRGB);\n }\n }\n\n // TEMP!\n // For now, the final blit in the backbuffer performs an sRGB write\n // So in the meantime we apply the inverse transform to linear data to compensate.\n if (!needLinearToSRGB)\n result = SRGBToLinear(max(0, result));\n\n outColor = float4(result, 1.0);\n }\n\n if (!viewMaterial)\n {\n if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_DIFFUSE_COLOR || _DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_SPECULAR_COLOR)\n {\n float3 result = float3(0.0, 0.0, 0.0);\n\n GetPBRValidatorDebug(surfaceData, result);\n\n outColor = float4(result, 1.0f);\n }\n else if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_TRANSPARENCY_OVERDRAW)\n {\n float4 result = _DebugTransparencyOverdrawWeight * float4(TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_A);\n outColor = result;\n }\n else\n #endif\n {\n #ifdef _SURFACE_TYPE_TRANSPARENT\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_TRANSPARENT;\n #else\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_OPAQUE;\n #endif\n\n float3 diffuseLighting;\n float3 specularLighting;\n\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n {\n LightLoopOutput lightLoopOutput;\n LightLoop(V, posInput, preLightData, bsdfData, builtinData, featureFlags, lightLoopOutput);\n\n // Alias\n diffuseLighting = lightLoopOutput.diffuseLighting;\n specularLighting = lightLoopOutput.specularLighting;\n }\n #else\n {\n LightLoop(V, posInput, preLightData, bsdfData, builtinData, featureFlags, diffuseLighting, specularLighting);\n }\n #endif\n\n diffuseLighting *= GetCurrentExposureMultiplier();\n specularLighting *= GetCurrentExposureMultiplier();\n\n #ifdef OUTPUT_SPLIT_LIGHTING\n if (_EnableSubsurfaceScattering != 0 && ShouldOutputSplitLighting(bsdfData))\n {\n outColor = float4(specularLighting, 1.0);\n outDiffuseLighting = float4(TagLightingForSSS(diffuseLighting), 1.0);\n }\n else\n {\n outColor = float4(diffuseLighting + specularLighting, 1.0);\n outDiffuseLighting = 0;\n }\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #else\n outColor = ApplyBlendMode(diffuseLighting, specularLighting, builtinData.opacity);\n outColor = EvaluateAtmosphericScattering(posInput, V, outColor);\n #endif\n\n ChainFinalColorForward(l, d, outColor);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n VaryingsPassToPS inputPass = UnpackVaryingsPassToPS(packedInput.vpass);\n bool forceNoMotion = any(unity_MotionVectorsParams.yw == 0.0);\n // outMotionVec is already initialize at the value of forceNoMotion (see above)\n if (!forceNoMotion)\n {\n float2 motionVec = CalculateMotionVector(inputPass.positionCS, inputPass.previousPositionCS);\n EncodeMotionVector(motionVec * 0.5, outMotionVec);\n outMotionVec.zw = 1.0;\n }\n #endif\n }\n\n #ifdef DEBUG_DISPLAY\n }\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"ShadowCaster\"\n Tags { \"LightMode\" = \"ShadowCaster\" }\n\n \n\n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n\n ZClip [_ZClip]\n ZWrite On\n ZTest LEqual\n\n ColorMask 0\n\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n //#pragma shader_feature _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _ _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_SHADOWS\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSSHADOW 1\n\n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n //-------------------------------------------------------------------------------------\n // Defines\n //-------------------------------------------------------------------------------------\n \n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n \n // define FragInputs structure\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl\"\n #endif\n\n\n \n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #ifdef DEBUG_DISPLAY\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n \n #if (SHADERPASS == SHADERPASS_FORWARD)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n \n #define HAS_LIGHTLOOP\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #else\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n // Used by SceneSelectionPass\n int _ObjectId;\n int _PassValue;\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n UNITY_VERTEX_OUTPUT_STEREO\n };\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n\n float _StencilRef;\n float _StencilWriteMask;\n float _StencilRefDepth;\n float _StencilWriteMaskDepth;\n float _StencilRefMV;\n float _StencilWriteMaskMV;\n float _StencilRefDistortionVec;\n float _StencilWriteMaskDistortionVec;\n float _StencilWriteMaskGBuffer;\n float _StencilRefGBuffer;\n float _ZTestGBuffer;\n float _RequireSplitLighting;\n float _ReceivesSSR;\n float _ZWrite;\n float _TransparentSortPriority;\n float _ZTestDepthEqualForOpaque;\n float _ZTestTransparent;\n float _TransparentBackfaceEnable;\n float _AlphaCutoffEnable;\n float _UseShadowThreshold;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\nstruct VaryingsToPS\n{\n VertexToPixel vmesh;\n #ifdef VARYINGS_NEED_PASS\n VaryingsPassToPS vpass;\n #endif\n};\n\nstruct PackedVaryingsToPS\n{\n #ifdef VARYINGS_NEED_PASS\n PackedVaryingsPassToPS vpass;\n #endif\n VertexToPixel vmesh;\n\n UNITY_VERTEX_OUTPUT_STEREO\n};\n\nPackedVaryingsToPS PackVaryingsToPS(VaryingsToPS input)\n{\n PackedVaryingsToPS output = (PackedVaryingsToPS)0;\n output.vmesh = input.vmesh;\n #ifdef VARYINGS_NEED_PASS\n output.vpass = PackVaryingsPassToPS(input.vpass);\n #endif\n\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n return output;\n}\n\n\n\n\nVertexToPixel VertMesh(VertexData input)\n{\n VertexToPixel output = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n\n \n ChainModifyVertex(input, output, _Time);\n\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n return output;\n}\n\n\n#if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\nvoid MeshDecalsPositionZBias(inout VaryingsToPS input)\n{\n#if defined(UNITY_REVERSED_Z)\n input.vmesh.pos.z -= _DecalMeshDepthBias;\n#else\n input.vmesh.pos.z += _DecalMeshDepthBias;\n#endif\n}\n#endif\n\n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n// This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\nfloat unity_OneOverOutputBoost;\nfloat unity_MaxOutputValue;\n\nCBUFFER_START(UnityMetaPass)\n// x = use uv1 as raster position\n// y = use uv2 as raster position\nbool4 unity_MetaVertexControl;\n\n// x = return albedo\n// y = return normal\nbool4 unity_MetaFragmentControl;\nCBUFFER_END\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS output = (VaryingsToPS)0;\n output.vmesh = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output.vmesh);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.vmesh.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n#ifdef VARYINGS_NEED_POSITION_WS\n output.vmesh.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz);\n#endif\n\n#ifdef VARYINGS_NEED_TANGENT_TO_WORLD\n // Normal is required for triplanar mapping\n output.vmesh.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.vmesh.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n#endif\n\n output.vmesh.texcoord0 = inputMesh.texcoord0;\n output.vmesh.texcoord1 = inputMesh.texcoord1;\n output.vmesh.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.vmesh.texcoord3 = inputMesh.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vmesh.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return PackVaryingsToPS(output);\n}\n#else\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS varyingsType;\n varyingsType.vmesh = VertMesh(inputMesh);\n #if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\n MeshDecalsPositionZBias(varyingsType);\n #endif\n return PackVaryingsToPS(varyingsType);\n}\n\n#endif\n\n\n\n \n\n \n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n \n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n \n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n \n #ifdef _HAS_REFRACTION\n if (_EnableSSRefraction)\n {\n // surfaceData.ior = surfaceDescription.RefractionIndex;\n // surfaceData.transmittanceColor = surfaceDescription.RefractionColor;\n // surfaceData.atDistance = surfaceDescription.RefractionDistance;\n \n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n \n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n // surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n\n \n // tangent-space normal\n float3 normalTS = float3(0.0f, 0.0f, 1.0f);\n normalTS = surfaceDescription.Normal;\n \n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(normalTS, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = normalTS; \n #endif\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n // surfaceData.tangentWS = TransformTangentToWorld(surfaceDescription.Tangent, fragInputs.tangentToWorld);\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n #if VERSION_GREATER_EQUAL(10,2)\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceData.geomNormalWS, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData.geomNormalWS, surfaceData);\n #else\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData);\n #endif\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #ifdef _ENABLE_GEOMETRIC_SPECULAR_AA\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // uint3 fadeMaskSeed = asuint((int3)(V * _ScreenSize.xyx)); // Quantize V to _ScreenSize values\n // LODDitheringTransition(fadeMaskSeed, unity_LODFade.x);\n //#endif\n \n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n \n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = posInput.deviceDepth;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n \n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceDescription.Distortion;\n //builtinData.distortionBlur = surfaceDescription.DistortionBlur;\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #else\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #endif\n \n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n }\n \n\n\n void Frag( PackedVaryingsToPS packedInput\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #ifdef WRITE_MSAA_DEPTH\n , out float1 depthColor : SV_Target1\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When only WRITE_MSAA_DEPTH is define and not WRITE_NORMAL_BUFFER it mean we are Unlit and only need depth, but we still have normal buffer binded\n , out float4 outNormalBuffer : SV_Target0\n , out float1 depthColor : SV_Target1\n #elif defined(SCENESELECTIONPASS)\n , out float4 outColor : SV_Target0\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);\n FragInputs input = BuildFragInputs(packedInput.vmesh);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n \n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(packedInput.vmesh, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), posInput.positionSS, outNormalBuffer);\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When we are MSAA depth only without normal buffer\n // Due to the binding order of these two render targets, we need to have them both declared\n outNormalBuffer = float4(0.0, 0.0, 0.0, 1.0);\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #elif defined(SCENESELECTIONPASS)\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #endif\n }\n\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"META\"\n Tags { \"LightMode\" = \"META\" }\n \n Cull Off\n \n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n //#pragma shader_feature _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _ _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_LIGHT_TRANSPORT\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define REQUIRE_DEPTH_TEXTURE\n #define _PASSMETA 1\n\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n\n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n \n // define FragInputs structure\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl\"\n #endif\n\n\n \n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #ifdef DEBUG_DISPLAY\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n \n #if (SHADERPASS == SHADERPASS_FORWARD)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n \n #define HAS_LIGHTLOOP\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #else\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n // Used by SceneSelectionPass\n int _ObjectId;\n int _PassValue;\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n\n float _StencilRef;\n float _StencilWriteMask;\n float _StencilRefDepth;\n float _StencilWriteMaskDepth;\n float _StencilRefMV;\n float _StencilWriteMaskMV;\n float _StencilRefDistortionVec;\n float _StencilWriteMaskDistortionVec;\n float _StencilWriteMaskGBuffer;\n float _StencilRefGBuffer;\n float _ZTestGBuffer;\n float _RequireSplitLighting;\n float _ReceivesSSR;\n float _ZWrite;\n float _TransparentSortPriority;\n float _ZTestDepthEqualForOpaque;\n float _ZTestTransparent;\n float _TransparentBackfaceEnable;\n float _AlphaCutoffEnable;\n float _UseShadowThreshold;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\nstruct VaryingsToPS\n{\n VertexToPixel vmesh;\n #ifdef VARYINGS_NEED_PASS\n VaryingsPassToPS vpass;\n #endif\n};\n\nstruct PackedVaryingsToPS\n{\n #ifdef VARYINGS_NEED_PASS\n PackedVaryingsPassToPS vpass;\n #endif\n VertexToPixel vmesh;\n\n UNITY_VERTEX_OUTPUT_STEREO\n};\n\nPackedVaryingsToPS PackVaryingsToPS(VaryingsToPS input)\n{\n PackedVaryingsToPS output = (PackedVaryingsToPS)0;\n output.vmesh = input.vmesh;\n #ifdef VARYINGS_NEED_PASS\n output.vpass = PackVaryingsPassToPS(input.vpass);\n #endif\n\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n return output;\n}\n\n\n\n\nVertexToPixel VertMesh(VertexData input)\n{\n VertexToPixel output = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n\n \n ChainModifyVertex(input, output, _Time);\n\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n return output;\n}\n\n\n#if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\nvoid MeshDecalsPositionZBias(inout VaryingsToPS input)\n{\n#if defined(UNITY_REVERSED_Z)\n input.vmesh.pos.z -= _DecalMeshDepthBias;\n#else\n input.vmesh.pos.z += _DecalMeshDepthBias;\n#endif\n}\n#endif\n\n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n// This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\nfloat unity_OneOverOutputBoost;\nfloat unity_MaxOutputValue;\n\nCBUFFER_START(UnityMetaPass)\n// x = use uv1 as raster position\n// y = use uv2 as raster position\nbool4 unity_MetaVertexControl;\n\n// x = return albedo\n// y = return normal\nbool4 unity_MetaFragmentControl;\nCBUFFER_END\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS output = (VaryingsToPS)0;\n output.vmesh = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output.vmesh);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.vmesh.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n#ifdef VARYINGS_NEED_POSITION_WS\n output.vmesh.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz);\n#endif\n\n#ifdef VARYINGS_NEED_TANGENT_TO_WORLD\n // Normal is required for triplanar mapping\n output.vmesh.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.vmesh.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n#endif\n\n output.vmesh.texcoord0 = inputMesh.texcoord0;\n output.vmesh.texcoord1 = inputMesh.texcoord1;\n output.vmesh.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.vmesh.texcoord3 = inputMesh.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vmesh.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return PackVaryingsToPS(output);\n}\n#else\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS varyingsType;\n varyingsType.vmesh = VertMesh(inputMesh);\n #if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\n MeshDecalsPositionZBias(varyingsType);\n #endif\n return PackVaryingsToPS(varyingsType);\n}\n\n#endif\n\n\n\n \n\n \n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n \n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n \n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n \n #ifdef _HAS_REFRACTION\n if (_EnableSSRefraction)\n {\n // surfaceData.ior = surfaceDescription.RefractionIndex;\n // surfaceData.transmittanceColor = surfaceDescription.RefractionColor;\n // surfaceData.atDistance = surfaceDescription.RefractionDistance;\n \n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n \n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n // surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n\n \n // tangent-space normal\n float3 normalTS = float3(0.0f, 0.0f, 1.0f);\n normalTS = surfaceDescription.Normal;\n \n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(normalTS, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = normalTS; \n #endif\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n // surfaceData.tangentWS = TransformTangentToWorld(surfaceDescription.Tangent, fragInputs.tangentToWorld);\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n #if VERSION_GREATER_EQUAL(10,2)\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceData.geomNormalWS, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData.geomNormalWS, surfaceData);\n #else\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData);\n #endif\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #ifdef _ENABLE_GEOMETRIC_SPECULAR_AA\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // uint3 fadeMaskSeed = asuint((int3)(V * _ScreenSize.xyx)); // Quantize V to _ScreenSize values\n // LODDitheringTransition(fadeMaskSeed, unity_LODFade.x);\n //#endif\n \n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n \n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = posInput.deviceDepth;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n \n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceDescription.Distortion;\n //builtinData.distortionBlur = surfaceDescription.DistortionBlur;\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #else\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #endif\n \n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n }\n\n\n float4 Frag(PackedVaryingsToPS packedInput\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n\n ) : SV_Target\n {\n FragInputs input = BuildFragInputs(packedInput.vmesh);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(packedInput.vmesh, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n // no debug apply during light transport pass\n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n LightTransportData lightTransportData = GetLightTransportData(surfaceData, builtinData, bsdfData);\n\n // This shader is call two times. Once for getting emissiveColor, the other time to get diffuseColor\n // We use unity_MetaFragmentControl to make the distinction.\n float4 res = float4(0.0, 0.0, 0.0, 1.0);\n\n if (unity_MetaFragmentControl.x)\n {\n // Apply diffuseColor Boost from LightmapSettings.\n // put abs here to silent a warning, no cost, no impact as color is assume to be positive.\n res.rgb = clamp(pow(abs(lightTransportData.diffuseColor), saturate(unity_OneOverOutputBoost)), 0, unity_MaxOutputValue);\n }\n\n if (unity_MetaFragmentControl.y)\n {\n // emissive use HDR format\n res.rgb = lightTransportData.emissiveColor;\n }\n\n return res;\n }\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"SceneSelectionPass\"\n Tags { \"LightMode\" = \"SceneSelectionPass\" }\n \n ColorMask 0\n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n \n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n //#pragma shader_feature _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _ _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #define SCENESELECTIONPASS\n #pragma editor_sync_compilation\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSSCENESELECT 1\n\n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n \n // define FragInputs structure\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl\"\n #endif\n\n\n \n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #ifdef DEBUG_DISPLAY\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n \n #if (SHADERPASS == SHADERPASS_FORWARD)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n \n #define HAS_LIGHTLOOP\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #else\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n // Used by SceneSelectionPass\n int _ObjectId;\n int _PassValue;\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n UNITY_VERTEX_OUTPUT_STEREO\n };\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n\n float _StencilRef;\n float _StencilWriteMask;\n float _StencilRefDepth;\n float _StencilWriteMaskDepth;\n float _StencilRefMV;\n float _StencilWriteMaskMV;\n float _StencilRefDistortionVec;\n float _StencilWriteMaskDistortionVec;\n float _StencilWriteMaskGBuffer;\n float _StencilRefGBuffer;\n float _ZTestGBuffer;\n float _RequireSplitLighting;\n float _ReceivesSSR;\n float _ZWrite;\n float _TransparentSortPriority;\n float _ZTestDepthEqualForOpaque;\n float _ZTestTransparent;\n float _TransparentBackfaceEnable;\n float _AlphaCutoffEnable;\n float _UseShadowThreshold;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\nstruct VaryingsToPS\n{\n VertexToPixel vmesh;\n #ifdef VARYINGS_NEED_PASS\n VaryingsPassToPS vpass;\n #endif\n};\n\nstruct PackedVaryingsToPS\n{\n #ifdef VARYINGS_NEED_PASS\n PackedVaryingsPassToPS vpass;\n #endif\n VertexToPixel vmesh;\n\n UNITY_VERTEX_OUTPUT_STEREO\n};\n\nPackedVaryingsToPS PackVaryingsToPS(VaryingsToPS input)\n{\n PackedVaryingsToPS output = (PackedVaryingsToPS)0;\n output.vmesh = input.vmesh;\n #ifdef VARYINGS_NEED_PASS\n output.vpass = PackVaryingsPassToPS(input.vpass);\n #endif\n\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n return output;\n}\n\n\n\n\nVertexToPixel VertMesh(VertexData input)\n{\n VertexToPixel output = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n\n \n ChainModifyVertex(input, output, _Time);\n\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n return output;\n}\n\n\n#if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\nvoid MeshDecalsPositionZBias(inout VaryingsToPS input)\n{\n#if defined(UNITY_REVERSED_Z)\n input.vmesh.pos.z -= _DecalMeshDepthBias;\n#else\n input.vmesh.pos.z += _DecalMeshDepthBias;\n#endif\n}\n#endif\n\n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n// This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\nfloat unity_OneOverOutputBoost;\nfloat unity_MaxOutputValue;\n\nCBUFFER_START(UnityMetaPass)\n// x = use uv1 as raster position\n// y = use uv2 as raster position\nbool4 unity_MetaVertexControl;\n\n// x = return albedo\n// y = return normal\nbool4 unity_MetaFragmentControl;\nCBUFFER_END\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS output = (VaryingsToPS)0;\n output.vmesh = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output.vmesh);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.vmesh.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n#ifdef VARYINGS_NEED_POSITION_WS\n output.vmesh.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz);\n#endif\n\n#ifdef VARYINGS_NEED_TANGENT_TO_WORLD\n // Normal is required for triplanar mapping\n output.vmesh.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.vmesh.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n#endif\n\n output.vmesh.texcoord0 = inputMesh.texcoord0;\n output.vmesh.texcoord1 = inputMesh.texcoord1;\n output.vmesh.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.vmesh.texcoord3 = inputMesh.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vmesh.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return PackVaryingsToPS(output);\n}\n#else\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS varyingsType;\n varyingsType.vmesh = VertMesh(inputMesh);\n #if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\n MeshDecalsPositionZBias(varyingsType);\n #endif\n return PackVaryingsToPS(varyingsType);\n}\n\n#endif\n\n\n\n \n\n \n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n \n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n \n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n \n #ifdef _HAS_REFRACTION\n if (_EnableSSRefraction)\n {\n // surfaceData.ior = surfaceDescription.RefractionIndex;\n // surfaceData.transmittanceColor = surfaceDescription.RefractionColor;\n // surfaceData.atDistance = surfaceDescription.RefractionDistance;\n \n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n \n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n // surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n\n \n // tangent-space normal\n float3 normalTS = float3(0.0f, 0.0f, 1.0f);\n normalTS = surfaceDescription.Normal;\n \n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(normalTS, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = normalTS; \n #endif\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n // surfaceData.tangentWS = TransformTangentToWorld(surfaceDescription.Tangent, fragInputs.tangentToWorld);\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n #if VERSION_GREATER_EQUAL(10,2)\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceData.geomNormalWS, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData.geomNormalWS, surfaceData);\n #else\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData);\n #endif\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #ifdef _ENABLE_GEOMETRIC_SPECULAR_AA\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // uint3 fadeMaskSeed = asuint((int3)(V * _ScreenSize.xyx)); // Quantize V to _ScreenSize values\n // LODDitheringTransition(fadeMaskSeed, unity_LODFade.x);\n //#endif\n \n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n \n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = posInput.deviceDepth;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n \n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceDescription.Distortion;\n //builtinData.distortionBlur = surfaceDescription.DistortionBlur;\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #else\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #endif\n \n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n }\n \n\n \n void Frag( PackedVaryingsToPS packedInput\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #ifdef WRITE_MSAA_DEPTH\n , out float1 depthColor : SV_Target1\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When only WRITE_MSAA_DEPTH is define and not WRITE_NORMAL_BUFFER it mean we are Unlit and only need depth, but we still have normal buffer binded\n , out float4 outNormalBuffer : SV_Target0\n , out float1 depthColor : SV_Target1\n #elif defined(SCENESELECTIONPASS)\n , out float4 outColor : SV_Target0\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);\n FragInputs input = BuildFragInputs(packedInput.vmesh);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(packedInput.vmesh, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), posInput.positionSS, outNormalBuffer);\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When we are MSAA depth only without normal buffer\n // Due to the binding order of these two render targets, we need to have them both declared\n outNormalBuffer = float4(0.0, 0.0, 0.0, 1.0);\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #elif defined(SCENESELECTIONPASS)\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"DepthOnly\"\n Tags { \"LightMode\" = \"DepthOnly\" }\n \n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n \n \n ZWrite On\n \n \n // Stencil setup\n Stencil\n {\n WriteMask [_StencilWriteMaskDepth]\n Ref [_StencilRefDepth]\n Comp Always\n Pass Replace\n }\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n \n //#pragma multi_compile_local _ _ALPHATEST_ON\n \n // #pragma multi_compile _ LOD_FADE_CROSSFADE\n \n //#pragma shader_feature _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _ _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #pragma multi_compile _ WRITE_NORMAL_BUFFER\n #pragma multi_compile _ WRITE_MSAA_DEPTH\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSDEPTH 1\n\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n \n // define FragInputs structure\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl\"\n #endif\n\n\n \n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #ifdef DEBUG_DISPLAY\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n \n #if (SHADERPASS == SHADERPASS_FORWARD)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n \n #define HAS_LIGHTLOOP\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #else\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #endif\n \n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n // Used by SceneSelectionPass\n int _ObjectId;\n int _PassValue;\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _StencilRef;\n float _StencilWriteMask;\n float _StencilRefDepth;\n float _StencilWriteMaskDepth;\n float _StencilRefMV;\n float _StencilWriteMaskMV;\n float _StencilRefDistortionVec;\n float _StencilWriteMaskDistortionVec;\n float _StencilWriteMaskGBuffer;\n float _StencilRefGBuffer;\n float _ZTestGBuffer;\n float _RequireSplitLighting;\n float _ReceivesSSR;\n float _ZWrite;\n float _TransparentSortPriority;\n float _ZTestDepthEqualForOpaque;\n float _ZTestTransparent;\n float _TransparentBackfaceEnable;\n float _AlphaCutoffEnable;\n float _UseShadowThreshold;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\nstruct VaryingsToPS\n{\n VertexToPixel vmesh;\n #ifdef VARYINGS_NEED_PASS\n VaryingsPassToPS vpass;\n #endif\n};\n\nstruct PackedVaryingsToPS\n{\n #ifdef VARYINGS_NEED_PASS\n PackedVaryingsPassToPS vpass;\n #endif\n VertexToPixel vmesh;\n\n UNITY_VERTEX_OUTPUT_STEREO\n};\n\nPackedVaryingsToPS PackVaryingsToPS(VaryingsToPS input)\n{\n PackedVaryingsToPS output = (PackedVaryingsToPS)0;\n output.vmesh = input.vmesh;\n #ifdef VARYINGS_NEED_PASS\n output.vpass = PackVaryingsPassToPS(input.vpass);\n #endif\n\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n return output;\n}\n\n\n\n\nVertexToPixel VertMesh(VertexData input)\n{\n VertexToPixel output = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n\n \n ChainModifyVertex(input, output, _Time);\n\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n return output;\n}\n\n\n#if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\nvoid MeshDecalsPositionZBias(inout VaryingsToPS input)\n{\n#if defined(UNITY_REVERSED_Z)\n input.vmesh.pos.z -= _DecalMeshDepthBias;\n#else\n input.vmesh.pos.z += _DecalMeshDepthBias;\n#endif\n}\n#endif\n\n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n// This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\nfloat unity_OneOverOutputBoost;\nfloat unity_MaxOutputValue;\n\nCBUFFER_START(UnityMetaPass)\n// x = use uv1 as raster position\n// y = use uv2 as raster position\nbool4 unity_MetaVertexControl;\n\n// x = return albedo\n// y = return normal\nbool4 unity_MetaFragmentControl;\nCBUFFER_END\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS output = (VaryingsToPS)0;\n output.vmesh = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output.vmesh);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.vmesh.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n#ifdef VARYINGS_NEED_POSITION_WS\n output.vmesh.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz);\n#endif\n\n#ifdef VARYINGS_NEED_TANGENT_TO_WORLD\n // Normal is required for triplanar mapping\n output.vmesh.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.vmesh.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n#endif\n\n output.vmesh.texcoord0 = inputMesh.texcoord0;\n output.vmesh.texcoord1 = inputMesh.texcoord1;\n output.vmesh.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.vmesh.texcoord3 = inputMesh.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vmesh.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return PackVaryingsToPS(output);\n}\n#else\n\nPackedVaryingsToPS Vert(VertexData inputMesh)\n{\n VaryingsToPS varyingsType;\n varyingsType.vmesh = VertMesh(inputMesh);\n #if (SHADERPASS == SHADERPASS_DBUFFER_MESH)\n MeshDecalsPositionZBias(varyingsType);\n #endif\n return PackVaryingsToPS(varyingsType);\n}\n\n#endif\n\n\n\n \n\n \n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n \n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n \n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n \n #ifdef _HAS_REFRACTION\n if (_EnableSSRefraction)\n {\n // surfaceData.ior = surfaceDescription.RefractionIndex;\n // surfaceData.transmittanceColor = surfaceDescription.RefractionColor;\n // surfaceData.atDistance = surfaceDescription.RefractionDistance;\n \n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n \n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n // surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n\n \n // tangent-space normal\n float3 normalTS = float3(0.0f, 0.0f, 1.0f);\n normalTS = surfaceDescription.Normal;\n \n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(normalTS, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = normalTS; \n #endif\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n // surfaceData.tangentWS = TransformTangentToWorld(surfaceDescription.Tangent, fragInputs.tangentToWorld);\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n #if VERSION_GREATER_EQUAL(10,2)\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceData.geomNormalWS, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData.geomNormalWS, surfaceData);\n #else\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, surfaceDescription.Alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, surfaceData);\n #endif\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #ifdef _ENABLE_GEOMETRIC_SPECULAR_AA\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // uint3 fadeMaskSeed = asuint((int3)(V * _ScreenSize.xyx)); // Quantize V to _ScreenSize values\n // LODDitheringTransition(fadeMaskSeed, unity_LODFade.x);\n //#endif\n \n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n \n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = posInput.deviceDepth;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n \n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceDescription.Distortion;\n //builtinData.distortionBlur = surfaceDescription.DistortionBlur;\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #else\n builtinData.distortion = float2(0.0, 0.0);\n builtinData.distortionBlur = 0.0;\n #endif\n \n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n }\n\n\n void Frag( PackedVaryingsToPS packedInput\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #ifdef WRITE_MSAA_DEPTH\n , out float1 depthColor : SV_Target1\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When only WRITE_MSAA_DEPTH is define and not WRITE_NORMAL_BUFFER it mean we are Unlit and only need depth, but we still have normal buffer binded\n , out float4 outNormalBuffer : SV_Target0\n , out float1 depthColor : SV_Target1\n #elif defined(SCENESELECTIONPASS)\n , out float4 outColor : SV_Target0\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);\n FragInputs input = BuildFragInputs(packedInput.vmesh);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(packedInput.vmesh, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n // to prevent stripping\n surfaceData.normalWS *= saturate(l.Albedo.r + 9999);\n\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), posInput.positionSS, outNormalBuffer);\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When we are MSAA depth only without normal buffer\n // Due to the binding order of these two render targets, we need to have them both declared\n outNormalBuffer = float4(0.0, 0.0, 0.0, 1.0);\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = packedInput.vmesh.pos.z;\n #elif defined(SCENESELECTIONPASS)\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #endif\n }\n\n ENDHLSL\n }\n\n\n \n\n\n\n }\n \n \n \n}\n"},{"srpTarget":0,"UnityVersionMin":20194,"UnityVersionMax":30000,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2021.3.20f1\n// Render Pipeline: Standard\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Diffuse_Normal_Metallic_Compositer\"\n{\n Properties\n {\n \n\n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n _HalfLambertStrength (\"Lambert(0), HalfLambert(1)\", Range(0,4)) = 1\n // _EmissiveModulation (\"Emissive Level\", Range(0,2)) = 1\n\n [Enum(Off,0,Front,1,Back,2)]_CullMode(\"Culling Mode\", Float) = 2\n [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode(\"Double sided normal mode\", Float) = 1\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_BaseMap(\"BaseMap\", 2D) = \"white\" {}\n [Message(A _BumpMap is encoded as follows R Normal_X G Normal_Y B Metallic_Level A Smoothness_Level)] \n [BetterHeader(Normal Mask)]\n [Group(Base Overlay)][NoScaleOffset]_BumpMap(\"_BumpMap\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_MetallicGlossMap(\"_MetallicGlossMap\", 2D) = \"black\" {}\n\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_BaseMap1(\"BaseMap1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_BumpMap1(\"_BumpMap1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_MetallicGlossMap1(\"_MetallicGlossMap1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_BaseMap2(\"BaseMap2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_BumpMap2(\"_BumpMap2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_MetallicGlossMap2(\"_MetallicGlossMap2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_BaseMap3(\"BaseMap3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_BumpMap3(\"_BumpMap3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_MetallicGlossMap3(\"_MetallicGlossMap3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n\n }\n SubShader\n {\n Tags { \"RenderType\" = \"Opaque\" \"Queue\" = \"Geometry\" }\n\n \n \n Pass\n {\n\t\t Name \"FORWARD\"\n\t\t Tags { \"LightMode\" = \"ForwardBase\" }\n \n Cull [_CullMode]\n\n\n CGPROGRAM\n // compile directives\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n #pragma multi_compile_instancing\n #pragma multi_compile_fog\n #pragma multi_compile_fwdbase\n #include \"HLSLSupport.cginc\"\n #define UNITY_INSTANCED_LOD_FADE\n #define UNITY_INSTANCED_SH\n #define UNITY_INSTANCED_LIGHTMAPSTS\n\n #include \"UnityShaderVariables.cginc\"\n #include \"UnityShaderUtilities.cginc\"\n // -------- variant for: \n\n #include \"UnityCG.cginc\"\n #include \"Lighting.cginc\"\n #include \"UnityPBSLighting.cginc\"\n #include \"AutoLight.cginc\"\n #define SHADER_PASS SHADERPASS_FORWARD\n #define _PASSFORWARD 1\n\n \n\n\n #define _STANDARD 1\n// If your looking in here and thinking WTF, yeah, I know. These are taken from the SRPs, to allow us to use the same\n// texturing library they use. However, since they are not included in the standard pipeline by default, there is no\n// way to include them in and they have to be inlined, since someone could copy this shader onto another machine without\n// Better Shaders installed. Unfortunate, but I'd rather do this and have a nice library for texture sampling instead\n// of the patchy one Unity provides being inlined/emulated in HDRP/URP. Strangely, PSSL and XBoxOne libraries are not\n// included in the standard SRP code, but they are in tons of Unity own projects on the web, so I grabbed them from there.\n\n#if defined(SHADER_API_GAMECORE)\n\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\t#define ASSIGN_SAMPLER(samplerName, samplerValue) samplerName = samplerValue\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define SAMPLE_DEPTH_TEXTURE(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2).r\n\t#define SAMPLE_DEPTH_TEXTURE_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod).r\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_XBOXONE)\n\t\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_PSSL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.GetLOD(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RW_Texture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RW_Texture2D_Array textureName\n\t#define RW_TEXTURE3D(type, textureName) RW_Texture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n\n#elif defined(SHADER_API_D3D11)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_METAL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_VULKAN)\n// This file assume SHADER_API_VULKAN is defined\n\t// TODO: This is a straight copy from D3D11.hlsl. Go through all this stuff and adjust where needed.\n\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_SWITCH)\n\t// This file assume SHADER_API_SWITCH is defined\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_GLCORE)\n\n\t// OpenGL 4.1 SM 5.0 https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 46)\n\t#define OPENGL4_1_SM5 1\n\t#else\n\t#define OPENGL4_1_SM5 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\n\t#if OPENGL4_1_SM5\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#endif\n\n\n\t#elif defined(SHADER_API_GLES3)\n\n\t// GLES 3.1 + AEP shader feature https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 40)\n\t#define GLES3_1_AEP 1\n\t#else\n\t#define GLES3_1_AEP 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#if GLES3_1_AEP\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\t#else\n\t#define RW_TEXTURE2D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\t#endif\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#if GLES3_1_AEP\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\t#endif\n\n\n#elif defined(SHADER_API_GLES)\n\n\n\t#define uint int\n\n\t#define rcp(x) 1.0 / (x)\n\t#define ddx_fine ddx\n\t#define ddy_fine ddy\n\t#define asfloat\n\t#define asuint(x) asint(x)\n\t#define f32tof16\n\t#define f16tof32\n\n\t#define ERROR_ON_UNSUPPORTED_FUNCTION(funcName) #error #funcName is not supported on GLES 2.0\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) #error calculate Level of Detail not supported in GLES2\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) samplerCUBE textureName // No support to texture2DArray\n\t#define TEXTURECUBE(textureName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY(textureName) samplerCUBE textureName // No supoport to textureCubeArray and can't emulate with texture2DArray\n\t#define TEXTURE3D(textureName) sampler3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) sampler2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_FLOAT(textureName) samplerCUBE_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_FLOAT(textureName) sampler3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) sampler2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_HALF(textureName) samplerCUBE_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_HALF(textureName) sampler3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\t#define TEXTURECUBE_SHADOW(textureName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\n\t#define RW_TEXTURE2D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\n\t#define SAMPLER(samplerName)\n\t#define SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURE3D_PARAM(textureName, samplerName) sampler3D textureName\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) tex2D(textureName, coord2)\n\n\t#if (SHADER_TARGET >= 30)\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) tex2Dlod(textureName, float4(coord2, 0, lod))\n\t#else\n\t // No lod support. Very poor approximation with bias.\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, lod)\n\t#endif\n\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) tex2Dbias(textureName, float4(coord2, 0, bias))\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_LOD)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_GRAD)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) texCUBE(textureName, coord3)\n\t// No lod support. Very poor approximation with bias.\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) texCUBEbias(textureName, float4(coord3, bias))\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) tex3D(textureName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE3D_LOD)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) SHADOW2D_SAMPLE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_SHADOW)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) SHADOWCUBE_SAMPLE(textureName, samplerName, coord4)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_SHADOW)\n\n\n\t// Not supported. Can't define as error because shader library is calling these functions.\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D)\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D_LOD)\n\n\t// Gather not supported. Fallback to regular texture sampling.\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\n#else\n#error unsupported shader api\n#endif\n\n\n\n\n// default flow control attributes\n#ifndef UNITY_BRANCH\n# define UNITY_BRANCH\n#endif\n#ifndef UNITY_FLATTEN\n# define UNITY_FLATTEN\n#endif\n#ifndef UNITY_UNROLL\n# define UNITY_UNROLL\n#endif\n#ifndef UNITY_UNROLLX\n# define UNITY_UNROLLX(_x)\n#endif\n#ifndef UNITY_LOOP\n# define UNITY_LOOP\n#endif\n\n\n\n#define NEED_FACING 1\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n UNITY_POSITION(pos);\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n float4 lmap : TEXCOORD8;\n #if UNITY_SHOULD_SAMPLE_SH\n half3 sh : TEXCOORD9; // SH\n #endif\n #ifdef LIGHTMAP_ON\n UNITY_LIGHTING_COORDS(10,11)\n UNITY_FOG_COORDS(12)\n #else\n UNITY_FOG_COORDS(10)\n UNITY_SHADOW_COORDS(11)\n #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD19;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD20;\n // #endif\n\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef UNITY_MATRIX_I_M\n\n #define UNITY_MATRIX_I_M unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)UNITY_MATRIX_M, transpose(mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)UNITY_MATRIX_V, norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n \n\n \n\n \n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n UNITY_SETUP_INSTANCE_ID(v);\n VertexToPixel o;\n UNITY_INITIALIZE_OUTPUT(VertexToPixel,o);\n UNITY_TRANSFER_INSTANCE_ID(v,o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.pos = UnityObjectToClipPos(v.vertex);\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos);\n // #endif\n\n o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;\n o.worldNormal = UnityObjectToWorldNormal(v.normal);\n o.worldTangent.xyz = UnityObjectToWorldDir(v.tangent.xyz);\n fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;\n o.worldTangent.w = tangentSign;\n\n #ifdef DYNAMICLIGHTMAP_ON\n o.lmap.zw = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n #endif\n #ifdef LIGHTMAP_ON\n o.lmap.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n #endif\n\n // SH/ambient and vertex lights\n #ifndef LIGHTMAP_ON\n #if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL\n o.sh = 0;\n // Approximated illumination from non-important point lights\n #ifdef VERTEXLIGHT_ON\n o.sh += Shade4PointLights (\n unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,\n unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,\n unity_4LightAtten0, o.worldPos, o.worldNormal);\n #endif\n o.sh = ShadeSHPerVertex (o.worldNormal, o.sh);\n #endif\n #endif // !LIGHTMAP_ON\n\n UNITY_TRANSFER_LIGHTING(o,v.texcoord1.xy); // pass shadow and, possibly, light cookie coordinates to pixel shader\n #ifdef FOG_COMBINED_WITH_TSPACE\n UNITY_TRANSFER_FOG_COMBINED_WITH_TSPACE(o,o.pos); // pass fog coordinates to pixel shader\n #elif defined FOG_COMBINED_WITH_WORLD_POS\n UNITY_TRANSFER_FOG_COMBINED_WITH_WORLD_POS(o,o.pos); // pass fog coordinates to pixel shader\n #else\n UNITY_TRANSFER_FOG(o,o.pos); // pass fog coordinates to pixel shader\n #endif\n\n return o;\n }\n\n \n\n // fragment shader\n fixed4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n // prepare and unpack data\n #ifdef FOG_COMBINED_WITH_TSPACE\n UNITY_EXTRACT_FOG_FROM_TSPACE(IN);\n #elif defined FOG_COMBINED_WITH_WORLD_POS\n UNITY_EXTRACT_FOG_FROM_WORLD_POS(IN);\n #else\n UNITY_EXTRACT_FOG(IN);\n #endif\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n \n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n \n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n\n #ifndef USING_DIRECTIONAL_LIGHT\n fixed3 lightDir = normalize(UnityWorldSpaceLightDir(d.worldSpacePosition));\n #else\n fixed3 lightDir = _WorldSpaceLightPos0.xyz;\n #endif\n float3 worldViewDir = normalize(UnityWorldSpaceViewDir(d.worldSpacePosition));\n\n // compute lighting & shadowing factor\n UNITY_LIGHT_ATTENUATION(atten, IN, d.worldSpacePosition)\n\n #if _USESPECULAR || _USESPECULARWORKFLOW || _SPECULARFROMMETALLIC\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;\n #else\n SurfaceOutputStandardSpecular o;\n #endif\n o.Specular = l.Specular;\n o.Occlusion = l.Occlusion;\n o.Smoothness = l.Smoothness;\n #elif _BDRFLAMBERT || _BDRF3 || _SIMPLELIT\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutput o = (SurfaceOutput)0;\n #else\n SurfaceOutput o;\n #endif\n\n o.Specular = l.Specular;\n o.Gloss = l.Smoothness;\n _SpecColor.rgb = l.Specular; // fucking hell Unity, wtf..\n #else\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutputStandard o = (SurfaceOutputStandard)0;\n #else\n SurfaceOutputStandard o;\n #endif\n o.Smoothness = l.Smoothness;\n o.Metallic = l.Metallic;\n o.Occlusion = l.Occlusion;\n #endif\n\n o.Albedo = l.Albedo;\n o.Emission = l.Emission;\n o.Alpha = l.Alpha;\n #if _WORLDSPACENORMAL\n o.Normal = l.Normal;\n #else\n o.Normal = normalize(TangentToWorldSpace(d, l.Normal));\n #endif\n\n fixed4 c = 0;\n // Setup lighting environment\n UnityGI gi;\n UNITY_INITIALIZE_OUTPUT(UnityGI, gi);\n gi.indirect.diffuse = 0;\n gi.indirect.specular = 0;\n gi.light.color = _LightColor0.rgb;\n gi.light.dir = lightDir;\n // Call GI (lightmaps/SH/reflections) lighting function\n UnityGIInput giInput;\n UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);\n giInput.light = gi.light;\n giInput.worldPos = d.worldSpacePosition;\n giInput.worldViewDir = worldViewDir;\n giInput.atten = atten;\n #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)\n giInput.lightmapUV = IN.lmap;\n #else\n giInput.lightmapUV = 0.0;\n #endif\n #if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL\n giInput.ambient = IN.sh;\n #else\n giInput.ambient.rgb = 0.0;\n #endif\n giInput.probeHDR[0] = unity_SpecCube0_HDR;\n giInput.probeHDR[1] = unity_SpecCube1_HDR;\n #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION)\n giInput.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending\n #endif\n #ifdef UNITY_SPECCUBE_BOX_PROJECTION\n giInput.boxMax[0] = unity_SpecCube0_BoxMax;\n giInput.probePosition[0] = unity_SpecCube0_ProbePosition;\n giInput.boxMax[1] = unity_SpecCube1_BoxMax;\n giInput.boxMin[1] = unity_SpecCube1_BoxMin;\n giInput.probePosition[1] = unity_SpecCube1_ProbePosition;\n #endif\n\n \n\n #if defined(_OVERRIDE_SHADOWMASK)\n float4 mulColor = saturate(dot(l.ShadowMask, unity_OcclusionMaskSelector));\n gi.light.color = mulColor;\n giInput.light.color = mulColor;\n #endif\n\n #if _UNLIT\n c.rgb = l.Albedo;\n c.a = l.Alpha;\n #elif _BDRF3 || _SIMPLELIT\n LightingBlinnPhong_GI(o, giInput, gi);\n #if defined(_OVERRIDE_BAKEDGI)\n gi.indirect.diffuse = l.DiffuseGI;\n gi.indirect.specular = l.SpecularGI;\n #endif\n c += LightingBlinnPhong (o, d.worldSpaceViewDir, gi);\n #elif _USESPECULAR || _USESPECULARWORKFLOW || _SPECULARFROMMETALLIC\n LightingStandardSpecular_GI(o, giInput, gi);\n #if defined(_OVERRIDE_BAKEDGI)\n gi.indirect.diffuse = l.DiffuseGI;\n gi.indirect.specular = l.SpecularGI;\n #endif\n c += LightingStandardSpecular (o, d.worldSpaceViewDir, gi);\n #else\n LightingStandard_GI(o, giInput, gi);\n #if defined(_OVERRIDE_BAKEDGI)\n gi.indirect.diffuse = l.DiffuseGI;\n gi.indirect.specular = l.SpecularGI;\n #endif\n c += LightingStandard (o, d.worldSpaceViewDir, gi);\n #endif\n\n c.rgb += o.Emission;\n\n ChainFinalColorForward(l, d, c);\n\n #if !DISABLEFOG\n UNITY_APPLY_FOG(_unity_fogCoord, c); // apply fog\n #endif\n \n\n return c;\n }\n\n ENDCG\n\n }\n\n\n \n \n\n\t // ---- forward rendering additive lights pass:\n\t Pass\n {\n\t\t Name \"FORWARD\"\n\t\t Tags { \"LightMode\" = \"ForwardAdd\" }\n\t\t ZWrite Off Blend One One\n \n Cull [_CullMode]\n\n\n CGPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // compile directives\n #pragma target 3.0\n #pragma multi_compile_instancing\n #pragma multi_compile_fog\n #pragma skip_variants INSTANCING_ON\n #pragma multi_compile_fwdadd_fullshadows\n #include \"HLSLSupport.cginc\"\n #define UNITY_INSTANCED_LOD_FADE\n #define UNITY_INSTANCED_SH\n #define UNITY_INSTANCED_LIGHTMAPSTS\n #include \"UnityShaderVariables.cginc\"\n #include \"UnityShaderUtilities.cginc\"\n\n\n #include \"UnityCG.cginc\"\n #include \"Lighting.cginc\"\n #include \"UnityPBSLighting.cginc\"\n #include \"AutoLight.cginc\"\n\n \n\n #define _PASSFORWARD 1\n #define _PASSFORWARDADD 1\n\n \n\n\n #define _STANDARD 1\n// If your looking in here and thinking WTF, yeah, I know. These are taken from the SRPs, to allow us to use the same\n// texturing library they use. However, since they are not included in the standard pipeline by default, there is no\n// way to include them in and they have to be inlined, since someone could copy this shader onto another machine without\n// Better Shaders installed. Unfortunate, but I'd rather do this and have a nice library for texture sampling instead\n// of the patchy one Unity provides being inlined/emulated in HDRP/URP. Strangely, PSSL and XBoxOne libraries are not\n// included in the standard SRP code, but they are in tons of Unity own projects on the web, so I grabbed them from there.\n\n#if defined(SHADER_API_GAMECORE)\n\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\t#define ASSIGN_SAMPLER(samplerName, samplerValue) samplerName = samplerValue\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define SAMPLE_DEPTH_TEXTURE(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2).r\n\t#define SAMPLE_DEPTH_TEXTURE_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod).r\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_XBOXONE)\n\t\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_PSSL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.GetLOD(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RW_Texture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RW_Texture2D_Array textureName\n\t#define RW_TEXTURE3D(type, textureName) RW_Texture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n\n#elif defined(SHADER_API_D3D11)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_METAL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_VULKAN)\n// This file assume SHADER_API_VULKAN is defined\n\t// TODO: This is a straight copy from D3D11.hlsl. Go through all this stuff and adjust where needed.\n\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_SWITCH)\n\t// This file assume SHADER_API_SWITCH is defined\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_GLCORE)\n\n\t// OpenGL 4.1 SM 5.0 https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 46)\n\t#define OPENGL4_1_SM5 1\n\t#else\n\t#define OPENGL4_1_SM5 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\n\t#if OPENGL4_1_SM5\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#endif\n\n\n\t#elif defined(SHADER_API_GLES3)\n\n\t// GLES 3.1 + AEP shader feature https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 40)\n\t#define GLES3_1_AEP 1\n\t#else\n\t#define GLES3_1_AEP 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#if GLES3_1_AEP\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\t#else\n\t#define RW_TEXTURE2D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\t#endif\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#if GLES3_1_AEP\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\t#endif\n\n\n#elif defined(SHADER_API_GLES)\n\n\n\t#define uint int\n\n\t#define rcp(x) 1.0 / (x)\n\t#define ddx_fine ddx\n\t#define ddy_fine ddy\n\t#define asfloat\n\t#define asuint(x) asint(x)\n\t#define f32tof16\n\t#define f16tof32\n\n\t#define ERROR_ON_UNSUPPORTED_FUNCTION(funcName) #error #funcName is not supported on GLES 2.0\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) #error calculate Level of Detail not supported in GLES2\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) samplerCUBE textureName // No support to texture2DArray\n\t#define TEXTURECUBE(textureName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY(textureName) samplerCUBE textureName // No supoport to textureCubeArray and can't emulate with texture2DArray\n\t#define TEXTURE3D(textureName) sampler3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) sampler2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_FLOAT(textureName) samplerCUBE_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_FLOAT(textureName) sampler3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) sampler2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_HALF(textureName) samplerCUBE_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_HALF(textureName) sampler3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\t#define TEXTURECUBE_SHADOW(textureName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\n\t#define RW_TEXTURE2D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\n\t#define SAMPLER(samplerName)\n\t#define SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURE3D_PARAM(textureName, samplerName) sampler3D textureName\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) tex2D(textureName, coord2)\n\n\t#if (SHADER_TARGET >= 30)\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) tex2Dlod(textureName, float4(coord2, 0, lod))\n\t#else\n\t // No lod support. Very poor approximation with bias.\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, lod)\n\t#endif\n\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) tex2Dbias(textureName, float4(coord2, 0, bias))\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_LOD)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_GRAD)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) texCUBE(textureName, coord3)\n\t// No lod support. Very poor approximation with bias.\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) texCUBEbias(textureName, float4(coord3, bias))\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) tex3D(textureName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE3D_LOD)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) SHADOW2D_SAMPLE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_SHADOW)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) SHADOWCUBE_SAMPLE(textureName, samplerName, coord4)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_SHADOW)\n\n\n\t// Not supported. Can't define as error because shader library is calling these functions.\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D)\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D_LOD)\n\n\t// Gather not supported. Fallback to regular texture sampling.\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\n#else\n#error unsupported shader api\n#endif\n\n\n\n\n// default flow control attributes\n#ifndef UNITY_BRANCH\n# define UNITY_BRANCH\n#endif\n#ifndef UNITY_FLATTEN\n# define UNITY_FLATTEN\n#endif\n#ifndef UNITY_UNROLL\n# define UNITY_UNROLL\n#endif\n#ifndef UNITY_UNROLLX\n# define UNITY_UNROLLX(_x)\n#endif\n#ifndef UNITY_LOOP\n# define UNITY_LOOP\n#endif\n\n\n\n#define NEED_FACING 1\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n UNITY_POSITION(pos); // must be named pos because Unity does stupid macro stuff\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n \n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n UNITY_LIGHTING_COORDS(8,9)\n UNITY_FOG_COORDS(10)\n\n \n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD18;\n // #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n\n };\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef UNITY_MATRIX_I_M\n\n #define UNITY_MATRIX_I_M unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)UNITY_MATRIX_M, transpose(mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)UNITY_MATRIX_V, norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n \n\n \n\n \n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n \n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n UNITY_SETUP_INSTANCE_ID(v);\n VertexToPixel o;\n UNITY_INITIALIZE_OUTPUT(VertexToPixel,o);\n UNITY_TRANSFER_INSTANCE_ID(v,o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.pos = UnityObjectToClipPos(v.vertex);\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos);\n // #endif\n\n o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;\n o.worldNormal = UnityObjectToWorldNormal(v.normal);\n o.worldTangent.xyz = UnityObjectToWorldDir(v.tangent.xyz);\n fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;\n o.worldTangent.w = tangentSign;\n\n UNITY_TRANSFER_LIGHTING(o, v.texcoord1.xy); // pass shadow and, possibly, light cookie coordinates to pixel shader\n UNITY_TRANSFER_FOG(o,o.pos); // pass fog coordinates to pixel shader\n\n return o;\n }\n\n \n\n // fragment shader\n fixed4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n // prepare and unpack data\n\n #ifdef FOG_COMBINED_WITH_TSPACE\n UNITY_EXTRACT_FOG_FROM_TSPACE(IN);\n #elif defined FOG_COMBINED_WITH_WORLD_POS\n UNITY_EXTRACT_FOG_FROM_WORLD_POS(IN);\n #else\n UNITY_EXTRACT_FOG(IN);\n #endif\n\n\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n\n #ifndef USING_DIRECTIONAL_LIGHT\n fixed3 lightDir = normalize(UnityWorldSpaceLightDir(d.worldSpacePosition));\n #else\n fixed3 lightDir = _WorldSpaceLightPos0.xyz;\n #endif\n float3 worldViewDir = normalize(UnityWorldSpaceViewDir(d.worldSpacePosition));\n\n #if _USESPECULAR || _USESPECULARWORKFLOW || _SPECULARFROMMETALLIC\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0;\n #else\n SurfaceOutputStandardSpecular o;\n #endif\n o.Specular = l.Specular;\n o.Occlusion = l.Occlusion;\n o.Smoothness = l.Smoothness;\n #elif _BDRFLAMBERT || _BDRF3 || _SIMPLELIT\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutput o = (SurfaceOutput)0;\n #else\n SurfaceOutput o;\n #endif\n\n o.Specular = l.SpecularPower;\n o.Gloss = l.Smoothness;\n _SpecColor.rgb = l.Specular; // fucking hell Unity, wtf..\n #else\n #ifdef UNITY_COMPILER_HLSL\n SurfaceOutputStandard o = (SurfaceOutputStandard)0;\n #else\n SurfaceOutputStandard o;\n #endif\n o.Smoothness = l.Smoothness;\n o.Metallic = l.Metallic;\n o.Occlusion = l.Occlusion;\n #endif\n\n \n o.Albedo = l.Albedo;\n o.Emission = l.Emission;\n o.Alpha = l.Alpha;\n\n #if _WORLDSPACENORMAL\n o.Normal = l.Normal;\n #else\n o.Normal = normalize(TangentToWorldSpace(d, l.Normal));\n #endif\n\n\n\n UNITY_LIGHT_ATTENUATION(atten, IN, d.worldSpacePosition)\n half4 c = 0;\n\n // Setup lighting environment\n UnityGI gi;\n UNITY_INITIALIZE_OUTPUT(UnityGI, gi);\n gi.indirect.diffuse = 0;\n gi.indirect.specular = 0;\n gi.light.color = _LightColor0.rgb;\n gi.light.dir = lightDir;\n gi.light.color *= atten;\n\n #if defined(_OVERRIDE_SHADOWMASK)\n float4 mulColor = saturate(dot(l.ShadowMask, unity_OcclusionMaskSelector));\n gi.light.color = mulColor;\n #endif\n\n #if _USESPECULAR\n c += LightingStandardSpecular (o, worldViewDir, gi);\n #elif _BDRF3 || _SIMPLELIT\n c += LightingBlinnPhong (o, d.worldSpaceViewDir, gi);\n #else\n c += LightingStandard (o, worldViewDir, gi);\n #endif\n \n\n ChainFinalColorForward(l, d, c);\n\n #if !DISABLEFOG\n UNITY_APPLY_FOG(_unity_fogCoord, c); // apply fog\n #endif\n #if !_ALPHABLEND_ON\n UNITY_OPAQUE_ALPHA(c.a);\n #endif\n \n return c;\n }\n\n ENDCG\n\n }\n\n \n\t Pass {\n\t\t Name \"ShadowCaster\"\n\t\t Tags { \"LightMode\" = \"ShadowCaster\" }\n\t\t ZWrite On ZTest LEqual\n\n Cull [_CullMode]\n\n\n CGPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n // compile directives\n #pragma target 3.0\n #pragma multi_compile_instancing\n #pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2\n #pragma multi_compile_shadowcaster\n #include \"HLSLSupport.cginc\"\n #define UNITY_INSTANCED_LOD_FADE\n #define UNITY_INSTANCED_SH\n #define UNITY_INSTANCED_LIGHTMAPSTS\n #include \"UnityShaderVariables.cginc\"\n #include \"UnityShaderUtilities.cginc\"\n\n #include \"UnityCG.cginc\"\n #include \"Lighting.cginc\"\n #include \"UnityPBSLighting.cginc\"\n\n #define _PASSSHADOW 1\n\n \n\n\n #define _STANDARD 1\n// If your looking in here and thinking WTF, yeah, I know. These are taken from the SRPs, to allow us to use the same\n// texturing library they use. However, since they are not included in the standard pipeline by default, there is no\n// way to include them in and they have to be inlined, since someone could copy this shader onto another machine without\n// Better Shaders installed. Unfortunate, but I'd rather do this and have a nice library for texture sampling instead\n// of the patchy one Unity provides being inlined/emulated in HDRP/URP. Strangely, PSSL and XBoxOne libraries are not\n// included in the standard SRP code, but they are in tons of Unity own projects on the web, so I grabbed them from there.\n\n#if defined(SHADER_API_GAMECORE)\n\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\t#define ASSIGN_SAMPLER(samplerName, samplerValue) samplerName = samplerValue\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define SAMPLE_DEPTH_TEXTURE(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2).r\n\t#define SAMPLE_DEPTH_TEXTURE_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod).r\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_XBOXONE)\n\t\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_PSSL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.GetLOD(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RW_Texture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RW_Texture2D_Array textureName\n\t#define RW_TEXTURE3D(type, textureName) RW_Texture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n\n#elif defined(SHADER_API_D3D11)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_METAL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_VULKAN)\n// This file assume SHADER_API_VULKAN is defined\n\t// TODO: This is a straight copy from D3D11.hlsl. Go through all this stuff and adjust where needed.\n\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_SWITCH)\n\t// This file assume SHADER_API_SWITCH is defined\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_GLCORE)\n\n\t// OpenGL 4.1 SM 5.0 https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 46)\n\t#define OPENGL4_1_SM5 1\n\t#else\n\t#define OPENGL4_1_SM5 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\n\t#if OPENGL4_1_SM5\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#endif\n\n\n\t#elif defined(SHADER_API_GLES3)\n\n\t// GLES 3.1 + AEP shader feature https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 40)\n\t#define GLES3_1_AEP 1\n\t#else\n\t#define GLES3_1_AEP 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#if GLES3_1_AEP\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\t#else\n\t#define RW_TEXTURE2D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\t#endif\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#if GLES3_1_AEP\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\t#endif\n\n\n#elif defined(SHADER_API_GLES)\n\n\n\t#define uint int\n\n\t#define rcp(x) 1.0 / (x)\n\t#define ddx_fine ddx\n\t#define ddy_fine ddy\n\t#define asfloat\n\t#define asuint(x) asint(x)\n\t#define f32tof16\n\t#define f16tof32\n\n\t#define ERROR_ON_UNSUPPORTED_FUNCTION(funcName) #error #funcName is not supported on GLES 2.0\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) #error calculate Level of Detail not supported in GLES2\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) samplerCUBE textureName // No support to texture2DArray\n\t#define TEXTURECUBE(textureName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY(textureName) samplerCUBE textureName // No supoport to textureCubeArray and can't emulate with texture2DArray\n\t#define TEXTURE3D(textureName) sampler3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) sampler2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_FLOAT(textureName) samplerCUBE_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_FLOAT(textureName) sampler3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) sampler2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_HALF(textureName) samplerCUBE_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_HALF(textureName) sampler3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\t#define TEXTURECUBE_SHADOW(textureName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\n\t#define RW_TEXTURE2D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\n\t#define SAMPLER(samplerName)\n\t#define SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURE3D_PARAM(textureName, samplerName) sampler3D textureName\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) tex2D(textureName, coord2)\n\n\t#if (SHADER_TARGET >= 30)\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) tex2Dlod(textureName, float4(coord2, 0, lod))\n\t#else\n\t // No lod support. Very poor approximation with bias.\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, lod)\n\t#endif\n\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) tex2Dbias(textureName, float4(coord2, 0, bias))\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_LOD)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_GRAD)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) texCUBE(textureName, coord3)\n\t// No lod support. Very poor approximation with bias.\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) texCUBEbias(textureName, float4(coord3, bias))\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) tex3D(textureName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE3D_LOD)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) SHADOW2D_SAMPLE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_SHADOW)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) SHADOWCUBE_SAMPLE(textureName, samplerName, coord4)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_SHADOW)\n\n\n\t// Not supported. Can't define as error because shader library is calling these functions.\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D)\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D_LOD)\n\n\t// Gather not supported. Fallback to regular texture sampling.\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\n#else\n#error unsupported shader api\n#endif\n\n\n\n\n// default flow control attributes\n#ifndef UNITY_BRANCH\n# define UNITY_BRANCH\n#endif\n#ifndef UNITY_FLATTEN\n# define UNITY_FLATTEN\n#endif\n#ifndef UNITY_UNROLL\n# define UNITY_UNROLL\n#endif\n#ifndef UNITY_UNROLLX\n# define UNITY_UNROLLX(_x)\n#endif\n#ifndef UNITY_LOOP\n# define UNITY_LOOP\n#endif\n\n\n\n#define NEED_FACING 1\n\n \n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n V2F_SHADOW_CASTER; // may declare TEXCOORD0 for the wonderfully named .vec\n float3 worldPos : TEXCOORD1;\n float3 worldNormal : TEXCOORD2;\n float4 worldTangent : TEXCOORD3;\n float4 texcoord0 : TEXCOORD4;\n // float4 texcoord1 : TEXCOORD5;\n // float4 texcoord2 : TEXCOORD6;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD7;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD8;\n // #endif\n \n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD16;\n // #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef UNITY_MATRIX_I_M\n\n #define UNITY_MATRIX_I_M unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)UNITY_MATRIX_M, transpose(mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)UNITY_MATRIX_V, norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n \n\n \n\n \n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n UNITY_SETUP_INSTANCE_ID(v);\n VertexToPixel o;\n UNITY_INITIALIZE_OUTPUT(VertexToPixel,o);\n UNITY_TRANSFER_INSTANCE_ID(v,o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n\n \n\n o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;\n o.worldNormal = UnityObjectToWorldNormal(v.normal);\n o.worldTangent.xyz = UnityObjectToWorldDir(v.tangent.xyz);\n fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;\n float3 worldBinormal = cross(o.worldNormal, o.worldTangent.xyz) * tangentSign;\n o.worldTangent.w = tangentSign;\n\n // sets o.pos, so do screenpos after.\n TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos);\n // #endif\n\n return o;\n }\n\n \n\n // fragment shader\n fixed4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n // prepare and unpack data\n\n #ifdef FOG_COMBINED_WITH_TSPACE\n UNITY_EXTRACT_FOG_FROM_TSPACE(IN);\n #elif defined FOG_COMBINED_WITH_WORLD_POS\n UNITY_EXTRACT_FOG_FROM_WORLD_POS(IN);\n #else\n UNITY_EXTRACT_FOG(IN);\n #endif\n\n #ifndef USING_DIRECTIONAL_LIGHT\n fixed3 lightDir = normalize(UnityWorldSpaceLightDir(IN.worldPos));\n #else\n fixed3 lightDir = _WorldSpaceLightPos0.xyz;\n #endif\n\n \n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n SHADOW_CASTER_FRAGMENT(IN)\n }\n\n\n ENDCG\n\n }\n\n \n\t // ---- meta information extraction pass:\n\t Pass\n {\n\t\t Name \"Meta\"\n\t\t Tags { \"LightMode\" = \"Meta\" }\n\t\t Cull Off\n\n Cull [_CullMode]\n\n\n CGPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // compile directives\n #pragma target 3.0\n #pragma multi_compile_instancing\n #pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2\n #pragma shader_feature EDITOR_VISUALIZATION\n\n #include \"HLSLSupport.cginc\"\n #define UNITY_INSTANCED_LOD_FADE\n #define UNITY_INSTANCED_SH\n #define UNITY_INSTANCED_LIGHTMAPSTS\n #include \"UnityShaderVariables.cginc\"\n #include \"UnityShaderUtilities.cginc\"\n\n #include \"UnityCG.cginc\"\n #include \"Lighting.cginc\"\n #include \"UnityPBSLighting.cginc\"\n #include \"UnityMetaPass.cginc\"\n\n #define _PASSMETA 1\n\n \n\n\n #define _STANDARD 1\n// If your looking in here and thinking WTF, yeah, I know. These are taken from the SRPs, to allow us to use the same\n// texturing library they use. However, since they are not included in the standard pipeline by default, there is no\n// way to include them in and they have to be inlined, since someone could copy this shader onto another machine without\n// Better Shaders installed. Unfortunate, but I'd rather do this and have a nice library for texture sampling instead\n// of the patchy one Unity provides being inlined/emulated in HDRP/URP. Strangely, PSSL and XBoxOne libraries are not\n// included in the standard SRP code, but they are in tons of Unity own projects on the web, so I grabbed them from there.\n\n#if defined(SHADER_API_GAMECORE)\n\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\t#define ASSIGN_SAMPLER(samplerName, samplerValue) samplerName = samplerValue\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) PLATFORM_SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) PLATFORM_SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) PLATFORM_SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURECUBE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) PLATFORM_SAMPLE_TEXTURE3D(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) PLATFORM_SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define SAMPLE_DEPTH_TEXTURE(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2).r\n\t#define SAMPLE_DEPTH_TEXTURE_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod).r\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_XBOXONE)\n\t\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n#elif defined(SHADER_API_PSSL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.GetLOD(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RW_Texture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RW_Texture2D_Array textureName\n\t#define RW_TEXTURE3D(type, textureName) RW_Texture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n\n\n#elif defined(SHADER_API_D3D11)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_METAL)\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_VULKAN)\n// This file assume SHADER_API_VULKAN is defined\n\t// TODO: This is a straight copy from D3D11.hlsl. Go through all this stuff and adjust where needed.\n\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_SWITCH)\n\t// This file assume SHADER_API_SWITCH is defined\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\n#elif defined(SHADER_API_GLCORE)\n\n\t// OpenGL 4.1 SM 5.0 https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 46)\n\t#define OPENGL4_1_SM5 1\n\t#else\n\t#define OPENGL4_1_SM5 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName)\n\t#define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName)\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\n\t#if OPENGL4_1_SM5\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#endif\n\n\n\t#elif defined(SHADER_API_GLES3)\n\n\t// GLES 3.1 + AEP shader feature https://docs.unity3d.com/Manual/SL-ShaderCompileTargets.html\n\t#if (SHADER_TARGET >= 40)\n\t#define GLES3_1_AEP 1\n\t#else\n\t#define GLES3_1_AEP 0\n\t#endif\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) Texture2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName\n\t#define TEXTURECUBE(textureName) TextureCube textureName\n\t#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName\n\t#define TEXTURE3D(textureName) Texture3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) Texture2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURECUBE_HALF(textureName) TextureCube_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray textureName // no support to _float on Array, it's being added\n\t#define TEXTURE3D_HALF(textureName) Texture3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName)\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName)\n\t#define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName)\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName)\n\n\t#if GLES3_1_AEP\n\t#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName\n\t#define RW_TEXTURE3D(type, textureName) RWTexture3D textureName\n\t#else\n\t#define RW_TEXTURE2D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\t#endif\n\n\t#define SAMPLER(samplerName) SamplerState samplerName\n\t#define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName)\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName)\n\t#define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName)\n\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName)\n\t#define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\t#define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)\n\n\t#ifdef UNITY_NO_CUBEMAP_ARRAY\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#else\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)textureName.SampleBias(samplerName, float4(coord3, index), bias)\n\t#endif\n\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w)\n\n\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))\n\n\t#if GLES3_1_AEP\n\t#define PLATFORM_SUPPORT_GATHER\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2)\n\t#else\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\t#endif\n\n\n#elif defined(SHADER_API_GLES)\n\n\n\t#define uint int\n\n\t#define rcp(x) 1.0 / (x)\n\t#define ddx_fine ddx\n\t#define ddy_fine ddy\n\t#define asfloat\n\t#define asuint(x) asint(x)\n\t#define f32tof16\n\t#define f16tof32\n\n\t#define ERROR_ON_UNSUPPORTED_FUNCTION(funcName) #error #funcName is not supported on GLES 2.0\n\n\t// Initialize arbitrary structure with zero values.\n\t// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0\n\t#define ZERO_INITIALIZE(type, name) name = (type)0;\n\t#define ZERO_INITIALIZE_ARRAY(type, name, arraySize) { for (int arrayIndex = 0; arrayIndex < arraySize; arrayIndex++) { name[arrayIndex] = (type)0; } }\n\n\n\t// Texture util abstraction\n\n\t#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) #error calculate Level of Detail not supported in GLES2\n\n\t// Texture abstraction\n\n\t#define TEXTURE2D(textureName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY(textureName) samplerCUBE textureName // No support to texture2DArray\n\t#define TEXTURECUBE(textureName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY(textureName) samplerCUBE textureName // No supoport to textureCubeArray and can't emulate with texture2DArray\n\t#define TEXTURE3D(textureName) sampler3D textureName\n\n\t#define TEXTURE2D_FLOAT(textureName) sampler2D_float textureName\n\t#define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_FLOAT(textureName) samplerCUBE_float textureName\n\t#define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_FLOAT(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_FLOAT(textureName) sampler3D_float textureName\n\n\t#define TEXTURE2D_HALF(textureName) sampler2D_half textureName\n\t#define TEXTURE2D_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to texture2DArray\n\t#define TEXTURECUBE_HALF(textureName) samplerCUBE_half textureName\n\t#define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_HALF(textureName) // No support to textureCubeArray\n\t#define TEXTURE3D_HALF(textureName) sampler3D_half textureName\n\n\t#define TEXTURE2D_SHADOW(textureName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\t#define TEXTURECUBE_SHADOW(textureName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_SHADOW(textureName) // No support to texture array\n\n\t#define RW_TEXTURE2D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2D)\n\t#define RW_TEXTURE2D_ARRAY(type, textureName) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture2DArray)\n\t#define RW_TEXTURE3D(type, textureNam) ERROR_ON_UNSUPPORTED_FUNCTION(RWTexture3D)\n\n\t#define SAMPLER(samplerName)\n\t#define SAMPLER_CMP(samplerName)\n\n\t#define TEXTURE2D_PARAM(textureName, samplerName) sampler2D textureName\n\t#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) samplerCUBE textureName\n\t#define TEXTURE3D_PARAM(textureName, samplerName) sampler3D textureName\n\t#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) SHADOW2D_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\t#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) SHADOWCUBE_TEXTURE_AND_SAMPLER textureName\n\n\t#define TEXTURE2D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE3D_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName\n\t#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName\n\n\t#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) tex2D(textureName, coord2)\n\n\t#if (SHADER_TARGET >= 30)\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) tex2Dlod(textureName, float4(coord2, 0, lod))\n\t#else\n\t // No lod support. Very poor approximation with bias.\n\t #define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, lod)\n\t#endif\n\n\t#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) tex2Dbias(textureName, float4(coord2, 0, bias))\n\t#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) SAMPLE_TEXTURE2D(textureName, samplerName, coord2)\n\t#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY)\n\t#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_LOD)\n\t#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_GRAD)\n\t#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) texCUBE(textureName, coord3)\n\t// No lod support. Very poor approximation with bias.\n\t#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, lod)\n\t#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) texCUBEbias(textureName, float4(coord3, bias))\n\t#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_LOD)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_BIAS)\n\t#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) tex3D(textureName, coord3)\n\t#define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE3D_LOD)\n\n\t#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) SHADOW2D_SAMPLE(textureName, samplerName, coord3)\n\t#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURE2D_ARRAY_SHADOW)\n\t#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) SHADOWCUBE_SAMPLE(textureName, samplerName, coord4)\n\t#define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) ERROR_ON_UNSUPPORTED_FUNCTION(SAMPLE_TEXTURECUBE_ARRAY_SHADOW)\n\n\n\t// Not supported. Can't define as error because shader library is calling these functions.\n\t#define LOAD_TEXTURE2D(textureName, unCoord2) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) half4(0, 0, 0, 0)\n\t#define LOAD_TEXTURE3D(textureName, unCoord3) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D)\n\t#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) ERROR_ON_UNSUPPORTED_FUNCTION(LOAD_TEXTURE3D_LOD)\n\n\t// Gather not supported. Fallback to regular texture sampling.\n\t#define GATHER_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D)\n\t#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURE2D_ARRAY)\n\t#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE)\n\t#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_TEXTURECUBE_ARRAY)\n\t#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_RED_TEXTURE2D)\n\t#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_GREEN_TEXTURE2D)\n\t#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_BLUE_TEXTURE2D)\n\t#define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) ERROR_ON_UNSUPPORTED_FUNCTION(GATHER_ALPHA_TEXTURE2D)\n\n#else\n#error unsupported shader api\n#endif\n\n\n\n\n// default flow control attributes\n#ifndef UNITY_BRANCH\n# define UNITY_BRANCH\n#endif\n#ifndef UNITY_FLATTEN\n# define UNITY_FLATTEN\n#endif\n#ifndef UNITY_UNROLL\n# define UNITY_UNROLL\n#endif\n#ifndef UNITY_UNROLLX\n# define UNITY_UNROLLX(_x)\n#endif\n#ifndef UNITY_LOOP\n# define UNITY_LOOP\n#endif\n\n\n\n#define NEED_FACING 1\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n UNITY_POSITION(pos);\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n #ifdef EDITOR_VISUALIZATION\n float2 vizUV : TEXCOORD8;\n float4 lightCoord : TEXCOORD9;\n #endif\n\n \n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD17;\n // #endif\n\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef UNITY_MATRIX_I_M\n\n #define UNITY_MATRIX_I_M unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)UNITY_MATRIX_M, transpose(mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)UNITY_MATRIX_V, norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n \n\n \n\n \n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n UNITY_SETUP_INSTANCE_ID(v);\n VertexToPixel o;\n UNITY_INITIALIZE_OUTPUT(VertexToPixel,o);\n UNITY_TRANSFER_INSTANCE_ID(v,o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n\n o.pos = UnityMetaVertexPosition(v.vertex, v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #ifdef EDITOR_VISUALIZATION\n o.vizUV = 0;\n o.lightCoord = 0;\n if (unity_VisualizationMode == EDITORVIZ_TEXTURE)\n o.vizUV = UnityMetaVizUV(unity_EditorViz_UVIndex, v.texcoord0.xy, v.texcoord1.xy, v.texcoord2.xy, unity_EditorViz_Texture_ST);\n else if (unity_VisualizationMode == EDITORVIZ_SHOWLIGHTMASK)\n {\n o.vizUV = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n o.lightCoord = mul(unity_EditorViz_WorldToLight, mul(unity_ObjectToWorld, float4(v.vertex.xyz, 1)));\n }\n #endif\n\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos);\n // #endif\n\n o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;\n o.worldNormal = UnityObjectToWorldNormal(v.normal);\n o.worldTangent.xyz = UnityObjectToWorldDir(v.tangent.xyz);\n fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;\n o.worldTangent.w = tangentSign;\n\n return o;\n }\n\n \n\n // fragment shader\n fixed4 Frag (VertexToPixel IN\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n\n #ifdef FOG_COMBINED_WITH_TSPACE\n UNITY_EXTRACT_FOG_FROM_TSPACE(IN);\n #elif defined FOG_COMBINED_WITH_WORLD_POS\n UNITY_EXTRACT_FOG_FROM_WORLD_POS(IN);\n #else\n UNITY_EXTRACT_FOG(IN);\n #endif\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n\n Surface l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n \n ChainSurfaceFunction(l, d);\n\n UnityMetaInput metaIN;\n UNITY_INITIALIZE_OUTPUT(UnityMetaInput, metaIN);\n metaIN.Albedo = l.Albedo;\n metaIN.Emission = l.Emission;\n \n #if _USESPECULAR\n metaIN.SpecularColor = l.Specular;\n #endif\n\n #ifdef EDITOR_VISUALIZATION\n metaIN.VizUV = IN.vizUV;\n metaIN.LightCoord = IN.lightCoord;\n #endif\n return UnityMetaFragment(metaIN);\n }\n ENDCG\n\n }\n\n \n\n\n\n }\n \n \n \n}\n"},{"srpTarget":1,"UnityVersionMin":20194,"UnityVersionMax":20201,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2021.3.20f1\n// Render Pipeline: URP2019\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Diffuse_Normal_Metallic_Compositer\"\n{\n Properties\n {\n \n\n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n _HalfLambertStrength (\"Lambert(0), HalfLambert(1)\", Range(0,4)) = 1\n // _EmissiveModulation (\"Emissive Level\", Range(0,2)) = 1\n\n [Enum(Off,0,Front,1,Back,2)]_CullMode(\"Culling Mode\", Float) = 2\n [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode(\"Double sided normal mode\", Float) = 1\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_BaseMap(\"BaseMap\", 2D) = \"white\" {}\n [Message(A _BumpMap is encoded as follows R Normal_X G Normal_Y B Metallic_Level A Smoothness_Level)] \n [BetterHeader(Normal Mask)]\n [Group(Base Overlay)][NoScaleOffset]_BumpMap(\"_BumpMap\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_MetallicGlossMap(\"_MetallicGlossMap\", 2D) = \"black\" {}\n\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_BaseMap1(\"BaseMap1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_BumpMap1(\"_BumpMap1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_MetallicGlossMap1(\"_MetallicGlossMap1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_BaseMap2(\"BaseMap2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_BumpMap2(\"_BumpMap2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_MetallicGlossMap2(\"_MetallicGlossMap2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_BaseMap3(\"BaseMap3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_BumpMap3(\"_BumpMap3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_MetallicGlossMap3(\"_MetallicGlossMap3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n\n }\n SubShader\n {\n Tags { \"RenderPipeline\"=\"UniversalPipeline\" \"RenderType\" = \"Opaque\" \"Queue\" = \"Geometry\" }\n\n \n \n Pass\n {\n Name \"Universal Forward\"\n Tags \n { \n \"LightMode\" = \"UniversalForward\"\n }\n Blend One Zero, One Zero\nCull Back\nZTest LEqual\nZWrite On\n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_fog\n #pragma multi_compile_instancing\n \n // Keywords\n #pragma multi_compile _ LIGHTMAP_ON\n #pragma multi_compile _ DIRLIGHTMAP_COMBINED\n #pragma multi_compile _ _MAIN_LIGHT_SHADOWS\n #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE\n #pragma multi_compile _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS _ADDITIONAL_OFF\n #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS\n #pragma multi_compile _ _SHADOWS_SOFT\n #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE\n\n // GraphKeywords: \n\n\n #define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #define SHADER_PASS SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD\n\n #define _PASSFORWARD 1\n\n \n\n\n #define _URP 1\n#define NEED_FACING 1\n\n // this has to be here or specular color will be ignored. Not in SG code\n #if _SIMPLELIT\n #define _SPECULAR_COLOR\n #endif\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n float4 fogFactorAndVertexLight : TEXCOORD10;\n float4 shadowCoord : TEXCOORD11;\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1, v.texcoord2, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD\n OUTPUT_LIGHTMAP_UV(v.texcoord1, unity_LightmapST, o.lightmapUV);\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #ifdef _MAIN_LIGHT_SHADOWS\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #if defined(_USESPECULAR) || _SIMPLELIT\n float3 specular = l.Specular;\n float metallic = 1;\n #else \n float3 specular = 0;\n float metallic = l.Metallic;\n #endif\n\n \n InputData inputData;\n\n inputData.positionWS = IN.worldPos;\n #if _WORLDSPACENORMAL\n inputData.normalWS = l.Normal;\n #else\n inputData.normalWS = normalize(TangentToWorldSpace(d, l.Normal));\n #endif\n \n inputData.viewDirectionWS = SafeNormalize(d.worldSpaceViewDir);\n\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n inputData.shadowCoord = IN.shadowCoord;\n #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)\n inputData.shadowCoord = TransformWorldToShadowCoord(IN.worldPos);\n #else\n inputData.shadowCoord = float4(0, 0, 0, 0);\n #endif\n\n inputData.fogCoord = IN.fogFactorAndVertexLight.x;\n inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw;\n #if defined(_OVERRIDE_BAKEDGI)\n inputData.bakedGI = l.DiffuseGI;\n l.Emission += l.SpecularGI;\n #else\n inputData.bakedGI = SAMPLE_GI(IN.lightmapUV, IN.sh, inputData.normalWS);\n #endif\n\n #if !_UNLIT\n #if _SIMPLELIT\n half4 color = UniversalFragmentBlinnPhong(\n inputData,\n l.Albedo,\n float4(specular * l.Smoothness, 0),\n l.SpecularPower * 128,\n l.Emission,\n l.Alpha);\n color.a = l.Alpha;\n #elif _BAKEDLIT\n half4 color = color = UniversalFragmentBakedLit(inputData, l.Albedo, l.Alpha, normalTS);\n #else\n half4 color = UniversalFragmentPBR(\n inputData,\n l.Albedo,\n metallic,\n specular,\n l.Smoothness,\n l.Occlusion,\n l.Emission,\n l.Alpha); \n #endif\n\n #else\n half4 color = half4(l.Albedo, l.Alpha);\n #endif\n\n #if _UNLITFOG && !DISABLEFOG\n color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x);\n #endif\n\n ChainFinalColorForward(l, d, color);\n\n return color;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"ShadowCaster\"\n Tags \n { \n \"LightMode\" = \"ShadowCaster\"\n }\n \n // Render State\n Blend One Zero, One Zero\n Cull Back\n ZTest LEqual\n ZWrite On\n // ColorMask: \n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_instancing\n \n #define _NORMAL_DROPOFF_TS 1\n #define ATTRIBUTES_NEED_NORMAL\n #define ATTRIBUTES_NEED_TANGENT\n #define SHADERPASS_SHADOWCASTER\n #define _PASSSHADOW 1\n\n \n\n\n #define _URP 1\n#define NEED_FACING 1\n\n\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n float4 fogFactorAndVertexLight : TEXCOORD10;\n float4 shadowCoord : TEXCOORD11;\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1, v.texcoord2, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD\n OUTPUT_LIGHTMAP_UV(v.texcoord1, unity_LightmapST, o.lightmapUV);\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #ifdef _MAIN_LIGHT_SHADOWS\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n return 0;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"DepthOnly\"\n Tags \n { \n \"LightMode\" = \"DepthOnly\"\n }\n \n // Render State\n Blend One Zero, One Zero\n Cull Back\n ZTest LEqual\n ZWrite On\n ColorMask 0\n \n Cull [_CullMode]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #define _NORMAL_DROPOFF_TS 1\n #define ATTRIBUTES_NEED_NORMAL\n #define ATTRIBUTES_NEED_TANGENT\n #define SHADERPASS_DEPTHONLY\n\n #pragma target 3.0\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_instancing\n\n \n\n\n #define _URP 1\n#define NEED_FACING 1\n\n #define _PASSDEPTH 1\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n float4 fogFactorAndVertexLight : TEXCOORD10;\n float4 shadowCoord : TEXCOORD11;\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1, v.texcoord2, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD\n OUTPUT_LIGHTMAP_UV(v.texcoord1, unity_LightmapST, o.lightmapUV);\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #ifdef _MAIN_LIGHT_SHADOWS\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n return 0;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"Meta\"\n Tags \n { \n \"LightMode\" = \"Meta\"\n }\n\n // Render State\n Cull Off\n // ColorMask: \n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n \n #define SHADERPASS_META\n #define _PASSMETA 1\n\n\n \n\n\n #define _URP 1\n#define NEED_FACING 1\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n float4 fogFactorAndVertexLight : TEXCOORD10;\n float4 shadowCoord : TEXCOORD11;\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1, v.texcoord2, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD\n OUTPUT_LIGHTMAP_UV(v.texcoord1, unity_LightmapST, o.lightmapUV);\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #ifdef _MAIN_LIGHT_SHADOWS\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n\n Surface l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n MetaInput metaInput = (MetaInput)0;\n metaInput.Albedo = l.Albedo;\n metaInput.Emission = l.Emission;\n\n return MetaFragment(metaInput);\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n // Name: \n Tags \n { \n \"LightMode\" = \"Universal2D\"\n }\n \n // Render State\n Blend One Zero, One Zero\n Cull Back\n ZTest LEqual\n ZWrite On\n // ColorMask: \n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_instancing\n \n #define SHADERPASS_2D\n\n \n\n\n #define _URP 1\n#define NEED_FACING 1\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n \n\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n\n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n float4 fogFactorAndVertexLight : TEXCOORD10;\n float4 shadowCoord : TEXCOORD11;\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1, v.texcoord2, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD\n OUTPUT_LIGHTMAP_UV(v.texcoord1, unity_LightmapST, o.lightmapUV);\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #ifdef _MAIN_LIGHT_SHADOWS\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n\n Surface l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n \n half4 color = half4(l.Albedo, l.Alpha);\n\n return color;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n\n\n\n }\n \n \n \n}\n"},{"srpTarget":2,"UnityVersionMin":20202,"UnityVersionMax":20221,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2021.3.20f1\n// Render Pipeline: HDRP2020\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Diffuse_Normal_Metallic_Compositer\"\n{\n Properties\n {\n \n\n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n _HalfLambertStrength (\"Lambert(0), HalfLambert(1)\", Range(0,4)) = 1\n // _EmissiveModulation (\"Emissive Level\", Range(0,2)) = 1\n\n [Enum(Off,0,Front,1,Back,2)]_CullMode(\"Culling Mode\", Float) = 2\n [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode(\"Double sided normal mode\", Float) = 1\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_BaseMap(\"BaseMap\", 2D) = \"white\" {}\n [Message(A _BumpMap is encoded as follows R Normal_X G Normal_Y B Metallic_Level A Smoothness_Level)] \n [BetterHeader(Normal Mask)]\n [Group(Base Overlay)][NoScaleOffset]_BumpMap(\"_BumpMap\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_MetallicGlossMap(\"_MetallicGlossMap\", 2D) = \"black\" {}\n\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_BaseMap1(\"BaseMap1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_BumpMap1(\"_BumpMap1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_MetallicGlossMap1(\"_MetallicGlossMap1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_BaseMap2(\"BaseMap2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_BumpMap2(\"_BumpMap2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_MetallicGlossMap2(\"_MetallicGlossMap2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_BaseMap3(\"BaseMap3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_BumpMap3(\"_BumpMap3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_MetallicGlossMap3(\"_MetallicGlossMap3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n\n\n [HideInInspector]_RenderQueueType(\"Float\", Float) = 1\n [HideInInspector][ToggleUI]_AddPrecomputedVelocity(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_DepthOffsetEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentWritingMotionVec(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaCutoffEnable(\"Boolean\", Float) = 0\n [HideInInspector]_TransparentSortPriority(\"_TransparentSortPriority\", Float) = 0\n [HideInInspector][ToggleUI]_UseShadowThreshold(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentDepthPrepassEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentDepthPostpassEnable(\"Boolean\", Float) = 0\n [HideInInspector]_SurfaceType(\"Float\", Float) = 0\n [HideInInspector]_BlendMode(\"Float\", Float) = 0\n [HideInInspector]_SrcBlend(\"Float\", Float) = 1\n [HideInInspector]_DstBlend(\"Float\", Float) = 0\n [HideInInspector]_AlphaSrcBlend(\"Float\", Float) = 1\n [HideInInspector]_AlphaDstBlend(\"Float\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaToMask(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaToMaskInspectorValue(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_ZWrite(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_TransparentZWrite(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_EnableFogOnTransparent(\"Boolean\", Float) = 1\n [HideInInspector]_ZTestDepthEqualForOpaque(\"Float\", Int) = 4\n [HideInInspector][Enum(UnityEngine.Rendering.CompareFunction)]_ZTestTransparent(\"Float\", Float) = 4\n [HideInInspector][ToggleUI]_TransparentBackfaceEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_RequireSplitLighting(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_ReceivesSSR(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_ReceivesSSRTransparent(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_EnableBlendModePreserveSpecularLighting(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_SupportDecals(\"Boolean\", Float) = 1\n [HideInInspector]_StencilRef(\"Float\", Int) = 0\n [HideInInspector]_StencilWriteMask(\"Float\", Int) = 6\n [HideInInspector]_StencilRefDepth(\"Float\", Int) = 8\n [HideInInspector]_StencilWriteMaskDepth(\"Float\", Int) = 8\n [HideInInspector]_StencilRefMV(\"Float\", Int) = 40\n [HideInInspector]_StencilWriteMaskMV(\"Float\", Int) = 40\n [HideInInspector]_StencilRefDistortionVec(\"Float\", Int) = 4\n [HideInInspector]_StencilWriteMaskDistortionVec(\"Float\", Int) = 4\n [HideInInspector]_StencilWriteMaskGBuffer(\"Float\", Int) = 14\n [HideInInspector]_StencilRefGBuffer(\"Float\", Int) = 10\n [HideInInspector]_ZTestGBuffer(\"Float\", Int) = 4\n [HideInInspector][ToggleUI]_RayTracing(\"Boolean\", Float) = 0\n [HideInInspector][Enum(None, 0, Box, 1, Sphere, 2, Thin, 3)]_RefractionModel(\"Float\", Float) = 0\n [HideInInspector][NoScaleOffset]unity_Lightmaps(\"unity_Lightmaps\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_LightmapsInd(\"unity_LightmapsInd\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_ShadowMasks(\"unity_ShadowMasks\", 2DArray) = \"\" {}\n }\n SubShader\n {\n Tags { \"RenderPipeline\" = \"HDRenderPipeline\" \"RenderType\" = \"HDLitShader\" \"Queue\" = \"Geometry+225\" }\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"Forward\"\n Tags { \"LightMode\" = \"Forward\" }\n\n \n \n Stencil\n {\n WriteMask [_StencilWriteMask]\n Ref [_StencilRef]\n CompFront Always\n PassFront Replace\n CompBack Always\n PassBack Replace\n }\n \n ColorMask [_ColorMaskTransparentVel] 1\n\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n #pragma multi_compile _ DEBUG_DISPLAY\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n #pragma multi_compile _ LIGHTMAP_ON\n #pragma multi_compile _ DIRLIGHTMAP_COMBINED\n #pragma multi_compile _ DYNAMICLIGHTMAP_ON\n #pragma multi_compile _ SHADOWS_SHADOWMASK\n #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT\n #pragma multi_compile SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH\n #pragma multi_compile SCREEN_SPACE_SHADOWS_OFF SCREEN_SPACE_SHADOWS_ON\n #pragma multi_compile USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_FORWARD\n #define SUPPORT_BLENDMODE_PRESERVE_SPECULAR_LIGHTING\n #define HAS_LIGHTLOOP\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define _PASSFORWARD 1\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n #define VT_BUFFER_TARGET SV_Target1\n #define EXTRA_BUFFER_TARGET SV_Target2\n #else\n #define EXTRA_BUFFER_TARGET SV_Target1\n #endif\n\n\n\n\n void Frag(VertexToPixel v2p,\n #ifdef OUTPUT_SPLIT_LIGHTING\n out float4 outColor : SV_Target0, // outSpecularLighting\n #ifdef UNITY_VIRTUAL_TEXTURING\n out float4 outVTFeedback : VT_BUFFER_TARGET,\n #endif\n out float4 outDiffuseLighting : EXTRA_BUFFER_TARGET,\n OUTPUT_SSSBUFFER(outSSSBuffer)\n #else\n out float4 outColor : SV_Target0\n #ifdef UNITY_VIRTUAL_TEXTURING\n ,out float4 outVTFeedback : VT_BUFFER_TARGET\n #endif\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n , out float4 outMotionVec : EXTRA_BUFFER_TARGET\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif // OUTPUT_SPLIT_LIGHTING\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n // Init outMotionVector here to solve compiler warning (potentially unitialized variable)\n // It is init to the value of forceNoMotion (with 2.0)\n outMotionVec = float4(2.0, 0.0, 0.0, 0.0);\n #endif\n\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2p);\n FragInputs input = BuildFragInputs(v2p);\n\n // We need to readapt the SS position as our screen space positions are for a low res buffer, but we try to access a full res buffer.\n input.positionSS.xy = _OffScreenRendering > 0 ? (input.positionSS.xy * _OffScreenDownsampleFactor) : input.positionSS.xy;\n\n uint2 tileIndex = uint2(input.positionSS.xy) / GetTileSize();\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, tileIndex);\n\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2p, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n \n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n\n PreLightData preLightData = GetPreLightData(V, posInput, bsdfData);\n\n outColor = float4(0.0, 0.0, 0.0, 0.0);\n\n // We need to skip lighting when doing debug pass because the debug pass is done before lighting so some buffers may not be properly initialized potentially causing crashes on PS4.\n\n #ifdef DEBUG_DISPLAY\n // Init in debug display mode to quiet warning\n #ifdef OUTPUT_SPLIT_LIGHTING\n outDiffuseLighting = 0;\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #endif\n\n \n\n // Same code in ShaderPassForwardUnlit.shader\n // Reminder: _DebugViewMaterialArray[i]\n // i==0 -> the size used in the buffer\n // i>0 -> the index used (0 value means nothing)\n // The index stored in this buffer could either be\n // - a gBufferIndex (always stored in _DebugViewMaterialArray[1] as only one supported)\n // - a property index which is different for each kind of material even if reflecting the same thing (see MaterialSharedProperty)\n bool viewMaterial = false;\n int bufferSize = _DebugViewMaterialArray[0].x;\n if (bufferSize != 0)\n {\n bool needLinearToSRGB = false;\n float3 result = float3(1.0, 0.0, 1.0);\n\n // Loop through the whole buffer\n // Works because GetSurfaceDataDebug will do nothing if the index is not a known one\n for (int index = 1; index <= bufferSize; index++)\n {\n int indexMaterialProperty = _DebugViewMaterialArray[index].x;\n\n // skip if not really in use\n if (indexMaterialProperty != 0)\n {\n viewMaterial = true;\n\n GetPropertiesDataDebug(indexMaterialProperty, result, needLinearToSRGB);\n GetVaryingsDataDebug(indexMaterialProperty, input, result, needLinearToSRGB);\n GetBuiltinDataDebug(indexMaterialProperty, builtinData, posInput, result, needLinearToSRGB);\n GetSurfaceDataDebug(indexMaterialProperty, surfaceData, result, needLinearToSRGB);\n GetBSDFDataDebug(indexMaterialProperty, bsdfData, result, needLinearToSRGB);\n }\n }\n\n // TEMP!\n // For now, the final blit in the backbuffer performs an sRGB write\n // So in the meantime we apply the inverse transform to linear data to compensate.\n if (!needLinearToSRGB)\n result = SRGBToLinear(max(0, result));\n\n outColor = float4(result, 1.0);\n }\n\n if (!viewMaterial)\n {\n if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_DIFFUSE_COLOR || _DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_SPECULAR_COLOR)\n {\n float3 result = float3(0.0, 0.0, 0.0);\n\n GetPBRValidatorDebug(surfaceData, result);\n\n outColor = float4(result, 1.0f);\n }\n else if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_TRANSPARENCY_OVERDRAW)\n {\n float4 result = _DebugTransparencyOverdrawWeight * float4(TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_A);\n outColor = result;\n }\n else\n #endif\n {\n #ifdef _SURFACE_TYPE_TRANSPARENT\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_TRANSPARENT;\n #else\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_OPAQUE;\n #endif\n\n LightLoopOutput lightLoopOutput;\n LightLoop(V, posInput, preLightData, bsdfData, builtinData, featureFlags, lightLoopOutput);\n\n float3 diffuseLighting = lightLoopOutput.diffuseLighting;\n float3 specularLighting = lightLoopOutput.specularLighting;\n\n diffuseLighting *= GetCurrentExposureMultiplier();\n specularLighting *= GetCurrentExposureMultiplier();\n\n #ifdef OUTPUT_SPLIT_LIGHTING\n if (_EnableSubsurfaceScattering != 0 && ShouldOutputSplitLighting(bsdfData))\n {\n outColor = float4(specularLighting, 1.0);\n outDiffuseLighting = float4(TagLightingForSSS(diffuseLighting), 1.0);\n }\n else\n {\n outColor = float4(diffuseLighting + specularLighting, 1.0);\n outDiffuseLighting = 0;\n }\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #else\n outColor = ApplyBlendMode(diffuseLighting, specularLighting, builtinData.opacity);\n outColor = EvaluateAtmosphericScattering(posInput, V, outColor);\n #endif\n\n ChainFinalColorForward(l, d, outColor);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n bool forceNoMotion = any(unity_MotionVectorsParams.yw == 0.0);\n // outMotionVec is already initialize at the value of forceNoMotion (see above)\n if (!forceNoMotion)\n {\n float2 motionVec = CalculateMotionVector(v2p.motionVectorCS, v2p.previousPositionCS);\n EncodeMotionVector(motionVec * 0.5, outMotionVec);\n outMotionVec.zw = 1.0;\n }\n #endif\n }\n\n #ifdef DEBUG_DISPLAY\n }\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n outVTFeedback = builtinData.vtPackedFeedback;\n #endif\n }\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"ShadowCaster\"\n Tags { \"LightMode\" = \"ShadowCaster\" }\n\n \n\n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n ZWrite On\n ColorMask 0\n ZClip [_ZClip]\n \n\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_SHADOWS\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSSHADOW 1\n\n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n //-------------------------------------------------------------------------------------\n // Defines\n //-------------------------------------------------------------------------------------\n \n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n \n\n #if defined(WRITE_NORMAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target2\n #elif defined(WRITE_NORMAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target1\n #else\n #define SV_TARGET_DECAL SV_Target0\n #endif\n\n\n void Frag( VertexToPixel v2f\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n\n #if defined(_DEPTHOFFSET_ON) && !defined(SCENEPICKINGPASS)\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n \n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n #endif\n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n\n\n }\n\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"DepthOnly\"\n Tags { \"LightMode\" = \"DepthOnly\" }\n \n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n \n \n ZWrite On\n \n \n // Stencil setup\n Stencil\n {\n WriteMask [_StencilWriteMaskDepth]\n Ref [_StencilRefDepth]\n Comp Always\n Pass Replace\n }\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n \n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #pragma multi_compile _ WRITE_NORMAL_BUFFER\n #pragma multi_compile _ WRITE_MSAA_DEPTH\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSDEPTH 1\n\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n #if defined(WRITE_NORMAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target2\n #elif defined(WRITE_NORMAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target1\n #else\n #define SV_TARGET_DECAL SV_Target0\n #endif\n\n\n void Frag( VertexToPixel v2p\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n\n #if defined(_DEPTHOFFSET_ON) && !defined(SCENEPICKINGPASS)\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2p);\n FragInputs input = BuildFragInputs(v2p);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n \n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2p, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n // to prevent stripping\n surfaceData.normalWS *= saturate(l.Albedo.r + 9999);\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2p.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n \n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n #endif\n\n }\n\n\n\n ENDHLSL\n }\n\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"META\"\n Tags { \"LightMode\" = \"META\" }\n \n Cull Off\n \n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 ps4 xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_LIGHT_TRANSPORT\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define REQUIRE_DEPTH_TEXTURE\n #define _PASSMETA 1\n\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n\n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n float4 Frag(VertexToPixel v2f\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n // no debug apply during light transport pass\n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n LightTransportData lightTransportData = GetLightTransportData(surfaceData, builtinData, bsdfData);\n\n // This shader is call two times. Once for getting emissiveColor, the other time to get diffuseColor\n // We use unity_MetaFragmentControl to make the distinction.\n float4 res = float4(0.0, 0.0, 0.0, 1.0);\n\n if (unity_MetaFragmentControl.x)\n {\n // Apply diffuseColor Boost from LightmapSettings.\n // put abs here to silent a warning, no cost, no impact as color is assume to be positive.\n res.rgb = clamp(pow(abs(lightTransportData.diffuseColor), saturate(unity_OneOverOutputBoost)), 0, unity_MaxOutputValue);\n }\n\n if (unity_MetaFragmentControl.y)\n {\n // emissive use HDR format\n res.rgb = lightTransportData.emissiveColor;\n }\n\n return res;\n }\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"SceneSelectionPass\"\n Tags { \"LightMode\" = \"SceneSelectionPass\" }\n \n Cull Off\n ColorMask 0\n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n #pragma multi_compile_instancing\n #pragma editor_sync_compilation\n #pragma instancing_options renderinglayer\n \n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define SCENESELECTIONPASS\n #define _PASSSCENESELECT 1\n\n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n\n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n \n\n \n void Frag( VertexToPixel IN\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #ifdef WRITE_MSAA_DEPTH\n , out float1 depthColor : SV_Target1\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When only WRITE_MSAA_DEPTH is define and not WRITE_NORMAL_BUFFER it mean we are Unlit and only need depth, but we still have normal buffer binded\n , out float4 outNormalBuffer : SV_Target0\n , out float1 depthColor : SV_Target1\n #elif defined(SCENESELECTIONPASS)\n , out float4 outColor : SV_Target0\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n FragInputs input = BuildFragInputs(IN);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(IN, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), posInput.positionSS, outNormalBuffer);\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When we are MSAA depth only without normal buffer\n // Due to the binding order of these two render targets, we need to have them both declared\n outNormalBuffer = float4(0.0, 0.0, 0.0, 1.0);\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n #elif defined(SCENESELECTIONPASS)\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n Name \"ScenePickingPass\"\n Tags\n {\n \"LightMode\" = \"Picking\"\n }\n \n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n #pragma multi_compile_instancing\n #pragma editor_sync_compilation\n #pragma instancing_options renderinglayer\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n \n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #define SCENEPICKINGPASS\n\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/PickingSpaceTransforms.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n void Frag( VertexToPixel v2f\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n \n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2p.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n \n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n #endif\n\n\n }\n\n ENDHLSL\n }\n\n Pass\n {\n Name \"MotionVectors\"\n Tags\n {\n \"LightMode\" = \"MotionVectors\"\n }\n \n // Render State\n Cull Back\n ZWrite On\n Stencil\n {\n WriteMask [_StencilWriteMaskMV]\n Ref [_StencilRefMV]\n CompFront Always\n PassFront Replace\n CompBack Always\n PassBack Replace\n }\n\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n\n #pragma multi_compile _ WRITE_MSAA_DEPTH\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n #pragma multi_compile _ WRITE_NORMAL_BUFFER\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n\n #define SHADERPASS SHADERPASS_MOTION_VECTORS\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define VARYINGS_NEED_PASS\n #define _PASSMOTIONVECTOR 1\n\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n#if defined(WRITE_DECAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n#define SV_TARGET_NORMAL SV_Target3\n#elif defined(WRITE_DECAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n#define SV_TARGET_NORMAL SV_Target2\n#else\n#define SV_TARGET_NORMAL SV_Target1\n#endif\n\n// Caution: Motion vector pass is different from Depth prepass, it render normal buffer last instead of decal buffer last\n// and thus, we force a write of 0 if _DISABLE_DECALS so we always write in the decal buffer.\n// This is required as we can't make distinction between deferred (write normal buffer) and forward (write normal buffer)\n// in the context of the motion vector pass. The cost is acceptable as it is only do object with motion vector (usualy skin object)\n// that most of the time use Forward Material (so are already writing motion vector data).\n// So note that here unlike for depth prepass we don't check && !defined(_DISABLE_DECALS)\nvoid Frag( VertexToPixel v2f\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n , out float4 outMotionVector : SV_Target1\n #ifdef WRITE_DECAL_BUFFER\n , out float4 outDecalBuffer : SV_Target2\n #endif\n #else\n // When no MSAA, the motion vector is always the first buffer\n , out float4 outMotionVector : SV_Target0\n #ifdef WRITE_DECAL_BUFFER\n , out float4 outDecalBuffer : SV_Target1\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_TARGET_NORMAL\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n\n FragInputs input = BuildFragInputs(v2f);\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n #ifdef _DEPTHOFFSET_ON\n v2f.motionVectorCS.w += builtinData.depthOffset;\n v2f.previousPositionCS.w += builtinData.depthOffset;\n #endif\n\n // TODO: How to allow overriden motion vector from GetSurfaceAndBuiltinData ?\n float2 motionVector = CalculateMotionVector(v2f.motionVectorCS, v2f.previousPositionCS);\n\n // Convert from Clip space (-1..1) to NDC 0..1 space.\n // Note it doesn't mean we don't have negative value, we store negative or positive offset in NDC space.\n // Note: ((positionCS * 0.5 + 0.5) - (v2f.previousPositionCS * 0.5 + 0.5)) = (motionVector * 0.5)\n EncodeMotionVector(motionVector * 0.5, outMotionVector);\n\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n\n // Setting the motionVector to a value more than 2 set as a flag for \"force no motion\". This is valid because, given that the velocities are in NDC,\n // a value of >1 can never happen naturally, unless explicitely set. \n if (forceNoMotion)\n outMotionVector = float4(2.0, 0.0, 0.0, 0.0);\n\n // Depth and Alpha to coverage\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif\n #endif\n\n // Normal Buffer Processing\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER)\n DecalPrepassData decalPrepassData;\n // Force a write in decal buffer even if decal is disab. This is a neutral value which have no impact for later pass\n #ifdef _DISABLE_DECALS\n ZERO_INITIALIZE(DecalPrepassData, decalPrepassData);\n #else\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n #endif\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n Name \"FullScreenDebug\"\n Tags\n {\n \"LightMode\" = \"FullScreenDebug\"\n }\n \n // Render State\n Cull Back\n ZTest LEqual\n ZWrite Off\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n\n #define SHADERPASS SHADERPASS_FULL_SCREEN_DEBUG\n #define _PASSFULLSCREENDEBUG 1\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n \n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex);\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // copy before user modification, since we'll apply that to the copy later\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n\n \n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || (_PASSFORWARD && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n #if defined(_ENABLE_SHADOW_MATTE) && SHADERPASS == SHADERPASS_FORWARD_UNLIT\n HDShadowContext shadowContext = InitShadowContext();\n float shadow;\n float3 shadow3;\n // We need to recompute some coordinate not computed by default for shadow matte\n posInput = GetPositionInput(fragInputs.positionSS.xy, _ScreenSize.zw, fragInputs.positionSS.z, UNITY_MATRIX_I_VP, GetWorldToViewMatrix());\n float3 upWS = normalize(fragInputs.tangentToWorld[1]);\n uint renderingLayers = GetMeshRenderingLightLayer();\n ShadowLoopMin(shadowContext, posInput, upWS, asuint(_ShadowMatteFilter), renderingLayers, shadow3);\n shadow = dot(shadow3, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0));\n \n float4 shadowColor = (1.0 - shadow) * surfaceDescription.ShadowTint.rgba;\n float localAlpha = saturate(shadowColor.a + surfaceDescription.Alpha);\n \n // Keep the nested lerp\n // With no Color (bsdfData.color.rgb, bsdfData.color.a == 0.0f), just use ShadowColor*Color to avoid a ring of \"white\" around the shadow\n // And mix color to consider the Color & ShadowColor alpha (from texture or/and color picker)\n #ifdef _SURFACE_TYPE_TRANSPARENT\n surfaceData.baseColor = lerp(shadowColor.rgb * surfaceData.baseColor, lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow), surfaceDescription.Alpha);\n #else\n surfaceData.baseColor = lerp(lerp(shadowColor.rgb, surfaceData.baseColor, 1.0 - surfaceDescription.ShadowTint.a), surfaceData.baseColor, shadow);\n #endif\n localAlpha = ApplyBlendMode(surfaceData.baseColor, localAlpha).a;\n \n surfaceDescription.Alpha = localAlpha;\n #endif\n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n //builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n \n #if (SHADERPASS == SHADERPASS_DISTORTION)\n //builtinData.distortion = surfaceData.Distortion;\n //builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n#define DEBUG_DISPLAY\n#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/FullScreenDebug.hlsl\"\n\n #if !defined(_DEPTHOFFSET_ON)\n [earlydepthstencil] // quad overshading debug mode writes to UAV\n #endif\n void Frag(VertexToPixel v2f\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz);\n\n #ifdef PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER\n if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_QUAD_OVERDRAW)\n {\n IncrementQuadOverdrawCounter(posInput.positionSS.xy, input.primitiveID);\n }\n #endif\n }\n\n ENDHLSL\n }\n\n \n\n\n \n }\n\n \n \n \n}\n"},{"srpTarget":2,"UnityVersionMin":20212,"UnityVersionMax":30000,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2021.3.20f1\n// Render Pipeline: HDRP2021\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Diffuse_Normal_Metallic_Compositer\"\n{\n Properties\n {\n \n\n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n _HalfLambertStrength (\"Lambert(0), HalfLambert(1)\", Range(0,4)) = 1\n // _EmissiveModulation (\"Emissive Level\", Range(0,2)) = 1\n\n [Enum(Off,0,Front,1,Back,2)]_CullMode(\"Culling Mode\", Float) = 2\n [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode(\"Double sided normal mode\", Float) = 1\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_BaseMap(\"BaseMap\", 2D) = \"white\" {}\n [Message(A _BumpMap is encoded as follows R Normal_X G Normal_Y B Metallic_Level A Smoothness_Level)] \n [BetterHeader(Normal Mask)]\n [Group(Base Overlay)][NoScaleOffset]_BumpMap(\"_BumpMap\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_MetallicGlossMap(\"_MetallicGlossMap\", 2D) = \"black\" {}\n\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_BaseMap1(\"BaseMap1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_BumpMap1(\"_BumpMap1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_MetallicGlossMap1(\"_MetallicGlossMap1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_BaseMap2(\"BaseMap2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_BumpMap2(\"_BumpMap2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_MetallicGlossMap2(\"_MetallicGlossMap2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_BaseMap3(\"BaseMap3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_BumpMap3(\"_BumpMap3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_MetallicGlossMap3(\"_MetallicGlossMap3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n\n\n [HideInInspector]_RenderQueueType(\"Float\", Float) = 1\n [HideInInspector][ToggleUI]_AddPrecomputedVelocity(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_DepthOffsetEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentWritingMotionVec(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaCutoffEnable(\"Boolean\", Float) = 0\n [HideInInspector]_TransparentSortPriority(\"_TransparentSortPriority\", Float) = 0\n [HideInInspector][ToggleUI]_UseShadowThreshold(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentDepthPrepassEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_TransparentDepthPostpassEnable(\"Boolean\", Float) = 0\n [HideInInspector]_SurfaceType(\"Float\", Float) = 0\n [HideInInspector]_BlendMode(\"Float\", Float) = 0\n [HideInInspector]_SrcBlend(\"Float\", Float) = 1\n [HideInInspector]_DstBlend(\"Float\", Float) = 0\n [HideInInspector]_AlphaSrcBlend(\"Float\", Float) = 1\n [HideInInspector]_AlphaDstBlend(\"Float\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaToMask(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_AlphaToMaskInspectorValue(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_ZWrite(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_TransparentZWrite(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_EnableFogOnTransparent(\"Boolean\", Float) = 1\n [HideInInspector]_ZTestDepthEqualForOpaque(\"Float\", Int) = 4\n [HideInInspector][Enum(UnityEngine.Rendering.CompareFunction)]_ZTestTransparent(\"Float\", Float) = 4\n [HideInInspector][ToggleUI]_TransparentBackfaceEnable(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_RequireSplitLighting(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_ReceivesSSR(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_ReceivesSSRTransparent(\"Boolean\", Float) = 0\n [HideInInspector][ToggleUI]_EnableBlendModePreserveSpecularLighting(\"Boolean\", Float) = 1\n [HideInInspector][ToggleUI]_SupportDecals(\"Boolean\", Float) = 1\n [HideInInspector]_StencilRef(\"Float\", Int) = 0\n [HideInInspector]_StencilWriteMask(\"Float\", Int) = 6\n [HideInInspector]_StencilRefDepth(\"Float\", Int) = 8\n [HideInInspector]_StencilWriteMaskDepth(\"Float\", Int) = 8\n [HideInInspector]_StencilRefMV(\"Float\", Int) = 40\n [HideInInspector]_StencilWriteMaskMV(\"Float\", Int) = 40\n [HideInInspector]_StencilRefDistortionVec(\"Float\", Int) = 4\n [HideInInspector]_StencilWriteMaskDistortionVec(\"Float\", Int) = 4\n [HideInInspector]_StencilWriteMaskGBuffer(\"Float\", Int) = 14\n [HideInInspector]_StencilRefGBuffer(\"Float\", Int) = 10\n [HideInInspector]_ZTestGBuffer(\"Float\", Int) = 4\n [HideInInspector][ToggleUI]_RayTracing(\"Boolean\", Float) = 0\n [HideInInspector][Enum(None, 0, Box, 1, Sphere, 2, Thin, 3)]_RefractionModel(\"Float\", Float) = 0\n [HideInInspector][NoScaleOffset]unity_Lightmaps(\"unity_Lightmaps\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_LightmapsInd(\"unity_LightmapsInd\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_ShadowMasks(\"unity_ShadowMasks\", 2DArray) = \"\" {}\n }\n SubShader\n {\n Tags { \"RenderPipeline\" = \"HDRenderPipeline\" \"RenderType\" = \"HDLitShader\" \"Queue\" = \"Geometry+225\" }\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"Forward\"\n Tags { \"LightMode\" = \"Forward\" }\n\n \n \n Stencil\n {\n WriteMask [_StencilWriteMask]\n Ref [_StencilRef]\n CompFront Always\n PassFront Replace\n CompBack Always\n PassBack Replace\n }\n \n ColorMask [_ColorMaskTransparentVel] 1\n\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n #pragma multi_compile _ DEBUG_DISPLAY\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n #pragma multi_compile _ LIGHTMAP_ON\n #pragma multi_compile _ DIRLIGHTMAP_COMBINED\n #pragma multi_compile_fragment PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2\n #pragma multi_compile_raytracing PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2\n #pragma multi_compile _ DYNAMICLIGHTMAP_ON\n #pragma multi_compile_fragment _ SHADOWS_SHADOWMASK\n #pragma multi_compile_raytracing _ SHADOWS_SHADOWMASK\n #pragma multi_compile_fragment DECALS_OFF DECALS_3RT DECALS_4RT\n #pragma multi_compile_fragment _ DECAL_SURFACE_GRADIENT\n #pragma multi_compile_fragment SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH SHADOW_VERY_HIGH\n #pragma multi_compile_fragment SCREEN_SPACE_SHADOWS_OFF SCREEN_SPACE_SHADOWS_ON\n #pragma multi_compile_fragment USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST\n \n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_FORWARD\n #define SUPPORT_BLENDMODE_PRESERVE_SPECULAR_LIGHTING\n #define HAS_LIGHTLOOP\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define _PASSFORWARD 1\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n #define VT_BUFFER_TARGET SV_Target1\n #define EXTRA_BUFFER_TARGET SV_Target2\n #else\n #define EXTRA_BUFFER_TARGET SV_Target1\n #endif\n\n\n\n\n void Frag(VertexToPixel v2p,\n #ifdef OUTPUT_SPLIT_LIGHTING\n out float4 outColor : SV_Target0, // outSpecularLighting\n #ifdef UNITY_VIRTUAL_TEXTURING\n out float4 outVTFeedback : VT_BUFFER_TARGET,\n #endif\n out float4 outDiffuseLighting : EXTRA_BUFFER_TARGET,\n OUTPUT_SSSBUFFER(outSSSBuffer)\n #else\n out float4 outColor : SV_Target0\n #ifdef UNITY_VIRTUAL_TEXTURING\n ,out float4 outVTFeedback : VT_BUFFER_TARGET\n #endif\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n , out float4 outMotionVec : EXTRA_BUFFER_TARGET\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif // OUTPUT_SPLIT_LIGHTING\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n // Init outMotionVector here to solve compiler warning (potentially unitialized variable)\n // It is init to the value of forceNoMotion (with 2.0)\n outMotionVec = float4(2.0, 0.0, 0.0, 0.0);\n #endif\n\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2p);\n FragInputs input = BuildFragInputs(v2p);\n\n // We need to readapt the SS position as our screen space positions are for a low res buffer, but we try to access a full res buffer.\n input.positionSS.xy = _OffScreenRendering > 0 ? (input.positionSS.xy * _OffScreenDownsampleFactor) : input.positionSS.xy;\n\n uint2 tileIndex = uint2(input.positionSS.xy) / GetTileSize();\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, tileIndex);\n\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2p, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n \n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n\n PreLightData preLightData = GetPreLightData(V, posInput, bsdfData);\n\n outColor = float4(0.0, 0.0, 0.0, 0.0);\n\n // We need to skip lighting when doing debug pass because the debug pass is done before lighting so some buffers may not be properly initialized potentially causing crashes on PS4.\n\n #ifdef DEBUG_DISPLAY\n // Init in debug display mode to quiet warning\n #ifdef OUTPUT_SPLIT_LIGHTING\n outDiffuseLighting = 0;\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #endif\n\n \n\n // Same code in ShaderPassForwardUnlit.shader\n // Reminder: _DebugViewMaterialArray[i]\n // i==0 -> the size used in the buffer\n // i>0 -> the index used (0 value means nothing)\n // The index stored in this buffer could either be\n // - a gBufferIndex (always stored in _DebugViewMaterialArray[1] as only one supported)\n // - a property index which is different for each kind of material even if reflecting the same thing (see MaterialSharedProperty)\n bool viewMaterial = false;\n int bufferSize = _DebugViewMaterialArray[0].x;\n if (bufferSize != 0)\n {\n bool needLinearToSRGB = false;\n float3 result = float3(1.0, 0.0, 1.0);\n\n // Loop through the whole buffer\n // Works because GetSurfaceDataDebug will do nothing if the index is not a known one\n for (int index = 1; index <= bufferSize; index++)\n {\n int indexMaterialProperty = _DebugViewMaterialArray[index].x;\n\n // skip if not really in use\n if (indexMaterialProperty != 0)\n {\n viewMaterial = true;\n\n GetPropertiesDataDebug(indexMaterialProperty, result, needLinearToSRGB);\n GetVaryingsDataDebug(indexMaterialProperty, input, result, needLinearToSRGB);\n GetBuiltinDataDebug(indexMaterialProperty, builtinData, posInput, result, needLinearToSRGB);\n GetSurfaceDataDebug(indexMaterialProperty, surfaceData, result, needLinearToSRGB);\n GetBSDFDataDebug(indexMaterialProperty, bsdfData, result, needLinearToSRGB);\n }\n }\n\n // TEMP!\n // For now, the final blit in the backbuffer performs an sRGB write\n // So in the meantime we apply the inverse transform to linear data to compensate.\n if (!needLinearToSRGB)\n result = SRGBToLinear(max(0, result));\n\n outColor = float4(result, 1.0);\n }\n\n if (!viewMaterial)\n {\n if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_DIFFUSE_COLOR || _DebugFullScreenMode == FULLSCREENDEBUGMODE_VALIDATE_SPECULAR_COLOR)\n {\n float3 result = float3(0.0, 0.0, 0.0);\n\n GetPBRValidatorDebug(surfaceData, result);\n\n outColor = float4(result, 1.0f);\n }\n else if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_TRANSPARENCY_OVERDRAW)\n {\n float4 result = _DebugTransparencyOverdrawWeight * float4(TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_A);\n outColor = result;\n }\n else\n #endif\n {\n #ifdef _SURFACE_TYPE_TRANSPARENT\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_TRANSPARENT;\n #else\n uint featureFlags = LIGHT_FEATURE_MASK_FLAGS_OPAQUE;\n #endif\n\n LightLoopOutput lightLoopOutput;\n LightLoop(V, posInput, preLightData, bsdfData, builtinData, featureFlags, lightLoopOutput);\n\n float3 diffuseLighting = lightLoopOutput.diffuseLighting;\n float3 specularLighting = lightLoopOutput.specularLighting;\n\n diffuseLighting *= GetCurrentExposureMultiplier();\n specularLighting *= GetCurrentExposureMultiplier();\n\n #ifdef OUTPUT_SPLIT_LIGHTING\n if (_EnableSubsurfaceScattering != 0 && ShouldOutputSplitLighting(bsdfData))\n {\n outColor = float4(specularLighting, 1.0);\n outDiffuseLighting = float4(TagLightingForSSS(diffuseLighting), 1.0);\n }\n else\n {\n outColor = float4(diffuseLighting + specularLighting, 1.0);\n outDiffuseLighting = 0;\n }\n ENCODE_INTO_SSSBUFFER(surfaceData, posInput.positionSS, outSSSBuffer);\n #else\n outColor = ApplyBlendMode(diffuseLighting, specularLighting, builtinData.opacity);\n outColor = EvaluateAtmosphericScattering(posInput, V, outColor);\n #endif\n\n ChainFinalColorForward(l, d, outColor);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n bool forceNoMotion = any(unity_MotionVectorsParams.yw == 0.0);\n // outMotionVec is already initialize at the value of forceNoMotion (see above)\n if (!forceNoMotion)\n {\n float2 motionVec = CalculateMotionVector(v2p.motionVectorCS, v2p.previousPositionCS);\n EncodeMotionVector(motionVec * 0.5, outMotionVec);\n outMotionVec.zw = 1.0;\n }\n #endif\n }\n\n #ifdef DEBUG_DISPLAY\n }\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n outVTFeedback = builtinData.vtPackedFeedback;\n #endif\n }\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"ShadowCaster\"\n Tags { \"LightMode\" = \"ShadowCaster\" }\n\n \n\n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n ZWrite On\n ColorMask 0\n ZClip [_ZClip]\n \n\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_SHADOWS\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSSHADOW 1\n\n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n //-------------------------------------------------------------------------------------\n // Defines\n //-------------------------------------------------------------------------------------\n \n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n \n\n #if defined(WRITE_NORMAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target2\n #elif defined(WRITE_NORMAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target1\n #else\n #define SV_TARGET_DECAL SV_Target0\n #endif\n\n\n void Frag( VertexToPixel v2f\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n\n #if defined(_DEPTHOFFSET_ON) && !defined(SCENEPICKINGPASS)\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n \n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n #endif\n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n\n\n }\n\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"DepthOnly\"\n Tags { \"LightMode\" = \"DepthOnly\" }\n \n //-------------------------------------------------------------------------------------\n // Render Modes (Blend, Cull, ZTest, Stencil, etc)\n //-------------------------------------------------------------------------------------\n \n Cull Back\n \n \n ZWrite On\n \n \n // Stencil setup\n Stencil\n {\n WriteMask [_StencilWriteMaskDepth]\n Ref [_StencilRefDepth]\n Comp Always\n Pass Replace\n }\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone vulkan metal switch\n //#pragma enable_d3d11_debug_symbols\n \n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n \n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #pragma multi_compile _ WRITE_NORMAL_BUFFER\n #pragma multi_compile _ WRITE_MSAA_DEPTH\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define _PASSDEPTH 1\n\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n #if defined(WRITE_NORMAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target2\n #elif defined(WRITE_NORMAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n #define SV_TARGET_DECAL SV_Target1\n #else\n #define SV_TARGET_DECAL SV_Target0\n #endif\n\n\n void Frag( VertexToPixel v2p\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n\n #if defined(_DEPTHOFFSET_ON) && !defined(SCENEPICKINGPASS)\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2p);\n FragInputs input = BuildFragInputs(v2p);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n \n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2p, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n // to prevent stripping\n surfaceData.normalWS *= saturate(l.Albedo.r + 9999);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2p.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n \n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n #endif\n\n }\n\n\n\n ENDHLSL\n }\n\n\n \n Pass\n {\n // based on HDLitPass.template\n Name \"META\"\n Tags { \"LightMode\" = \"META\" }\n \n Cull Off\n \n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n\n \n #pragma multi_compile_instancing\n\n //#pragma multi_compile_local _ _ALPHATEST_ON\n\n\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_LIGHT_TRANSPORT\n #define RAYTRACING_SHADER_GRAPH_HIGH\n #define REQUIRE_DEPTH_TEXTURE\n #define _PASSMETA 1\n\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n\n \n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n float4 Frag(VertexToPixel v2f\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n // no debug apply during light transport pass\n\n BSDFData bsdfData = ConvertSurfaceDataToBSDFData(input.positionSS.xy, surfaceData);\n LightTransportData lightTransportData = GetLightTransportData(surfaceData, builtinData, bsdfData);\n\n // This shader is call two times. Once for getting emissiveColor, the other time to get diffuseColor\n // We use unity_MetaFragmentControl to make the distinction.\n float4 res = float4(0.0, 0.0, 0.0, 1.0);\n\n if (unity_MetaFragmentControl.x)\n {\n // Apply diffuseColor Boost from LightmapSettings.\n // put abs here to silent a warning, no cost, no impact as color is assume to be positive.\n res.rgb = clamp(pow(abs(lightTransportData.diffuseColor), saturate(unity_OneOverOutputBoost)), 0, unity_MaxOutputValue);\n }\n\n if (unity_MetaFragmentControl.y)\n {\n // emissive use HDR format\n res.rgb = lightTransportData.emissiveColor;\n }\n\n return res;\n }\n\n\n\n ENDHLSL\n }\n \n Pass\n {\n // based on HDLitPass.template\n Name \"SceneSelectionPass\"\n Tags { \"LightMode\" = \"SceneSelectionPass\" }\n \n Cull Off\n ColorMask 0\n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n #pragma multi_compile_instancing\n #pragma editor_sync_compilation\n #pragma instancing_options renderinglayer\n \n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n //-------------------------------------------------------------------------------------\n // Variant Definitions (active field translations to HDRP defines)\n //-------------------------------------------------------------------------------------\n // #define _MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1\n // #define _MATERIAL_FEATURE_TRANSMISSION 1\n // #define _MATERIAL_FEATURE_ANISOTROPY 1\n // #define _MATERIAL_FEATURE_IRIDESCENCE 1\n // #define _MATERIAL_FEATURE_SPECULAR_COLOR 1\n #define _ENABLE_FOG_ON_TRANSPARENT 1\n // #define _AMBIENT_OCCLUSION 1\n // #define _SPECULAR_OCCLUSION_FROM_AO 1\n // #define _SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1\n // #define _SPECULAR_OCCLUSION_CUSTOM 1\n // #define _ENERGY_CONSERVING_SPECULAR 1\n // #define _ENABLE_GEOMETRIC_SPECULAR_AA 1\n // #define _HAS_REFRACTION 1\n // #define _REFRACTION_PLANE 1\n // #define _REFRACTION_SPHERE 1\n // #define _DISABLE_DECALS 1\n // #define _DISABLE_SSR 1\n // #define _ADD_PRECOMPUTED_VELOCITY\n // #define _WRITE_TRANSPARENT_MOTION_VECTOR 1\n // #define _DEPTHOFFSET_ON 1\n // #define _BLENDMODE_PRESERVE_SPECULAR_LIGHTING 1\n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define SCENESELECTIONPASS\n #define _PASSSCENESELECT 1\n\n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n \n \n\n \n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n \n\n \n void Frag( VertexToPixel IN\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #ifdef WRITE_MSAA_DEPTH\n , out float1 depthColor : SV_Target1\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When only WRITE_MSAA_DEPTH is define and not WRITE_NORMAL_BUFFER it mean we are Unlit and only need depth, but we still have normal buffer binded\n , out float4 outNormalBuffer : SV_Target0\n , out float1 depthColor : SV_Target1\n #elif defined(SCENESELECTIONPASS)\n , out float4 outColor : SV_Target0\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n FragInputs input = BuildFragInputs(IN);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(IN, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), posInput.positionSS, outNormalBuffer);\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n #endif\n #elif defined(WRITE_MSAA_DEPTH) // When we are MSAA depth only without normal buffer\n // Due to the binding order of these two render targets, we need to have them both declared\n outNormalBuffer = float4(0.0, 0.0, 0.0, 1.0);\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n #elif defined(SCENESELECTIONPASS)\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n Name \"ScenePickingPass\"\n Tags\n {\n \"LightMode\" = \"Picking\"\n }\n \n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n #pragma multi_compile_instancing\n #pragma editor_sync_compilation\n #pragma instancing_options renderinglayer\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n \n\n #define SHADERPASS SHADERPASS_DEPTH_ONLY\n #define SCENEPICKINGPASS\n\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/PickingSpaceTransforms.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n void Frag( VertexToPixel v2f\n #if defined(SCENESELECTIONPASS) || defined(SCENEPICKINGPASS)\n , out float4 outColor : SV_Target0\n #else\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target1\n #endif\n #else\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_Target0\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n , out float4 outDecalBuffer : SV_TARGET_DECAL\n #endif\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n // input.positionSS is SV_Position\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n\n \n #ifdef SCENESELECTIONPASS\n // We use depth prepass for scene selection in the editor, this code allow to output the outline correctly\n outColor = float4(_ObjectId, _PassValue, 1.0, 1.0);\n #elif defined(SCENEPICKINGPASS)\n outColor = _SelectionID;\n #else\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2p.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif // alphatomask\n #endif // msaa_depth\n \n\n #if defined(WRITE_NORMAL_BUFFER)\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n DecalPrepassData decalPrepassData;\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n #endif\n\n\n }\n\n ENDHLSL\n }\n\n Pass\n {\n Name \"MotionVectors\"\n Tags\n {\n \"LightMode\" = \"MotionVectors\"\n }\n \n // Render State\n Cull Back\n ZWrite On\n Stencil\n {\n WriteMask [_StencilWriteMaskMV]\n Ref [_StencilRefMV]\n CompFront Always\n PassFront Replace\n CompBack Always\n PassBack Replace\n }\n\n Cull [_CullMode]\n\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n #pragma multi_compile_instancing\n #pragma instancing_options renderinglayer\n\n\n #pragma multi_compile _ WRITE_MSAA_DEPTH\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n #pragma multi_compile _ WRITE_NORMAL_BUFFER\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n #pragma multi_compile _ WRITE_DECAL_BUFFER\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n\n #define SHADERPASS SHADERPASS_MOTION_VECTORS\n #define RAYTRACING_SHADER_GRAPH_DEFAULT\n #define VARYINGS_NEED_PASS\n #define _PASSMOTIONVECTOR 1\n\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n#if defined(WRITE_DECAL_BUFFER) && defined(WRITE_MSAA_DEPTH)\n#define SV_TARGET_NORMAL SV_Target3\n#elif defined(WRITE_DECAL_BUFFER) || defined(WRITE_MSAA_DEPTH)\n#define SV_TARGET_NORMAL SV_Target2\n#else\n#define SV_TARGET_NORMAL SV_Target1\n#endif\n\n// Caution: Motion vector pass is different from Depth prepass, it render normal buffer last instead of decal buffer last\n// and thus, we force a write of 0 if _DISABLE_DECALS so we always write in the decal buffer.\n// This is required as we can't make distinction between deferred (write normal buffer) and forward (write normal buffer)\n// in the context of the motion vector pass. The cost is acceptable as it is only do object with motion vector (usualy skin object)\n// that most of the time use Forward Material (so are already writing motion vector data).\n// So note that here unlike for depth prepass we don't check && !defined(_DISABLE_DECALS)\nvoid Frag( VertexToPixel v2f\n #ifdef WRITE_MSAA_DEPTH\n // We need the depth color as SV_Target0 for alpha to coverage\n , out float4 depthColor : SV_Target0\n , out float4 outMotionVector : SV_Target1\n #ifdef WRITE_DECAL_BUFFER\n , out float4 outDecalBuffer : SV_Target2\n #endif\n #else\n // When no MSAA, the motion vector is always the first buffer\n , out float4 outMotionVector : SV_Target0\n #ifdef WRITE_DECAL_BUFFER\n , out float4 outDecalBuffer : SV_Target1\n #endif\n #endif\n\n // Decal buffer must be last as it is bind but we can optionally write into it (based on _DISABLE_DECALS)\n #ifdef WRITE_NORMAL_BUFFER\n , out float4 outNormalBuffer : SV_TARGET_NORMAL\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n\n FragInputs input = BuildFragInputs(v2f);\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS);\n\n float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);\n\n\n SurfaceData surfaceData;\n BuiltinData builtinData;\n Surface l;\n ShaderData d;\n GetSurfaceAndBuiltinData(v2f, input, V, posInput, surfaceData, builtinData, l, d\n #if NEED_FACING\n , facing\n #endif\n );\n\n #ifdef _DEPTHOFFSET_ON\n v2f.motionVectorCS.w += builtinData.depthOffset;\n v2f.previousPositionCS.w += builtinData.depthOffset;\n #endif\n\n // TODO: How to allow overriden motion vector from GetSurfaceAndBuiltinData ?\n float2 motionVector = CalculateMotionVector(v2f.motionVectorCS, v2f.previousPositionCS);\n\n // Convert from Clip space (-1..1) to NDC 0..1 space.\n // Note it doesn't mean we don't have negative value, we store negative or positive offset in NDC space.\n // Note: ((positionCS * 0.5 + 0.5) - (v2f.previousPositionCS * 0.5 + 0.5)) = (motionVector * 0.5)\n EncodeMotionVector(motionVector * 0.5, outMotionVector);\n\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n\n // Setting the motionVector to a value more than 2 set as a flag for \"force no motion\". This is valid because, given that the velocities are in NDC,\n // a value of >1 can never happen naturally, unless explicitely set. \n if (forceNoMotion)\n outMotionVector = float4(2.0, 0.0, 0.0, 0.0);\n\n // Depth and Alpha to coverage\n #ifdef WRITE_MSAA_DEPTH\n // In case we are rendering in MSAA, reading the an MSAA depth buffer is way too expensive. To avoid that, we export the depth to a color buffer\n depthColor = v2f.pos.z;\n\n #ifdef _ALPHATOMASK_ON\n // Alpha channel is used for alpha to coverage\n depthColor.a = SharpenAlpha(builtinData.opacity, builtinData.alphaClipTreshold);\n #endif\n #endif\n\n // Normal Buffer Processing\n #ifdef WRITE_NORMAL_BUFFER\n EncodeIntoNormalBuffer(ConvertSurfaceDataToNormalData(surfaceData), outNormalBuffer);\n #endif\n\n #if defined(WRITE_DECAL_BUFFER)\n DecalPrepassData decalPrepassData;\n // Force a write in decal buffer even if decal is disab. This is a neutral value which have no impact for later pass\n #ifdef _DISABLE_DECALS\n ZERO_INITIALIZE(DecalPrepassData, decalPrepassData);\n #else\n // We don't have the right to access SurfaceData in a shaderpass.\n // However it would be painful to have to add a function like ConvertSurfaceDataToDecalPrepassData() to every Material to return geomNormalWS anyway\n // Here we will put the constrain that any Material requiring to support Decal, will need to have geomNormalWS as member of surfaceData (and we already require normalWS anyway)\n decalPrepassData.geomNormalWS = surfaceData.geomNormalWS;\n decalPrepassData.decalLayerMask = GetMeshRenderingDecalLayer();\n #endif\n EncodeIntoDecalPrepassBuffer(decalPrepassData, outDecalBuffer);\n #endif\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = posInput.deviceDepth;\n #endif\n }\n\n ENDHLSL\n }\n\n \n Pass\n {\n Name \"FullScreenDebug\"\n Tags\n {\n \"LightMode\" = \"FullScreenDebug\"\n }\n \n // Render State\n Cull Back\n ZTest LEqual\n ZWrite Off\n \n //-------------------------------------------------------------------------------------\n // End Render Modes\n //-------------------------------------------------------------------------------------\n \n HLSLPROGRAM\n \n #pragma target 4.5\n #pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch\n\n\n\n //#pragma shader_feature _ _SURFACE_TYPE_TRANSPARENT\n //#pragma shader_feature_local _BLENDMODE_OFF _BLENDMODE_ALPHA _BLENDMODE_ADD _BLENDMODE_PRE_MULTIPLY\n //#pragma shader_feature_local _ _ADD_PRECOMPUTED_VELOCITY\n //#pragma shader_feature_local _ _TRANSPARENT_WRITES_MOTION_VEC\n //#pragma shader_feature_local _ _ENABLE_FOG_ON_TRANSPARENT\n //#pragma shader_feature_local _ _DISABLE_DECALS\n //#pragma shader_feature_local _ _DISABLE_SSR\n //#pragma shader_feature_local _ _DISABLE_SSR_TRANSPARENT\n //#pragma shader_feature_local _REFRACTION_OFF _REFRACTION_PLANE _REFRACTION_SPHERE _REFRACTION_THIN\n \n \n\n #define SHADERPASS SHADERPASS_FULL_SCREEN_DEBUG\n #define _PASSFULLSCREENDEBUG 1\n \n \n\n\n #define _HDRP 1\n#define NEED_FACING 1\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n // useful conversion functions to make surface shader code just work\n\n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(tex) TEXTURE2D_ARRAY(tex);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n\n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n\n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n\n\n\n// HDRP Adapter stuff\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\" // Required to be include before we include properties as it define DECLARE_STACK_CB\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphHeader.hlsl\" // Need to be here for Gradient struct definition\n\n #ifdef RAYTRACING_SHADER_GRAPH_DEFAULT \n #define RAYTRACING_SHADER_GRAPH_HIGH\n #endif\n \n #ifdef RAYTRACING_SHADER_GRAPH_RAYTRACED\n #define RAYTRACING_SHADER_GRAPH_LOW\n #endif\n // end\n \n\n\n\n // If we use subsurface scattering, enable output split lighting (for forward pass)\n #if defined(_MATERIAL_FEATURE_SUBSURFACE_SCATTERING) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define OUTPUT_SPLIT_LIGHTING\n #endif\n\n #define HAVE_RECURSIVE_RENDERING\n\n #if SHADERPASS == SHADERPASS_TRANSPARENT_DEPTH_PREPASS\n #if !defined(_DISABLE_SSR_TRANSPARENT) && !defined(SHADER_UNLIT)\n #define WRITE_NORMAL_BUFFER\n #endif\n #endif\n\n #ifndef DEBUG_DISPLAY\n // In case of opaque we don't want to perform the alpha test, it is done in depth prepass and we use depth equal for ztest (setup from UI)\n // Don't do it with debug display mode as it is possible there is no depth prepass in this case\n #if !defined(_SURFACE_TYPE_TRANSPARENT) && defined(_ALPHATEST)\n #if SHADERPASS == SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD_BYPASS_ALPHA_TEST\n #elif SHADERPASS == SHADERPASS_GBUFFER\n #define SHADERPASS_GBUFFER_BYPASS_ALPHA_TEST\n #endif\n #endif\n #endif\n\n // Define _DEFERRED_CAPABLE_MATERIAL for shader capable to run in deferred pass\n #if defined(SHADER_LIT) && !defined(_SURFACE_TYPE_TRANSPARENT)\n #define _DEFERRED_CAPABLE_MATERIAL\n #endif\n \n // Translate transparent motion vector define\n #if defined(_TRANSPARENT_WRITES_MOTION_VEC) && defined(_SURFACE_TYPE_TRANSPARENT)\n #define _WRITE_TRANSPARENT_MOTION_VECTOR\n #endif\n\n\n\n\n CBUFFER_START(UnityPerMaterial)\n float _UseShadowThreshold;\n float _BlendMode;\n float _EnableBlendModePreserveSpecularLighting;\n float _RayTracing;\n float _RefractionModel;\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n \n\n\n // -- Property used by ScenePickingPass\n #ifdef SCENEPICKINGPASS\n float4 _SelectionID;\n #endif\n \n // -- Properties used by SceneSelectionPass\n #ifdef SCENESELECTIONPASS\n int _ObjectId;\n int _PassValue;\n #endif\n \n \n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n float4 texcoord1 : TEXCOORD4;\n float4 texcoord2 : TEXCOORD5;\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD15;\n // #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n UNITY_VERTEX_INPUT_INSTANCE_ID\n #endif // UNITY_ANY_INSTANCING_ENABLED\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float4 previousPositionCS : TEXCOORD16; // Contain previous transform position (in case of skinning for example)\n float4 motionVectorCS : TEXCOORD17;\n #endif\n\n UNITY_VERTEX_OUTPUT_STEREO\n }; \n\n\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl\"\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n \n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n\n#if (SHADERPASS == SHADERPASS_LIGHT_TRANSPORT)\n\n // This was not in constant buffer in original unity, so keep outiside. But should be in as ShaderRenderPass frequency\n float unity_OneOverOutputBoost;\n float unity_MaxOutputValue;\n\n CBUFFER_START(UnityMetaPass)\n // x = use uv1 as raster position\n // y = use uv2 as raster position\n bool4 unity_MetaVertexControl;\n\n // x = return albedo\n // y = return normal\n bool4 unity_MetaFragmentControl;\n CBUFFER_END\n\n VertexToPixel Vert(VertexData inputMesh)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n UNITY_SETUP_INSTANCE_ID(inputMesh);\n UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n // Output UV coordinate in vertex shader\n float2 uv = float2(0.0, 0.0);\n\n if (unity_MetaVertexControl.x)\n {\n uv = inputMesh.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;\n }\n else if (unity_MetaVertexControl.y)\n {\n uv = inputMesh.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;\n }\n\n // OpenGL right now needs to actually use the incoming vertex position\n // so we create a fake dependency on it here that haven't any impact.\n output.pos = float4(uv * 2.0 - 1.0, inputMesh.vertex.z > 0 ? 1.0e-4 : 0.0, 1.0);\n\n output.worldPos = TransformObjectToWorld(inputMesh.vertex.xyz).xyz;\n\n // Normal is required for triplanar mapping\n output.worldNormal = TransformObjectToWorldNormal(inputMesh.normal);\n // Not required but assign to silent compiler warning\n output.worldTangent = float4(1.0, 0.0, 0.0, 0.0);\n\n output.texcoord0 = inputMesh.texcoord0;\n output.texcoord1 = inputMesh.texcoord1;\n output.texcoord2 = inputMesh.texcoord2;\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = inputMesh.texcoord3;\n // #endif\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = inputMesh.vertexColor;\n // #endif\n\n return output;\n }\n#else\n\n #if (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariablesMatrixDefsHDCamera.hlsl\"\n\n void MotionVectorPositionZBias(VertexToPixel input)\n {\n #if UNITY_REVERSED_Z\n input.pos.z -= unity_MotionVectorsParams.z * input.pos.w;\n #else\n input.pos.z += unity_MotionVectorsParams.z * input.pos.w;\n #endif\n }\n\n #endif\n\n VertexToPixel Vert(VertexData input)\n {\n VertexToPixel output;\n ZERO_INITIALIZE(VertexToPixel, output);\n\n UNITY_SETUP_INSTANCE_ID(input);\n UNITY_TRANSFER_INSTANCE_ID(input, output);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n VertexData previousMesh = input;\n #endif\n\n ChainModifyVertex(input, output, _Time);\n\n // This return the camera relative position (if enable)\n float3 positionRWS = TransformObjectToWorld(input.vertex.xyz);\n float3 normalWS = TransformObjectToWorldNormal(input.normal);\n float4 tangentWS = float4(TransformObjectToWorldDir(input.tangent.xyz), input.tangent.w);\n\n\n output.worldPos = GetAbsolutePositionWS(positionRWS);\n output.pos = TransformWorldToHClip(positionRWS);\n output.worldNormal = normalWS;\n output.worldTangent = tangentWS;\n\n\n output.texcoord0 = input.texcoord0;\n output.texcoord1 = input.texcoord1;\n output.texcoord2 = input.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // output.texcoord3 = input.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // output.vertexColor = input.vertexColor;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // output.screenPos = ComputeScreenPos(output.pos, _ProjectionParams.x);\n // #endif\n \n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n\n #if !defined(TESSELLATION_ON)\n MotionVectorPositionZBias(output);\n #endif\n\n output.motionVectorCS = mul(UNITY_MATRIX_UNJITTERED_VP, float4(positionRWS.xyz, 1.0));\n // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled\n bool forceNoMotion = unity_MotionVectorsParams.y == 0.0;\n if (forceNoMotion)\n {\n output.previousPositionCS = float4(0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n bool hasDeformation = unity_MotionVectorsParams.x > 0.0; // Skin or morph target\n\n float3 effectivePositionOS = (hasDeformation ? previousMesh.previousPositionOS : previousMesh.vertex.xyz);\n #if defined(_ADD_PRECOMPUTED_VELOCITY)\n effectivePositionOS -= input.precomputedVelocity;\n #endif\n\n previousMesh.vertex = float4(effectivePositionOS, 1);\n VertexToPixel dummy = (VertexToPixel)0;\n \n\n ChainModifyVertex(previousMesh, dummy, _LastTimeParameters);\n\n // we might need this for skinned objects?\n //float3 normalWS = TransformPreviousObjectToWorldNormal(input.normal).xyz;\n float3 previousPositionRWS = TransformPreviousObjectToWorld(previousMesh.vertex.xyz);\n\n #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR\n if (_TransparentCameraOnlyMotionVectors > 0)\n {\n previousPositionRWS = positionRWS.xyz;\n }\n #endif // _WRITE_TRANSPARENT_MOTION_VECTOR\n\n output.previousPositionCS = mul(UNITY_MATRIX_PREV_VP, float4(previousPositionRWS, 1.0));\n }\n #endif // _HDRP && _PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR))\n\n\n return output;\n }\n\n\n#endif\n\n\n\n \n\n \n\n #if defined(WRITE_DECAL_BUFFER) && !defined(_DISABLE_DECALS)\n #include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl\"\n #endif\n\n FragInputs BuildFragInputs(VertexToPixel input)\n {\n UNITY_SETUP_INSTANCE_ID(input);\n FragInputs output;\n ZERO_INITIALIZE(FragInputs, output);\n \n // Init to some default value to make the computer quiet (else it output 'divide by zero' warning even if value is not used).\n // TODO: this is a really poor workaround, but the variable is used in a bunch of places\n // to compute normals which are then passed on elsewhere to compute other values...\n output.tangentToWorld = k_identity3x3;\n output.positionSS = input.pos; // input.positionCS is SV_Position\n // BETTER SHADERS: because we transform world position into actual world space for things like\n // triplanar, etc, we have to back transform it here for lighting\n output.positionRWS = GetCameraRelativePositionWS(input.worldPos);\n output.tangentToWorld = BuildTangentToWorld(input.worldTangent, input.worldNormal);\n output.texCoord0 = input.texcoord0;\n output.texCoord1 = input.texcoord1;\n output.texCoord2 = input.texcoord2;\n \n return output;\n }\n \n void BuildSurfaceData(FragInputs fragInputs, inout Surface surfaceDescription, float3 V, PositionInputs posInput, out SurfaceData surfaceData, out float3 bentNormalWS)\n {\n // setup defaults -- these are used if the graph doesn't output a value\n ZERO_INITIALIZE(SurfaceData, surfaceData);\n \n // specularOcclusion need to be init ahead of decal to quiet the compiler that modify the SurfaceData struct\n // however specularOcclusion can come from the graph, so need to be init here so it can be override.\n surfaceData.specularOcclusion = 1.0;\n\n // copy across graph values, if defined\n surfaceData.baseColor = surfaceDescription.Albedo;\n surfaceData.perceptualSmoothness = surfaceDescription.Smoothness;\n surfaceData.ambientOcclusion = surfaceDescription.Occlusion;\n surfaceData.specularOcclusion = surfaceDescription.SpecularOcclusion;\n surfaceData.metallic = surfaceDescription.Metallic;\n surfaceData.subsurfaceMask = surfaceDescription.SubsurfaceMask;\n surfaceData.thickness = surfaceDescription.Thickness;\n surfaceData.diffusionProfileHash = asuint(surfaceDescription.DiffusionProfileHash);\n #if _USESPECULAR\n surfaceData.specularColor = surfaceDescription.Specular;\n #endif\n surfaceData.coatMask = surfaceDescription.CoatMask;\n surfaceData.anisotropy = surfaceDescription.Anisotropy;\n surfaceData.iridescenceMask = surfaceDescription.IridescenceMask;\n surfaceData.iridescenceThickness = surfaceDescription.IridescenceThickness;\n\n\n\n #if defined(_REFRACTION_PLANE) || defined(_REFRACTION_SPHERE) || defined(_REFRACTION_THIN)\n if (_EnableSSRefraction)\n {\n surfaceData.transmittanceMask = (1.0 - surfaceDescription.Alpha);\n surfaceDescription.Alpha = 1.0;\n }\n else\n {\n surfaceData.ior = surfaceDescription.ior;\n surfaceData.transmittanceColor = surfaceDescription.transmittanceColor;\n surfaceData.atDistance = surfaceDescription.atDistance;\n surfaceData.transmittanceMask = surfaceDescription.transmittanceMask;\n surfaceDescription.Alpha = 1.0;\n }\n #else\n surfaceData.ior = 1.0;\n surfaceData.transmittanceColor = float3(1.0, 1.0, 1.0);\n surfaceData.atDistance = 1.0;\n surfaceData.transmittanceMask = 0.0;\n #endif\n\n \n\n // These static material feature allow compile time optimization\n surfaceData.materialFeatures = MATERIALFEATUREFLAGS_LIT_STANDARD;\n #ifdef _MATERIAL_FEATURE_SUBSURFACE_SCATTERING\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SUBSURFACE_SCATTERING;\n #endif\n \n #ifdef _MATERIAL_FEATURE_TRANSMISSION\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_TRANSMISSION;\n #endif\n \n #ifdef _MATERIAL_FEATURE_ANISOTROPY\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_ANISOTROPY;\n surfaceData.normalWS = float3(0, 1, 0);\n #endif\n \n #ifdef _MATERIAL_FEATURE_IRIDESCENCE\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_IRIDESCENCE;\n #endif\n \n #ifdef _MATERIAL_FEATURE_SPECULAR_COLOR\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_SPECULAR_COLOR;\n #endif\n \n #if defined(_MATERIAL_FEATURE_CLEAR_COAT) || _CLEARCOAT\n surfaceData.materialFeatures |= MATERIALFEATUREFLAGS_LIT_CLEAR_COAT;\n #endif\n \n #if defined (_MATERIAL_FEATURE_SPECULAR_COLOR) && defined (_ENERGY_CONSERVING_SPECULAR)\n // Require to have setup baseColor\n // Reproduce the energy conservation done in legacy Unity. Not ideal but better for compatibility and users can unchek it\n surfaceData.baseColor *= (1.0 - Max3(surfaceData.specularColor.r, surfaceData.specularColor.g, surfaceData.specularColor.b));\n #endif\n \n\n\n // compute world space normal\n #if !_WORLDSPACENORMAL\n surfaceData.normalWS = mul(surfaceDescription.Normal, fragInputs.tangentToWorld);\n #else\n surfaceData.normalWS = surfaceDescription.Normal;\n #endif\n\n surfaceData.geomNormalWS = fragInputs.tangentToWorld[2];\n \n surfaceData.tangentWS = normalize(fragInputs.tangentToWorld[0].xyz); // The tangent is not normalize in tangentToWorld for mikkt. TODO: Check if it expected that we normalize with Morten. Tag: SURFACE_GRADIENT\n\n \n #if HAVE_DECALS\n if (_EnableDecals)\n {\n float alpha = 1.0;\n alpha = surfaceDescription.Alpha;\n \n // Both uses and modifies 'surfaceData.normalWS'.\n DecalSurfaceData decalSurfaceData = GetDecalSurfaceData(posInput, fragInputs.tangentToWorld[2], alpha);\n ApplyDecalToSurfaceData(decalSurfaceData, fragInputs.tangentToWorld[2], surfaceData);\n }\n #endif\n \n bentNormalWS = surfaceData.normalWS;\n \n surfaceData.tangentWS = Orthonormalize(surfaceData.tangentWS, surfaceData.normalWS);\n \n #ifdef DEBUG_DISPLAY\n if (_DebugMipMapMode != DEBUGMIPMAPMODE_NONE)\n {\n // TODO: need to update mip info\n surfaceData.metallic = 0;\n }\n \n // We need to call ApplyDebugToSurfaceData after filling the surfarcedata and before filling builtinData\n // as it can modify attribute use for static lighting\n ApplyDebugToSurfaceData(fragInputs.tangentToWorld, surfaceData);\n #endif\n \n // By default we use the ambient occlusion with Tri-ace trick (apply outside) for specular occlusion.\n // If user provide bent normal then we process a better term\n #if defined(_SPECULAR_OCCLUSION_CUSTOM)\n // Just use the value passed through via the slot (not active otherwise)\n #elif defined(_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL)\n // If we have bent normal and ambient occlusion, process a specular occlusion\n surfaceData.specularOcclusion = GetSpecularOcclusionFromBentAO(V, bentNormalWS, surfaceData.normalWS, surfaceData.ambientOcclusion, PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness));\n #elif defined(_AMBIENT_OCCLUSION) && defined(_SPECULAR_OCCLUSION_FROM_AO)\n surfaceData.specularOcclusion = GetSpecularOcclusionFromAmbientOcclusion(ClampNdotV(dot(surfaceData.normalWS, V)), surfaceData.ambientOcclusion, PerceptualSmoothnessToRoughness(surfaceData.perceptualSmoothness));\n #endif\n \n #if defined(_ENABLE_GEOMETRIC_SPECULAR_AA) && !defined(SHADER_STAGE_RAY_TRACING)\n surfaceData.perceptualSmoothness = GeometricNormalFiltering(surfaceData.perceptualSmoothness, fragInputs.tangentToWorld[2], surfaceDescription.SpecularAAScreenSpaceVariance, surfaceDescription.SpecularAAThreshold);\n #endif\n }\n \n void GetSurfaceAndBuiltinData(VertexToPixel m2ps, FragInputs fragInputs, float3 V, inout PositionInputs posInput,\n out SurfaceData surfaceData, out BuiltinData builtinData, inout Surface l, inout ShaderData d\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n // Removed since crossfade does not work, probably needs extra material setup. \n //#if !defined(SHADER_STAGE_RAY_TRACING) && !defined(_TESSELLATION_DISPLACEMENT)\n // #ifdef LOD_FADE_CROSSFADE // enable dithering LOD transition if user select CrossFade transition in LOD group\n // LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);\n // #endif\n //#endif\n\n d = CreateShaderData(m2ps\n #if NEED_FACING\n , facing\n #endif\n );\n\n l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n l.SpecularOcclusion = 1;\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n l.outputDepth = d.clipPos.z;\n #endif\n\n ChainSurfaceFunction(l, d);\n\n #if !defined(SHADER_STAGE_RAY_TRACING) && defined(_DEPTHOFFSET_ON)\n //posInput.deviceDepth = l.outputDepth;\n #endif\n\n #if _UNLIT\n //l.Emission = l.Albedo;\n //l.Albedo = 0;\n l.Normal = half3(0,0,1);\n l.Occlusion = 1;\n l.Metallic = 0;\n l.Specular = 0;\n #endif\n\n surfaceData.geomNormalWS = d.worldSpaceNormal;\n surfaceData.tangentWS = d.worldSpaceTangent;\n fragInputs.tangentToWorld = d.TBNMatrix;\n\n float3 bentNormalWS;\n BuildSurfaceData(fragInputs, l, V, posInput, surfaceData, bentNormalWS);\n\n\n InitBuiltinData(posInput, l.Alpha, bentNormalWS, -d.worldSpaceNormal, fragInputs.texCoord1, fragInputs.texCoord2, builtinData);\n\n \n\n builtinData.emissiveColor = l.Emission;\n\n #if defined(_OVERRIDE_BAKEDGI)\n builtinData.bakeDiffuseLighting = l.DiffuseGI;\n builtinData.backBakeDiffuseLighting = l.BackDiffuseGI;\n builtinData.emissiveColor += l.SpecularGI;\n #endif\n\n #if defined(_OVERRIDE_SHADOWMASK)\n builtinData.shadowMask0 = l.ShadowMask.x;\n builtinData.shadowMask1 = l.ShadowMask.y;\n builtinData.shadowMask2 = l.ShadowMask.z;\n builtinData.shadowMask3 = l.ShadowMask.w;\n #endif\n\n #ifdef UNITY_VIRTUAL_TEXTURING\n builtinData.vtPackedFeedback = surfaceDescription.VTPackedFeedback;\n #endif\n\n #if (SHADERPASS == SHADERPASS_DISTORTION)\n builtinData.distortion = surfaceData.Distortion;\n builtinData.distortionBlur = surfaceData.DistortionBlur;\n #endif\n\n #ifndef SHADER_UNLIT\n // PostInitBuiltinData call ApplyDebugToBuiltinData\n PostInitBuiltinData(V, posInput, surfaceData, builtinData);\n #else\n ApplyDebugToBuiltinData(builtinData);\n #endif\n \n RAY_TRACING_OPTIONAL_ALPHA_TEST_PASS\n }\n\n\n\n#define DEBUG_DISPLAY\n#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl\"\n#include \"Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/FullScreenDebug.hlsl\"\n\n #if !defined(_DEPTHOFFSET_ON)\n [earlydepthstencil] // quad overshading debug mode writes to UAV\n #endif\n void Frag(VertexToPixel v2f\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n )\n {\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v2f);\n FragInputs input = BuildFragInputs(v2f);\n\n PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz);\n\n #ifdef PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER\n if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_QUAD_OVERDRAW)\n {\n IncrementQuadOverdrawCounter(posInput.positionSS.xy, input.primitiveID);\n }\n #endif\n }\n\n ENDHLSL\n }\n\n \n\n\n \n }\n\n \n \n \n}\n"},{"srpTarget":1,"UnityVersionMin":20202,"UnityVersionMax":30000,"shader":{"instanceID":0},"shaderSrc":"////////////////////////////////////////\n// Generated with Better Shaders\n//\n// Auto-generated shader code, don't hand edit!\n//\n// Unity Version: 2021.3.20f1\n// Render Pipeline: URP2020\n// Platform: WindowsEditor\n////////////////////////////////////////\n\n\nShader \"UMA/Compositing/Diffuse_Normal_Metallic_Compositer\"\n{\n Properties\n {\n [HideInInspector][NoScaleOffset]unity_Lightmaps(\"unity_Lightmaps\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_LightmapsInd(\"unity_LightmapsInd\", 2DArray) = \"\" {}\n [HideInInspector][NoScaleOffset]unity_ShadowMasks(\"unity_ShadowMasks\", 2DArray) = \"\" {}\n \n\n [BetterHeader(Material Specific)]\n\t_OverlayCount (\"OverlayCount\", Float) = 0\n\t_ColorModulation (\"Color Modulation\", Range(0,2)) = 1\n\t_MetallicModulation (\"Metallic Level\", Range(0,2)) = 1\n\t_SmoothnessModulation (\"Smoothness Level\", Range(0,2)) = 1\n _HalfLambertStrength (\"Lambert(0), HalfLambert(1)\", Range(0,4)) = 1\n // _EmissiveModulation (\"Emissive Level\", Range(0,2)) = 1\n\n [Enum(Off,0,Front,1,Back,2)]_CullMode(\"Culling Mode\", Float) = 2\n [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode(\"Double sided normal mode\", Float) = 1\n\n [GroupRollout(Base Overlay)]\n [Group(Base Overlay)][NoScaleOffset]_BaseMap(\"BaseMap\", 2D) = \"white\" {}\n [Message(A _BumpMap is encoded as follows R Normal_X G Normal_Y B Metallic_Level A Smoothness_Level)] \n [BetterHeader(Normal Mask)]\n [Group(Base Overlay)][NoScaleOffset]_BumpMap(\"_BumpMap\", 2D) = \"bump\" {}\n [Group(Base Overlay)][NoScaleOffset]_MetallicGlossMap(\"_MetallicGlossMap\", 2D) = \"black\" {}\n\n // no AlphaMask for the base.\n [Group(Base Overlay)]_Tile0_0 (\"Tile0_0\", Float) = 1\n [Group(Base Overlay)]_Tile0_1 (\"Tile0_1\", Float) = 1\n [Group(Base Overlay)]_Tile0_2 (\"Tile0_2\", Float) = 1\n [Group(Base Overlay)]_NormalStrength0(\"Normal Strength 0\", Range(0,2)) = 1\n\t[Group(Base Overlay)]_RedColor0 (\"RedColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_GreenColor0 (\"GreenColor\", Color) = (1, 1, 1, 1)\n\t[Group(Base Overlay)]_BlueColor0 (\"BlueColor\", Color) = (1, 1, 1, 1)\n [Group(Base Overlay)]_Tint0_0 (\"Tint 0_0\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_1 (\"Tint 0_1\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Tint0_2 (\"Tint 0_2\",Color) = (1,1,1,1)\n [Group(Base Overlay)]_Add0_0 (\"Add 0_0\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_1 (\"Add 0_1\",Color) = (0,0,0,0)\n [Group(Base Overlay)]_Add0_2 (\"Add 0_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 1)]\n [Group(Overlay 1)][NoScaleOffset]_BaseMap1(\"BaseMap1\", 2D) = \"white\" {}\n [Group(Overlay 1)][NoScaleOffset]_BumpMap1(\"_BumpMap1\", 2D) = \"bump\" {}\n [Group(Overlay 1)][NoScaleOffset]_MetallicGlossMap1(\"_MetallicGlossMap1\", 2D) = \"black\" {}\n [Group(Overlay 1)][NoScaleOffset]_AlphaMask1(\"Mask1\", 2D) = \"white\" {} \n [Group(Overlay 1)]_Tile1_0 (\"Tile1_0\", Float) = 1\n [Group(Overlay 1)]_Tile1_1 (\"Tile1_1\", Float) = 1\n [Group(Overlay 1)]_Tile1_2 (\"Tile1_2\", Float) = 1\n [Group(Overlay 1)]_NormalStrength1(\"Normal Strength 1\", Range(0,2)) = 1\n [Group(Overlay 1)]_Tint1_0 (\"Tint 1_0\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_1 (\"Tint 1_1\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Tint1_2 (\"Tint 1_2\",Color) = (1,1,1,1)\n [Group(Overlay 1)]_Add1_0 (\"Add 1_0\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_1 (\"Add 1_1\",Color) = (0,0,0,0)\n [Group(Overlay 1)]_Add1_2 (\"Add 1_2\",Color) = (0,0,0,0)\n\n [GroupRollout(Overlay 2)]\n [Group(Overlay 2)][NoScaleOffset]_BaseMap2(\"BaseMap2\", 2D) = \"white\" {}\n [Group(Overlay 2)][NoScaleOffset]_BumpMap2(\"_BumpMap2\", 2D) = \"bump\" {}\n [Group(Overlay 2)][NoScaleOffset]_MetallicGlossMap2(\"_MetallicGlossMap2\", 2D) = \"black\" {}\n [Group(Overlay 2)][NoScaleOffset]_AlphaMask2(\"Mask2\", 2D) = \"white\" {} \n [Group(Overlay 2)]_Tile2_0 (\"Tile2_0\", Float) = 1\n [Group(Overlay 2)]_Tile2_1 (\"Tile2_1\", Float) = 1\n [Group(Overlay 2)]_Tile2_2 (\"Tile2_2\", Float) = 1\n [Group(Overlay 2)]_NormalStrength2(\"Normal Strength 2\", Range(0,2)) = 1\n [Group(Overlay 2)]_Tint2_0 (\"Tint 2_0\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_1 (\"Tint 2_1\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Tint2_2 (\"Tint 2_2\",Color) = (1,1,1,1)\n [Group(Overlay 2)]_Add2_0 (\"Add 2_0\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_1 (\"Add 2_1\",Color) = (0,0,0,0)\n [Group(Overlay 2)]_Add2_2 (\"Add 2_2\",Color) = (0,0,0,0)\n\n // Overlay 3\n [GroupRollout(Overlay 3)]\n [Group(Overlay 3)][NoScaleOffset]_BaseMap3(\"BaseMap3\", 2D) = \"white\" {}\n [Group(Overlay 3)][NoScaleOffset]_BumpMap3(\"_BumpMap3\", 2D) = \"bump\" {}\n [Group(Overlay 3)][NoScaleOffset]_MetallicGlossMap3(\"_MetallicGlossMap3\", 2D) = \"black\" {} \n [Group(Overlay 3)][NoScaleOffset]_AlphaMask3(\"Mask3\", 2D) = \"white\" {} \n [Group(Overlay 3)]_Tile3_0 (\"Tile3_0\", Float) = 1\n [Group(Overlay 3)]_Tile3_1 (\"Tile3_1\", Float) = 1\n [Group(Overlay 3)]_Tile3_2 (\"Tile3_2\", Float) = 1\n [Group(Overlay 3)]_NormalStrength3(\"Normal Strength 3\", Range(0,2)) = 1\n [Group(Overlay 3)]_Tint3_0 (\"Tint 3_0\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_1 (\"Tint 3_1\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Tint3_2 (\"Tint 3_2\",Color) = (1,1,1,1)\n [Group(Overlay 3)]_Add3_0 (\"Add 3_0\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_1 (\"Add 3_1\",Color) = (0,0,0,0)\n [Group(Overlay 3)]_Add3_2 (\"Add 3_2\",Color) = (0,0,0,0)\n\n\n }\n SubShader\n {\n Tags { \"RenderPipeline\"=\"UniversalPipeline\" \"RenderType\" = \"Opaque\" \"UniversalMaterialType\" = \"Lit\" \"Queue\" = \"Geometry\" }\n\n \n\n \n Pass\n {\n Name \"Universal Forward\"\n Tags \n { \n \"LightMode\" = \"UniversalForward\"\n }\n Cull Back\n Blend One Zero\n ZTest LEqual\n ZWrite On\n\n Blend One Zero, One Zero\nCull Back\nZTest LEqual\nZWrite On\n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_fog\n #pragma multi_compile_instancing\n #pragma multi_compile _ DOTS_INSTANCING_ON\n \n // Keywords\n #pragma multi_compile _ _SCREEN_SPACE_OCCLUSION\n #pragma multi_compile _ LIGHTMAP_ON\n #pragma multi_compile _ DIRLIGHTMAP_COMBINED\n #pragma multi_compile _ _MAIN_LIGHT_SHADOWS\n #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE\n #pragma multi_compile _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS _ADDITIONAL_OFF\n #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS\n #pragma multi_compile _ _SHADOWS_SOFT\n #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING\n #pragma multi_compile _ SHADOWS_SHADOWMASK\n // GraphKeywords: \n\n #define SHADER_PASS SHADERPASS_FORWARD\n #define SHADERPASS_FORWARD\n #define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #define _PASSFORWARD 1\n \n\n \n\n\n #define _URP 1\n#define NEED_FACING 1\n\n // this has to be here or specular color will be ignored. Not in SG code\n #if _SIMPLELIT\n #define _SPECULAR_COLOR\n #endif\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n float4 fogFactorAndVertexLight : TEXCOORD10;\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n float4 shadowCoord : TEXCOORD11;\n #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD || _PASSGBUFFER\n float2 uv1 = v.texcoord1.xy;\n OUTPUT_LIGHTMAP_UV(uv1, unity_LightmapST, o.lightmapUV);\n // o.texcoord1.xy = uv1;\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n #if _USESPECULAR || _SIMPLELIT\n float3 specular = l.Specular;\n float metallic = 1;\n #else \n float3 specular = 0;\n float metallic = l.Metallic;\n #endif\n\n\n \n \n InputData inputData;\n\n inputData.positionWS = IN.worldPos;\n #if _WORLDSPACENORMAL\n inputData.normalWS = l.Normal;\n #else\n inputData.normalWS = normalize(TangentToWorldSpace(d, l.Normal));\n #endif\n\n inputData.viewDirectionWS = SafeNormalize(d.worldSpaceViewDir);\n\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n inputData.shadowCoord = IN.shadowCoord;\n #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)\n inputData.shadowCoord = TransformWorldToShadowCoord(IN.worldPos);\n #else\n inputData.shadowCoord = float4(0, 0, 0, 0);\n #endif\n\n inputData.fogCoord = IN.fogFactorAndVertexLight.x;\n inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw;\n #if defined(_OVERRIDE_BAKEDGI)\n inputData.bakedGI = l.DiffuseGI;\n l.Emission += l.SpecularGI;\n #else\n inputData.bakedGI = SAMPLE_GI(IN.lightmapUV, IN.sh, inputData.normalWS);\n #endif\n inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(IN.pos);\n #if !_BAKEDLIT\n inputData.shadowMask = SAMPLE_SHADOWMASK(IN.lightmapUV);\n\n #if defined(_OVERRIDE_SHADOWMASK)\n float4 mulColor = saturate(dot(l.ShadowMask, _MainLightOcclusionProbes)); //unity_OcclusionMaskSelector));\n inputData.shadowMask = mulColor;\n #endif\n #endif\n\n #if !_UNLIT\n #if _SIMPLELIT\n half4 color = UniversalFragmentBlinnPhong(\n inputData,\n l.Albedo,\n float4(specular * l.Smoothness, 0),\n l.SpecularPower * 128,\n l.Emission,\n l.Alpha);\n color.a = l.Alpha;\n #elif _BAKEDLIT\n color = UniversalFragmentBakedLit(inputData, l.Albedo, l.Alpha, normalTS);\n #else\n\n \n SurfaceData surface = (SurfaceData)0;\n surface.albedo = l.Albedo;\n surface.metallic = saturate(metallic);\n surface.specular = specular;\n surface.smoothness = saturate(l.Smoothness),\n surface.occlusion = l.Occlusion,\n surface.emission = l.Emission,\n surface.alpha = saturate(l.Alpha);\n surface.clearCoatMask = 0;\n surface.clearCoatSmoothness = 1;\n\n #ifdef _CLEARCOAT\n surface.clearCoatMask = saturate(l.CoatMask);\n surface.clearCoatSmoothness = saturate(l.CoatSmoothness);\n #endif\n\n half4 color = UniversalFragmentPBR(inputData, surface);\n\n #endif\n\n #else\n half4 color = half4(l.Albedo, l.Alpha);\n \n #endif\n\n #if !DISABLEFOG\n color.rgb = MixFog(color.rgb, IN.fogFactorAndVertexLight.x);\n #endif\n ChainFinalColorForward(l, d, color);\n\n return color;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n \n Pass\n {\n Name \"ShadowCaster\"\n Tags \n { \n \"LightMode\" = \"ShadowCaster\"\n }\n \n // Render State\n Blend One Zero, One Zero\n Cull Back\n ZTest LEqual\n ZWrite On\n // ColorMask: \n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_instancing\n \n #define _NORMAL_DROPOFF_TS 1\n #define ATTRIBUTES_NEED_NORMAL\n #define ATTRIBUTES_NEED_TANGENT\n #define SHADERPASS_SHADOWCASTER\n #define _PASSSHADOW 1\n\n \n\n\n #define _URP 1\n#define NEED_FACING 1\n \n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n float4 fogFactorAndVertexLight : TEXCOORD10;\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n float4 shadowCoord : TEXCOORD11;\n #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD || _PASSGBUFFER\n float2 uv1 = v.texcoord1.xy;\n OUTPUT_LIGHTMAP_UV(uv1, unity_LightmapST, o.lightmapUV);\n // o.texcoord1.xy = uv1;\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n return 0;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"DepthOnly\"\n Tags \n { \n \"LightMode\" = \"DepthOnly\"\n }\n \n // Render State\n Blend One Zero, One Zero\n Cull Back\n ZTest LEqual\n ZWrite On\n ColorMask 0\n \n Cull [_CullMode]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n\n #define SHADERPASS_DEPTHONLY\n #define _PASSDEPTH 1\n\n #pragma target 3.0\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_instancing\n #pragma multi_compile _ DOTS_INSTANCING_ON\n\n \n\n\n #define _URP 1\n#define NEED_FACING 1\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n float4 fogFactorAndVertexLight : TEXCOORD10;\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n float4 shadowCoord : TEXCOORD11;\n #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n \n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD || _PASSGBUFFER\n float2 uv1 = v.texcoord1.xy;\n OUTPUT_LIGHTMAP_UV(uv1, unity_LightmapST, o.lightmapUV);\n // o.texcoord1.xy = uv1;\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n return 0;\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"Meta\"\n Tags \n { \n \"LightMode\" = \"Meta\"\n }\n\n // Render State\n Cull Off\n // ColorMask: \n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n \n #define SHADERPASS_META\n #define _PASSMETA 1\n\n\n \n\n\n #define _URP 1\n#define NEED_FACING 1\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/MetaInput.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n float4 fogFactorAndVertexLight : TEXCOORD10;\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n float4 shadowCoord : TEXCOORD11;\n #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD || _PASSGBUFFER\n float2 uv1 = v.texcoord1.xy;\n OUTPUT_LIGHTMAP_UV(uv1, unity_LightmapST, o.lightmapUV);\n // o.texcoord1.xy = uv1;\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n\n Surface l = (Surface)0;\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n MetaInput metaInput = (MetaInput)0;\n metaInput.Albedo = l.Albedo;\n metaInput.Emission = l.Emission;\n\n return MetaFragment(metaInput);\n\n }\n\n ENDHLSL\n\n }\n\n\n \n Pass\n {\n Name \"DepthNormals\"\n Tags\n {\n \"LightMode\" = \"DepthNormals\"\n }\n \n // Render State\n Cull Back\n Blend One Zero\n ZTest LEqual\n ZWrite On\n\n Cull [_CullMode]\n\n\n HLSLPROGRAM\n\n #pragma vertex Vert\n #pragma fragment Frag\n\n #pragma target 3.0\n\n #pragma prefer_hlslcc gles\n #pragma exclude_renderers d3d11_9x\n #pragma multi_compile_fog\n #pragma multi_compile_instancing\n #pragma multi_compile _ DOTS_INSTANCING_ON\n \n #define SHADERPASS SHADERPASS_DEPTHNORMALSONLY\n #define _PASSDEPTH 1\n #define _PASSDEPTHNORMALS 1\n\n\n \n\n\n #define _URP 1\n#define NEED_FACING 1\n\n // this has to be here or specular color will be ignored. Not in SG code\n #if _SIMPLELIT\n #define _SPECULAR_COLOR\n #endif\n\n\n // Includes\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl\"\n #include \"Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl\"\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl\"\n #include \"Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl\"\n\n\n \n\n #undef WorldNormalVector\n #define WorldNormalVector(data, normal) mul(normal, data.TBNMatrix)\n \n #define UnityObjectToWorldNormal(normal) mul(GetObjectToWorldMatrix(), normal)\n\n #define _WorldSpaceLightPos0 _MainLightPosition\n \n #define UNITY_DECLARE_TEX2D(name) TEXTURE2D(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2D_NOSAMPLER(name) TEXTURE2D(name);\n #define UNITY_DECLARE_TEX2DARRAY(name) TEXTURE2D_ARRAY(name); SAMPLER(sampler##name);\n #define UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(name) TEXTURE2D_ARRAY(name);\n\n #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z)\n #define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) SAMPLE_TEXTURE2D_ARRAY_LOD(tex, sampler##tex, coord.xy, coord.z, lod)\n #define UNITY_SAMPLE_TEX2D(tex, coord) SAMPLE_TEXTURE2D(tex, sampler##tex, coord)\n #define UNITY_SAMPLE_TEX2D_SAMPLER(tex, samp, coord) SAMPLE_TEXTURE2D(tex, sampler##samp, coord)\n\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) SAMPLE_TEXTURE2D_LOD(tex, sampler_##tex, coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) SAMPLE_TEXTURE2D_LOD (tex, sampler##samplertex,coord, lod)\n \n #if defined(UNITY_COMPILER_HLSL)\n #define UNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;\n #else\n #define UNITY_INITIALIZE_OUTPUT(type,name)\n #endif\n\n #define sampler2D_float sampler2D\n #define sampler2D_half sampler2D\n\n \n\n // data across stages, stripped like the above.\n struct VertexToPixel\n {\n float4 pos : SV_POSITION;\n float3 worldPos : TEXCOORD0;\n float3 worldNormal : TEXCOORD1;\n float4 worldTangent : TEXCOORD2;\n float4 texcoord0 : TEXCOORD3;\n // float4 texcoord1 : TEXCOORD4;\n // float4 texcoord2 : TEXCOORD5;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD6;\n // #endif\n\n // #if %SCREENPOSREQUIREKEY%\n // float4 screenPos : TEXCOORD7;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // half4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD12;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD13;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD14;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD15;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD16;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD17;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD18;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD19;\n // #endif\n \n #if defined(LIGHTMAP_ON)\n float2 lightmapUV : TEXCOORD8;\n #endif\n #if !defined(LIGHTMAP_ON)\n float3 sh : TEXCOORD9;\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n float4 fogFactorAndVertexLight : TEXCOORD10;\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n float4 shadowCoord : TEXCOORD11;\n #endif\n\n #if UNITY_ANY_INSTANCING_ENABLED\n uint instanceID : CUSTOM_INSTANCE_ID;\n #endif\n #if (defined(UNITY_STEREO_INSTANCING_ENABLED))\n uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;\n #endif\n #if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))\n uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;\n #endif\n #if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)\n FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;\n #endif\n };\n\n\n \n \n // data describing the user output of a pixel\n struct Surface\n {\n half3 Albedo;\n half Height;\n half3 Normal;\n half Smoothness;\n half3 Emission;\n half Metallic;\n half3 Specular;\n half Occlusion;\n half SpecularPower; // for simple lighting\n half Alpha;\n float outputDepth; // if written, SV_Depth semantic is used. ShaderData.clipPos.z is unused value\n // HDRP Only\n half SpecularOcclusion;\n half SubsurfaceMask;\n half Thickness;\n half CoatMask;\n half CoatSmoothness;\n half Anisotropy;\n half IridescenceMask;\n half IridescenceThickness;\n int DiffusionProfileHash;\n float SpecularAAThreshold;\n float SpecularAAScreenSpaceVariance;\n // requires _OVERRIDE_BAKEDGI to be defined, but is mapped in all pipelines\n float3 DiffuseGI;\n float3 BackDiffuseGI;\n float3 SpecularGI;\n float ior;\n float3 transmittanceColor;\n float atDistance;\n float transmittanceMask;\n // requires _OVERRIDE_SHADOWMASK to be defines\n float4 ShadowMask;\n\n // for decals\n float NormalAlpha;\n float MAOSAlpha;\n\n\n };\n\n // Data the user declares in blackboard blocks\n struct Blackboard\n {\n \n float blackboardDummyData;\n };\n\n // data the user might need, this will grow to be big. But easy to strip\n struct ShaderData\n {\n float4 clipPos; // SV_POSITION\n float3 localSpacePosition;\n float3 localSpaceNormal;\n float3 localSpaceTangent;\n \n float3 worldSpacePosition;\n float3 worldSpaceNormal;\n float3 worldSpaceTangent;\n float tangentSign;\n\n float3 worldSpaceViewDir;\n float3 tangentSpaceViewDir;\n\n float4 texcoord0;\n float4 texcoord1;\n float4 texcoord2;\n float4 texcoord3;\n\n float2 screenUV;\n float4 screenPos;\n\n float4 vertexColor;\n bool isFrontFace;\n\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n\n float3x3 TBNMatrix;\n Blackboard blackboard;\n };\n\n struct VertexData\n {\n #if SHADER_TARGET > 30\n // UNITY_VERTEX_INPUT_INSTANCE_ID;\n #endif\n float4 vertex : POSITION;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n\n // optimize out mesh coords when not in use by user or lighting system\n #if _URP && (_USINGTEXCOORD1 || _PASSMETA || _PASSFORWARD || _PASSGBUFFER)\n float4 texcoord1 : TEXCOORD1;\n #endif\n\n #if _URP && (_USINGTEXCOORD2 || _PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && defined(DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n #if _STANDARD && (_USINGTEXCOORD1 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER || _PASSFORWARDADD) && LIGHTMAP_ON)))\n float4 texcoord1 : TEXCOORD1;\n #endif\n #if _STANDARD && (_USINGTEXCOORD2 || (_PASSMETA || ((_PASSFORWARD || _PASSGBUFFER) && DYNAMICLIGHTMAP_ON)))\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n\n #if _HDRP\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n #endif\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD4; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD5; // Add Precomputed Velocity (Alembic computes velocities on runtime side).\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n };\n\n struct TessVertex \n {\n float4 vertex : INTERNALTESSPOS;\n float3 normal : NORMAL;\n float4 tangent : TANGENT;\n float4 texcoord0 : TEXCOORD0;\n float4 texcoord1 : TEXCOORD1;\n float4 texcoord2 : TEXCOORD2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // float4 texcoord3 : TEXCOORD3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // float4 vertexColor : COLOR;\n // #endif\n\n // #if %EXTRAV2F0REQUIREKEY%\n // float4 extraV2F0 : TEXCOORD5;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // float4 extraV2F1 : TEXCOORD6;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // float4 extraV2F2 : TEXCOORD7;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // float4 extraV2F3 : TEXCOORD8;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // float4 extraV2F4 : TEXCOORD9;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // float4 extraV2F5 : TEXCOORD10;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // float4 extraV2F6 : TEXCOORD11;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // float4 extraV2F7 : TEXCOORD12;\n // #endif\n\n #if _HDRP && (_PASSMOTIONVECTOR || ((_PASSFORWARD || _PASSUNLIT) && defined(_WRITE_TRANSPARENT_MOTION_VECTOR)))\n float3 previousPositionOS : TEXCOORD13; // Contain previous transform position (in case of skinning for example)\n #if defined (_ADD_PRECOMPUTED_VELOCITY)\n float3 precomputedVelocity : TEXCOORD14;\n #endif\n #endif\n\n UNITY_VERTEX_INPUT_INSTANCE_ID\n UNITY_VERTEX_OUTPUT_STEREO\n };\n\n struct ExtraV2F\n {\n float4 extraV2F0;\n float4 extraV2F1;\n float4 extraV2F2;\n float4 extraV2F3;\n float4 extraV2F4;\n float4 extraV2F5;\n float4 extraV2F6;\n float4 extraV2F7;\n Blackboard blackboard;\n float4 time;\n };\n\n\n float3 WorldToTangentSpace(ShaderData d, float3 normal)\n {\n return mul(d.TBNMatrix, normal);\n }\n\n float3 TangentToWorldSpace(ShaderData d, float3 normal)\n {\n return mul(normal, d.TBNMatrix);\n }\n\n // in this case, make standard more like SRPs, because we can't fix\n // unity_WorldToObject in HDRP, since it already does macro-fu there\n\n #if _STANDARD\n float3 TransformWorldToObject(float3 p) { return mul(unity_WorldToObject, float4(p, 1)); };\n float3 TransformObjectToWorld(float3 p) { return mul(unity_ObjectToWorld, float4(p, 1)); };\n float4 TransformWorldToObject(float4 p) { return mul(unity_WorldToObject, p); };\n float4 TransformObjectToWorld(float4 p) { return mul(unity_ObjectToWorld, p); };\n float4x4 GetWorldToObjectMatrix() { return unity_WorldToObject; }\n float4x4 GetObjectToWorldMatrix() { return unity_ObjectToWorld; }\n #if (defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (SHADER_TARGET_SURFACE_ANALYSIS && !SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord, lod) tex.SampleLevel (sampler##tex,coord, lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord, lod) tex.SampleLevel (sampler##samplertex,coord, lod)\n #else\n #define UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod) tex2D (tex,coord,0,lod)\n #define UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod) tex2D (tex,coord,0,lod)\n #endif\n\n #undef GetWorldToObjectMatrix()\n\n #define GetWorldToObjectMatrix() unity_WorldToObject\n\n\n #endif\n\n float3 GetCameraWorldPosition()\n {\n #if _HDRP\n return GetCameraRelativePositionWS(_WorldSpaceCameraPos);\n #else\n return _WorldSpaceCameraPos;\n #endif\n }\n\n #if _GRABPASSUSED\n #if _STANDARD\n TEXTURE2D(%GRABTEXTURE%);\n SAMPLER(sampler_%GRABTEXTURE%);\n #endif\n\n half3 GetSceneColor(float2 uv)\n {\n #if _STANDARD\n return SAMPLE_TEXTURE2D(%GRABTEXTURE%, sampler_%GRABTEXTURE%, uv).rgb;\n #else\n return SHADERGRAPH_SAMPLE_SCENE_COLOR(uv);\n #endif\n }\n #endif\n\n\n \n #if _STANDARD\n UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);\n float GetSceneDepth(float2 uv) { return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv)); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv)); } \n #else\n float GetSceneDepth(float2 uv) { return SHADERGRAPH_SAMPLE_SCENE_DEPTH(uv); }\n float GetLinear01Depth(float2 uv) { return Linear01Depth(GetSceneDepth(uv), _ZBufferParams); }\n float GetLinearEyeDepth(float2 uv) { return LinearEyeDepth(GetSceneDepth(uv), _ZBufferParams); } \n #endif\n\n float3 GetWorldPositionFromDepthBuffer(float2 uv, float3 worldSpaceViewDir)\n {\n float eye = GetLinearEyeDepth(uv);\n float3 camView = mul((float3x3)GetObjectToWorldMatrix(), transpose(mul(GetWorldToObjectMatrix(), UNITY_MATRIX_I_V)) [2].xyz);\n\n float dt = dot(worldSpaceViewDir, camView);\n float3 div = worldSpaceViewDir/dt;\n float3 wpos = (eye * div) + GetCameraWorldPosition();\n return wpos;\n }\n\n #if _HDRP\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return GetAbsolutePositionWS(TransformObjectToWorld(pos));\n }\n #else\n float3 ObjectToWorldSpacePosition(float3 pos)\n {\n return TransformObjectToWorld(pos);\n }\n #endif\n\n #if _STANDARD\n UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n float4 depthNorms = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv);\n float3 norms = DecodeViewNormalStereo(depthNorms);\n norms = mul((float3x3)GetWorldToViewMatrix(), norms) * 0.5 + 0.5;\n return norms;\n }\n #elif _HDRP && !_DECALSHADER\n \n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n NormalData nd;\n DecodeFromNormalBuffer(_ScreenSize.xy * uv, nd);\n return nd.normalWS;\n }\n #elif _URP\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n #include \"Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl\"\n #endif\n\n float3 GetSceneNormal(float2 uv, float3 worldSpaceViewDir)\n {\n #if (SHADER_LIBRARY_VERSION_MAJOR >= 10)\n return SampleSceneNormals(uv);\n #else\n float3 wpos = GetWorldPositionFromDepthBuffer(uv, worldSpaceViewDir);\n return normalize(-cross(ddx(wpos), ddy(wpos))) * 0.5 + 0.5;\n #endif\n\n }\n #endif\n\n #if _HDRP\n\n half3 UnpackNormalmapRGorAG(half4 packednormal)\n {\n // This do the trick\n packednormal.x *= packednormal.w;\n\n half3 normal;\n normal.xy = packednormal.xy * 2 - 1;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\n half3 UnpackNormal(half4 packednormal)\n {\n #if defined(UNITY_NO_DXT5nm)\n return packednormal.xyz * 2 - 1;\n #else\n return UnpackNormalmapRGorAG(packednormal);\n #endif\n }\n #endif\n #if _HDRP || _URP\n\n half3 UnpackScaleNormal(half4 packednormal, half scale)\n {\n #ifndef UNITY_NO_DXT5nm\n // Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)\n // Note neutral texture like \"bump\" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5\n packednormal.x *= packednormal.w;\n #endif\n half3 normal;\n normal.xy = (packednormal.xy * 2 - 1) * scale;\n normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));\n return normal;\n }\t\n\n #endif\n\n\n void GetSun(out float3 lightDir, out float3 color)\n {\n lightDir = float3(0.5, 0.5, 0);\n color = 1;\n #if _HDRP\n if (_DirectionalLightCount > 0)\n {\n DirectionalLightData light = _DirectionalLightDatas[0];\n lightDir = -light.forward.xyz;\n color = light.color;\n }\n #elif _STANDARD\n\t\t\t lightDir = normalize(_WorldSpaceLightPos0.xyz);\n color = _LightColor0.rgb;\n #elif _URP\n\t Light light = GetMainLight();\n\t lightDir = light.direction;\n\t color = light.color;\n #endif\n }\n\n\n \n CBUFFER_START(UnityPerMaterial)\n\n \n\n half _OverlayCount;\n\thalf _ColorModulation;\n\thalf _SmoothnessModulation;\n\thalf _MetallicModulation;\n half _EmissiveModulation;\n half _HalfLambertStrength;\n float _DoubleSidedNormalMode;\n\n\n // These should ALL BE IN ARRAYS!!!!!\n // But unity will not save/restore arrays on appdomain reload,NOR CAN YOU EDIT THEM IN THE INSPECTOR - so properties on materials are LOST\n // unless you write your own save/restore routine. But there are no events to know when they are lost or will be lost!!!!\n // so until I can write a utility to save/restore these, but only in edit time, this is what they will be.\n half _Tile0_0;\n half _Tile0_1; \n half _Tile0_2;\n\thalf4 _RedColor0;\n\thalf4 _GreenColor0;\n\thalf4 _BlueColor0;\n half _NormalStrength0;\n half4 _Tint0_0;\n half4 _Tint0_1;\n half4 _Tint0_2;\n half4 _Add0_0;\n half4 _Add0_1;\n half4 _Add0_2;\n half4 _HasTextures0;\n\n half _Tile1_0;\n half _Tile1_1;\n half _Tile1_2;\n half _NormalStrength1;\n half4 _Tint1_0;\n half4 _Tint1_1;\n half4 _Tint1_2;\n half4 _Add1_0;\n half4 _Add1_1;\n half4 _Add1_2;\n half4 _HasTextures1;\n\n half _Tile2_0;\n half _Tile2_1;\n half _Tile2_2;\n half _NormalStrength2;\n half4 _Tint2_0;\n half4 _Tint2_1;\n half4 _Tint2_2;\n half4 _Add2_0;\n half4 _Add2_1;\n half4 _Add2_2;\n half4 _HasTextures2;\n\n half _Tile3_0;\n half _Tile3_1;\n half _Tile3_2;\n half _NormalStrength3;\n half4 _Tint3_0;\n half4 _Tint3_1;\n half4 _Tint3_2;\n half4 _Add3_0;\n half4 _Add3_1;\n half4 _Add3_2;\n half4 _HasTextures3;\n\n\n\n CBUFFER_END\n\n \n\n \n\n #ifdef unity_WorldToObject\n#undef unity_WorldToObject\n#endif\n#ifdef unity_ObjectToWorld\n#undef unity_ObjectToWorld\n#endif\n#define unity_ObjectToWorld GetObjectToWorldMatrix()\n#define unity_WorldToObject GetWorldToObjectMatrix()\n\n\n TEXTURE2D(_BaseMap);\n SAMPLER(sampler_BaseMap);\n TEXTURE2D(_BumpMap);\n TEXTURE2D(_MetallicGlossMap);\n\n\n TEXTURE2D(_BaseMap1);\n TEXTURE2D(_BumpMap1);\n TEXTURE2D(_AlphaMask1);\n TEXTURE2D(_MetallicGlossMap1);\n\n TEXTURE2D(_BaseMap2);\n TEXTURE2D(_BumpMap2);\n TEXTURE2D(_AlphaMask2);\n TEXTURE2D(_MetallicGlossMap2);\n\n TEXTURE2D(_BaseMap3);\n TEXTURE2D(_BumpMap3);\n TEXTURE2D(_AlphaMask3);\n TEXTURE2D(_MetallicGlossMap3);\n\n\tvoid Ext_SurfaceFunction0 (inout Surface o, ShaderData d)\n\t{\n // Base Overlay always exists. Uses Textures 0,1,2 (2 is not currently used)\n float2 auv = d.texcoord0.xy * _Tile0_0;\n float2 nuv = d.texcoord0.xy * _Tile0_1;\n float2 cuv = d.texcoord0.xy * _Tile0_2;\n\n\t half4 mask = SAMPLE_TEXTURE2D(_MetallicGlossMap,sampler_BaseMap,cuv);\n\t half4 base_c = (SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, auv) * _Tint0_0)+_Add0_0;\n\n\t half4 basepackednormal = (SAMPLE_TEXTURE2D(_BumpMap, sampler_BaseMap,nuv) * _Tint0_1) + _Add0_1;\n\t half3 base_n = UnpackScaleNormal(basepackednormal,_NormalStrength0);\n\n\t half base_smooth = mask.a;\n\t half base_Metallic = mask.r;\n\n o.Alpha = base_c.a; \n\n \n \t if (_OverlayCount > 1)\n\t { \n float2 auv = d.texcoord0.xy * _Tile1_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask1, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap1, sampler_BaseMap, auv) * _Tint1_0) + _Add1_0;\n\n float2 cuv = d.texcoord0.xy * _Tile1_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap1,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n float2 nuv = d.texcoord0.xy * _Tile1_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint1_1) + _Add1_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength1);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n\n\n\t if (_OverlayCount > 2)\n\t {\n float2 auv = d.texcoord0.xy * _Tile2_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask2, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap, auv)* _Tint2_0) + _Add2_0;\n\n float2 cuv = d.texcoord0.xy * _Tile2_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap2,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile2_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap2, sampler_BaseMap,nuv) * _Tint2_1) + _Add2_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t }\n \n\t if (_OverlayCount > 3)\n\t {\n float2 auv = d.texcoord0.xy * _Tile3_0;\n\n half alpha = SAMPLE_TEXTURE2D(_AlphaMask3, sampler_BaseMap, auv).a;\n half oneminus = 1.0f - alpha;\n\n\t half4 add_c = (SAMPLE_TEXTURE2D(_BaseMap3, sampler_BaseMap, auv)* _Tint3_0) + _Add3_0;\n\n float2 cuv = d.texcoord0.xy * _Tile3_2;\n\t half4 addmask = SAMPLE_TEXTURE2D(_MetallicGlossMap3,sampler_BaseMap, cuv);\n\t\t base_c = (add_c * alpha) + (base_c * oneminus);\n\n float2 nuv = d.texcoord0.xy * _Tile3_1;\n\t half4 addpackednormal = (SAMPLE_TEXTURE2D(_BumpMap1, sampler_BaseMap,nuv) * _Tint3_1) + _Add3_1;\n\t half3 add_n = UnpackScaleNormal(addpackednormal,_NormalStrength2);\n\n\t\t base_n = (add_n * alpha) + (base_n * oneminus);\n\t\t base_smooth = (addmask.a * alpha) + (base_smooth * oneminus);\n\t\t base_Metallic = (addmask.r * alpha) + (base_Metallic * oneminus);\n \t } \n\t \n o.Albedo = base_c * _ColorModulation;\n\t o.Normal = base_n;\n\t o.Metallic = base_Metallic * _MetallicModulation;\n\t o.Smoothness = base_smooth * _SmoothnessModulation;\n\n if (_DoubleSidedNormalMode == 0)\n {\n o.Normal *= d.isFrontFace ? 1 : -1;\n }\n else if (_DoubleSidedNormalMode == 1)\n {\n\t\t o.Normal.z *= d.isFrontFace ? 1 : -1;\n }\n\n\n\t float3 lightDir;\n float3 lightColor;\n\t GetSun(lightDir, lightColor);\n\t float3 normalDirection = TangentToWorldSpace(d, o.Normal);\n\t float atten = 1.0;\n\t float lambert = dot(normalDirection, lightDir);\n\n lambert = lerp(lambert, lambert * 0.5 + 0.5, _HalfLambertStrength);\n o.Albedo *= atten * lightColor * lambert;\n\t}\n\n\n\n\n \n void ChainSurfaceFunction(inout Surface l, inout ShaderData d)\n {\n Ext_SurfaceFunction0(l, d);\n // Ext_SurfaceFunction1(l, d);\n // Ext_SurfaceFunction2(l, d);\n // Ext_SurfaceFunction3(l, d);\n // Ext_SurfaceFunction4(l, d);\n // Ext_SurfaceFunction5(l, d);\n // Ext_SurfaceFunction6(l, d);\n // Ext_SurfaceFunction7(l, d);\n // Ext_SurfaceFunction8(l, d);\n // Ext_SurfaceFunction9(l, d);\n\t\t // Ext_SurfaceFunction10(l, d);\n // Ext_SurfaceFunction11(l, d);\n // Ext_SurfaceFunction12(l, d);\n // Ext_SurfaceFunction13(l, d);\n // Ext_SurfaceFunction14(l, d);\n // Ext_SurfaceFunction15(l, d);\n // Ext_SurfaceFunction16(l, d);\n // Ext_SurfaceFunction17(l, d);\n // Ext_SurfaceFunction18(l, d);\n\t\t // Ext_SurfaceFunction19(l, d);\n // Ext_SurfaceFunction20(l, d);\n // Ext_SurfaceFunction21(l, d);\n // Ext_SurfaceFunction22(l, d);\n // Ext_SurfaceFunction23(l, d);\n // Ext_SurfaceFunction24(l, d);\n // Ext_SurfaceFunction25(l, d);\n // Ext_SurfaceFunction26(l, d);\n // Ext_SurfaceFunction27(l, d);\n // Ext_SurfaceFunction28(l, d);\n\t\t // Ext_SurfaceFunction29(l, d);\n }\n\n#if !_DECALSHADER\n\n void ChainModifyVertex(inout VertexData v, inout VertexToPixel v2p, float4 time)\n {\n ExtraV2F d;\n \n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n // due to motion vectors in HDRP, we need to use the last\n // time in certain spots. So if you are going to use _Time to adjust vertices,\n // you need to use this time or motion vectors will break. \n d.time = time;\n\n // Ext_ModifyVertex0(v, d);\n // Ext_ModifyVertex1(v, d);\n // Ext_ModifyVertex2(v, d);\n // Ext_ModifyVertex3(v, d);\n // Ext_ModifyVertex4(v, d);\n // Ext_ModifyVertex5(v, d);\n // Ext_ModifyVertex6(v, d);\n // Ext_ModifyVertex7(v, d);\n // Ext_ModifyVertex8(v, d);\n // Ext_ModifyVertex9(v, d);\n // Ext_ModifyVertex10(v, d);\n // Ext_ModifyVertex11(v, d);\n // Ext_ModifyVertex12(v, d);\n // Ext_ModifyVertex13(v, d);\n // Ext_ModifyVertex14(v, d);\n // Ext_ModifyVertex15(v, d);\n // Ext_ModifyVertex16(v, d);\n // Ext_ModifyVertex17(v, d);\n // Ext_ModifyVertex18(v, d);\n // Ext_ModifyVertex19(v, d);\n // Ext_ModifyVertex20(v, d);\n // Ext_ModifyVertex21(v, d);\n // Ext_ModifyVertex22(v, d);\n // Ext_ModifyVertex23(v, d);\n // Ext_ModifyVertex24(v, d);\n // Ext_ModifyVertex25(v, d);\n // Ext_ModifyVertex26(v, d);\n // Ext_ModifyVertex27(v, d);\n // Ext_ModifyVertex28(v, d);\n // Ext_ModifyVertex29(v, d);\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainModifyTessellatedVertex(inout VertexData v, inout VertexToPixel v2p)\n {\n ExtraV2F d;\n ZERO_INITIALIZE(ExtraV2F, d);\n ZERO_INITIALIZE(Blackboard, d.blackboard);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = v2p.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = v2p.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = v2p.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = v2p.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = v2p.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = v2p.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = v2p.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = v2p.extraV2F7;\n // #endif\n\n\n // Ext_ModifyTessellatedVertex0(v, d);\n // Ext_ModifyTessellatedVertex1(v, d);\n // Ext_ModifyTessellatedVertex2(v, d);\n // Ext_ModifyTessellatedVertex3(v, d);\n // Ext_ModifyTessellatedVertex4(v, d);\n // Ext_ModifyTessellatedVertex5(v, d);\n // Ext_ModifyTessellatedVertex6(v, d);\n // Ext_ModifyTessellatedVertex7(v, d);\n // Ext_ModifyTessellatedVertex8(v, d);\n // Ext_ModifyTessellatedVertex9(v, d);\n // Ext_ModifyTessellatedVertex10(v, d);\n // Ext_ModifyTessellatedVertex11(v, d);\n // Ext_ModifyTessellatedVertex12(v, d);\n // Ext_ModifyTessellatedVertex13(v, d);\n // Ext_ModifyTessellatedVertex14(v, d);\n // Ext_ModifyTessellatedVertex15(v, d);\n // Ext_ModifyTessellatedVertex16(v, d);\n // Ext_ModifyTessellatedVertex17(v, d);\n // Ext_ModifyTessellatedVertex18(v, d);\n // Ext_ModifyTessellatedVertex19(v, d);\n // Ext_ModifyTessellatedVertex20(v, d);\n // Ext_ModifyTessellatedVertex21(v, d);\n // Ext_ModifyTessellatedVertex22(v, d);\n // Ext_ModifyTessellatedVertex23(v, d);\n // Ext_ModifyTessellatedVertex24(v, d);\n // Ext_ModifyTessellatedVertex25(v, d);\n // Ext_ModifyTessellatedVertex26(v, d);\n // Ext_ModifyTessellatedVertex27(v, d);\n // Ext_ModifyTessellatedVertex28(v, d);\n // Ext_ModifyTessellatedVertex29(v, d);\n\n // #if %EXTRAV2F0REQUIREKEY%\n // v2p.extraV2F0 = d.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // v2p.extraV2F1 = d.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // v2p.extraV2F2 = d.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // v2p.extraV2F3 = d.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // v2p.extraV2F4 = d.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // v2p.extraV2F5 = d.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // v2p.extraV2F6 = d.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // v2p.extraV2F7 = d.extraV2F7;\n // #endif\n }\n\n void ChainFinalColorForward(inout Surface l, inout ShaderData d, inout half4 color)\n {\n // Ext_FinalColorForward0(l, d, color);\n // Ext_FinalColorForward1(l, d, color);\n // Ext_FinalColorForward2(l, d, color);\n // Ext_FinalColorForward3(l, d, color);\n // Ext_FinalColorForward4(l, d, color);\n // Ext_FinalColorForward5(l, d, color);\n // Ext_FinalColorForward6(l, d, color);\n // Ext_FinalColorForward7(l, d, color);\n // Ext_FinalColorForward8(l, d, color);\n // Ext_FinalColorForward9(l, d, color);\n // Ext_FinalColorForward10(l, d, color);\n // Ext_FinalColorForward11(l, d, color);\n // Ext_FinalColorForward12(l, d, color);\n // Ext_FinalColorForward13(l, d, color);\n // Ext_FinalColorForward14(l, d, color);\n // Ext_FinalColorForward15(l, d, color);\n // Ext_FinalColorForward16(l, d, color);\n // Ext_FinalColorForward17(l, d, color);\n // Ext_FinalColorForward18(l, d, color);\n // Ext_FinalColorForward19(l, d, color);\n // Ext_FinalColorForward20(l, d, color);\n // Ext_FinalColorForward21(l, d, color);\n // Ext_FinalColorForward22(l, d, color);\n // Ext_FinalColorForward23(l, d, color);\n // Ext_FinalColorForward24(l, d, color);\n // Ext_FinalColorForward25(l, d, color);\n // Ext_FinalColorForward26(l, d, color);\n // Ext_FinalColorForward27(l, d, color);\n // Ext_FinalColorForward28(l, d, color);\n // Ext_FinalColorForward29(l, d, color);\n }\n\n void ChainFinalGBufferStandard(inout Surface s, inout ShaderData d, inout half4 GBuffer0, inout half4 GBuffer1, inout half4 GBuffer2, inout half4 outEmission, inout half4 outShadowMask)\n {\n // Ext_FinalGBufferStandard0(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard1(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard2(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard3(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard4(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard5(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard6(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard7(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard8(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard9(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard10(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard11(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard12(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard13(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard14(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard15(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard16(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard17(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard18(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard19(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard20(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard21(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard22(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard23(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard24(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard25(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard26(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard27(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard28(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n // Ext_FinalGBufferStandard29(s, d, GBuffer0, GBuffer1, GBuffer2, outEmission, outShadowMask);\n }\n#endif\n\n\n \n\n\n#if _DECALSHADER\n\n ShaderData CreateShaderData(SurfaceDescriptionInputs IN)\n {\n ShaderData d = (ShaderData)0;\n d.TBNMatrix = float3x3(IN.WorldSpaceTangent, IN.WorldSpaceBiTangent, IN.WorldSpaceNormal);\n d.worldSpaceNormal = IN.WorldSpaceNormal;\n d.worldSpaceTangent = IN.WorldSpaceTangent;\n\n d.worldSpacePosition = IN.WorldSpacePosition;\n d.texcoord0 = IN.uv0.xyxy;\n d.screenPos = IN.ScreenPosition;\n\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - d.worldSpacePosition);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(d.worldSpacePosition), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(d.worldSpacePosition, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, d.worldSpaceTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenUV = (IN.ScreenPosition.xy / max(0.01, IN.ScreenPosition.w));\n // #endif\n\n return d;\n }\n#else\n\n ShaderData CreateShaderData(VertexToPixel i\n #if NEED_FACING\n , bool facing\n #endif\n )\n {\n ShaderData d = (ShaderData)0;\n d.clipPos = i.pos;\n d.worldSpacePosition = i.worldPos;\n\n d.worldSpaceNormal = normalize(i.worldNormal);\n d.worldSpaceTangent = normalize(i.worldTangent.xyz);\n d.tangentSign = i.worldTangent.w;\n float3 bitangent = cross(i.worldTangent.xyz, i.worldNormal) * d.tangentSign * -1;\n \n\n d.TBNMatrix = float3x3(d.worldSpaceTangent, bitangent, d.worldSpaceNormal);\n d.worldSpaceViewDir = normalize(_WorldSpaceCameraPos - i.worldPos);\n\n d.tangentSpaceViewDir = mul(d.TBNMatrix, d.worldSpaceViewDir);\n d.texcoord0 = i.texcoord0;\n // d.texcoord1 = i.texcoord1;\n // d.texcoord2 = i.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // d.texcoord3 = i.texcoord3;\n // #endif\n\n d.isFrontFace = facing;\n // #if %VERTEXCOLORREQUIREKEY%\n // d.vertexColor = i.vertexColor;\n // #endif\n\n // these rarely get used, so we back transform them. Usually will be stripped.\n #if _HDRP\n // d.localSpacePosition = mul(unity_WorldToObject, float4(GetCameraRelativePositionWS(i.worldPos), 1)).xyz;\n #else\n // d.localSpacePosition = mul(unity_WorldToObject, float4(i.worldPos, 1)).xyz;\n #endif\n // d.localSpaceNormal = normalize(mul((float3x3)unity_WorldToObject, i.worldNormal));\n // d.localSpaceTangent = normalize(mul((float3x3)unity_WorldToObject, i.worldTangent.xyz));\n\n // #if %SCREENPOSREQUIREKEY%\n // d.screenPos = i.screenPos;\n // d.screenUV = (i.screenPos.xy / i.screenPos.w);\n // #endif\n\n\n // #if %EXTRAV2F0REQUIREKEY%\n // d.extraV2F0 = i.extraV2F0;\n // #endif\n\n // #if %EXTRAV2F1REQUIREKEY%\n // d.extraV2F1 = i.extraV2F1;\n // #endif\n\n // #if %EXTRAV2F2REQUIREKEY%\n // d.extraV2F2 = i.extraV2F2;\n // #endif\n\n // #if %EXTRAV2F3REQUIREKEY%\n // d.extraV2F3 = i.extraV2F3;\n // #endif\n\n // #if %EXTRAV2F4REQUIREKEY%\n // d.extraV2F4 = i.extraV2F4;\n // #endif\n\n // #if %EXTRAV2F5REQUIREKEY%\n // d.extraV2F5 = i.extraV2F5;\n // #endif\n\n // #if %EXTRAV2F6REQUIREKEY%\n // d.extraV2F6 = i.extraV2F6;\n // #endif\n\n // #if %EXTRAV2F7REQUIREKEY%\n // d.extraV2F7 = i.extraV2F7;\n // #endif\n\n return d;\n }\n\n#endif\n\n \n #if _PASSSHADOW\n float3 _LightDirection;\n #endif\n\n // vertex shader\n VertexToPixel Vert (VertexData v)\n {\n \n VertexToPixel o = (VertexToPixel)0;\n\n UNITY_SETUP_INSTANCE_ID(v);\n UNITY_TRANSFER_INSTANCE_ID(v, o);\n UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);\n\n\n#if !_TESSELLATION_ON\n ChainModifyVertex(v, o, _Time);\n#endif\n\n o.texcoord0 = v.texcoord0;\n // o.texcoord1 = v.texcoord1;\n // o.texcoord2 = v.texcoord2;\n\n // #if %TEXCOORD3REQUIREKEY%\n // o.texcoord3 = v.texcoord3;\n // #endif\n\n // #if %VERTEXCOLORREQUIREKEY%\n // o.vertexColor = v.vertexColor;\n // #endif\n \n VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);\n o.worldPos = TransformObjectToWorld(v.vertex.xyz);\n o.worldNormal = TransformObjectToWorldNormal(v.normal);\n o.worldTangent = float4(TransformObjectToWorldDir(v.tangent.xyz), v.tangent.w);\n\n\n #if _PASSSHADOW\n // Define shadow pass specific clip position for Universal\n o.pos = TransformWorldToHClip(ApplyShadowBias(o.worldPos, o.worldNormal, _LightDirection));\n #if UNITY_REVERSED_Z\n o.pos.z = min(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #else\n o.pos.z = max(o.pos.z, o.pos.w * UNITY_NEAR_CLIP_VALUE);\n #endif\n #elif _PASSMETA\n o.pos = MetaVertexPosition(float4(v.vertex.xyz, 0), v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST);\n #else\n o.pos = TransformWorldToHClip(o.worldPos);\n #endif\n\n\n // #if %SCREENPOSREQUIREKEY%\n // o.screenPos = ComputeScreenPos(o.pos, _ProjectionParams.x);\n // #endif\n\n #if _PASSFORWARD || _PASSGBUFFER\n float2 uv1 = v.texcoord1.xy;\n OUTPUT_LIGHTMAP_UV(uv1, unity_LightmapST, o.lightmapUV);\n // o.texcoord1.xy = uv1;\n OUTPUT_SH(o.worldNormal, o.sh);\n #endif\n\n #ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT\n #if _BAKEDLIT\n half3 vertexLight = 0;\n #else\n half3 vertexLight = VertexLighting(o.worldPos, o.worldNormal);\n #endif\n half fogFactor = ComputeFogFactor(o.pos.z);\n o.fogFactorAndVertexLight = half4(fogFactor, vertexLight);\n #endif\n\n #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)\n o.shadowCoord = GetShadowCoord(vertexInput);\n #endif\n\n return o;\n }\n\n\n \n\n // fragment shader\n half4 Frag (VertexToPixel IN\n #ifdef _DEPTHOFFSET_ON\n , out float outputDepth : SV_Depth\n #endif\n #if NEED_FACING\n , bool facing : SV_IsFrontFace\n #endif\n ) : SV_Target\n {\n UNITY_SETUP_INSTANCE_ID(IN);\n UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);\n\n ShaderData d = CreateShaderData(IN\n #if NEED_FACING\n , facing\n #endif\n );\n Surface l = (Surface)0;\n\n #ifdef _DEPTHOFFSET_ON\n l.outputDepth = outputDepth;\n #endif\n\n l.Albedo = half3(0.5, 0.5, 0.5);\n l.Normal = float3(0,0,1);\n l.Occlusion = 1;\n l.Alpha = 1;\n\n ChainSurfaceFunction(l, d);\n\n #ifdef _DEPTHOFFSET_ON\n outputDepth = l.outputDepth;\n #endif\n\n return float4(PackNormalOctRectEncode(TransformWorldToViewDir(d.worldSpaceNormal, true)), 0.0, 0.0);\n\n }\n\n ENDHLSL\n\n }\n\n\n \n\n\n \n\n }\n \n \n \n}\n"}],"betterShader":{"fileID":-6465566751694194690,"guid":"b498c9514de2c6849b9f2561db4570d2","type":3},"betterShaderPath":"Assets/UMA/CompositingShaders/DiffuseNormalMetallic_Compositer.surfshader","optionOverrides":{"shaderName":"","useCustomEditor":false,"customEditor":"","fallback":{"instanceID":0}}}} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/CompositingShaders/DiffuseNormalMetallic_Compositer_ShadePack.umaShaderPack.meta b/UMAProject/Assets/UMA/CompositingShaders/DiffuseNormalMetallic_Compositer_ShadePack.umaShaderPack.meta new file mode 100644 index 000000000..12f833689 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/DiffuseNormalMetallic_Compositer_ShadePack.umaShaderPack.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: cca0fdc349e2c1a4994ad9763f1d6258 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 432996ca1b2bd36408bd150d34f9b6ca, type: 3} diff --git a/UMAProject/Assets/UMA/CompositingShaders/ShaderPackager-main/Examples.meta b/UMAProject/Assets/UMA/CompositingShaders/ShaderPackager-main/Examples.meta new file mode 100644 index 000000000..662b56b24 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/ShaderPackager-main/Examples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 906b077ed282f514cba202faa8e9a0d4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/CompositingShaders/ShaderPackager-main/Scripts/Editor/ShaderPackageImporterEditor.cs b/UMAProject/Assets/UMA/CompositingShaders/ShaderPackager-main/Scripts/Editor/ShaderPackageImporterEditor.cs new file mode 100644 index 000000000..6c69ccdd6 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/ShaderPackager-main/Scripts/Editor/ShaderPackageImporterEditor.cs @@ -0,0 +1,155 @@ +////////////////////////////////////////////////////// +// Shader Packager +// Copyright (c)2021 Jason Booth +////////////////////////////////////////////////////// + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UMA.ShaderPackager; +#if UNITY_2020_2_OR_NEWER +using UnityEditor.AssetImporters; +#else +using UnityEditor.Experimental.AssetImporters; +#endif +using System.IO; + + +namespace JBooth.ShaderPackager +{ + [CustomEditor(typeof(ShaderPackageImporter))] + [CanEditMultipleObjects] + public class ShaderPackageImporterEditor : ScriptedImporterEditor + { + SerializedProperty m_autoUpdate; + SerializedProperty m_entryProperties; +#if __BETTERSHADERS__ + SerializedProperty m_betterShader; + SerializedProperty m_optionOverrides; +#endif + + // override extraDataType to return the type that will be used in the Editor. + protected override System.Type extraDataType => typeof(ShaderPackage); + + // override InitializeExtraDataInstance to set up the data. + protected override void InitializeExtraDataInstance(Object extraTarget, int targetIndex) + { + var stack = (ShaderPackage)extraTarget; + + string fileContent = File.ReadAllText(((AssetImporter)targets[targetIndex]).assetPath); + EditorJsonUtility.FromJsonOverwrite(fileContent, stack); + } + + protected override void Apply() + { + base.Apply(); + // After the Importer is applied, rewrite the file with the custom value. + for (int i = 0; i < targets.Length; i++) + { + string path = ((AssetImporter)targets[i]).assetPath; + File.WriteAllText(path, EditorJsonUtility.ToJson((ShaderPackage)extraDataTargets[i])); + } + } + + public override void OnEnable() + { + base.OnEnable(); + // In OnEnable, retrieve the importerUserSerializedObject property and store it. + m_entryProperties = extraDataSerializedObject.FindProperty("entries"); +#if __BETTERSHADERS__ + m_betterShader = extraDataSerializedObject.FindProperty("betterShader"); + m_optionOverrides = extraDataSerializedObject.FindProperty("optionOverrides"); +#endif + } + + public override void OnInspectorGUI() + { + extraDataSerializedObject.Update(); + ShaderPackage sp = extraDataSerializedObject.targetObject as ShaderPackage; +#if __BETTERSHADERS__ + EditorGUILayout.PropertyField(m_betterShader); + EditorGUILayout.PropertyField(m_optionOverrides); +#endif + EditorGUILayout.PropertyField(m_entryProperties); + + if ((typeof(ShaderPackage).Namespace == "JBooth.ShaderPackager") || + ShaderPackageImporter.k_FileExtension == ".shaderpack") + { + EditorGUILayout.HelpBox("Warning: You must change the namespace and extension!", MessageType.Error); + } + + if (GUILayout.Button("Pack")) + { + sp.Pack(true); + } + if (GUILayout.Button("Pack all in Project")) + { + var guids = AssetDatabase.FindAssets("t:Shader"); + List shaders = new List(); + for (int i = 0; i < guids.Length; ++i) + { + var path = AssetDatabase.GUIDToAssetPath(guids[i]); + if (path.EndsWith(ShaderPackageImporter.k_FileExtension)) + { + shaders.Add(path); + } + } + + for (int i = 0; i < shaders.Count; ++i) + { + var path = shaders[i]; + EditorUtility.DisplayProgressBar("Packing Shaders", Path.GetFileName(path), (float)i/shaders.Count); + try + { + ShaderPackage packed = ShaderPackage.CreateInstance(); + UnityEditor.EditorJsonUtility.FromJsonOverwrite(File.ReadAllText(path), packed); + packed.Pack(true); + File.WriteAllText(path, EditorJsonUtility.ToJson(packed)); + EditorUtility.SetDirty(packed); + AssetDatabase.SaveAssets(); + AssetDatabase.ImportAsset(path); + + } + catch + { + EditorUtility.ClearProgressBar(); + } + } + EditorUtility.ClearProgressBar(); + } + + extraDataSerializedObject.ApplyModifiedProperties(); + + ApplyRevertGUI(); + } + + + [MenuItem("Assets/Create/Shader Package", priority = 300)] + static void CreateMenuItemShaderPackage() + { + string directoryPath = "Assets"; + foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets)) + { + directoryPath = AssetDatabase.GetAssetPath(obj); + if (!string.IsNullOrEmpty(directoryPath) && File.Exists(directoryPath)) + { + directoryPath = Path.GetDirectoryName(directoryPath); + break; + } + } + directoryPath = directoryPath.Replace("\\", "/"); + if (directoryPath.Length > 0 && directoryPath[directoryPath.Length - 1] != '/') + directoryPath += "/"; + if (string.IsNullOrEmpty(directoryPath)) + directoryPath = "Assets/"; + + var fileName = string.Format("New ShaderPackage{0}", ShaderPackageImporter.k_FileExtension); + directoryPath = AssetDatabase.GenerateUniqueAssetPath(directoryPath + fileName); + var content = ScriptableObject.CreateInstance(); + File.WriteAllText(directoryPath, EditorJsonUtility.ToJson(content)); + AssetDatabase.Refresh(); + } + } + +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/CompositingShaders/ShaderPackager-main/Scripts/Editor/ShaderPackageImporterEditor.cs.meta b/UMAProject/Assets/UMA/CompositingShaders/ShaderPackager-main/Scripts/Editor/ShaderPackageImporterEditor.cs.meta new file mode 100644 index 000000000..aa0479651 --- /dev/null +++ b/UMAProject/Assets/UMA/CompositingShaders/ShaderPackager-main/Scripts/Editor/ShaderPackageImporterEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 019a594d1421fc84e91aafcfd10b8fec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Content/Contrib/Male_ShavedHead/Cap_Shadow_Screen.asset b/UMAProject/Assets/UMA/Content/Contrib/Male_ShavedHead/Cap_Shadow_Screen.asset new file mode 100644 index 000000000..07fc30827 Binary files /dev/null and b/UMAProject/Assets/UMA/Content/Contrib/Male_ShavedHead/Cap_Shadow_Screen.asset differ diff --git a/UMAProject/Assets/UMA/Content/Contrib/Male_ShavedHead/Cap_Shadow_Screen.asset.meta b/UMAProject/Assets/UMA/Content/Contrib/Male_ShavedHead/Cap_Shadow_Screen.asset.meta new file mode 100644 index 000000000..a46aa59c4 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Contrib/Male_ShavedHead/Cap_Shadow_Screen.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 272762530ca48c247be4e873086851d9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided.asset b/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided.asset index abb88ef93..a8effda50 100644 --- a/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided.asset +++ b/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided.asset @@ -13,10 +13,11 @@ MonoBehaviour: m_Name: UMA_Mesh_Hair_DoubleSided m_EditorClassIdentifier: translateSRP: 1 - material: {fileID: 2100000, guid: dfa6f3056d5614f40998ac56a797d454, type: 2} - materialType: 1 + material: {fileID: 2100000, guid: 8146edb8bb821c34f956f820090a2adb, type: 2} + secondPass: {fileID: 2100000, guid: 9cbdf960da83ce848b6fa53141ca2fe7, type: 2} + materialType: 8 channels: - - channelType: 4 + - channelType: 3 textureFormat: 0 materialPropertyName: _MainTex sourceTextureName: @@ -24,7 +25,7 @@ MonoBehaviour: DownSample: 0 ConvertRenderTexture: 0 NonShaderTexture: 0 - - channelType: 1 + - channelType: 3 textureFormat: 0 materialPropertyName: _BumpMap sourceTextureName: @@ -32,11 +33,21 @@ MonoBehaviour: DownSample: 0 ConvertRenderTexture: 0 NonShaderTexture: 0 + - channelType: 3 + textureFormat: 0 + materialPropertyName: _MetallicGlossMap + sourceTextureName: + Compression: 0 + DownSample: 0 + ConvertRenderTexture: 0 + NonShaderTexture: 0 MipMapBias: 0 AnisoLevel: 1 MatFilterMode: 1 Compression: 0 - shaderParms: [] + shaderParms: + - ParameterName: _Color + ColorName: Hair MaskWithCurrentColor: 1 maskMultiplier: {r: 0.3773585, g: 0.3773585, b: 0.3773585, a: 1} MaterialName: diff --git a/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Alpha.mat b/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Alpha.mat new file mode 100644 index 000000000..82eb61e7f --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Alpha.mat @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: UMA_Mesh_Hair_DoubleSided_Alpha + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHABLEND_ON _EMISSION _NORMALMAP + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: a09fa58420b231548b33e51650f78ef2, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: d6d3ad9ff24a3154ca46eae0f69fdeb6, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _texcoord: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 0.35 + - _BumpStrength: 0.344 + - _Cutoff: 0.65 + - _DetailNormalMapScale: 1 + - _DstBlend: 10 + - _FadeFactor: 2 + - _GlossMapScale: 1 + - _Glossiness: 0.334 + - _GlossyReflections: 1 + - _MaskClipValue: 0.561 + - _Metallic: 0.686 + - _MetallicAdd: 0.306 + - _MetallicStrength: 0 + - _Mode: 2 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _Richness: 0.721 + - _SmoothnessAdd: 0.303 + - _SmoothnessStrength: 0 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 5 + - _UVSec: 0 + - _ZWrite: 0 + - __dirty: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _HairTint: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Alpha.mat.meta b/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Alpha.mat.meta new file mode 100644 index 000000000..beb6e8de1 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Alpha.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9cbdf960da83ce848b6fa53141ca2fe7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Cutout.mat b/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Cutout.mat new file mode 100644 index 000000000..499014c8c --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Cutout.mat @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: UMA_Mesh_Hair_DoubleSided_Cutout + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHATEST_ON _EMISSION _NORMALMAP + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2450 + stringTagMap: + RenderType: TransparentCutout + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: a09fa58420b231548b33e51650f78ef2, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 13391af2af9819a4fa765171eb48a4f4, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _texcoord: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 0.35 + - _BumpStrength: 0.344 + - _Cutoff: 0.65 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _FadeFactor: 2 + - _GlossMapScale: 1 + - _Glossiness: 0.334 + - _GlossyReflections: 1 + - _MaskClipValue: 0.561 + - _Metallic: 0.686 + - _MetallicAdd: 0.306 + - _MetallicStrength: 0 + - _Mode: 1 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _Richness: 0.721 + - _SmoothnessAdd: 0.303 + - _SmoothnessStrength: 0 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + - __dirty: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _HairTint: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Cutout.mat.meta b/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Cutout.mat.meta new file mode 100644 index 000000000..835a658e5 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Contrib/Materials/UMA_Mesh_Hair_DoubleSided_Cutout.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8146edb8bb821c34f956f820090a2adb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Content/Core/HumanFemale/DNA/HumanFemaleDNAConverterController_Bare.asset b/UMAProject/Assets/UMA/Content/Core/HumanFemale/DNA/HumanFemaleDNAConverterController_Bare.asset new file mode 100644 index 000000000..45e0316a4 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Core/HumanFemale/DNA/HumanFemaleDNAConverterController_Bare.asset @@ -0,0 +1,13572 @@ +%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: 56c6edb17218abd469257d07a2bc5559, type: 3} + m_Name: HumanFemaleDNAConverterController_Bare + m_EditorClassIdentifier: + _dnaAsset: {fileID: 11400000, guid: a1502ce9ef533aa42a647fe4052e15f8, type: 2} + _plugins: + - {fileID: 114705533353492140} + _overallModifiers: + _adjustScale: 0 + _adjustHeight: 0 + _adjustRadius: 0 + _adjustMass: 0 + _updateBounds: 0 + _tightenBounds: 1 + _adjustBounds: 0 + _scale: 0.81 + _bone: Position + _scaleBoneHash: -1084586333 + _headRatio: 7.5 + _radiusAdjustY: 0.015 + _radiusAdjust: {x: 0.25, y: 0} + _massAdjust: {x: 42, y: 28, z: 22} + _boundsAdjust: {x: -0.36, y: 0.09, z: 0} + _displayValue: +--- !u!114 &114705533353492140 +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: 0bb2689319b4d5a418829cf43a059e3a, type: 3} + m_Name: SkeletonDNAConverters + m_EditorClassIdentifier: + masterWeight: + _masterWeightType: 0 + _globalWeight: 1 + _DNAForWeight: + _calcOption: 0 + _dnaName: + _dnaNameHash: 0 + _evaluator: + _name: Raw + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0.5 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _converterController: {fileID: 11400000} + _skeletonModifiers: + - _hashName: HeadAdjust + _hash: -423229038 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 1 + _max: 1 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: headWidth + _dnaNameHash: -1394340122 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.3 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 1.6 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 1 + _max: 1 + _umaDNA: + dnaTypeHash: 0 + - _hashName: NeckAdjust + _hash: 1605701185 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: neckThickness + _dnaNameHash: -1589207448 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.8 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 1.6 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: neckThickness + _dnaNameHash: -1589207448 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 1.6 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftOuterBreast + _hash: 361754685 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastSize + _dnaNameHash: -1437215794 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.5 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.6 + _max: 1.5 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastSize + _dnaNameHash: -1437215794 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.5 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.1 + _initialized: 1 + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.4 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.6 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastSize + _dnaNameHash: -1437215794 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.5 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.1 + _initialized: 1 + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.4 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.6 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightOuterBreast + _hash: -1043063424 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastSize + _dnaNameHash: -1437215794 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.5 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.6 + _max: 1.5 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastSize + _dnaNameHash: -1437215794 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.5 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.1 + _initialized: 1 + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.4 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.6 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastSize + _dnaNameHash: -1437215794 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.5 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.1 + _initialized: 1 + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.4 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.6 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftEye + _hash: 27653119 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: eyeSize + _dnaNameHash: 1336626240 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.3 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.7 + _max: 1.4 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: eyeSize + _dnaNameHash: 1336626240 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.3 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.7 + _max: 1.4 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: eyeSize + _dnaNameHash: 1336626240 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.3 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.7 + _max: 1.4 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightEye + _hash: -2120937982 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: eyeSize + _dnaNameHash: 1336626240 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.3 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.7 + _max: 1.4 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: eyeSize + _dnaNameHash: 1336626240 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.3 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.7 + _max: 1.4 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: eyeSize + _dnaNameHash: 1336626240 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.3 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.7 + _max: 1.4 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftEyeAdjust + _hash: -595031702 + _property: 1 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: eyeRotation + _dnaNameHash: -477838111 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 20 + _initialized: 1 + _aggregationMethod: 1 + _min: -360 + _max: 360 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0 + _max: 0 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0 + _max: 0 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightEyeAdjust + _hash: -734071712 + _property: 1 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 1 + _dnaName: eyeRotation + _dnaNameHash: -477838111 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 20 + _initialized: 1 + _aggregationMethod: 1 + _min: -360 + _max: 360 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0 + _max: 0 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0 + _max: 0 + _umaDNA: + dnaTypeHash: 0 + - _hashName: Spine1Adjust + _hash: 473121629 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.1 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.1 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.1 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.25 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.85 + _max: 1 + _umaDNA: + dnaTypeHash: 0 + - _hashName: SpineAdjust + _hash: 1842365421 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.25 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.25 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.85 + _max: 1.35 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.25 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.25 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.85 + _max: 1.45 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LowerBackBelly + _hash: -1421416706 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: belly + _dnaNameHash: -2005660810 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.75 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 1.75 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: waist + _dnaNameHash: 439759899 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.75 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 1.75 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: belly + _dnaNameHash: -2005660810 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 3 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 3 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LowerBackAdjust + _hash: -1471957022 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.25 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.85 + _max: 1.5 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.25 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.85 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.25 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.85 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftTrapezius + _hash: -1320475381 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.35 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.35 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.35 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightTrapezius + _hash: -1174579199 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.35 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.35 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.35 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftArmAdjust + _hash: -270431657 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: armWidth + _dnaNameHash: 1023885308 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.65 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: armWidth + _dnaNameHash: 1023885308 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.65 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightArmAdjust + _hash: -413665443 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: armWidth + _dnaNameHash: 1023885308 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.65 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: armWidth + _dnaNameHash: 1023885308 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.65 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftForeArmAdjust + _hash: 923803339 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmWidth + _dnaNameHash: -1006953310 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmWidth + _dnaNameHash: -1006953310 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightForeArmAdjust + _hash: -1195342688 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmWidth + _dnaNameHash: -1006953310 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmWidth + _dnaNameHash: -1006953310 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftForeArmTwistAdjust + _hash: 547566030 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmWidth + _dnaNameHash: -1006953310 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmWidth + _dnaNameHash: -1006953310 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightForeArmTwistAdjust + _hash: 758040550 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmWidth + _dnaNameHash: -1006953310 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmWidth + _dnaNameHash: -1006953310 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftShoulderAdjust + _hash: -1372013129 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.55 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.55 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightShoulderAdjust + _hash: 1960302077 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.55 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperWeight + _dnaNameHash: -1337485543 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.55 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.25 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftUpLegAdjust + _hash: 898137571 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerMuscle + _dnaNameHash: 602183253 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.45 + _max: 1.35 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerMuscle + _dnaNameHash: 602183253 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.45 + _max: 1.35 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightUpLegAdjust + _hash: -506228642 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerMuscle + _dnaNameHash: 602183253 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.45 + _max: 1.35 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.65 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerMuscle + _dnaNameHash: 602183253 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.45 + _max: 1.35 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftLegAdjust + _hash: -861926788 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerMuscle + _dnaNameHash: 602183253 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.95 + _initialized: 1 + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.45 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerMuscle + _dnaNameHash: 602183253 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.75 + _initialized: 1 + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.45 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightLegAdjust + _hash: -1005160586 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.6 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerMuscle + _dnaNameHash: 602183253 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.95 + _initialized: 1 + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.45 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerMuscle + _dnaNameHash: 602183253 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.75 + _initialized: 1 + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.45 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftGluteus + _hash: 2044062440 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: gluteusSize + _dnaNameHash: 20512318 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.25 + _max: 2.35 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: gluteusSize + _dnaNameHash: 20512318 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.25 + _max: 2.35 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: gluteusSize + _dnaNameHash: 20512318 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.25 + _max: 2.35 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightGluteus + _hash: -2110033470 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: gluteusSize + _dnaNameHash: 20512318 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.25 + _max: 2.35 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: gluteusSize + _dnaNameHash: 20512318 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.25 + _max: 2.35 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: gluteusSize + _dnaNameHash: 20512318 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.25 + _max: 2.35 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftEarAdjust + _hash: -777059916 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: earsSize + _dnaNameHash: 1590056058 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.5 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: earsSize + _dnaNameHash: 1590056058 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: earsSize + _dnaNameHash: 1590056058 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightEarAdjust + _hash: -652641090 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: earsSize + _dnaNameHash: 1590056058 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.5 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: earsSize + _dnaNameHash: 1590056058 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: earsSize + _dnaNameHash: 1590056058 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftEarAdjust + _hash: -777059916 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: headWidth + _dnaNameHash: -1394340122 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.01 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.01 + _max: 0.01 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: headWidth + _dnaNameHash: -1394340122 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.03 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.03 + _max: 0.03 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: earsPosition + _dnaNameHash: -1147901968 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.02 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.02 + _max: 0.02 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightEarAdjust + _hash: -652641090 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: headWidth + _dnaNameHash: -1394340122 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.01 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.01 + _max: 0.01 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: headWidth + _dnaNameHash: -1394340122 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.03 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.03 + _max: 0.03 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: earsPosition + _dnaNameHash: -1147901968 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.02 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.02 + _max: 0.02 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftEarAdjust + _hash: -777059916 + _property: 1 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -30 + _max: 80 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -30 + _max: 80 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: earsRotation + _dnaNameHash: -725345292 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 40 + _initialized: 1 + _aggregationMethod: 1 + _min: -15 + _max: 40 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightEarAdjust + _hash: -652641090 + _property: 1 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -30 + _max: 80 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -30 + _max: 80 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: earsRotation + _dnaNameHash: -725345292 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -40 + _initialized: 1 + _aggregationMethod: 1 + _min: -40 + _max: 15 + _umaDNA: + dnaTypeHash: 0 + - _hashName: NoseBaseAdjust + _hash: -685367200 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: noseSize + _dnaNameHash: 2003796726 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.5 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.25 + _max: 3 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: noseSize + _dnaNameHash: 2003796726 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 0 + _dnaName: noseWidth + _dnaNameHash: 1965241830 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.25 + _max: 3 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: noseSize + _dnaNameHash: 2003796726 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 0 + _dnaName: noseFlatten + _dnaNameHash: -512297083 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.75 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.25 + _max: 3 + _umaDNA: + dnaTypeHash: 0 + - _hashName: NoseMiddleAdjust + _hash: -1907186538 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: noseCurve + _dnaNameHash: -1365234306 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.5 + _initialized: 1 + - _calcOption: 0 + _dnaName: noseSize + _dnaNameHash: 2003796726 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 3 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: noseCurve + _dnaNameHash: -1365234306 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 0 + _dnaName: noseSize + _dnaNameHash: 2003796726 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.25 + _initialized: 1 + - _calcOption: 0 + _dnaName: noseWidth + _dnaNameHash: 1965241830 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.5 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 3 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: noseCurve + _dnaNameHash: -1365234306 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 0 + _dnaName: noseSize + _dnaNameHash: 2003796726 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 3 + _umaDNA: + dnaTypeHash: 0 + - _hashName: NoseBaseAdjust + _hash: -685367200 + _property: 1 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -30 + _max: 80 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: noseInclination + _dnaNameHash: -164646798 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 60 + _initialized: 1 + _aggregationMethod: 1 + _min: -60 + _max: 30 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -30 + _max: 80 + _umaDNA: + dnaTypeHash: 0 + - _hashName: NoseBaseAdjust + _hash: -685367200 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: nosePronounced + _dnaNameHash: 1938239509 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.025 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.025 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: nosePosition + _dnaNameHash: -1469532099 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.025 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.025 + _umaDNA: + dnaTypeHash: 0 + - _hashName: NoseMiddleAdjust + _hash: -1907186538 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: nosePronounced + _dnaNameHash: 1938239509 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.012 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.012 + _max: 0.012 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: nosePosition + _dnaNameHash: -1469532099 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.015 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.015 + _max: 0.015 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftNoseAdjust + _hash: 623523856 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: nosePronounced + _dnaNameHash: 1938239509 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.025 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.025 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: nosePosition + _dnaNameHash: -1469532099 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.025 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.025 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightNoseAdjust + _hash: -973641869 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: nosePronounced + _dnaNameHash: 1938239509 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.025 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.025 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: nosePosition + _dnaNameHash: -1469532099 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.025 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.025 + _umaDNA: + dnaTypeHash: 0 + - _hashName: UpperLipsAdjust + _hash: -736966710 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: nosePosition + _dnaNameHash: -1469532099 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.0045 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.0045 + _max: 0.0045 + _umaDNA: + dnaTypeHash: 0 + - _hashName: MandibleAdjust + _hash: 691264956 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: chinPronounced + _dnaNameHash: 2080425167 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.18 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.55 + _max: 1.75 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: chinSize + _dnaNameHash: -61818555 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.3 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.75 + _max: 1.3 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0.4 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: MandibleAdjust + _hash: 691264956 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.0125 + _max: 0.0125 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.0125 + _max: 0.0125 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: chinPosition + _dnaNameHash: -1390074964 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.0075 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.0075 + _max: 0.0075 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftLowMaxilarAdjust + _hash: 1385644791 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: jawsSize + _dnaNameHash: -684992667 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.025 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.025 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: jawsPosition + _dnaNameHash: 791229381 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.03 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.03 + _max: 0.03 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightLowMaxilarAdjust + _hash: 459855613 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: jawsSize + _dnaNameHash: -684992667 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.025 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.025 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: jawsPosition + _dnaNameHash: 791229381 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.03 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.03 + _max: 0.03 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftCheekAdjust + _hash: -1371476741 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: cheekSize + _dnaNameHash: -1727332994 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 2.05 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: cheekSize + _dnaNameHash: -1727332994 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 2.05 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: cheekSize + _dnaNameHash: -1727332994 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 2.05 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightCheekAdjust + _hash: 2048590150 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: cheekSize + _dnaNameHash: -1727332994 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 2.05 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: cheekSize + _dnaNameHash: -1727332994 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 2.05 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: cheekSize + _dnaNameHash: -1727332994 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 2.05 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftCheekAdjust + _hash: -1371476741 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: cheekPosition + _dnaNameHash: -2146412263 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.03 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.03 + _max: 0.03 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightCheekAdjust + _hash: 2048590150 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: cheekPosition + _dnaNameHash: -2146412263 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.03 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.03 + _max: 0.03 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftLowCheekAdjust + _hash: -982498292 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowCheekPronounced + _dnaNameHash: 27609084 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.07 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.07 + _max: 0.07 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowCheekPosition + _dnaNameHash: -673784177 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.06 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.06 + _max: 0.06 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightLowCheekAdjust + _hash: 530525254 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowCheekPronounced + _dnaNameHash: 27609084 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.07 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.07 + _max: 0.07 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lowCheekPosition + _dnaNameHash: -673784177 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.06 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.06 + _max: 0.06 + _umaDNA: + dnaTypeHash: 0 + - _hashName: NoseTopAdjust + _hash: 1973914600 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.015 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.005 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadPosition + _dnaNameHash: 1645211981 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.02 + _initialized: 1 + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.005 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.015 + _max: 0.0025 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftEyebrowLowAdjust + _hash: -87457348 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.015 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.005 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadPosition + _dnaNameHash: 1645211981 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.02 + _initialized: 1 + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.005 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.015 + _max: 0.005 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftEyebrowMiddleAdjust + _hash: 1573521115 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.015 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.005 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadPosition + _dnaNameHash: 1645211981 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.05 + _initialized: 1 + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.005 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.005 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftEyebrowUpAdjust + _hash: -550662924 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.015 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.005 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadPosition + _dnaNameHash: 1645211981 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.007 + _initialized: 1 + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.005 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.01 + _max: 0.005 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightEyebrowLowAdjust + _hash: -1288301130 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.015 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.005 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadPosition + _dnaNameHash: 1645211981 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.02 + _initialized: 1 + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.005 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.015 + _max: 0.005 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightEyebrowMiddleAdjust + _hash: 1752310743 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.015 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.005 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadPosition + _dnaNameHash: 1645211981 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.05 + _initialized: 1 + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.005 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.005 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightEyebrowUpAdjust + _hash: 1241434898 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.015 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.005 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: foreheadPosition + _dnaNameHash: 1645211981 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.007 + _initialized: 1 + - _calcOption: 0 + _dnaName: foreheadSize + _dnaNameHash: -1728938687 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.005 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.01 + _max: 0.005 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LipsSuperiorAdjust + _hash: 1865332640 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 1 + _max: 1.05 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.9 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.9 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LipsInferiorAdjust + _hash: 1799356466 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 1 + _max: 1.05 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftLipsSuperiorMiddleAdjust + _hash: 1940197654 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 1 + _max: 1.05 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.9 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.9 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightLipsSuperiorMiddleAdjust + _hash: 1220922885 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 1 + _max: 1.05 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.9 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.9 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftLipsInferiorAdjust + _hash: 1599456840 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 1 + _max: 1.05 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.9 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.9 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightLipsInferiorAdjust + _hash: 1389899872 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.05 + _initialized: 1 + _aggregationMethod: 1 + _min: 1 + _max: 1.05 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.9 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.9 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.65 + _max: 1.5 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LipsInferiorAdjust + _hash: 1799356466 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.008 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.1 + _max: 0.1 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftLipsAdjust + _hash: -666615888 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: mouthSize + _dnaNameHash: -1275520811 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.03 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.02 + _max: 0.005 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightLipsAdjust + _hash: 949575891 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: mouthSize + _dnaNameHash: -1275520811 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.03 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.005 + _max: 0.02 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftLipsSuperiorMiddleAdjust + _hash: 1940197654 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: mouthSize + _dnaNameHash: -1275520811 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.007 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.02 + _max: 0.005 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightLipsSuperiorMiddleAdjust + _hash: 1220922885 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: mouthSize + _dnaNameHash: -1275520811 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.007 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.005 + _max: 0.02 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftLipsInferiorAdjust + _hash: 1599456840 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: mouthSize + _dnaNameHash: -1275520811 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.007 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.02 + _max: 0.005 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.008 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.1 + _max: 0.1 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightLipsInferiorAdjust + _hash: 1389899872 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.05 + _max: 0.05 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: mouthSize + _dnaNameHash: -1275520811 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.007 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.005 + _max: 0.02 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: lipsSize + _dnaNameHash: 1068408893 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.008 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.1 + _max: 0.1 + _umaDNA: + dnaTypeHash: 0 + - _hashName: Position + _hash: -1084586333 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: feetSize + _dnaNameHash: -1997170247 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.17 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.15 + _max: 0.0675 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -10 + _max: 10 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -10 + _max: 10 + _umaDNA: + dnaTypeHash: 0 + - _hashName: Head + _hash: 130111906 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: headSize + _dnaNameHash: 1712217631 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: headSize + _dnaNameHash: 1712217631 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: headSize + _dnaNameHash: 1712217631 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftArm + _hash: -343733542 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: armLength + _dnaNameHash: 504758438 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: armLength + _dnaNameHash: 504758438 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: armLength + _dnaNameHash: 504758438 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightArm + _hash: 1806956327 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: armLength + _dnaNameHash: 504758438 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: armLength + _dnaNameHash: 504758438 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: armLength + _dnaNameHash: 504758438 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftForeArm + _hash: -1984349568 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmLength + _dnaNameHash: -1841594250 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmLength + _dnaNameHash: -1841594250 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmLength + _dnaNameHash: -1841594250 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightForeArm + _hash: 1918345642 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmLength + _dnaNameHash: -1841594250 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmLength + _dnaNameHash: -1841594250 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: forearmLength + _dnaNameHash: -1841594250 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftHand + _hash: -1233783956 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: handsSize + _dnaNameHash: -1646582892 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: handsSize + _dnaNameHash: -1646582892 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: handsSize + _dnaNameHash: -1646582892 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightHand + _hash: 1979272496 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: handsSize + _dnaNameHash: -1646582892 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: handsSize + _dnaNameHash: -1646582892 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: handsSize + _dnaNameHash: -1646582892 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftFoot + _hash: 1486391408 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: feetSize + _dnaNameHash: -1997170247 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: feetSize + _dnaNameHash: -1997170247 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: feetSize + _dnaNameHash: -1997170247 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightFoot + _hash: -1693174228 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: feetSize + _dnaNameHash: -1997170247 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: feetSize + _dnaNameHash: -1997170247 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: feetSize + _dnaNameHash: -1997170247 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 2 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 2 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftUpLeg + _hash: 392266736 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -10 + _max: 10 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: legSeparation + _dnaNameHash: -1628857215 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.15 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.035 + _initialized: 1 + - _calcOption: 0 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.1 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.025 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -10 + _max: 10 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightUpLeg + _hash: 1971262097 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -10 + _max: 10 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: legSeparation + _dnaNameHash: -1628857215 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.15 + _initialized: 1 + - _calcOption: 0 + _dnaName: lowerWeight + _dnaNameHash: -684139781 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.035 + _initialized: 1 + - _calcOption: 0 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.1 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.025 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -10 + _max: 10 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftShoulder + _hash: 759586984 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -10 + _max: 10 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.0235 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.025 + _max: 0.015 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -10 + _max: 10 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightShoulder + _hash: -167360539 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -10 + _max: 10 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: upperMuscle + _dnaNameHash: 1151065015 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.0235 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.015 + _max: 0.025 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -10 + _max: 10 + _umaDNA: + dnaTypeHash: 0 + - _hashName: Mandible + _hash: 1574626840 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: mandibleSize + _dnaNameHash: 420250386 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 1.35 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: mandibleSize + _dnaNameHash: 420250386 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 1.35 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: mandibleSize + _dnaNameHash: 420250386 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 0.35 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.35 + _max: 1.35 + _umaDNA: + dnaTypeHash: 0 + - _hashName: Position + _hash: -1084586333 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: height + _dnaNameHash: -179444465 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + - _calcOption: 0 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.4 + _max: 1.8 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: height + _dnaNameHash: -179444465 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + - _calcOption: 0 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.4 + _max: 1.8 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: height + _dnaNameHash: -179444465 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + - _calcOption: 0 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.4 + _max: 1.8 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LowerBack + _hash: -919067556 + _property: 2 + _valuesX: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 3 + _valuesY: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 3 + _valuesZ: + _val: + _value: 1 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 1 + _dnaName: legsSize + _dnaNameHash: -421660566 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 1 + _initialized: 1 + _aggregationMethod: 1 + _min: 0.5 + _max: 3 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftOuterBreast + _hash: 361754685 + _property: 1 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -360 + _max: 360 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + _multiplier: -20 + _initialized: 1 + _aggregationMethod: 1 + _min: -10 + _max: 10 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -40 + _initialized: 1 + _aggregationMethod: 1 + _min: -20 + _max: 10 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftOuterBreast + _hash: 361754685 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.01 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.01 + _max: 0.01 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + _multiplier: 0.04 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.04 + _max: 0.04 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.1 + _max: 0.1 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightOuterBreast + _hash: -1043063424 + _property: 1 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -360 + _max: 360 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -20 + _initialized: 1 + _aggregationMethod: 1 + _min: -10 + _max: 10 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: 40 + _initialized: 1 + _aggregationMethod: 1 + _min: -10 + _max: 20 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightOuterBreast + _hash: -1043063424 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.01 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.01 + _max: 0.01 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: breastCleavage + _dnaNameHash: -261091259 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _multiplier: -0.04 + _initialized: 1 + _aggregationMethod: 1 + _min: -0.04 + _max: 0.04 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: -0.1 + _max: 0.1 + _umaDNA: + dnaTypeHash: 0 + - _hashName: LeftEye + _hash: 27653119 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0 + _max: 0 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: eyeSpacing + _dnaNameHash: -348141931 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + _multiplier: -0.01 + _initialized: 1 + _aggregationMethod: 1 + _min: -1 + _max: 1 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0 + _max: 0 + _umaDNA: + dnaTypeHash: 0 + - _hashName: RightEye + _hash: -2120937982 + _property: 0 + _valuesX: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0 + _max: 0 + _valuesY: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: + - _calcOption: 0 + _dnaName: eyeSpacing + _dnaNameHash: -348141931 + _evaluator: + _name: Default + _graph: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -0.5 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.5 + inSlope: 1 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + _multiplier: 0.01 + _initialized: 1 + _aggregationMethod: 1 + _min: -1 + _max: 1 + _valuesZ: + _val: + _value: 0 + _modifiers: [] + _modifyingDNA: + _dnaEvaluators: [] + _aggregationMethod: 1 + _min: 0 + _max: 0 + _umaDNA: + dnaTypeHash: 0 diff --git a/UMAProject/Assets/UMA/Content/Core/HumanFemale/DNA/HumanFemaleDNAConverterController_Bare.asset.meta b/UMAProject/Assets/UMA/Content/Core/HumanFemale/DNA/HumanFemaleDNAConverterController_Bare.asset.meta new file mode 100644 index 000000000..e99d511f6 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Core/HumanFemale/DNA/HumanFemaleDNAConverterController_Bare.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9ba14a67e20536a4188d6e53af9d2620 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Content/Core/HumanFemale/RaceData/Human Female HighPoly_Bare.asset b/UMAProject/Assets/UMA/Content/Core/HumanFemale/RaceData/Human Female HighPoly_Bare.asset new file mode 100644 index 000000000..d3adcd067 Binary files /dev/null and b/UMAProject/Assets/UMA/Content/Core/HumanFemale/RaceData/Human Female HighPoly_Bare.asset differ diff --git a/UMAProject/Assets/UMA/Content/Core/HumanFemale/RaceData/Human Female HighPoly_Bare.asset.meta b/UMAProject/Assets/UMA/Content/Core/HumanFemale/RaceData/Human Female HighPoly_Bare.asset.meta new file mode 100644 index 000000000..25ea17f35 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Core/HumanFemale/RaceData/Human Female HighPoly_Bare.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0708cdc72d330e8479897c79afa766e0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Content/Core/HumanMale/Overlays/Body/M_Bod Overlay 1.asset b/UMAProject/Assets/UMA/Content/Core/HumanMale/Overlays/Body/M_Bod Overlay 1.asset index c73774431..f9c7a6105 100644 Binary files a/UMAProject/Assets/UMA/Content/Core/HumanMale/Overlays/Body/M_Bod Overlay 1.asset and b/UMAProject/Assets/UMA/Content/Core/HumanMale/Overlays/Body/M_Bod Overlay 1.asset differ diff --git a/UMAProject/Assets/UMA/Content/Core/HumanMale/Overlays/Face/M_Face Screen.asset b/UMAProject/Assets/UMA/Content/Core/HumanMale/Overlays/Face/M_Face Screen.asset new file mode 100644 index 000000000..fc78f2e09 Binary files /dev/null and b/UMAProject/Assets/UMA/Content/Core/HumanMale/Overlays/Face/M_Face Screen.asset differ diff --git a/UMAProject/Assets/UMA/Content/Core/HumanMale/Overlays/Face/M_Face Screen.asset.meta b/UMAProject/Assets/UMA/Content/Core/HumanMale/Overlays/Face/M_Face Screen.asset.meta new file mode 100644 index 000000000..ea0c9c836 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Core/HumanMale/Overlays/Face/M_Face Screen.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5dc7dbcdfd4c8794380348c1472c565a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Content/Core/HumanMale/RaceData/Human Male.asset b/UMAProject/Assets/UMA/Content/Core/HumanMale/RaceData/Human Male.asset index 16fd26297..3b6add484 100644 Binary files a/UMAProject/Assets/UMA/Content/Core/HumanMale/RaceData/Human Male.asset and b/UMAProject/Assets/UMA/Content/Core/HumanMale/RaceData/Human Male.asset differ diff --git a/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/BasicHuman Base Recipe.asset b/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/BasicHuman Base Recipe.asset new file mode 100644 index 000000000..c70269207 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/BasicHuman Base Recipe.asset @@ -0,0 +1,33 @@ +%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: 9448878e2e40f1a4c9f8fd2b56832b13, type: 3} + m_Name: BasicHuman Base Recipe + m_EditorClassIdentifier: + label: + resourcesOnly: 0 + recipeType: Standard + DisplayValue: + compatibleRaces: [] + wardrobeRecipeThumbs: [] + wardrobeSlot: None + Appended: 0 + Hides: [] + HideTags: [] + suppressWardrobeSlots: [] + activeWardrobeSet: [] + MeshHideAssets: [] + OverrideDNA: + PreloadValues: [] + recipeString: '{"version":3,"packedSlotDataList":[],"slotsV2":[],"slotsV3":[{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"MaleTorso","scale":100,"copyIdx":-1,"overlays":[{"id":"M_Bod + Overlay 1","colorIdx":0,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":0.0,"y":0.0,"z":0.0},"rotation":0.0,"blendModes":[]}],"Tags":["Torso"],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"MaleFeet","scale":100,"copyIdx":16,"overlays":[],"Tags":["Feet"],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"MaleHands","scale":100,"copyIdx":16,"overlays":[],"Tags":["Hands"],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"MaleLegs","scale":100,"copyIdx":16,"overlays":[],"Tags":["Legs"],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"M_High + poly Head","scale":100,"copyIdx":-1,"overlays":[{"id":"M_Face","colorIdx":3,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0,"blendModes":[0,0,0]},{"id":"M_Face + Screen","colorIdx":4,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0,"blendModes":[1,0,1]}],"Tags":["Head","Face","smooshtarget"],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""}],"colors":[],"fColors":[{"name":"Skin","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"Hair","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"Eyes","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"-","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"-","colors":[255,255,255,255,0,0,0,254,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false}],"sharedColorCount":3,"race":"HumanMale","packedDna":[{"dnaType":"DynamicUMADna","dnaTypeHash":815443803,"packedDna":"{\"bDnaAsset\":{\"instanceID\":24014},\"bDnaAssetName\":\"HumanMaleDynamicDnaAsset\",\"bDnaSettings\":[{\"name\":\"skinGreenness\",\"value\":128},{\"name\":\"skinBlueness\",\"value\":128},{\"name\":\"skinRedness\",\"value\":128},{\"name\":\"height\",\"value\":128},{\"name\":\"headSize\",\"value\":128},{\"name\":\"headWidth\",\"value\":128},{\"name\":\"neckThickness\",\"value\":128},{\"name\":\"armLength\",\"value\":128},{\"name\":\"forearmLength\",\"value\":128},{\"name\":\"armWidth\",\"value\":128},{\"name\":\"forearmWidth\",\"value\":128},{\"name\":\"handsSize\",\"value\":128},{\"name\":\"feetSize\",\"value\":128},{\"name\":\"legSeparation\",\"value\":128},{\"name\":\"upperMuscle\",\"value\":128},{\"name\":\"lowerMuscle\",\"value\":128},{\"name\":\"upperWeight\",\"value\":128},{\"name\":\"lowerWeight\",\"value\":128},{\"name\":\"legsSize\",\"value\":128},{\"name\":\"belly\",\"value\":128},{\"name\":\"waist\",\"value\":128},{\"name\":\"gluteusSize\",\"value\":128},{\"name\":\"earsSize\",\"value\":128},{\"name\":\"earsPosition\",\"value\":128},{\"name\":\"earsRotation\",\"value\":128},{\"name\":\"noseSize\",\"value\":128},{\"name\":\"noseCurve\",\"value\":128},{\"name\":\"noseWidth\",\"value\":128},{\"name\":\"noseInclination\",\"value\":128},{\"name\":\"nosePosition\",\"value\":128},{\"name\":\"nosePronounced\",\"value\":128},{\"name\":\"noseFlatten\",\"value\":128},{\"name\":\"chinSize\",\"value\":128},{\"name\":\"chinPronounced\",\"value\":128},{\"name\":\"chinPosition\",\"value\":128},{\"name\":\"mandibleSize\",\"value\":128},{\"name\":\"jawsSize\",\"value\":128},{\"name\":\"jawsPosition\",\"value\":128},{\"name\":\"cheekSize\",\"value\":128},{\"name\":\"cheekPosition\",\"value\":128},{\"name\":\"lowCheekPronounced\",\"value\":128},{\"name\":\"lowCheekPosition\",\"value\":128},{\"name\":\"foreheadSize\",\"value\":128},{\"name\":\"foreheadPosition\",\"value\":128},{\"name\":\"lipsSize\",\"value\":128},{\"name\":\"mouthSize\",\"value\":128},{\"name\":\"eyeRotation\",\"value\":128},{\"name\":\"eyeSize\",\"value\":128},{\"name\":\"breastSize\",\"value\":128},{\"name\":\"eyeSpacing\",\"value\":128}]}"}],"wardrobeSet":[],"packedRecipeType":"Standard"}' diff --git a/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/BasicHuman Base Recipe.asset.meta b/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/BasicHuman Base Recipe.asset.meta new file mode 100644 index 000000000..ddba564e7 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/BasicHuman Base Recipe.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d335824ae8e4acb49a1ed31a86d30ef9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/HumanMale Base Recipe 1.asset.meta b/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/HumanMale Base Recipe 1.asset.meta index ea6082db9..5cb69b07f 100644 --- a/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/HumanMale Base Recipe 1.asset.meta +++ b/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/HumanMale Base Recipe 1.asset.meta @@ -1,7 +1,5 @@ fileFormatVersion: 2 -guid: e9c4ce3b586a9884f83db0fb2581ddfe -labels: -- UMA_Text Recipe +guid: 9fa4e6472e255014591f809562d64abc NativeFormatImporter: externalObjects: {} mainObjectFileID: 0 diff --git a/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/HumanMale Base Recipe.asset b/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/HumanMale Base Recipe.asset new file mode 100644 index 000000000..d78b688f6 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/HumanMale Base Recipe.asset @@ -0,0 +1,36 @@ +%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: 9448878e2e40f1a4c9f8fd2b56832b13, type: 3} + m_Name: HumanMale Base Recipe + m_EditorClassIdentifier: + label: + resourcesOnly: 0 + recipeType: Standard + DisplayValue: + compatibleRaces: [] + wardrobeRecipeThumbs: [] + wardrobeSlot: None + Appended: 0 + Hides: [] + HideTags: [] + suppressWardrobeSlots: [] + activeWardrobeSet: [] + MeshHideAssets: [] + OverrideDNA: + PreloadValues: [] + recipeString: '{"version":3,"packedSlotDataList":[],"slotsV2":[],"slotsV3":[{"id":"MaleEyes","scale":100,"copyIdx":-1,"overlays":[{"id":"Eye + Overlay","colorIdx":3,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":0.0,"y":0.0,"z":0.0},"rotation":0.0},{"id":"Default + Eye Adjust","colorIdx":2,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":0.0,"y":0.0,"z":0.0},"rotation":0.0}],"Tags":["Eyes"],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"MaleInnerMouth","scale":100,"copyIdx":-1,"overlays":[{"id":"InnerMouth","colorIdx":4,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":0.0,"y":0.0,"z":0.0},"rotation":0.0}],"Tags":["InnerMouth","Mouth","Head"],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"MaleTorso","scale":100,"copyIdx":-1,"overlays":[{"id":"M_Bod + Overlay 1","colorIdx":0,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":0.0,"y":0.0,"z":0.0},"rotation":0.0}],"Tags":["Torso"],"Races":[],"blendShapeTarget":""},{"id":"MaleFeet","scale":100,"copyIdx":16,"overlays":[],"Tags":["Feet"],"Races":[],"blendShapeTarget":""},{"id":"MaleHands","scale":100,"copyIdx":16,"overlays":[],"Tags":["Hands"],"Races":[],"blendShapeTarget":""},{"id":"MaleLegs","scale":100,"copyIdx":16,"overlays":[],"Tags":["Legs"],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"M_High + poly Head","scale":100,"copyIdx":-1,"overlays":[{"id":"M_Face","colorIdx":0,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":0.0,"y":0.0,"z":0.0},"rotation":0.0},{"id":"Cap_Shadow_overlay","colorIdx":5,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0}],"Tags":["Head","Face"],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"M_High + poly Eyelash","scale":100,"copyIdx":-1,"overlays":[{"id":"M_Eyelash","colorIdx":6,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":0.0,"y":0.0,"z":0.0},"rotation":0.0},{"id":"M_Eyelash","colorIdx":6,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":0.0,"y":0.0,"z":0.0},"rotation":0.0}],"Tags":["EyeLash","Head"],"Races":[],"blendShapeTarget":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":""},{"id":"M_Eyebrow","scale":100,"copyIdx":-1,"overlays":[{"id":"M_Face + 1 eyebrows2","colorIdx":7,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0}],"Tags":["Eyebrows"],"Races":[],"blendShapeTarget":""}],"colors":[],"fColors":[{"name":"Skin","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":["Color;#CC262600;UMA.UMAColorProperty"],"alwaysUpdate":false},{"name":"Hair","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"Eyes","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"-","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"-","colors":[234,234,234,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"-","colors":[50,50,50,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"-","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"-","colors":[40,40,40,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false}],"sharedColorCount":3,"race":"HumanMale","packedDna":[{"dnaType":"DynamicUMADna","dnaTypeHash":815443803,"packedDna":"{\"bDnaAsset\":{\"instanceID\":19726},\"bDnaAssetName\":\"HumanMaleDynamicDnaAsset\",\"bDnaSettings\":[{\"name\":\"skinGreenness\",\"value\":128},{\"name\":\"skinBlueness\",\"value\":128},{\"name\":\"skinRedness\",\"value\":128},{\"name\":\"height\",\"value\":128},{\"name\":\"headSize\",\"value\":128},{\"name\":\"headWidth\",\"value\":128},{\"name\":\"neckThickness\",\"value\":128},{\"name\":\"armLength\",\"value\":128},{\"name\":\"forearmLength\",\"value\":128},{\"name\":\"armWidth\",\"value\":128},{\"name\":\"forearmWidth\",\"value\":128},{\"name\":\"handsSize\",\"value\":128},{\"name\":\"feetSize\",\"value\":128},{\"name\":\"legSeparation\",\"value\":128},{\"name\":\"upperMuscle\",\"value\":128},{\"name\":\"lowerMuscle\",\"value\":128},{\"name\":\"upperWeight\",\"value\":128},{\"name\":\"lowerWeight\",\"value\":128},{\"name\":\"legsSize\",\"value\":128},{\"name\":\"belly\",\"value\":128},{\"name\":\"waist\",\"value\":128},{\"name\":\"gluteusSize\",\"value\":128},{\"name\":\"earsSize\",\"value\":128},{\"name\":\"earsPosition\",\"value\":128},{\"name\":\"earsRotation\",\"value\":128},{\"name\":\"noseSize\",\"value\":128},{\"name\":\"noseCurve\",\"value\":128},{\"name\":\"noseWidth\",\"value\":128},{\"name\":\"noseInclination\",\"value\":128},{\"name\":\"nosePosition\",\"value\":128},{\"name\":\"nosePronounced\",\"value\":128},{\"name\":\"noseFlatten\",\"value\":128},{\"name\":\"chinSize\",\"value\":128},{\"name\":\"chinPronounced\",\"value\":128},{\"name\":\"chinPosition\",\"value\":128},{\"name\":\"mandibleSize\",\"value\":128},{\"name\":\"jawsSize\",\"value\":128},{\"name\":\"jawsPosition\",\"value\":128},{\"name\":\"cheekSize\",\"value\":128},{\"name\":\"cheekPosition\",\"value\":128},{\"name\":\"lowCheekPronounced\",\"value\":128},{\"name\":\"lowCheekPosition\",\"value\":128},{\"name\":\"foreheadSize\",\"value\":128},{\"name\":\"foreheadPosition\",\"value\":128},{\"name\":\"lipsSize\",\"value\":128},{\"name\":\"mouthSize\",\"value\":128},{\"name\":\"eyeRotation\",\"value\":128},{\"name\":\"eyeSize\",\"value\":128},{\"name\":\"breastSize\",\"value\":128},{\"name\":\"eyeSpacing\",\"value\":128}]}"}],"wardrobeSet":[],"packedRecipeType":"Standard"}' diff --git a/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/HumanMale Base Recipe.asset.meta b/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/HumanMale Base Recipe.asset.meta new file mode 100644 index 000000000..ea6082db9 --- /dev/null +++ b/UMAProject/Assets/UMA/Content/Core/HumanMale/Recipes/BaseRecipes/HumanMale Base Recipe.asset.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: e9c4ce3b586a9884f83db0fb2581ddfe +labels: +- UMA_Text Recipe +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Content/Core/HumanMale/Slots/Body/HighPoly/Male_High_Torso_Slot.asset b/UMAProject/Assets/UMA/Content/Core/HumanMale/Slots/Body/HighPoly/Male_High_Torso_Slot.asset index cd47e646e..4067800f2 100644 Binary files a/UMAProject/Assets/UMA/Content/Core/HumanMale/Slots/Body/HighPoly/Male_High_Torso_Slot.asset and b/UMAProject/Assets/UMA/Content/Core/HumanMale/Slots/Body/HighPoly/Male_High_Torso_Slot.asset differ diff --git a/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Cutout_Diffuse_Normal_Metallic.asset b/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Cutout_Diffuse_Normal_Metallic.asset index 318c9af8b..81c4adda3 100644 --- a/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Cutout_Diffuse_Normal_Metallic.asset +++ b/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Cutout_Diffuse_Normal_Metallic.asset @@ -13,7 +13,9 @@ MonoBehaviour: m_Name: UMA_Cutout_Diffuse_Normal_Metallic m_EditorClassIdentifier: translateSRP: 1 - material: {fileID: 2100000, guid: 40307702d879bbd4ab01db8945ade355, type: 2} + _material: {fileID: 2100000, guid: 40307702d879bbd4ab01db8945ade355, type: 2} + srpMaterials: [] + secondPass: {fileID: 0} materialType: 1 channels: - channelType: 4 @@ -47,3 +49,5 @@ MonoBehaviour: shaderParms: [] MaskWithCurrentColor: 0 maskMultiplier: {r: 1, g: 1, b: 1, a: 1} + MaterialName: + ShaderName: diff --git a/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Diffuse_Normal_Metallic.asset b/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Diffuse_Normal_Metallic.asset index 0ac5d8d22..c334b0e12 100644 --- a/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Diffuse_Normal_Metallic.asset +++ b/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Diffuse_Normal_Metallic.asset @@ -14,9 +14,10 @@ MonoBehaviour: m_EditorClassIdentifier: translateSRP: 1 material: {fileID: 2100000, guid: 2db8991bb8fd75f4eb02f3ee57a55f37, type: 2} + secondPass: {fileID: 0} materialType: 1 channels: - - channelType: 0 + - channelType: 4 textureFormat: 0 materialPropertyName: _MainTex sourceTextureName: diff --git a/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Mat_Diffuse.mat b/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Mat_Diffuse.mat index a44d22051..5aaff9395 100644 --- a/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Mat_Diffuse.mat +++ b/UMAProject/Assets/UMA/Content/Core/HumanShared/Materials/Standard/UMA_Mat_Diffuse.mat @@ -9,12 +9,13 @@ Material: m_PrefabAsset: {fileID: 0} m_Name: UMA_Mat_Diffuse m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: + m_ShaderKeywords: _ALPHATEST_ON m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} + m_CustomRenderQueue: 2450 + stringTagMap: + RenderType: TransparentCutout disabledShaderPasses: [] m_SavedProperties: serializedVersion: 3 @@ -64,7 +65,7 @@ Material: - _Glossiness: 0.145 - _GlossyReflections: 1 - _Metallic: 0 - - _Mode: 0 + - _Mode: 1 - _OcclusionStrength: 1 - _Parallax: 0.02 - _SmoothnessTextureChannel: 0 diff --git a/UMAProject/Assets/UMA/Content/Example/HumanMale/Overlays/Hair/MaleEyebrow01.asset b/UMAProject/Assets/UMA/Content/Example/HumanMale/Overlays/Hair/MaleEyebrow01.asset index 350964e73..c3fb903b2 100644 Binary files a/UMAProject/Assets/UMA/Content/Example/HumanMale/Overlays/Hair/MaleEyebrow01.asset and b/UMAProject/Assets/UMA/Content/Example/HumanMale/Overlays/Hair/MaleEyebrow01.asset differ diff --git a/UMAProject/Assets/UMA/Content/Example/HumanMale/Overlays/Hair/MaleEyebrow02.asset b/UMAProject/Assets/UMA/Content/Example/HumanMale/Overlays/Hair/MaleEyebrow02.asset index ffc98e102..875eb89c4 100644 Binary files a/UMAProject/Assets/UMA/Content/Example/HumanMale/Overlays/Hair/MaleEyebrow02.asset and b/UMAProject/Assets/UMA/Content/Example/HumanMale/Overlays/Hair/MaleEyebrow02.asset differ diff --git a/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleBrow01.asset b/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleBrow01.asset index 7f4db20b7..fa0e4dd9e 100644 --- a/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleBrow01.asset +++ b/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleBrow01.asset @@ -18,14 +18,10 @@ MonoBehaviour: DisplayValue: Brow 1 compatibleRaces: - HumanMale - - HumanMaleDCS wardrobeRecipeThumbs: - race: HumanMale filename: thumb: {fileID: 21300000, guid: abd6de799032c4c4b91b7c66f7cdf4e4, type: 3} - - race: HumanMaleDCS - filename: - thumb: {fileID: 0} wardrobeSlot: Eyebrows Appended: 0 Hides: [] @@ -35,8 +31,8 @@ MonoBehaviour: MeshHideAssets: [] OverrideDNA: PreloadValues: [] - recipeString: '{"version":2,"packedSlotDataList":[],"slotsV2":[{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"M_High - poly Head","scale":100,"copyIdx":-1,"overlays":[{"id":"MaleEyebrow01","colorIdx":1,"rect":[768,512,512,128]}]}],"colors":[],"fColors":[{"name":"Skin","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{"name":"Hair","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{"name":"Eyes","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]}],"sharedColorCount":3,"race":"","packedDna":[]}' + recipeString: '{"version":3,"packedSlotDataList":[],"slotsV2":[],"slotsV3":[{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"M_High + poly Head","scale":100,"copyIdx":-1,"overlays":[{"id":"MaleEyebrow01","colorIdx":1,"rect":[768.0,512.0,512.0,128.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0,"blendModes":[0]}],"Tags":["Head","Face"],"Races":[],"blendShapeTarget":"","overSmoosh":0.009999999776482582,"smooshDistance":0.0010000000474974514,"smooshInvertX":false,"smooshInvertY":true,"smooshInvertZ":false,"smooshInvertDist":true,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":"LongHair"}],"colors":[],"fColors":[{"name":"Skin","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false,"isBaseColor":false},{"name":"Hair","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false,"isBaseColor":false},{"name":"Eyes","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false,"isBaseColor":false}],"sharedColorCount":3,"race":"HumanMale","packedDna":[]}' IncompatibleRecipes: [] UserField: - replaces: + replaces: Nothing diff --git a/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleBrow02.asset b/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleBrow02.asset index 3a0c4d5f2..6044adda3 100644 --- a/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleBrow02.asset +++ b/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleBrow02.asset @@ -35,8 +35,8 @@ MonoBehaviour: MeshHideAssets: [] OverrideDNA: PreloadValues: [] - recipeString: '{"version":2,"packedSlotDataList":[],"slotsV2":[{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"","scale":1,"copyIdx":-1,"overlays":[]},{"id":"M_High - poly Head","scale":100,"copyIdx":-1,"overlays":[{"id":"MaleEyebrow02","colorIdx":1,"rect":[768,512,512,128]}]}],"colors":[],"fColors":[{"name":"Skin","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{"name":"Hair","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]},{"name":"Eyes","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]}],"sharedColorCount":3,"race":"","packedDna":[]}' + recipeString: '{"version":3,"packedSlotDataList":[],"slotsV2":[],"slotsV3":[{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"M_High + poly Head","scale":100,"copyIdx":-1,"overlays":[{"id":"MaleEyebrow02","colorIdx":1,"rect":[768.0,512.0,512.0,128.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0,"blendModes":[0]}],"Tags":["Head","Face"],"Races":[],"blendShapeTarget":"","overSmoosh":0.009999999776482582,"smooshDistance":0.0010000000474974514,"smooshInvertX":false,"smooshInvertY":true,"smooshInvertZ":false,"smooshInvertDist":true,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":"LongHair"}],"colors":[],"fColors":[{"name":"Skin","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false,"isBaseColor":false},{"name":"Hair","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false,"isBaseColor":false},{"name":"Eyes","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false,"isBaseColor":false}],"sharedColorCount":3,"race":"HumanMale","packedDna":[]}' IncompatibleRecipes: [] UserField: - replaces: + replaces: Nothing diff --git a/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleRobe Hood.asset b/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleRobe Hood.asset index 137dd6cd5..a0fd9452e 100644 --- a/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleRobe Hood.asset +++ b/UMAProject/Assets/UMA/Content/Example/HumanMale/Recipes/WardrobeRecipes/MaleRobe Hood.asset @@ -18,14 +18,10 @@ MonoBehaviour: DisplayValue: Mystic Robe Hood compatibleRaces: - HumanMale - - HumanMaleDCS wardrobeRecipeThumbs: - race: HumanMale filename: thumb: {fileID: 21300000, guid: 9f540207166d6874f9e8b31f2aa88076, type: 3} - - race: HumanMaleDCS - filename: - thumb: {fileID: 0} wardrobeSlot: Helmet Appended: 0 Hides: [] @@ -36,10 +32,11 @@ MonoBehaviour: MeshHideAssets: [] OverrideDNA: PreloadValues: [] - recipeString: '{"version":3,"packedSlotDataList":[],"slotsV2":[],"slotsV3":[{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[]},{"id":"M_Freebie + recipeString: '{"version":3,"packedSlotDataList":[],"slotsV2":[],"slotsV3":[{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"M_Freebie Robeset Hood_Slot","scale":100,"copyIdx":-1,"overlays":[{"id":"M_Freebie Robeset - Hood","colorIdx":0,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0},{"id":"M_Freebie - Robeset Hood AC","colorIdx":1,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0}],"Tags":[],"Races":[]}],"colors":[],"fColors":[{"name":"Shirt","colors":[106,4,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[]},{"name":"ShirtAccent","colors":[232,8,8,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[]}],"sharedColorCount":2,"race":"","packedDna":[]}' + Hood","colorIdx":0,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0,"blendModes":[]},{"id":"M_Freebie + Robeset Hood AC","colorIdx":1,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0,"blendModes":[]}],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"","scale":1,"copyIdx":-1,"overlays":[],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":""},{"id":"M_High + poly Head","scale":100,"copyIdx":-1,"overlays":[{"id":"MaleHair01","colorIdx":3,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0,"blendModes":[]}],"Tags":["Head","Face"],"Races":[],"blendShapeTarget":"","overSmoosh":0.0,"smooshDistance":0.0,"smooshInvertX":false,"smooshInvertY":false,"smooshInvertZ":false,"smooshInvertDist":false,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":true,"swapTag":"unsmooshable"}],"colors":[],"fColors":[{"name":"Shirt","colors":[106,4,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"ShirtAccent","colors":[232,8,8,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"Skin","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"Hair","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false},{"name":"Eyes","colors":[255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false}],"sharedColorCount":5,"race":"HumanMale","packedDna":[]}' IncompatibleRecipes: [] UserField: replaces: Nothing diff --git a/UMAProject/Assets/UMA/Content/Hats/Bowler/Bowler_Overlay.asset b/UMAProject/Assets/UMA/Content/Hats/Bowler/Bowler_Overlay.asset index 1bebb1689..4470cd9d5 100644 Binary files a/UMAProject/Assets/UMA/Content/Hats/Bowler/Bowler_Overlay.asset and b/UMAProject/Assets/UMA/Content/Hats/Bowler/Bowler_Overlay.asset differ diff --git a/UMAProject/Assets/UMA/Core/Editor/Decals/DecalEditor.cs b/UMAProject/Assets/UMA/Core/Editor/Decals/DecalEditor.cs index a3e5199c5..bf9d426af 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Decals/DecalEditor.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Decals/DecalEditor.cs @@ -7,6 +7,11 @@ using UnityEngine; using UnityEngine.SceneManagement; + +/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +/// Are we missing // SkinnedMeshAligner.AlignBindPose(prefabMesh, resultingSkinnedMesh); +/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + namespace UMA { public class DecalEditor : IEditorScene diff --git a/UMAProject/Assets/UMA/Core/Editor/Extensions/DynamicCharacterSystem/DynamicCharacterAvatarEditor.cs b/UMAProject/Assets/UMA/Core/Editor/Extensions/DynamicCharacterSystem/DynamicCharacterAvatarEditor.cs index 592b9fadc..8782a9c7a 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Extensions/DynamicCharacterSystem/DynamicCharacterAvatarEditor.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Extensions/DynamicCharacterSystem/DynamicCharacterAvatarEditor.cs @@ -97,7 +97,8 @@ private void EndVerticalPadded() public override void OnInspectorGUI() { - serializedObject.Update(); + thisDCA = target as DynamicCharacterAvatar; + serializedObject.Update(); EditorGUI.BeginChangeCheck(); showHelp = EditorGUILayout.Toggle("Show Help", showHelp); @@ -106,6 +107,31 @@ public override void OnInspectorGUI() serializedObject.ApplyModifiedProperties(); } + if (Application.isPlaying) + { + BeginVerticalPadded(); + EditorGUILayout.LabelField("Force Regenerate (Playtime)", EditorStyles.boldLabel); + EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button("Full Build")) + { + thisDCA.BuildCharacter(true); + } + if (GUILayout.Button("Textures")) + { + thisDCA.ForceUpdate(false, true, false); + } + if (GUILayout.Button("DNA")) + { + thisDCA.ForceUpdate(true, false, false); + } + if (GUILayout.Button("Mesh")) + { + thisDCA.ForceUpdate(false, false, true); + } + EditorGUILayout.EndHorizontal(); + EndVerticalPadded(); + } + EditorGUI.BeginChangeCheck(); Editor.DrawPropertiesExcluding(serializedObject, new string[] { "hide","BundleCheck", "loadBlendShapes","activeRace","defaultChangeRaceOptions","cacheCurrentState", "rebuildSkeleton", "preloadWardrobeRecipes", "raceAnimationControllers", /* Editor Only Fields */ "editorTimeGeneration", @@ -327,7 +353,32 @@ public override void OnInspectorGUI() EditorGUI.BeginChangeCheck(); if (newCharacterColors.isExpanded) { - currentcolorfilter = EditorGUILayout.Popup("Filter Colors", currentcolorfilter, colorfilters); + var charcol = thisDCA.characterColors._colors; + int baseColors = 0; + foreach(var c in charcol) + { + if (c != null) + { + if (c.isBaseColor) + { + baseColors++; + } + } + } + + if (baseColors == 0 && charcol.Count > 0 ) + { + foreach(var c in charcol) + { + if (baseColorNames.Contains(c.name.ToLower())) + { + c.isBaseColor = true; + baseColors++; + } + } + } + + currentcolorfilter = EditorGUILayout.Popup("Filter Colors", currentcolorfilter, colorfilters); n_newArraySize = EditorGUILayout.DelayedIntField(new GUIContent("Size"), n_origArraySize); EditorGUILayout.Space(); @@ -337,7 +388,22 @@ public override void OnInspectorGUI() for (int i = 0; i < n_origArraySize; i++) { SerializedProperty currentColor = newCharacterColors.GetArrayElementAtIndex(i); - if (currentcolorfilter == 0 && !baseColorNames.Contains(currentColor.displayName.ToLower())) continue; + // What a hack. + var col = thisDCA.characterColors._colors[i]; + if (col == null) + { + continue; + } + + + if (currentcolorfilter == 0) + { + if (!col.isBaseColor) + { + continue; + } + } + //&& !baseColorNames.Contains(currentColor.displayName.ToLower())) continue; if (currentcolorfilter == 2 && currentColor.displayName.ToLower().Contains("colordna")) continue; EditorGUILayout.PropertyField(newCharacterColors.GetArrayElementAtIndex(i)); } diff --git a/UMAProject/Assets/UMA/Core/Editor/Extensions/DynamicCharacterSystem/UMAWardrobeCollectionEditor.cs b/UMAProject/Assets/UMA/Core/Editor/Extensions/DynamicCharacterSystem/UMAWardrobeCollectionEditor.cs index 7786dfe02..7be818527 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Extensions/DynamicCharacterSystem/UMAWardrobeCollectionEditor.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Extensions/DynamicCharacterSystem/UMAWardrobeCollectionEditor.cs @@ -362,16 +362,9 @@ private bool AddIfWardrobeRecipe(UnityEngine.Object tempRecipeAsset, List 0 || DraggedOverlays.Count > 0) + if (DraggedSlots.Count > 0 || DraggedOverlays.Count > 0 || recipesMerged == true) { AddDraggedFiles(); return true; @@ -988,7 +1003,7 @@ public virtual bool OnGUI(string targetName, ref bool _dnaDirty, ref bool _textu GUILayout.Space(10); Rect dropArea = GUILayoutUtility.GetRect(0.0f, 50.0f, GUILayout.ExpandWidth(true)); - GUI.Box(dropArea, "Drag Slots and Overlays here. Click to Pick"); + GUI.Box(dropArea, "Drag Slots, Overlays and recipes here. Click to Pick"); if (DropAreaGUI(dropArea)) { changed |= true; @@ -1835,6 +1850,21 @@ public bool OnGUI() _overlayData.Validate(); + bool changed = false; + + if (!isUV) + { + EditorGUILayout.HelpBox("Overlay " + _overlayData.asset.name + " is not using UV coordinates! Convert?", MessageType.Error); + _overlayData.editorReferenceTextureSize = EditorGUILayout.Vector2Field("Reference Texture Size", _overlayData.editorReferenceTextureSize); + if (_overlayData.editorReferenceTextureSize.magnitude != 0.0f) + { + if (GUILayout.Button("Convert to UV")) + { + _overlayData.rect = new Rect(_overlayData.rect.x / _overlayData.editorReferenceTextureSize.x, _overlayData.rect.y / _overlayData.editorReferenceTextureSize.y, _overlayData.rect.width / _overlayData.editorReferenceTextureSize.x, _overlayData.rect.height / _overlayData.editorReferenceTextureSize.y); + changed = true; + } + } + } if (_slotData.asset.material != null) { if (_overlayData.asset.material.name != _slotData.material.name) @@ -1871,7 +1901,7 @@ public bool OnGUI() } // Edit the colors - bool changed = OnColorGUI(); + changed |= OnColorGUI(); // Edit the transformations @@ -2275,7 +2305,7 @@ public bool OnBlendGUI() bool changed = false; InitEditor(); - var currentBlendMode = _overlay.getTextureBlend(_channel); + var currentBlendMode = _overlay.GetOverlayBlend(_channel); var newBlendMode = (OverlayDataAsset.OverlayBlend)EditorGUILayout.EnumPopup(currentBlendMode, GUILayout.Width(100)); RestoreEditor(); diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/GeometrySelectorWindow.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/GeometrySelectorWindow.cs index b4263fb23..8bec7355c 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/GeometrySelectorWindow.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/GeometrySelectorWindow.cs @@ -267,17 +267,30 @@ public override void OnInspectorGUI() EditorGUI.EndDisabledGroup(); GUILayout.Space(20); - textureMap = EditorGUILayout.ObjectField("Set From Texture Map", textureMap, typeof(Texture2D), false) as Texture2D; - if (GUILayout.Button("Calculate occlusion from texture.")) + if (GUILayout.Button("Export Occlusion Map")) + { + GeometryUVEditorWindow.Init(_Source, true); + } + EditorGUILayout.LabelField(new GUIContent("Occlusion Map (Optional)", "Use this texture to attempt to automatically detect occluded triangles")); + textureMap = EditorGUILayout.ObjectField("Set From Occluaion Map", textureMap, typeof(Texture2D), false) as Texture2D; + if (GUILayout.Button("Add to Occlusion from texture.")) { if (_Source != null) { - if (textureMap == null) + if (ValidateTexture(textureMap)) { - EditorUtility.DisplayDialog("Warning", "A readable texture must be selected before processing.", "OK"); + _Source.UpdateFromTexture(textureMap); } - else + } + } + + if (GUILayout.Button("Set Occlusion from texture (clears existing)")) + { + if (_Source != null) + { + if (ValidateTexture(textureMap)) { + ClearAll(); _Source.UpdateFromTexture(textureMap); } } @@ -286,11 +299,26 @@ public override void OnInspectorGUI() GUILayout.Space(20); if (GUILayout.Button(new GUIContent("View UV Layout", "Brings up a window displaying the uv layout of the currently selected object and export to texture options."))) { - GeometryUVEditorWindow.Init(_Source); + GeometryUVEditorWindow.Init(_Source,false); } GUILayout.EndScrollView(); } + public bool ValidateTexture(Texture2D textureMap) + { + if (textureMap == null) + { + EditorUtility.DisplayDialog("Warning", "A readable texture must be selected before processing.", "OK"); + return false; + } + else if (!textureMap.isReadable) + { + EditorUtility.DisplayDialog("Warning", "Texture is not readable. Please set the read/write flag on the texture import settings.", "OK"); + return false; + } + return true; + } + private void UpdateShadingMode(bool wireframeOn) { if (SceneView.lastActiveSceneView == null) diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/GeometryUVEditorWindow.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/GeometryUVEditorWindow.cs index 60e12247d..781f2f741 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/GeometryUVEditorWindow.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/GeometryUVEditorWindow.cs @@ -2,6 +2,10 @@ using System.Collections.Generic; using UnityEngine; using UnityEditor; +using System; +using UnityEditor.SceneManagement; +using UnityEngine.SceneManagement; + namespace UMA.Editors { @@ -15,22 +19,47 @@ public class GeometryUVEditorWindow : EditorWindow private Vector2 drag; private Vector2[] box = { new Vector2(0,0), new Vector2(0,1), new Vector2(1,0), new Vector2(1,1) }; + private bool occlusionMapMode = false; + private Texture2D occlusionMap = null; + private Color32[] straightWhiteLine = new Color32[(int)dimension]; + - public static void Init(GeometrySelector obj) + public static void Init(GeometrySelector obj, bool OcclusionMapMode) { // Get existing open window or if none, make a new one: GeometryUVEditorWindow window = (GeometryUVEditorWindow)EditorWindow.GetWindow(typeof(GeometryUVEditorWindow)); window.titleContent = new GUIContent("UV Layout"); window.minSize = new Vector2(dimension, dimension); window.geometrySelector = obj; + window.occlusionMapMode = OcclusionMapMode; + if (OcclusionMapMode) + { + window.GenerateOcclusionMap(); + } window.Show(); } + private void OnDestroy() + { + if (occlusionMap != null) + { + DestroyImmediate(occlusionMap); + } + } + void OnGUI() { + if (occlusionMap != null) + { + GUI.color = Color.white; + GUI.DrawTexture(new Rect(startPosition.x, startPosition.y, occlusionMap.width, occlusionMap.height), occlusionMap);//, ScaleMode.ScaleToFit, false); + } + else + { DrawGrid(20, 0.2f, Color.gray); DrawGrid(100, 0.4f, Color.gray); DrawUVLines(); + } if(GUILayout.Button("Export", GUILayout.MaxWidth(100))) { @@ -39,7 +68,10 @@ void OnGUI() ProcessEvents(Event.current); - if (GUI.changed) Repaint(); + if (GUI.changed) + { + Repaint(); + } } private void ProcessEvents(Event e) @@ -69,7 +101,9 @@ private void OnDrag(Vector2 delta) private void DrawUVLines() { if (geometrySelector == null) + { return; + } BitArray selectedTris = geometrySelector.selectedTriangles; Mesh mesh = geometrySelector.sharedMesh; @@ -92,9 +126,13 @@ private void DrawUVLines() for(int i = 0; i < selectedTris.Length; i++) { if (selectedTris[i]) + { Handles.color = Color.red; + } else + { Handles.color = Color.white; + } int triIndex = i * 3; @@ -143,13 +181,311 @@ private void DrawGrid(float gridSpacing, float gridOpacity, Color gridColor) Handles.EndGUI(); } + + private void GenerateOcclusionMap() + { + BitArray selectedTris = geometrySelector.selectedTriangles; + Mesh mesh = geometrySelector.sharedMesh; + Vector2[] uvs = mesh.uv; + int[] triangles = mesh.triangles; + + Vector2 uv0; + Vector2 uv1; + Vector2 uv2; + Color currentColor = Color.white; + + + for (int i = 0; i < straightWhiteLine.Length; i++) + { + straightWhiteLine[i] = Color.white; + } + + int length = (int)dimension * (int)dimension; + Color32[] colors = new Color32[length]; + for (int i = 0; i < length; i++) + { + colors[i] = Color.black; + } + + if (occlusionMap != null) + { + DestroyImmediate(occlusionMap); + } + occlusionMap = new Texture2D((int)dimension, (int)dimension, TextureFormat.ARGB32, false); + //Set the background to black + + occlusionMap.SetPixels32(0, 0, (int)dimension - 1, (int)dimension - 1, colors); + for (int i = 0; i < selectedTris.Length; i++) + { + if (selectedTris[i]) + { + int triIndex = i * 3; + + uv0 = uvs[triangles[triIndex]]; + uv1 = uvs[triangles[triIndex + 1]]; + uv2 = uvs[triangles[triIndex + 2]]; + + uv0.x = Mathf.RoundToInt(uv0.x * dimension); + uv0.y = Mathf.RoundToInt(uv0.y * dimension); + uv1.x = Mathf.RoundToInt(uv1.x * dimension); + uv1.y = Mathf.RoundToInt(uv1.y * dimension); + uv2.x = Mathf.RoundToInt(uv2.x * dimension); + uv2.y = Mathf.RoundToInt(uv2.y * dimension); + + + DrawTriangle(occlusionMap, uv0, uv1, uv2); + } + } + occlusionMap.Apply(); + } + + public static bool LineIntersection(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, ref Vector2 intersection) + { + float Ax, Bx, Cx, Ay, By, Cy, d, e, f, num/*,offset*/; + float x1lo, x1hi, y1lo, y1hi; + + Ax = p2.x - p1.x; + Bx = p3.x - p4.x; + + // X bound box test/ + + if (Ax < 0) + { + + x1lo = p2.x; x1hi = p1.x; + + } + else + { + + x1hi = p2.x; x1lo = p1.x; + + } + + + + if (Bx > 0) + { + + if (x1hi < p4.x || p3.x < x1lo) + { + return false; + } + } + else + { + + if (x1hi < p3.x || p4.x < x1lo) + { + return false; + } + } + + Ay = p2.y - p1.y; + By = p3.y - p4.y; + + // Y bound box test// + if (Ay < 0) + { + + y1lo = p2.y; y1hi = p1.y; + + } + else + { + y1hi = p2.y; y1lo = p1.y; + } + + if (By > 0) + { + if (y1hi < p4.y || p3.y < y1lo) + { + return false; + } + } + else + { + if (y1hi < p3.y || p4.y < y1lo) + { + return false; + } + } + + Cx = p1.x - p3.x; + Cy = p1.y - p3.y; + d = By * Cx - Bx * Cy; // alpha numerator// + f = Ay * Bx - Ax * By; // both denominator// + + // alpha tests// + if (f > 0) + { + if (d < 0 || d > f) + { + return false; + } + } + else + { + if (d > 0 || d < f) + { + return false; + } + } + + e = Ax * Cy - Ay * Cx; // beta numerator// + + // beta tests // + if (f > 0) + { + if (e < 0 || e > f) + { + return false; + } + } + else + { + if (e > 0 || e < f) + { + return false; + } + } + + // check if they are parallel + if (f == 0) + { + return false; + } + + // compute intersection coordinates // + + num = d * Ax; // numerator // + intersection.x = p1.x + num / f; + num = d * Ay; + intersection.y = p1.y + num / f; + return true; + } + private void DrawTriangle(Texture2D tex, Vector2 v1, Vector2 v2, Vector2 v3) + { + Vector2[] vertices = { v1, v2, v3 }; + + //Sort the vertices by y + Array.Sort(vertices, (x, y) => x.y.CompareTo(y.y)); + + v1 = vertices[0]; + v2 = vertices[1]; + v3 = vertices[2]; + + // Draw a square around each vertex, to make sure we don't miss any pixels + DrawSquare(tex, v1, Color.white, dimension /256); + DrawSquare(tex, v2, Color.white, dimension / 256); + DrawSquare(tex, v3, Color.white, dimension / 256); + + /* here we know that v1.y <= v2.y <= v3.y */ + /* check for trivial case of bottom-flat triangle */ + if ((int)v2.y == (int)v3.y) + { + fillBottomFlatTriangle(tex, v1, v2, v3); + } + else if ((int)v1.y == (int)v2.y) + { + fillTopFlatTriangle(tex, v1, v2, v3); + } + else + { + // general case - split the triangle in a topflat and bottom-flat one + + Vector2 temp1; + Vector2 temp2; + + Vector2 intersection = Vector2.zero; + + temp1.x = 0; + temp1.y = v2.y; + temp2.x = dimension; + temp2.y = v2.y; + + float invslopev1v3 = (v3.x - v1.x) / (v3.y - v1.y); + float xintersect = v1.x + invslopev1v3 * (v2.y - v1.y); + + Vector2 v4 = new Vector2(xintersect, v2.y); + fillBottomFlatTriangle(tex, v1, v2, v4); + fillTopFlatTriangle(tex, v2, v4, v3); + + + return; + } + } + + private void DrawSquare(Texture2D tex, Vector2 v3, Color white, float v) + { + int x = (int)(v3.x - v); + int y = (int)(v3.y - v); + int height = (int)v * 2; + + for(int i=0; i (int)v1.y; scanlineY--) + { + DrawStraightLine(tex, (int)curx1, scanlineY, (int)curx2); + curx1 -= invslope1; + curx2 -= invslope2; + } + } + private void SaveTexture() { - string path = EditorUtility.SaveFilePanelInProject("Save Texture(s)", "Texture.png", "png", "Base Filename to save PNG files to."); + string filename = geometrySelector.meshAsset.name; + if (occlusionMap != null) + { + filename += "_MHA_OcclusionMap.png"; + } + else + { + filename += "_MHA_UV.png"; + } + + string path = EditorUtility.SaveFilePanelInProject("Save Texture(s)", filename, "png", "Base Filename to save PNG files to."); if (!string.IsNullOrEmpty(path)) { - Texture2D tex = new Texture2D((int)dimension, (int)dimension, TextureFormat.ARGB32, false); + bool freemap = false; + Texture2D tex; + if (occlusionMapMode) + { + tex = occlusionMap; + } + else + { + freemap = true; + tex = new Texture2D((int)dimension, (int)dimension, TextureFormat.ARGB32, false); BitArray selectedTris = geometrySelector.selectedTriangles; Mesh mesh = geometrySelector.sharedMesh; Vector2[] uvs = mesh.uv; @@ -173,9 +509,13 @@ private void SaveTexture() for (int i = 0; i < selectedTris.Length; i++) { if (selectedTris[i]) + { currentColor = Color.red; + } else + { currentColor = Color.white; + } int triIndex = i * 3; @@ -194,9 +534,45 @@ private void SaveTexture() //Handles.DrawLine(uv0, uv2); DrawLine(tex, (int)uv0.x, (int)uv0.y, (int)uv2.x, (int)uv2.y, currentColor); } + } byte[] data = tex.EncodeToPNG(); System.IO.File.WriteAllBytes(path, data); + if (freemap) + { + DestroyImmediate(tex); + } + AssetDatabase.Refresh(); + TextureImporter textureImporter = AssetImporter.GetAtPath(path) as TextureImporter; + textureImporter.textureType = TextureImporterType.Default; + textureImporter.isReadable = true; + textureImporter.mipmapEnabled = false; + AssetDatabase.ImportAsset(path); + } + } + + private void DrawStraightLine(Texture2D tex, int x0, int y0, int x1) + { + if (x0 > x1) + { + int tmp = x0; + x0 = x1; + x1 = tmp; + } + if (x1 >= dimension) + { + x1 = (int)dimension-1; + } + int width = (x1 - x0) + 1; + + if (width < 0) + { + return; + } + + if (width > 0) + { + tex.SetPixels32(x0, y0, width, 1, straightWhiteLine); } } diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/MeshHideInspector.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/MeshHideInspector.cs index 41e6d4004..af2584ed8 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/MeshHideInspector.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/MeshHideInspector.cs @@ -201,8 +201,8 @@ private void UpdateMeshPreview() for (int i = 0; i < _meshData.subMeshCount; i++) { -// _meshPreview.SetTriangles(_meshData.submeshes[i].triangles, i); - _meshPreview.SetIndices(_meshData.submeshes[i].GetTriangles(), MeshTopology.Triangles, i); + var tris = _meshData.submeshes[i].getBaseTriangles(); + _meshPreview.SetIndices(tris, MeshTopology.Triangles, i); } ResetPreviewCamera(); diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayColorDataPropertyDrawer.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayColorDataPropertyDrawer.cs index ebb3e91c2..4e8c3e8f2 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayColorDataPropertyDrawer.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayColorDataPropertyDrawer.cs @@ -6,13 +6,13 @@ using System.Text.RegularExpressions; using System.Reflection; using System.Collections; +using UnityEditor.UIElements; namespace UMA.Editors { [CustomPropertyDrawer(typeof(OverlayColorData),true)] public class OverlayColorDataPropertyDrawer : PropertyDrawer { - bool showAdvanced; GUIContent Modulate = new GUIContent("Multiplier"); GUIContent Additive = new GUIContent("Additive"); GUIContent Channels = new GUIContent("Channel Count"); @@ -62,8 +62,9 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten if (name.isExpanded) { EditorGUILayout.PropertyField(property.FindPropertyRelative("name")); + EditorGUILayout.PropertyField(property.FindPropertyRelative("isBaseColor")); - if (ocd != null) + if (ocd != null) { string Name = property.FindPropertyRelative("name").stringValue; int ChannelCount = EditorGUILayout.IntSlider(Channels, ocd.channelCount, 0, 16); @@ -77,13 +78,16 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten } } - showAdvanced = EditorGUILayout.Toggle("Show Extended Ranges", showAdvanced); + SerializedProperty showAdvancedProperty = property.FindPropertyRelative("showAdvanced"); + EditorGUILayout.PropertyField(showAdvancedProperty); + //showAdvanced = EditorGUILayout.Toggle("Show Extended Ranges", showAdvanced); GUILayout.Space(5); + for (int i = 0; i < mask.arraySize; i++) { - if (showAdvanced) + if (showAdvancedProperty.boolValue) { var channelMask = mask.GetArrayElementAtIndex(i); var channelColor = ToVector4(channelMask.colorValue); diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayDataAssetInspector.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayDataAssetInspector.cs index cba54e1b0..f64bb2930 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayDataAssetInspector.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayDataAssetInspector.cs @@ -91,6 +91,7 @@ public override void OnInspectorGUI() { GUIHelper.BeginVerticalPadded(10, new Color(0.75f, 0.875f, 1f)); EditorGUILayout.PropertyField(_textureList.FindPropertyRelative("Array.size")); + _blendList.arraySize = _textureList.arraySize; for (int i = 0; i < _textureList.arraySize; i++) { SerializedProperty textureElement = _textureList.GetArrayElementAtIndex(i); diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayInspector.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayInspector.cs index ffddd7bc0..57911c7a3 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayInspector.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/OverlayInspector.cs @@ -13,7 +13,7 @@ public class OverlayInspector : Editor #endif public static void CreateOverlayMenuItem() { - CustomAssetUtility.CreateAsset(); + var ovl = CustomAssetUtility.CreateAsset(); } diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/SlotDataAssetInspector.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/SlotDataAssetInspector.cs index 725d58d0a..b717bc6b7 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/SlotDataAssetInspector.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/SlotDataAssetInspector.cs @@ -10,7 +10,7 @@ namespace UMA.Editors [CanEditMultipleObjects] public class SlotDataAssetInspector : Editor { - static string[] RegularSlotFields = new string[] { "slotName", "CharacterBegun", "SlotAtlassed", "SlotProcessed", "SlotBeginProcessing", "DNAApplied", "CharacterCompleted", "_slotDNALegacy","tags","isWildCardSlot","Races"}; + static string[] RegularSlotFields = new string[] { "slotName", "CharacterBegun", "SlotAtlassed", "SlotProcessed", "SlotBeginProcessing", "DNAApplied", "CharacterCompleted", "_slotDNALegacy","tags","isWildCardSlot","Races","smooshOffset", "smooshExpand"}; static string[] WildcardSlotFields = new string[] { "slotName", "CharacterBegun", "SlotAtlassed", "SlotProcessed", "SlotBeginProcessing", "DNAApplied", "CharacterCompleted", "_slotDNALegacy", "tags", "isWildCardSlot", "Races", "_rendererAsset", "maxLOD", "useAtlasOverlay", "overlayScale", "animatedBoneNames", "_slotDNA", "meshData", "subMeshIndex", }; SerializedProperty slotName; SerializedProperty CharacterBegun; @@ -21,11 +21,15 @@ public class SlotDataAssetInspector : Editor SerializedProperty CharacterCompleted; SerializedProperty MaxLOD; SerializedProperty isClippingPlane; + SerializedProperty smooshOffset; + SerializedProperty smooshExpand; SlotDataAsset slot; SlotDataAsset.Welding lastWeld = null; + SlotDataAsset WeldToSlot = null; - bool CopyNormals; + bool CopyNormals; bool CopyBoneWeights; + bool AverageNormals; private int selectedRaceIndex = -1; private List foundRaces = new List(); private List foundRaceNames = new List(); @@ -64,6 +68,8 @@ void OnEnable() CharacterCompleted = serializedObject.FindProperty("CharacterCompleted"); MaxLOD = serializedObject.FindProperty("maxLOD"); isClippingPlane = serializedObject.FindProperty("isClippingPlane"); + smooshExpand = serializedObject.FindProperty("smooshExpand"); + smooshOffset = serializedObject.FindProperty("smooshOffset"); slot = (target as SlotDataAsset); SetRaceLists(); @@ -119,12 +125,17 @@ private void UpdateSourceAsset(SlotDataAsset sda) { if (sda != null) { - lastWeld = slot.CalculateWelds(sda, CopyNormals, CopyBoneWeights); + lastWeld = slot.CalculateWelds(sda, CopyNormals, CopyBoneWeights, AverageNormals); } } public override void OnInspectorGUI() { + if (slot == null) + { + OnEnable(); + } + bool forceUpdate = false; SlotDataAsset targetAsset = target as SlotDataAsset; serializedObject.Update(); @@ -153,6 +164,42 @@ public override void OnInspectorGUI() Editor.DrawPropertiesExcluding(serializedObject, WildcardSlotFields); else Editor.DrawPropertiesExcluding(serializedObject, RegularSlotFields); + + GUILayout.Space(10); + GUIHelper.BeginVerticalPadded(10, new Color(0.75f, 0.875f, 1f)); + EditorGUILayout.HelpBox("Smooshing is a feature that conforms one slot to another using a clipping plane. Smoosh Offset is used to adjust the offset of the conforming vertexes to help assist conforming and fitting. Smoosh Expand expands scales the vertexes. ", MessageType.Info); + + var currentTarget = target as SlotDataAsset; + + forceUpdate = EditorGUI.EndChangeCheck(); + EditorGUILayout.PropertyField(smooshOffset); + EditorGUILayout.PropertyField(smooshExpand); + + //GUILayout.BeginHorizontal(); + /*GUILayout.Label("Smoosh Offset", GUILayout.Width(100)); + currentTarget.smooshOffset.x = EditorGUILayout.DelayedFloatField("X", currentTarget.smooshOffset.x, GUILayout.Width(50),GUILayout.ExpandWidth(false)); + currentTarget.smooshOffset.y = EditorGUILayout.DelayedFloatField("Y", currentTarget.smooshOffset.y, GUILayout.Width(50),GUILayout.ExpandWidth(false)); + currentTarget.smooshOffset.z = EditorGUILayout.DelayedFloatField("Z", currentTarget.smooshOffset.z, GUILayout.Width(50),GUILayout.ExpandWidth(false)); + // GUILayout.EndHorizontal(); + // GUILayout.BeginHorizontal(); + GUILayout.Label("Smoosh Expand", GUILayout.Width(100)); + currentTarget.smooshOffset.x = EditorGUILayout.DelayedFloatField("X", currentTarget.smooshOffset.x, GUILayout.Width(50),GUILayout.ExpandWidth(false)); + currentTarget.smooshOffset.y = EditorGUILayout.DelayedFloatField("Y", currentTarget.smooshOffset.y, GUILayout.Width(50),GUILayout.ExpandWidth(false)); + currentTarget.smooshOffset.z = EditorGUILayout.DelayedFloatField("Z", currentTarget.smooshOffset.z, GUILayout.Width(50),GUILayout.ExpandWidth(false)); + //GUILayout.EndHorizontal(); */ + if (GUILayout.Button("Save and Test Smoosh")) + { + UMAUpdateProcessor.UpdateSlot(target as SlotDataAsset, false); + EditorUtility.SetDirty(target); + AssetDatabase.SaveAssetIfDirty(target); + string path = AssetDatabase.GetAssetPath(target.GetInstanceID()); + AssetDatabase.ImportAsset(path); + forceUpdate = true; + } + EditorGUI.BeginChangeCheck(); + // EditorGUILayout.PropertyField(smooshOffset); + //EditorGUILayout.PropertyField(smooshExpand); + GUIHelper.EndVerticalPadded(10); GUILayout.Space(10); slot.tagList.DoLayoutList(); @@ -208,7 +255,7 @@ public override void OnInspectorGUI() serializedObject.ApplyModifiedProperties(); #region WELDS - bool forceUpdate = false; + selectedRaceIndex = EditorGUILayout.Popup("Select Base Slot by Race", selectedRaceIndex, foundRaceNames.ToArray()); if (selectedRaceIndex <= 0) @@ -226,56 +273,65 @@ public override void OnInspectorGUI() { if (GUILayout.Button(string.Format("{0} ({1})", sd.asset.name, sd.slotName))) { - UpdateSourceAsset(sd.asset); + // UpdateSourceAsset(sd.asset); + WeldToSlot = sd.asset; } } } } GUILayout.Space(12); - //int inx = 0; - //foreach(SlotDataAsset.Welding thisWeld in slot.Welds) - //{ - if (lastWeld != null) - { - GUILayout.BeginHorizontal(); - GUILayout.Label(lastWeld.WeldedToSlot + " (" + lastWeld.WeldPoints.Count.ToString() + " points, " + lastWeld.MisMatchCount + " mismatches)", GUILayout.ExpandWidth(true)); - //if (GUILayout.Button("x", GUILayout.Width(18))) - // deleteme = inx; - GUILayout.EndHorizontal(); - } - //inx++; - // } - //if (deleteme >= 0) - //{ - // slot.Welds.RemoveAt(deleteme); - // forceUpdate = true; - //} - SlotDataAsset sda = null; - sda = EditorGUILayout.ObjectField("Drop slot here to create weld",sda, typeof(SlotDataAsset),false) as SlotDataAsset; + WeldToSlot = EditorGUILayout.ObjectField("Drop slot here to create weld",WeldToSlot, typeof(SlotDataAsset),false) as SlotDataAsset; - if (sda != null) - { - slot.CalculateWelds(sda,CopyNormals,CopyBoneWeights); - forceUpdate = true; - } CopyBoneWeights = EditorGUILayout.Toggle("Copy Boneweights", CopyBoneWeights); CopyNormals = EditorGUILayout.Toggle("Copy Normals", CopyNormals); - #endregion + AverageNormals = EditorGUILayout.Toggle("Average Normals", AverageNormals); + GUILayout.Box("Warning! averaging normals will update both slots!",GUILayout.ExpandWidth(true)); + + if (WeldToSlot == null) + { + EditorGUI.BeginDisabledGroup(true); + } + if (GUILayout.Button("Perform Weld")) + { + lastWeld = slot.CalculateWelds(WeldToSlot, CopyNormals, CopyBoneWeights,AverageNormals); + forceUpdate = true; + } + if (WeldToSlot == null) + { + EditorGUI.EndDisabledGroup(); + } + + int lastWeldCount = 0; + int lastWeldMismatch = 0; + if (lastWeld != null) + { + lastWeldCount = lastWeld.WeldPoints.Count; + lastWeldMismatch = lastWeld.MisMatchCount; + } + + if (lastWeld != null) + { + GUILayout.Label($"Last Weld: {lastWeldCount} points, {lastWeld.MisMatchCount} mismatches", GUILayout.ExpandWidth(true)); + } + else + { + GUILayout.Label($"Last Weld: None", GUILayout.ExpandWidth(true)); + } + #endregion - if (EditorGUI.EndChangeCheck() || forceUpdate) + if (EditorGUI.EndChangeCheck() || forceUpdate) { EditorUtility.SetDirty(target); + AssetDatabase.SaveAssetIfDirty(target); string path = AssetDatabase.GetAssetPath(target.GetInstanceID()); AssetDatabase.ImportAsset(path); - UMAUpdateProcessor.UpdateSlot(target as SlotDataAsset); - } - - + UMAUpdateProcessor.UpdateSlot(target as SlotDataAsset, false); + } } private void AnimatedBoneDropAreaGUI(Rect dropArea) @@ -336,7 +392,6 @@ private GameObject DropAreaGUI(Rect dropArea) } return null; } - private void AddAnimatedBone(string animatedBone) { var hash = UMASkeleton.StringToHash(animatedBone); diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAAssetTreeView.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAAssetTreeView.cs index 0d4669b08..48bfb93e0 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAAssetTreeView.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAAssetTreeView.cs @@ -26,6 +26,7 @@ enum AssetColumns IsAddressable, Group, Labels, + Ignore, Always, Buttons } @@ -217,7 +218,13 @@ void HeaderCellGUI(Rect cellRect, TreeViewItem item, AssetColu } break; - case AssetColumns.IsResource: + case AssetColumns.Ignore: + { + GUI.Label(cellRect, ate.IgnoreCount.ToString()); + } + break; + + case AssetColumns.IsResource: { GUI.Label(cellRect, ate.IsResourceCount.ToString()); } @@ -323,7 +330,21 @@ void CellGUI(Rect cellRect, TreeViewItem item, AssetColumns co } break; - case AssetColumns.IsResource: + case AssetColumns.Ignore: + { + cellRect.x += kCheckboxOffset; + cellRect.width -= kCheckboxOffset; + bool clicked = EditorGUI.Toggle(cellRect, ai.Ignore); + if (clicked != ai.Ignore) + { + ai.Ignore = clicked; + UMAAssetIndexer.Instance.ForceSave(); + } + } + break; + + + case AssetColumns.IsResource: { cellRect.x += kCheckboxOffset; cellRect.width -= kCheckboxOffset; @@ -626,7 +647,19 @@ public static MultiColumnHeaderState CreateDefaultMultiColumnHeaderState(float t autoResize = false, allowToggleVisibility = true }, - new MultiColumnHeaderState.Column + new MultiColumnHeaderState.Column + { + headerContent = new GUIContent("Ignore", "This is not included in addressables or resources"), + headerTextAlignment = TextAlignment.Center, + sortedAscending = true, + sortingArrowAlignment = TextAlignment.Left, + width = 40, + minWidth = 40, + maxWidth = 40, + autoResize = false, + allowToggleVisibility = true + }, + new MultiColumnHeaderState.Column { headerContent = new GUIContent("Commands", "Command Buttons"), headerTextAlignment = TextAlignment.Center, diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAEditorUtilities.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAEditorUtilities.cs index 3226ba462..1637e6438 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAEditorUtilities.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAEditorUtilities.cs @@ -25,6 +25,7 @@ public static class UMAEditorUtilities private const string umaLocation = "RelativeUMA"; private const string DefineSymbol_32BitBuffers = "UMA_32BITBUFFERS"; private const string DefineSymbol_Addressables = "UMA_ADDRESSABLES"; + private const string DefineSymbol_BurstCompile = "UMA_BURSTCOMPILE"; //private const string DefineSymbol_AsmDef = "UMA_ASMDEF"; public const string ConfigToggle_LeanMeanSceneFiles = "UMA_CLEANUP_GENERATED_DATA_ON_SAVE"; public const string ConfigToggle_UseSharedGroup = "UMA_ADDRESSABLES_USE_SHARED_GROUP"; @@ -35,6 +36,7 @@ public static class UMAEditorUtilities public const string ConfigToggle_IncludeOther = "UMA_SHAREDGROUP_INCLUDEOTHERINDEXED"; public const string ConfigToggle_StripUmaMaterials = "UMA_SHAREDGROUP_STRIPUMAMATERIALS"; public const string ConfigToggle_PostProcessAllAssets = "UMA_POSTPROCESS_ALL_ASSETS"; + public const string ConfigToggle_IndexAutoRepair = "UMA_INDEX_AUTOREPAIR"; private static string DNALocation = "UMA/"; static UMAEditorUtilities() @@ -133,6 +135,7 @@ public static void PreferencesGUI() ConfigToggle(ConfigToggle_PostProcessAllAssets, "Postprocess All Assets", "When assets in unity are moved, this will fix their paths in the index. This can be very slow.", false); ConfigToggle(ConfigToggle_LeanMeanSceneFiles, "Clean/Regen on Save", "When using edit-time UMA's the geometry is stored in scene files. Enabling this cleans them up before saving, and regenerates after saving, making your scene files squeaky clean.", true); + ConfigToggle(ConfigToggle_IndexAutoRepair, "Auto Repair Index", "When enabled, the index will be repaired automatically when items are not found. This can be slow, so it is recommended to only enable this if you have a team of artists checking in work simultaneously.", false); EditorGUI.BeginChangeCheck(); EditorGUILayout.Space(); @@ -147,7 +150,7 @@ public static void PreferencesGUI() var defineSymbols = new HashSet(PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup).Split(';')); - + DefineSymbolToggle(defineSymbols, DefineSymbol_BurstCompile, "Use Burst Compile", "This activates the burst compiler for UMA."); DefineSymbolToggle(defineSymbols, DefineSymbol_32BitBuffers, "Use 32bit buffers", "This allows meshes bigger than 64k vertices"); DefineSymbolToggle(defineSymbols, DefineSymbol_Addressables, "Use Addressables", "This activates the code that loads from asset bundles using addressables."); @@ -263,6 +266,11 @@ public static bool IsAddressable() return GetConfigValue(DefineSymbol_Addressables, false); } + public static bool IsAutoRepairIndex() + { + return GetConfigValue(ConfigToggle_IndexAutoRepair, false); + } + public static bool IsAsmdef(HashSet defineSymbols, string Symbol) { return (defineSymbols.Contains(Symbol)); diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavorite.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavorite.cs new file mode 100644 index 000000000..8908eef2c --- /dev/null +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavorite.cs @@ -0,0 +1,21 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +[System.Serializable] +public class UMAFavorite +{ + public string path; + public string GUID; + public string name; + public Object asset; + public UMAFavoriteList favoriteList; + public UMAFavorite (Object asset) + { + this.asset = asset; + path = AssetDatabase.GetAssetPath(asset); + GUID = AssetDatabase.AssetPathToGUID(path); + name = asset.name; + } +} diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavorite.cs.meta b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavorite.cs.meta new file mode 100644 index 000000000..d3e023053 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavorite.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b9451aac7fd1ac42aecbc8680b8e053 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteList.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteList.cs new file mode 100644 index 000000000..8de3fafb1 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteList.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +public class UMAFavoriteList : ScriptableObject +{ + public List Favorites = new List(); + public bool exPanded = true; + public void AddAsset(Object asset) + { + if (Favorites == null) + { + Favorites = new List(); + } + UMAFavorite favorite = new UMAFavorite(asset); + favorite.favoriteList = this; + Favorites.Add(favorite); + } + public void RemoveAsset(Object asset) + { + Favorites.Remove(new UMAFavorite(asset)); + } + public void RemoveAsset(UMAFavorite asset) + { + Favorites.Remove(asset); + } +} diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteList.cs.meta b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteList.cs.meta new file mode 100644 index 000000000..bec7ff22c --- /dev/null +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteList.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a21b01507d5987b4689b5f16296f8eb8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteWindow.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteWindow.cs new file mode 100644 index 000000000..ab3f32e63 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteWindow.cs @@ -0,0 +1,226 @@ +using JetBrains.Annotations; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Xml.Serialization; +using UnityEditor; +using UnityEngine; +using static UnityEngine.GUI; + +namespace UMA.Editors +{ + + public class UMAFavoriteWindow : EditorWindow + { + public static UMAFavoriteWindow instance; + private static List favoritelists = new List(); + private static bool initialSearchCompleted = false; + private static Vector2 scrollPosition = Vector2.zero; + + [MenuItem("UMA/Favorites")] + public static void ShowWindow() + { + RefreshFavoriteListCategories(); + var window = EditorWindow.GetWindow(typeof(UMAFavoriteWindow)); + window.titleContent.text = "UMA Favorites"; + instance = window as UMAFavoriteWindow; + } + + public static void RefreshFavoriteListCategories() + { + initialSearchCompleted = true; + var favoritelists = AssetDatabase.FindAssets("t:UMAFavoriteList"); + foreach (var favoritelist in favoritelists) + { + var path = AssetDatabase.GUIDToAssetPath(favoritelist); + var list = AssetDatabase.LoadAssetAtPath(path); + if (list != null) + { + if (!UMAFavoriteWindow.favoritelists.Contains(list)) + { + UMAFavoriteWindow.favoritelists.Add(list); + } + } + } + } + + public static void AddNewFavoriteType() + { + string Path = EditorUtility.SaveFilePanelInProject("Create New Favorite Category", "CategoryName", "asset", "Create a new favorite category"); + if (Path != "") + { + string CategoryName = System.IO.Path.GetFileNameWithoutExtension(Path); + var asset = CustomAssetUtility.CreateAsset(Path,false,CategoryName,false); + UMAFavoriteWindow.favoritelists.Add(asset); + AddFavorite(asset); + } + if (instance != null) + { + instance.Repaint(); + } + } + + + public static void AddFavorite(object oFavoriteList) + { + var favoriteList = oFavoriteList as UMAFavoriteList; + foreach (var o in Selection.objects) + { + favoriteList.AddAsset(o); + } + EditorUtility.SetDirty(favoriteList); + AssetDatabase.SaveAssetIfDirty(favoriteList); + if (instance != null) + { + instance.Repaint(); + } + } + + [UnityEditor.MenuItem("Assets/Add Selected Assets to UMA Favorites")] + public static void AddSelectedToFavorites() + { + if (!initialSearchCompleted) + { + RefreshFavoriteListCategories(); + } + List choices = new List(); + + foreach(var fl in favoritelists) + { + UMAGenericPopupChoice choice = new UMAGenericPopupChoice(new GUIContent(fl.name), () => { AddFavorite(fl); }); + choices.Add(choice); + } + + if (choices.Count > 0) + { + // Add seperator + choices.Add(new UMAGenericPopupChoice()); + } + + choices.Add(new UMAGenericPopupChoice(new GUIContent("Add New Favorite Category"), AddNewFavoriteType)); + UMAGenericPopupSelection.ShowWindow("Add to Favorites", choices); + } + + void OnEnable() + { + instance = this; + } + + private void OnGUI() + { + instance = this; + UMAFavoriteList deletedList = null; + + if (!initialSearchCompleted) + { + RefreshFavoriteListCategories(); + } + // search bar, refresh button + scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); + foreach (var fl in favoritelists) + { + if (DrawFavoriteList(fl)) + { + deletedList = fl; + } + } + EditorGUILayout.EndScrollView(); + + if (deletedList != null) + { + favoritelists.Remove(deletedList); + AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(deletedList)); + } + } + + private void RemoveFavorite(object oFavorite) + { + var favorite = oFavorite as UMAFavorite; + var favoriteList = favorite.favoriteList; + favoriteList.RemoveAsset(favorite); + EditorUtility.SetDirty(favoriteList); + AssetDatabase.SaveAssetIfDirty(favoriteList); + AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(favoriteList)); + Repaint(); + } + + private void OpenFavorite(object oFavorite) + { + var favorite = oFavorite as UMAFavorite; + AssetDatabase.OpenAsset(favorite.asset); + } + + private void PingFavorite(object oFavorite) + { + var favorite = oFavorite as UMAFavorite; + Selection.activeObject = favorite.asset; + EditorGUIUtility.PingObject(favorite.asset); + } + + private void InspectFavorite(object oFavorite) + { + var favorite = oFavorite as UMAFavorite; + InspectorUtlity.InspectTarget(favorite.asset); + // Selection.activeObject = favorite.asset; + } + + private bool DrawFavoriteList(UMAFavoriteList fl) + { + UMAFavorite deletedFavorite = null; + bool pingPressed = false; + bool deletePressed = false; + GUIContent pingButton = new GUIContent("", "Ping"); + GUIContent inspectButton = new GUIContent("", "Inspect"); + GUIContent deleteButton = new GUIContent("", "Remove"); + //GUIContent openButton = new GUIContent("", "Open"); + pingButton.image = EditorGUIUtility.IconContent("d_scenepicking_pickable_hover@2x").image; + inspectButton.image = EditorGUIUtility.IconContent("d_UnityEditor.InspectorWindow@2x").image; + deleteButton.image = EditorGUIUtility.IconContent("d_winbtn_win_close_h@2x").image; + // openButton.image = EditorGUIUtility.IconContent("Customized@2x").image; + + GUIHelper.FoldoutBarButton(ref fl.exPanded, fl.name, "Ping", out pingPressed, out deletePressed); + if (fl.exPanded) + { + GUIHelper.BeginVerticalPadded(10, new Color(0.75f, 0.875f, 1f)); + foreach (var o in fl.Favorites) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(new GUIContent(AssetDatabase.GetCachedIcon(AssetDatabase.GetAssetPath(o.asset))), GUILayout.Width(20), GUILayout.Height(22)); + //Type t = o.asset.GetType(); + // EditorGUILayout.LabelField($"{o.name}", GUILayout.ExpandWidth(true), GUILayout.MinWidth(120), GUILayout.Height(22)); + if (GUILayout.Button($"{o.name}", GUILayout.ExpandWidth(true), GUILayout.MinWidth(120), GUILayout.Height(22))) + { + OpenFavorite(o); + } +// if (GUILayout.Button(openButton,GUILayout.Width(22), GUILayout.Height(22))) +// { +// OpenFavorite(o); +// } + if (GUILayout.Button(pingButton, GUILayout.Width(22),GUILayout.Height(22))) + { + PingFavorite(o); + } + if (GUILayout.Button(inspectButton, GUILayout.Width(22), GUILayout.Height(22))) + { + InspectFavorite(o); + } + if (GUILayout.Button(deleteButton, GUILayout.Width(22), GUILayout.Height(22))) + { + deletedFavorite = o; + } + EditorGUILayout.EndHorizontal(); + } + GUIHelper.EndVerticalPadded(10); + if (deletedFavorite != null) + { + RemoveFavorite(deletedFavorite); + } + } + if (pingPressed) + { + EditorGUIUtility.PingObject(fl); + } + return deletePressed; + } + } +} diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteWindow.cs.meta b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteWindow.cs.meta new file mode 100644 index 000000000..145987ca5 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAFavoriteWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 64b9670e518d88943b0ac114a782da7d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupChoice.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupChoice.cs new file mode 100644 index 000000000..2d80e0cbd --- /dev/null +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupChoice.cs @@ -0,0 +1,29 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class UMAGenericPopupChoice +{ + public GUIContent Content; + public event System.Action OnClick; + public bool isSeperator = false; + public UMAGenericPopupChoice(GUIContent content, System.Action onClick) + { + Content = content; + OnClick = onClick; + isSeperator = false; + } + + public UMAGenericPopupChoice() + { + this.isSeperator = true; + } + + public void FireEvent() + { + if (OnClick != null) + { + OnClick(); + } + } +} diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupChoice.cs.meta b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupChoice.cs.meta new file mode 100644 index 000000000..6d6bb3942 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupChoice.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8617e3086ba504d43a2fa65159014964 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupSelection.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupSelection.cs new file mode 100644 index 000000000..4b456aa33 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupSelection.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Xml.Serialization; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; +namespace UMA.Editors +{ + + public class UMAGenericPopupSelection : EditorWindow + { + const int titleBarHeight = 24; + const int borderSize = 4; + const int padding = 3; + + private static List Choices; + + public float lastHeight = 0f; + public static void ShowWindow(string Title, List choices) + { + Choices = choices; + var window = EditorWindow.GetWindow(typeof(UMAGenericPopupSelection)); + window.titleContent.text = Title; + + float height = titleBarHeight + borderSize; + float width = 200.0f; + var EditorPos = EditorGUIUtility.GetMainWindowPosition(); + //GUIStyle style = EditorStyles.iconButton; + GUIStyle style = EditorStyles.miniButton; + foreach(var v in choices) + { + var r = style.CalcSize(v.Content); + height += r.y; + height += padding; + if (r.x > width) + { + width = r.x; + } + } + + var WindowPos = new Rect(EditorPos.x + (EditorPos.width / 2) - (width / 2), EditorPos.y + (EditorPos.height / 2) - (height / 2), width, height); + + window.position = WindowPos; + window.Focus(); + window.ShowModalUtility(); + } + + private void OnGUI() + { + GUILayout.Label("Select a category to add to", EditorStyles.boldLabel); + foreach (UMAGenericPopupChoice c in Choices) + { + if (c.isSeperator) + { + GUILayout.Space(5); + EditorGUILayout.Separator(); + GUILayout.Space(5); + } + else + { + if (GUILayout.Button(c.Content)) + { + c.FireEvent(); + this.Close(); + } + } + } + } + } +} diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupSelection.cs.meta b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupSelection.cs.meta new file mode 100644 index 000000000..69f52fba6 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAGenericPopupSelection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68823a0b7069f05478e25ff218f4e66d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAMaterialInspector.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAMaterialInspector.cs index 91fc00005..059f314ff 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAMaterialInspector.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAMaterialInspector.cs @@ -50,12 +50,28 @@ public override void OnInspectorGUI() showHelp = EditorGUILayout.Toggle("Show Help", showHelp); - EditorGUILayout.PropertyField(serializedObject.FindProperty("material"), new GUIContent( "Material", "The Unity Material to link to.")); + EditorGUILayout.PropertyField(serializedObject.FindProperty("_material"), new GUIContent( "Default Material", "The Unity Material to link to.")); + if (showHelp) + { + EditorGUILayout.HelpBox("Default Material: This is the material that will be used if no other material is found.", MessageType.Info); + } + + EditorGUILayout.PropertyField(serializedObject.FindProperty("srpMaterials"), new GUIContent("SRP Materials", "Materials for SRP pipelines. If no SRP materials are found, the default material will be used.")); + if (showHelp) + { + EditorGUILayout.HelpBox("SRP Materials: These are the materials that will be used for the various SRP pipelines. If no SRP materials are found, the default material will be used.", MessageType.Info); + } + + EditorGUILayout.PropertyField(materialTypeProperty, new GUIContent( "Material Type", "To atlas or not to atlas- that is the question.")); if (showHelp) { EditorGUILayout.HelpBox("Atlas: Combine all textures using this material into a single atlas. Each channel will be a separate atlas - ie, normal maps will not be combine with albedo\nNo Atlas: Create a single texture for each channel, compositing all layers and colorizing as needed.\nUseExistingMaterial: use the material assigned directly. No channels, layering or colorizing will be done. This type has no texture channels.\nUseExistingTextures: Generates a new material, assigns the textures from the overlay to the appropriate channel. No layering can be done, but you can colorize the texture using Color 0 on the overlay. This will set all channels to type TintedTexture.", MessageType.Info); } + if (MatType == UMAMaterial.MaterialType.UseExistingTextures) + { + EditorGUILayout.PropertyField(serializedObject.FindProperty("secondPass"), new GUIContent("Second Pass", "The Unity Material for a second pass. Usually NULL.")); + } EditorGUILayout.PropertyField(serializedObject.FindProperty("translateSRP"), new GUIContent("Translate SRP", "When checked, this will automatically translate the UMAMaterial property names to URP/HDRP names (ie - _MainTex becomes _BaseMap etc.)")); GUILayout.Space(20); diff --git a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAUpdateProcessor.cs b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAUpdateProcessor.cs index b15f1c959..20a39b3c6 100644 --- a/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAUpdateProcessor.cs +++ b/UMAProject/Assets/UMA/Core/Editor/Scripts/UMAUpdateProcessor.cs @@ -79,7 +79,7 @@ public static void UpdateRecipe(UMATextRecipe recipe) } } - public static void UpdateSlot(SlotDataAsset slot) + public static void UpdateSlot(SlotDataAsset slot, bool doItAll = true) { if (slot == null) { @@ -103,7 +103,15 @@ public static void UpdateSlot(SlotDataAsset slot) { if (sd.asset == slot) { + if (doItAll) + { dca.GenerateSingleUMA(); + } + else + { + dca.GenerateSingleUMA(true); + } + dca.ForceUpdate(false,false,true); break; } } diff --git a/UMAProject/Assets/UMA/Core/Extensions/DynamicCharacterSystem/Scripts/DynamicCharacterAvatar.cs b/UMAProject/Assets/UMA/Core/Extensions/DynamicCharacterSystem/Scripts/DynamicCharacterAvatar.cs index bf0dbc94b..14e4d01d4 100644 --- a/UMAProject/Assets/UMA/Core/Extensions/DynamicCharacterSystem/Scripts/DynamicCharacterAvatar.cs +++ b/UMAProject/Assets/UMA/Core/Extensions/DynamicCharacterSystem/Scripts/DynamicCharacterAvatar.cs @@ -1,3 +1,5 @@ +#undef SUPER_LOGGINGCOLLECTIONS + using UnityEngine; //For loading a recipe directly from the web @2465 using UnityEngine.Networking; @@ -14,7 +16,7 @@ using UMA.PoseTools;//so we can set the expression set based on the race using UnityEngine.SceneManagement; using System.Web; -using static HairSmoosher; + #if UMA_ADDRESSABLES using UnityEngine.ResourceManagement.AsyncOperations; using AsyncOp = UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle>; @@ -249,6 +251,7 @@ public enum PreviewModel { Male, Female, Custom } // so that the slot will not be included in the next build. private HashSet forceRemovedBaseSlots = new HashSet(); + private HashSet forceRemovedTags = new HashSet(); #if UNITY_EDITOR private PreviewModel lastPreviewModel; private GameObject lastCustomModel; @@ -259,6 +262,7 @@ public enum PreviewModel { Male, Female, Custom } #region PROPERTIES + public HashSet ForceRemovedTags { get { return forceRemovedTags; } } public HashSet ForceRemovedBaseSlots { get { return forceRemovedBaseSlots; } } public List ForceSuppressedWardrobeSlots { get { return forceSuppressedWardrobeSlots; } } @@ -636,7 +640,7 @@ public void GenerateNow() #if UNITY_EDITOR - public void GenerateSingleUMA() + public void GenerateSingleUMA(bool slotsOnly = false) { UMAGenerator ugb = umaGenerator as UMAGenerator; if (umaGenerator == null) @@ -650,6 +654,11 @@ public void GenerateSingleUMA() } if (ugb != null) { + /* if (slotsOnly) + { + ugb.UpdateSlots(umaData); + return; + } */ // TODO: Fix this if (UnityEditor.PrefabUtility.IsPartOfPrefabInstance(gameObject.transform)) { // Unfortunately we must unpack the prefab or it will blow up. @@ -1438,7 +1447,7 @@ public void LoadDefaultWardrobe() { foreach (WardrobeRecipeListItem recipe in validRecipes) { - if (recipe._recipe != null) + if (recipe._recipe != null && recipe._enabledInDefaultWardrobe) { if (((recipe._recipe.compatibleRaces.Count == 0 || recipe._recipe.compatibleRaces.Contains(activeRace.name)) || (activeRace.racedata.IsCrossCompatibleWith(recipe._recipe.compatibleRaces) && activeRace.racedata.wardrobeSlots.Contains(recipe._recipe.wardrobeSlot)))) { @@ -1465,7 +1474,7 @@ public void LoadDefaultWardrobe() } else { - if (Debug.isDebugBuild) + if (Debug.isDebugBuild && recipe._recipe == null) { Debug.LogWarning("[DynamicCharacterAvatar:LoadDefaultWardrobe] recipe._recipe was null for " + recipe._recipeName); } @@ -1646,6 +1655,15 @@ public bool SetSlot(UMATextRecipe utr) return false; } + public void SetSlot(string Slotname) + { + var UTR = UMAContext.Instance.GetRecipe(Slotname,false); + if (UTR != null) + { + SetSlot(UTR); + } + } + public void SetSlot(string Slotname, string Recipename) { UMATextRecipe utr = FindSlotRecipe(Slotname, Recipename); @@ -3893,6 +3911,11 @@ public void BuildCharacter(bool RestoreDNA = true, bool skipBundleCheck = false, HiddenSlots.Add(s); } + foreach(string s in forceRemovedTags) + { + HideTags.Add(s); + } + #if UNITY_EDITOR if (!Application.isPlaying) { @@ -4204,6 +4227,10 @@ private void LoadCharacter(UMARecipeBase umaRecipe, List Repl if (sd.asset.isSmooshable) { smooshSlots.Add(sd); + if (umaData.VertexOverrides.ContainsKey(sd.slotName)) + { + umaData.VertexOverrides.Remove(sd.slotName); + } } } @@ -4274,6 +4301,7 @@ private void LoadCharacter(UMARecipeBase umaRecipe, List Repl UpdateSameRace(); } + umaData.RebuildSkeleton = false; if (alwaysRebuildSkeleton) { umaData.RebuildSkeleton = true; @@ -4303,27 +4331,43 @@ private void LoadCharacter(UMARecipeBase umaRecipe, List Repl } } - public Vector3 GetDestVertPhys(Vector3 vertex, Vector3 center, float PlaneDist, SlotDataAsset SmooshTarget, PhysicsScene ps, int vertindex, float smooshDistance, float overSmoosh) + + public Vector3 GetDestVertPhys(Vector3 originVertex, Vector3 center, float PlaneDist, SlotDataAsset SmooshTarget, PhysicsScene ps, int vertindex, float smooshDistance, float overSmoosh) { Vector3 result = new Vector3(); + if (overSmoosh == 0) + { + overSmoosh = 0.00001f; + } + + result.Set(originVertex.x, originVertex.y, originVertex.z); - Vector3 AlternateCenter = new Vector3(center.x, center.y + 0.001f, center.z); - result.Set(vertex.x, vertex.y, vertex.z); - float distance = Vector3.Distance(center, vertex); + Vector3 direction = (center - originVertex); + float distance = direction.magnitude; - Vector3 direction = (center - vertex).normalized; - if (ps.Raycast(vertex, direction, out RaycastHit hit, 5.0f, -5, QueryTriggerInteraction.Ignore)) + + if (ps.Raycast(originVertex, direction, out RaycastHit hit))//, 5.0f, -5, QueryTriggerInteraction.Ignore)) + { + + var facing = Vector3.Dot(hit.normal, direction); + + if (facing > 0) { + return result; + } + // todo: offset by smoosh distance - float vertdistance = (hit.point - vertex).magnitude; + result.Set(hit.point.x, hit.point.y, hit.point.z); + + float vertdistance = (hit.point - originVertex).magnitude; if (vertdistance < distance) { distance = vertdistance; float newSmooshDistance = smooshDistance; // Smooth smooshing - if (distance > 0.0f) + if (PlaneDist > 0.0f) { - newSmooshDistance = smooshDistance + (smooshDistance * (distance / overSmoosh)); + newSmooshDistance = smooshDistance + (smooshDistance * (PlaneDist / overSmoosh)); } Vector3 newLocation = hit.point + (direction * (0 - newSmooshDistance)); result.Set(newLocation.x, newLocation.y, newLocation.z); @@ -4333,12 +4377,44 @@ public Vector3 GetDestVertPhys(Vector3 vertex, Vector3 center, float PlaneDist, result.Set(hit.point.x, hit.point.y, hit.point.z); } } + + return result; + } + + + // cache these + private static Scene SmooshScene; + // todo: Should cache these. Maybe in a dictionary by slot name? + private static Dictionary SmooshTargets = new Dictionary(); + + private static void CreateSmooshScene() + { + if (SmooshScene.IsValid()) + { + CleanScene(SmooshScene); + } else { - result.Set(center.x, center.y, center.z); +#if UNITY_EDITOR + SmooshScene = EditorSceneManager.NewPreviewScene(); +#else + CreateSceneParameters csp = new CreateSceneParameters(LocalPhysicsMode.Physics3D); + SmooshScene = SceneManager.CreateScene("SmooshScene", csp); +#endif + } } - return result; + private static void CleanScene(Scene scene) + { + var rootObjects = scene.GetRootGameObjects(); + foreach (var rootObject in rootObjects) + { +#if UNITY_EDITOR + GameObject.DestroyImmediate(rootObject); +#else + GameObject.Destroy(rootObject); +#endif + } } public void SmooshSlotPhysics(UMAData umaData, SlotDataAsset SmooshMe, SlotDataAsset SmooshPlane, SlotDataAsset SmooshTarget, bool invertX, bool invertY, bool invertZ, bool invertDist, float smooshDistance, float overSmoosh) @@ -4349,32 +4425,34 @@ public void SmooshSlotPhysics(UMAData umaData, SlotDataAsset SmooshMe, SlotDataA } Mesh m = new Mesh(); - if (umaData.VertexOverrides.ContainsKey(SmooshTarget.slotName)) - { - m.SetVertices(umaData.VertexOverrides[SmooshTarget.slotName]); - } - else - { - m.SetVertices(SmooshTarget.meshData.vertices); - } - m.SetTriangles(SmooshTarget.meshData.submeshes[0].getBaseTriangles(), 0); -#if UNITY_EDITOR - Scene S = EditorSceneManager.NewPreviewScene(); -#else - CreateSceneParameters csp = new CreateSceneParameters(LocalPhysicsMode.Physics3D); - Scene S = SceneManager.CreateScene("SmooshScene", csp); -#endif + m.SetVertices(SmooshTarget.meshData.vertices); + + int[] triangles = new int[SmooshTarget.meshData.submeshes[0].getBaseTriangles().Length]; + Array.Copy(SmooshTarget.meshData.submeshes[0].getBaseTriangles(), triangles, SmooshTarget.meshData.submeshes[0].getBaseTriangles().Length); + m.SetTriangles(triangles, 0); + + Physics.BakeMesh(m.GetInstanceID(), false); + + CreateSmooshScene(); + GameObject go = new GameObject(); + go.transform.localPosition = Vector3.zero; + go.transform.localRotation = Quaternion.identity; + go.transform.localScale = Vector3.one; try { var collider = go.AddComponent(); collider.sharedMesh = m; - SceneManager.MoveGameObjectToScene(go, S); - PhysicsScene physicsScene = S.GetPhysicsScene(); - var a = SmooshPlane.meshData.vertices[0]; - var b = SmooshPlane.meshData.vertices[1]; - var c = SmooshPlane.meshData.vertices[2]; + + SceneManager.MoveGameObjectToScene(go, SmooshScene); + PhysicsScene physicsScene = SmooshScene.GetPhysicsScene(); + // Physics.SyncTransforms(); + + var a = SmooshPlane.meshData.vertices[0] + SmooshPlane.clippingPlaneOffset[0]; + var b = SmooshPlane.meshData.vertices[1] + SmooshPlane.clippingPlaneOffset[1]; + var c = SmooshPlane.meshData.vertices[2] + SmooshPlane.clippingPlaneOffset[2]; + var d = SmooshPlane.meshData.vertices[3] + SmooshPlane.clippingPlaneOffset[3]; if (invertY) { @@ -4389,8 +4467,16 @@ public void SmooshSlotPhysics(UMAData umaData, SlotDataAsset SmooshMe, SlotDataA c.x = -c.x; } - Plane p = new Plane(a, b, c); - Vector3 center = (a + b + c) / 3; + //Plane p = new Plane(a, b, c); + Plane p = new Plane(a, c, b); + + Vector3 total = Vector3.zero; + for(int i=0; i -overSmoosh) { - newVerts[i] = GetDestVertPhys(currentVert, center, dist, SmooshTarget, physicsScene, i, smooshDistance, overSmoosh); - } - else - { - newVerts[i] = currentVert; + newVector = GetDestVertPhys(currentVert, center, dist, SmooshTarget, physicsScene, i, smooshDistance, overSmoosh); + if (Mathf.Abs((newVector - currentVert).magnitude) > 0.18f) + { + newVector = currentVert; + } } + + newVector = SmooshMe.smooshOffset + newVector; + newVerts[i].Set(newVector.x * SmooshMe.smooshExpand.x, newVector.y * SmooshMe.smooshExpand.y, newVector.z * SmooshMe.smooshExpand.z); } umaData.AddVertexOverride(SmooshMe, newVerts); } finally { -#if UNITY_EDITOR - EditorSceneManager.UnloadSceneAsync(S); - GameObject.DestroyImmediate(m); -#else - // Cleanup - SceneManager.UnloadSceneAsync(S); - GameObject.Destroy(m); -#endif + CleanScene(SmooshScene); } } @@ -4667,70 +4750,15 @@ void ReplaceSlot(UMAWardrobeRecipe Replacer) continue; } var ovl = checkSlot.GetOverlay(0); - - if (ovl != null && replacedSlot != null && ovl.overlayName == replacedSlot.GetOverlay(0).overlayName) + if (ovl.overlayName == replacedSlot.GetOverlay(0).overlayName) { checkSlot.SetOverlayList(ReplacedOverlays); } } } - - /* - - for (int i = 0; i < umaData.umaRecipe.slotDataList.Length; i++) - { - SlotData originalSlot = umaData.umaRecipe.slotDataList[i]; - if (originalSlot == null) - { - continue; - } - - if (originalSlot.slotName == replaceSlot) - { - UMAPackedRecipeBase.UMAPackRecipe PackRecipe = Replacer.PackedLoad(context); - UMAData.UMARecipe TempRecipe = UMATextRecipe.UnpackRecipe(PackRecipe, context); - if (TempRecipe.slotDataList.Length > 0) - { - List originalOverlays = originalSlot.GetOverlayList(); - foreach (SlotData replacementSlot in TempRecipe.slotDataList) - { - if (replacementSlot != null) - { - if (originalOverlays.Count > 1) - { - replacedOverlay = originalOverlays[0]; - for (int j = 1; j < originalOverlays.Count; j++) - { - replacementSlot.AddOverlay(originalOverlays[j]); - } - } - // replacementSlot.SetOverlayList(originalOverlays); - umaData.umaRecipe.slotDataList[i] = replacementSlot; - replacedSlot = replacementSlot; - break; - } - } - } - } } - if (replacedSlot != null && replacedOverlay != null) - { - foreach (SlotData sd in umaData.umaRecipe.slotDataList) - { - var ovl = sd.GetOverlay(0); - if (ovl != null) - { - if (ovl.overlayName == replacedOverlay.overlayName) - { - sd.SetOverlayList(replacedSlot.GetOverlayList()); - } - } - } - } - */ - } /// /// JRM - Renamed from ProcessHiddenSlots for Wildcards @@ -4797,6 +4825,8 @@ void PostProcessSlots(List hiddenSlots, List hideTags = null) continue; } + sd.RemoveOverlayTags(hideTags); + if (sd.HasTag(hideTags)) { continue; @@ -5198,6 +5228,7 @@ public class WardrobeRecipeListItem public string _recipeName; [System.NonSerialized] public UMATextRecipe _recipe; + public bool _enabledInDefaultWardrobe = true; //store compatible races here because when a recipe is not downloaded we dont have access to this info... public List _compatibleRaces; diff --git a/UMAProject/Assets/UMA/Core/Scripts/AssetItem.cs b/UMAProject/Assets/UMA/Core/Scripts/AssetItem.cs index c1a0ec307..2559bfe26 100644 --- a/UMAProject/Assets/UMA/Core/Scripts/AssetItem.cs +++ b/UMAProject/Assets/UMA/Core/Scripts/AssetItem.cs @@ -27,6 +27,7 @@ public class AssetItem public bool IsAssetBundle; public bool IsAddressable; public bool IsAlwaysLoaded; + public bool Ignore; // does not go into adressables or resources. public string AddressableGroup; public string AddressableAddress { diff --git a/UMAProject/Assets/UMA/Core/Scripts/BaseCharacterModifier.cs b/UMAProject/Assets/UMA/Core/Scripts/BaseCharacterModifier.cs index 653e56193..7f2daa4bd 100644 --- a/UMAProject/Assets/UMA/Core/Scripts/BaseCharacterModifier.cs +++ b/UMAProject/Assets/UMA/Core/Scripts/BaseCharacterModifier.cs @@ -301,6 +301,7 @@ private Bounds DoBoundsModifications(SkinnedMeshRenderer targetRenderer, UMAData bool prevColliderEnabled = false; bool prevUpdateWhenOffScreen = false; Bounds newBounds = targetRenderer.bounds; + var saveRoot = targetRenderer.rootBone; targetRenderer.rootBone = null; if (_updateBounds) @@ -365,6 +366,7 @@ private Bounds DoBoundsModifications(SkinnedMeshRenderer targetRenderer, UMAData umaCollider.enabled = prevColliderEnabled; } targetRenderer.localBounds = newBounds; + targetRenderer.rootBone = saveRoot; return newBounds; } diff --git a/UMAProject/Assets/UMA/Core/Scripts/DNAEvaluationGraph.cs b/UMAProject/Assets/UMA/Core/Scripts/DNAEvaluationGraph.cs index cc9e912ad..206342d50 100644 --- a/UMAProject/Assets/UMA/Core/Scripts/DNAEvaluationGraph.cs +++ b/UMAProject/Assets/UMA/Core/Scripts/DNAEvaluationGraph.cs @@ -58,8 +58,7 @@ public Keyframe[] GraphKeys /// public float Evaluate(float dnaValue) { - float value = _graph.Evaluate(dnaValue); - return value; + return _graph.Evaluate(dnaValue); } /// diff --git a/UMAProject/Assets/UMA/Core/Scripts/DNAEvaluatorList.cs b/UMAProject/Assets/UMA/Core/Scripts/DNAEvaluatorList.cs index 167df524e..9cb7d2c05 100644 --- a/UMAProject/Assets/UMA/Core/Scripts/DNAEvaluatorList.cs +++ b/UMAProject/Assets/UMA/Core/Scripts/DNAEvaluatorList.cs @@ -121,8 +121,7 @@ private float GetAggregateValueNew(UMADnaBase dna, float result = 0f) if (!string.IsNullOrEmpty(_dnaEvaluators[i].dnaName)) { aveCount++; - float value = _dnaEvaluators[i].Evaluate(dna); - result += value; + result += _dnaEvaluators[i].Evaluate(dna); } } if (aveCount > 0) diff --git a/UMAProject/Assets/UMA/Core/Scripts/UMAAssetIndexer.cs b/UMAProject/Assets/UMA/Core/Scripts/UMAAssetIndexer.cs index 69ad3a2b1..fb74ff318 100644 --- a/UMAProject/Assets/UMA/Core/Scripts/UMAAssetIndexer.cs +++ b/UMAProject/Assets/UMA/Core/Scripts/UMAAssetIndexer.cs @@ -685,6 +685,10 @@ public List GetAssetItems(UMAPackedRecipeBase recipe, bool LookForLOD foreach (var slot in Slots) { // We are getting extra blank slots. That's weird. + if (slot == null) + { + continue; + } if (string.IsNullOrWhiteSpace(slot.id)) continue; @@ -703,6 +707,11 @@ public List GetAssetItems(UMAPackedRecipeBase recipe, bool LookForLOD { foreach (var overlay in slot.overlays) { + if (overlay == null) + { + continue; + } + AssetItem o = GetAssetItem(overlay.id); if (o != null) { @@ -714,6 +723,11 @@ public List GetAssetItems(UMAPackedRecipeBase recipe, bool LookForLOD { foreach (string slod in TypeDic.Keys) { + if (String.IsNullOrEmpty(slod)) + { + continue; + } + if (slod.StartsWith(LodIndicator)) { AssetItem lodSlot = GetAssetItem(slod); @@ -742,9 +756,15 @@ private List GetAssetItemsV2(UMAPackedRecipeBase.UMAPackRecipe PackRe foreach (var slot in Slots) { if (slot == null) + { continue; + } + if (string.IsNullOrEmpty(slot.id)) + { continue; + } + string LodIndicator = slot.id.Trim() + "_LOD"; AssetItem s = GetAssetItem(slot.id); if (s != null) @@ -866,6 +886,13 @@ public List GetAllAssets(string[] foldersToSearch = null) where T : UnityE /// public bool CheckIndex() { + // Unfortunately that asmdef is not available here + string autoconfig = "UMA_INDEX_AUTOREPAIR"; + if (EditorPrefs.GetBool(autoconfig, false)) + { + return false; + } + if (WasChecked) { return false; @@ -962,6 +989,7 @@ private void RefreshType(Type ot) FolderFilter = TypeFolderSearch[typeString]; } AddType(typeString, ot, FolderFilter); + ForceSave(); } #endif @@ -1240,6 +1268,21 @@ public string GetLabel(UMARecipeBase recipe) keys.Add(GetLabel(wr)); } + // preload any additive recipes. + foreach (var addList in avatar.AdditiveRecipes.Values) + { + if (addList != null) + { + foreach (var wr in addList) + { + if (wr != null) + { + keys.Add(GetLabel(wr)); + } + } + } + } + // preload utility recipes foreach (var tr in avatar.umaAdditionalRecipes) { @@ -1271,6 +1314,20 @@ public string GetLabel(UMARecipeBase recipe) keys.Add(GetLabel(wr)); } + foreach(var addList in avatar.AdditiveRecipes.Values) + { + if (addList != null) + { + foreach(var wr in addList) + { + if (wr != null) + { + keys.Add(GetLabel(wr)); + } + } + } + } + if (avatar.umaAdditionalRecipes != null) { foreach (var tr in avatar.umaAdditionalRecipes) @@ -2293,7 +2350,6 @@ private void AddType(string s, Type CurrentType, List FolderFilter) } } EditorUtility.ClearProgressBar(); - ForceSave(); } @@ -2499,6 +2555,13 @@ public Dictionary GetAssetDictionary(System.Type type) /// public void HealIndex(bool AlwaysRebuild = false) { + // do not heal in the editor if we are playing. + if (Application.isPlaying == true) + { + return; + } + + Debug.Log("Healing index..."); if (!AlwaysRebuild) { // See if we can shortcut @@ -2533,6 +2596,7 @@ public void RebuildIndex() ai._Name = ai.EvilName; } UpdateSerializedDictionaryItems(); + RebuildRaceRecipes(); } #endregion diff --git a/UMAProject/Assets/UMA/Core/Scripts/UMAPackedRecipeBase.cs b/UMAProject/Assets/UMA/Core/Scripts/UMAPackedRecipeBase.cs index b2ea68540..296ceadea 100644 --- a/UMAProject/Assets/UMA/Core/Scripts/UMAPackedRecipeBase.cs +++ b/UMAProject/Assets/UMA/Core/Scripts/UMAPackedRecipeBase.cs @@ -223,6 +223,7 @@ public class PackedOverlayDataV3 public bool isTransformed; public Vector3 scale; public float rotation; + public int[] blendModes; #if (UNITY_STANDALONE || UNITY_IOS || UNITY_ANDROID || UNITY_PS4 || UNITY_XBOXONE) && !UNITY_2017_3_OR_NEWER //supported platforms for procedural materials public PackedOverlaySubstanceData[] data; #endif @@ -367,12 +368,17 @@ public class PackedOverlayColorDataV3 public short[] colors; public string[] ShaderParms; public bool alwaysUpdate; + public bool isBaseColor; public PackedOverlayColorDataV3() { name = ""; colors = new short[0]; ShaderParms = new string[0]; +#if UNITY_EDITOR + alwaysUpdate = false; + isBaseColor = false; +#endif } public PackedOverlayColorDataV3(OverlayColorData colorData) @@ -401,6 +407,9 @@ public PackedOverlayColorDataV3(OverlayColorData colorData) { alwaysUpdate = colorData.PropertyBlock.alwaysUpdate; } +#if UNITY_EDITOR + isBaseColor = colorData.isBaseColor; +#endif if (colorData.HasProperties) { ShaderParms = new string[colorData.PropertyBlock.shaderProperties.Count]; @@ -423,6 +432,9 @@ public void SetOverlayColorData(OverlayColorData overlayColorData) int channelCount = colors.Length / 8; overlayColorData.channelMask = new Color[channelCount]; overlayColorData.channelAdditiveMask = new Color[channelCount]; +#if UNITY_EDITOR + overlayColorData.isBaseColor = isBaseColor; +#endif int colorIndex = 0; for (int channel = 0; channel < channelCount; channel++) { @@ -612,7 +624,12 @@ public static UMAPackRecipe PackRecipeV3(UMA.UMAData.UMARecipe umaRecipe) tempPackedOverlay.isTransformed = overlayData.instanceTransformed; tempPackedOverlay.scale = overlayData.Scale; tempPackedOverlay.rotation = overlayData.Rotation; + tempPackedOverlay.blendModes = new int[overlayData.GetOverlayBlendsLength()]; + for (int b=0;b< overlayData.GetOverlayBlendsLength(); b++) + { + tempPackedOverlay.blendModes[b] = (int)overlayData.GetOverlayBlend(b); + } #if (UNITY_STANDALONE || UNITY_IOS || UNITY_ANDROID || UNITY_PS4 || UNITY_XBOXONE) && !UNITY_2017_3_OR_NEWER //supported platforms for procedural materials if (overlayData.isProcedural && (overlayData.proceduralData != null)) @@ -952,6 +969,15 @@ public static void UnpackRecipeVersion3(UMA.UMAData.UMARecipe umaRecipe, UMAPack overlayData.colorData.name = OverlayColorData.UNSHARED; } + if (packedOverlay.blendModes != null) + { + overlayData.SetOverlayBlendsLength(packedOverlay.blendModes.Length); + for (int blendModeIdx = 0; blendModeIdx < packedOverlay.blendModes.Length; blendModeIdx++) + { + overlayData.SetOverlayBlend(blendModeIdx, (OverlayDataAsset.OverlayBlend)packedOverlay.blendModes[blendModeIdx]); + } + } + if (UMAPackRecipe.MaterialIsValid(overlayData.asset.material)) overlayData.EnsureChannels(overlayData.asset.material.channels.Length); diff --git a/UMAProject/Assets/UMA/Core/Scripts/UMAUVAttachedItem.cs b/UMAProject/Assets/UMA/Core/Scripts/UMAUVAttachedItem.cs index b2ccd3147..b17ab4f6e 100644 --- a/UMAProject/Assets/UMA/Core/Scripts/UMAUVAttachedItem.cs +++ b/UMAProject/Assets/UMA/Core/Scripts/UMAUVAttachedItem.cs @@ -30,12 +30,12 @@ public class UMAUVAttachedItem public List triangle = new List(); public SkinnedMeshRenderer skin; private Mesh tempMesh; - public UMAUVAttachedItemLauncher bootStrapper; private UMAData umaData; private Transform mostestBone; public Vector3 originalPosition; public Vector3 normal; public Vector3 normalMult = Vector3.one; + public List blendshapeAdjusters = new List(); public bool InitialFound = false; public float DistanceFromBone = 0.0f; @@ -76,7 +76,10 @@ public void Setup(UMAData umaData, UMAUVAttachedItemLauncher bootstrap) tempMesh = new Mesh(); uvVerts = new UVVerts(); subMeshNumber = -1; - bootStrapper = bootstrap; + blendshapeAdjusters.Clear(); + foreach(var bsa in bootstrap.blendshapeAdjusters) { + blendshapeAdjusters.Add(new UMAUVAttachedItemBlendshapeAdjuster(bsa)); + } normalAdjust = bootstrap.normalAdjust; uVLocation = bootstrap.uVLocation; @@ -308,7 +311,7 @@ public void DoLateUpdate(SkinnedMeshRenderer skin, Transform transform, DynamicC Vector3 newTranslation = new Vector3(translation.x, translation.y, translation.z); #if true - foreach (var bsAdjust in bootStrapper.blendshapeAdjusters) + foreach (var bsAdjust in blendshapeAdjusters) { if(string.IsNullOrEmpty(bsAdjust.RaceName) || bsAdjust.RaceName == avatar.activeRace.name) { diff --git a/UMAProject/Assets/UMA/Core/Scripts/UMAUVAttachedItemBlendshapeAdjuster.cs b/UMAProject/Assets/UMA/Core/Scripts/UMAUVAttachedItemBlendshapeAdjuster.cs index 6e9bd1504..6113fe358 100644 --- a/UMAProject/Assets/UMA/Core/Scripts/UMAUVAttachedItemBlendshapeAdjuster.cs +++ b/UMAProject/Assets/UMA/Core/Scripts/UMAUVAttachedItemBlendshapeAdjuster.cs @@ -10,4 +10,18 @@ public class UMAUVAttachedItemBlendshapeAdjuster public string RaceName; public Vector3 newOffset; public Vector3 newOrientation; + + public UMAUVAttachedItemBlendshapeAdjuster(string blendshapeName, string raceName, Vector3 newOffset, Vector3 newOrientation) { + BlendshapeName = blendshapeName; + RaceName = raceName; + this.newOffset = newOffset; + this.newOrientation = newOrientation; + } + + public UMAUVAttachedItemBlendshapeAdjuster(UMAUVAttachedItemBlendshapeAdjuster src) { + this.newOffset = src.newOffset; + this.newOrientation = src.newOrientation; + this.BlendshapeName = src.BlendshapeName; + this.RaceName = src.RaceName; + } } diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Cutout.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Cutout.meta new file mode 100644 index 000000000..9ca90db04 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Cutout.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1e90d78d53403e439f360b175db51a8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data.meta new file mode 100644 index 000000000..162f2700b --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5b4c325b50714134596b72ab388f5b10 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasShader.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader.shader similarity index 100% rename from UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasShader.shader rename to UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader.shader diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasShader.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader.shader.meta similarity index 100% rename from UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasShader.shader.meta rename to UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader.shader.meta diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorBurn.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorBurn.shader new file mode 100644 index 000000000..968b048ad --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorBurn.shader @@ -0,0 +1,126 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNew_ColorBurn" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend Zero SrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +half4 frag (v2f i) : COLOR +{ + half4 maskcol = tex2D (_ExtraTex, i.uv); + float value = 1 - maskcol.a; + return half4(value, value, value, value); +} +ENDCG + } + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend One One + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float BlendMode_ColorBurn(float base, float blend) +{ + if (base >= 1.0) + return 1.0; + else if (blend <= 0.0) + return 0.0; + else + return 1.0 - min(1.0, (1.0-base) / blend); +} + +float3 BlendMode_ColorBurn(float3 base, float3 blend) +{ + return float3( BlendMode_ColorBurn(base.r, blend.r), + BlendMode_ColorBurn(base.g, blend.g), + BlendMode_ColorBurn(base.b, blend.b) ); +} + +half4 frag (v2f i) : COLOR +{ + half4 texcol = tex2D(_MainTex, i.uv); + half4 maskcol = tex2D (_ExtraTex, i.uv); + half4 basecol = tex2D(_BaseTex, i.uv); + + texcol.rgb = BlendMode_ColorBurn(basecol.rgb, texcol.rgb); + return (texcol * _Color + _AdditiveColor) * maskcol.a; +} + +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorBurn.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorBurn.shader.meta new file mode 100644 index 000000000..663d28c12 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorBurn.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 59c382ffc8bc32f4d92e53948d3431e0 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorDodge.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorDodge.shader new file mode 100644 index 000000000..00061fe19 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorDodge.shader @@ -0,0 +1,121 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNew_ColorDodge" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} + +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend Zero SrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +half4 frag (v2f i) : COLOR +{ + half4 maskcol = tex2D (_ExtraTex, i.uv); + float value = 1 - maskcol.a; + return half4(value, value, value, value); +} +ENDCG + } + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend One One + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float BlendMode_ColorDodge(float base, float blend) +{ + if (base <= 0.0) + return 0.0; + if (blend >= 1.0) + return 1.0; + else + return min(1.0, base / (1.0-blend)); +} + +half4 frag (v2f i) : COLOR +{ + half4 texcol = tex2D(_MainTex, i.uv); + half4 maskcol = tex2D (_ExtraTex, i.uv); + half4 basecol = tex2D(_BaseTex, i.uv); + + texcol.rgb = BlendMode_ColorDodge(basecol.rgb, texcol.rgb); + return (texcol * _Color + _AdditiveColor) * maskcol.a; +} + +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorDodge.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorDodge.shader.meta new file mode 100644 index 000000000..76cd650f7 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_ColorDodge.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 353bcb59bc293294399a855b2881b1f7 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Darken.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Darken.shader new file mode 100644 index 000000000..acf3257ce --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Darken.shader @@ -0,0 +1,116 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNew_Darken" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend Zero SrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +half4 frag (v2f i) : COLOR +{ + half4 maskcol = tex2D (_ExtraTex, i.uv); + float value = 1 - maskcol.a; + return half4(value, value, value, value); +} +ENDCG + } + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend One One + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float3 BlendMode_Darken(float3 base, float3 blend) +{ + return min(base, blend); +} + +half4 frag (v2f i) : COLOR +{ + half4 texcol = tex2D(_MainTex, i.uv); + half4 maskcol = tex2D (_ExtraTex, i.uv); + half4 basecol = tex2D(_BaseTex, i.uv); + + texcol.rgb = BlendMode_Darken(basecol.rgb, texcol.rgb); + return (texcol * _Color + _AdditiveColor) * maskcol.a; +} + +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Darken.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Darken.shader.meta new file mode 100644 index 000000000..34ffc7548 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Darken.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: e5c5b4cf426f2ea48a7cce0214a0bdb4 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_HardLight.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_HardLight.shader new file mode 100644 index 000000000..7a87499c5 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_HardLight.shader @@ -0,0 +1,117 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNew_HardLight" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend Zero SrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +half4 frag (v2f i) : COLOR +{ + half4 maskcol = tex2D (_ExtraTex, i.uv); + float value = 1 - maskcol.a; + return half4(value, value, value, value); +} +ENDCG + } + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend One One + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float BlendMode_HardLight(float base, float blend) +{ + return (blend <= 0.5) ? 2*base*blend : 1 - 2*(1-base)*(1-blend); +} + +half4 frag (v2f i) : COLOR +{ + half4 texcol = tex2D(_MainTex, i.uv); + half4 maskcol = tex2D (_ExtraTex, i.uv); + half4 basecol = tex2D(_BaseTex, i.uv); + + texcol.rgb = BlendMode_HardLight(basecol.rgb, texcol.rgb); + return (texcol * _Color + _AdditiveColor) * maskcol.a; +} + + +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_HardLight.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_HardLight.shader.meta new file mode 100644 index 000000000..bbe5ec1ee --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_HardLight.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: da31722262eeee64f936b9ee3e310d37 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Lighten.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Lighten.shader new file mode 100644 index 000000000..716079a18 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Lighten.shader @@ -0,0 +1,114 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNew_Lighten" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend Zero SrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +half4 frag (v2f i) : COLOR +{ + half4 maskcol = tex2D (_ExtraTex, i.uv); + float value = 1 - maskcol.a; + return half4(value, value, value, value); +} +ENDCG + } + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend One One + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float3 BlendMode_Lighten(float3 base, float3 blend) +{ + return max(base, blend); +} + +half4 frag (v2f i) : COLOR +{ + half4 texcol = tex2D(_MainTex, i.uv); + half4 maskcol = tex2D (_ExtraTex, i.uv); + half4 basecol = tex2D(_BaseTex, i.uv); + + texcol.rgb = BlendMode_Lighten(basecol.rgb, texcol.rgb); + return (texcol * _Color + _AdditiveColor) * maskcol.a; +} + +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Lighten.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Lighten.shader.meta new file mode 100644 index 000000000..dd43e1a8b --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Lighten.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 45f4712c260a06e4f9d269efa51b5ce8 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Multiply.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Multiply.shader new file mode 100644 index 000000000..25d6bc3ca --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Multiply.shader @@ -0,0 +1,112 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNew_Multiply" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend Zero SrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +half4 frag (v2f i) : COLOR +{ + half4 maskcol = tex2D (_ExtraTex, i.uv); + float value = 1 - maskcol.a; + return half4(value, value, value, value); +} +ENDCG + } + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend One One + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float3 BlendMode_Multiply(float3 base, float3 blend) +{ + return base*blend; +} +half4 frag (v2f i) : COLOR +{ + half4 texcol = tex2D(_MainTex, i.uv); + half4 maskcol = tex2D (_ExtraTex, i.uv); + half4 basecol = tex2D(_BaseTex, i.uv); + + texcol.rgb = BlendMode_Multiply(basecol.rgb, texcol.rgb); + return (texcol * _Color + _AdditiveColor) * maskcol.a; +} +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Multiply.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Multiply.shader.meta new file mode 100644 index 000000000..ab67cb7f3 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Multiply.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 9ffddd6feae61314c847684c042c3125 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Overlay.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Overlay.shader new file mode 100644 index 000000000..63ea6ee06 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Overlay.shader @@ -0,0 +1,114 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNew_Overlay" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend Zero SrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +half4 frag (v2f i) : COLOR +{ + half4 maskcol = tex2D (_ExtraTex, i.uv); + float value = 1 - maskcol.a; + return half4(value, value, value, value); +} +ENDCG + } + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend One One + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float BlendMode_Overlay(float base, float blend) +{ + return (base <= 0.5) ? 2*base*blend : 1 - 2*(1-base)*(1-blend); +} + +half4 frag (v2f i) : COLOR +{ + half4 texcol = tex2D(_MainTex, i.uv); + half4 maskcol = tex2D (_ExtraTex, i.uv); + half4 basecol = tex2D(_BaseTex, i.uv); + + texcol.rgb = BlendMode_Overlay(basecol.rgb, texcol.rgb); + return (texcol * _Color + _AdditiveColor) * maskcol.a; +} + +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Overlay.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Overlay.shader.meta new file mode 100644 index 000000000..5ee3edac7 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Overlay.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 9931f25706937944ca44b618185a03f0 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Screen.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Screen.shader new file mode 100644 index 000000000..7102ec87f --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Screen.shader @@ -0,0 +1,113 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNew_Screen" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend Zero SrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +half4 frag (v2f i) : COLOR +{ + half4 maskcol = tex2D (_ExtraTex, i.uv); + float value = 1 - maskcol.a; + return half4(value, value, value, value); +} +ENDCG + } + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend One One + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float3 BlendMode_Screen(float3 base, float3 blend) +{ + return base + blend - base*blend; +} + +half4 frag (v2f i) : COLOR +{ + half4 texcol = tex2D(_MainTex, i.uv); + half4 maskcol = tex2D (_ExtraTex, i.uv); + half4 basecol = tex2D(_BaseTex, i.uv); + + texcol.rgb = BlendMode_Screen(basecol.rgb, texcol.rgb); + return (texcol * _Color + _AdditiveColor) * maskcol.a; +} +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Screen.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Screen.shader.meta new file mode 100644 index 000000000..ecd558fae --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Screen.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: eff2e81e510ad8348b120d56d22fddf3 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_SoftLight.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_SoftLight.shader new file mode 100644 index 000000000..25f823b06 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_SoftLight.shader @@ -0,0 +1,128 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNew_SoftLight" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend Zero SrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +half4 frag (v2f i) : COLOR +{ + half4 maskcol = tex2D (_ExtraTex, i.uv); + float value = 1 - maskcol.a; + return half4(value, value, value, value); +} +ENDCG + } + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend One One + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float BlendMode_SoftLight(float base, float blend) +{ + if (blend <= 0.5) + { + return base - (1-2*blend)*base*(1-base); + } + else + { + float d = (base <= 0.25) ? ((16*base-12)*base+4)*base : sqrt(base); + return base + (2*blend-1)*(d-base); + } +} + +float3 BlendMode_SoftLight(float3 base, float3 blend) +{ + return float3( BlendMode_SoftLight(base.r, blend.r), + BlendMode_SoftLight(base.g, blend.g), + BlendMode_SoftLight(base.b, blend.b) ); +} + +half4 frag (v2f i) : COLOR +{ + half4 texcol = tex2D(_MainTex, i.uv); + half4 maskcol = tex2D (_ExtraTex, i.uv); + half4 basecol = tex2D(_BaseTex, i.uv); + + texcol.rgb = BlendMode_SoftLight(basecol.rgb, texcol.rgb); + return (texcol * _Color + _AdditiveColor) * maskcol.a; +} +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_SoftLight.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_SoftLight.shader.meta new file mode 100644 index 000000000..01f86620e --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_SoftLight.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: c21f293c9e1e3a6408c5f2f8feceaa00 +ShaderImporter: + defaultTextures: [] + userData: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Subtract.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Subtract.shader new file mode 100644 index 000000000..69a290e89 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Subtract.shader @@ -0,0 +1,121 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNew_Subtract" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend Zero SrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + + float3 BlendMode_Subtract(float3 base, float3 blend) + { + return max(0, base - blend); + } + + +half4 frag (v2f i) : COLOR +{ + half4 maskcol = tex2D (_ExtraTex, i.uv); + float value = 1 - maskcol.a; + return half4(value, value, value, value); +} +ENDCG + } + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + Blend One One + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + + float3 BlendMode_Subtract(float3 base, float3 blend) + { + return max(0, base - blend); + } + + +half4 frag (v2f i) : COLOR +{ + half4 texcol = tex2D(_MainTex, i.uv); + half4 maskcol = tex2D (_ExtraTex, i.uv); + half4 basecol = tex2D(_BaseTex, i.uv); + + texcol.rgb = BlendMode_Subtract(basecol.rgb, texcol.rgb); + return (texcol * _Color + _AdditiveColor) * maskcol.a; +} + +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Subtract.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Subtract.shader.meta new file mode 100644 index 000000000..b34caf015 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Data/AtlasShader_Subtract.shader.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: b5d2bd7dde5a3164282c0b655f391fbd +ShaderImporter: + defaultTextures: [] + userData: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse.meta new file mode 100644 index 000000000..e960e7ca1 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c8fbaa2db3bb38641b51985da29ec9df +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasDiffuseShader.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader.shader similarity index 100% rename from UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasDiffuseShader.shader rename to UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader.shader diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasDiffuseShader.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader.shader.meta similarity index 100% rename from UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasDiffuseShader.shader.meta rename to UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader.shader.meta diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorBurn.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorBurn.shader new file mode 100644 index 000000000..a43403e27 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorBurn.shader @@ -0,0 +1,84 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasDiffuseShader_ColorBurn" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + BlendOp Add, Add + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float BlendMode_ColorBurn(float base, float blend) +{ + if (base >= 1.0) + return 1.0; + else if (blend <= 0.0) + return 0.0; + else + return 1.0 - min(1.0, (1.0-base) / blend); +} + +float3 BlendMode_ColorBurn(float3 base, float3 blend) +{ + return float3( BlendMode_ColorBurn(base.r, blend.r), + BlendMode_ColorBurn(base.g, blend.g), + BlendMode_ColorBurn(base.b, blend.b) ); +} + + float4 frag (v2f i) : COLOR + { + float4 texcol = tex2D(_MainTex, i.uv); // get the color from the overlay + float4 basecol = tex2D(_BaseTex, i.uv); // get the color from the previous pass + texcol.rgb = BlendMode_ColorBurn(basecol.rgb, texcol.rgb); // subtract the overlay from the previous pass + half4 mask = tex2D(_ExtraTex, i.uv); + return float4(texcol.rgb, mask.a)*_Color+_AdditiveColor; + } +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorBurn.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorBurn.shader.meta new file mode 100644 index 000000000..a5771e339 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorBurn.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f9f9211b52af6604885380483f5968fd +timeCreated: 1467924405 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorDodge.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorDodge.shader new file mode 100644 index 000000000..c3cbbebdd --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorDodge.shader @@ -0,0 +1,84 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasDiffuseShader_ColorDodge" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + BlendOp Add, Add + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float BlendMode_ColorDodge(float base, float blend) +{ + if (base <= 0.0) + return 0.0; + if (blend >= 1.0) + return 1.0; + else + return min(1.0, base / (1.0-blend)); +} + +float3 BlendMode_ColorDodge(float3 base, float3 blend) +{ + return float3( BlendMode_ColorDodge(base.r, blend.r), + BlendMode_ColorDodge(base.g, blend.g), + BlendMode_ColorDodge(base.b, blend.b) ); +} + + float4 frag (v2f i) : COLOR + { + float4 texcol = tex2D(_MainTex, i.uv); // get the color from the overlay + float4 basecol = tex2D(_BaseTex, i.uv); // get the color from the previous pass + texcol.rgb = BlendMode_ColorDodge(basecol.rgb, texcol.rgb); // subtract the overlay from the previous pass + half4 mask = tex2D(_ExtraTex, i.uv); + return float4(texcol.rgb, mask.a)*_Color+_AdditiveColor; + } +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorDodge.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorDodge.shader.meta new file mode 100644 index 000000000..aa851f651 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_ColorDodge.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7b90e2d2fd21de84ea1e1895046ac3e7 +timeCreated: 1467924405 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Darken.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Darken.shader new file mode 100644 index 000000000..23f3daba0 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Darken.shader @@ -0,0 +1,72 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasDiffuseShader_Darken" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + BlendOp Add, Add + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float3 BlendMode_Darken(float3 base, float3 blend) +{ + return min(base, blend); +} + + float4 frag (v2f i) : COLOR + { + float4 texcol = tex2D(_MainTex, i.uv); // get the color from the overlay + float4 basecol = tex2D(_BaseTex, i.uv); // get the color from the previous pass + texcol.rgb = BlendMode_Darken(basecol.rgb, texcol.rgb); // subtract the overlay from the previous pass + half4 mask = tex2D(_ExtraTex, i.uv); + return float4(texcol.rgb, mask.a)*_Color+_AdditiveColor; + } +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Darken.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Darken.shader.meta new file mode 100644 index 000000000..1f0418f53 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Darken.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 744ac0ef59fda2f4db65e637e41f65f8 +timeCreated: 1467924405 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_HardLight.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_HardLight.shader new file mode 100644 index 000000000..e4f76dee3 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_HardLight.shader @@ -0,0 +1,80 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasDiffuseShader_HardLight" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + BlendOp Add, Add + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float BlendMode_HardLight(float base, float blend) +{ + return (blend <= 0.5) ? 2*base*blend : 1 - 2*(1-base)*(1-blend); +} + +float3 BlendMode_HardLight(float3 base, float3 blend) +{ + return float3( BlendMode_HardLight(base.r, blend.r), + BlendMode_HardLight(base.g, blend.g), + BlendMode_HardLight(base.b, blend.b) ); +} + + float4 frag (v2f i) : COLOR + { + float4 texcol = tex2D(_MainTex, i.uv); // get the color from the overlay + float4 basecol = tex2D(_BaseTex, i.uv); // get the color from the previous pass + texcol.rgb = BlendMode_HardLight(basecol.rgb, texcol.rgb); // subtract the overlay from the previous pass + half4 mask = tex2D(_ExtraTex, i.uv); + return float4(texcol.rgb, mask.a)*_Color+_AdditiveColor; + } + +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_HardLight.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_HardLight.shader.meta new file mode 100644 index 000000000..c98b0189f --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_HardLight.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b2a1284fa6f898e4898d45fefe12fee1 +timeCreated: 1467924405 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Lighten.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Lighten.shader new file mode 100644 index 000000000..fdce54e1a --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Lighten.shader @@ -0,0 +1,72 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasDiffuseShader_Lighten" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + BlendOp Add, Add + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float3 BlendMode_Lighten(float3 base, float3 blend) +{ + return max(base, blend); +} + + float4 frag (v2f i) : COLOR + { + float4 texcol = tex2D(_MainTex, i.uv); // get the color from the overlay + float4 basecol = tex2D(_BaseTex, i.uv); // get the color from the previous pass + texcol.rgb = BlendMode_Lighten(basecol.rgb, texcol.rgb); // subtract the overlay from the previous pass + half4 mask = tex2D(_ExtraTex, i.uv); + return float4(texcol.rgb, mask.a)*_Color+_AdditiveColor; + } +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Lighten.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Lighten.shader.meta new file mode 100644 index 000000000..bc78ebac7 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Lighten.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3254ca564125ccd448b4533e4dc6a54a +timeCreated: 1467924405 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Multiply.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Multiply.shader new file mode 100644 index 000000000..8b2d0197f --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Multiply.shader @@ -0,0 +1,72 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasDiffuseShader_Multiply" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + BlendOp Add, Add + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float3 BlendMode_Multiply(float3 base, float3 blend) +{ + return base*blend; +} + + float4 frag (v2f i) : COLOR + { + float4 texcol = tex2D(_MainTex, i.uv); // get the color from the overlay + float4 basecol = tex2D(_BaseTex, i.uv); // get the color from the previous pass + texcol.rgb = BlendMode_Multiply(basecol.rgb, texcol.rgb); // subtract the overlay from the previous pass + half4 mask = tex2D(_ExtraTex, i.uv); + return float4(texcol.rgb, mask.a)*_Color+_AdditiveColor; + } +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Multiply.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Multiply.shader.meta new file mode 100644 index 000000000..4cb6c56a3 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Multiply.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b2242db2c314abc49b2ff484123ea161 +timeCreated: 1467924405 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Overlay.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Overlay.shader new file mode 100644 index 000000000..4ab03b6c1 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Overlay.shader @@ -0,0 +1,71 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasDiffuseShader_Overlay" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + BlendOp Add, Add + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} +float BlendMode_Overlay(float base, float blend) +{ + return (base <= 0.5) ? 2*base*blend : 1 - 2*(1-base)*(1-blend); +} + + float4 frag (v2f i) : COLOR + { + float4 texcol = tex2D(_MainTex, i.uv); // get the color from the overlay + float4 basecol = tex2D(_BaseTex, i.uv); // get the color from the previous pass + texcol.rgb = BlendMode_Overlay(basecol.rgb, texcol.rgb); // subtract the overlay from the previous pass + half4 mask = tex2D(_ExtraTex, i.uv); + return float4(texcol.rgb, mask.a)*_Color+_AdditiveColor; + } +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Overlay.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Overlay.shader.meta new file mode 100644 index 000000000..c3ffd6f09 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Overlay.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ebfa7a5903b17e34494d3c74eb7fc305 +timeCreated: 1467924405 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Screen.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Screen.shader new file mode 100644 index 000000000..8a0812764 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Screen.shader @@ -0,0 +1,72 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasDiffuseShader_Screen" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + BlendOp Add, Add + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float3 BlendMode_Screen(float3 base, float3 blend) +{ + return base + blend - base*blend; +} + + float4 frag (v2f i) : COLOR + { + float4 texcol = tex2D(_MainTex, i.uv); // get the color from the overlay + float4 basecol = tex2D(_BaseTex, i.uv); // get the color from the previous pass + texcol.rgb = BlendMode_Screen(basecol.rgb, texcol.rgb); // subtract the overlay from the previous pass + half4 mask = tex2D(_ExtraTex, i.uv); + return float4(texcol.rgb, mask.a)*_Color+_AdditiveColor; + } +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Screen.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Screen.shader.meta new file mode 100644 index 000000000..516b79ae8 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Screen.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6059699f235f2824296f29d2abe77d5a +timeCreated: 1467924405 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_SoftLight.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_SoftLight.shader new file mode 100644 index 000000000..e4e5c99c3 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_SoftLight.shader @@ -0,0 +1,88 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasDiffuseShader_SoftLight" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Base Texture", 2D) = "white" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Base Texture", 2D) = "white" {} +} + +SubShader { + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + BlendOp Add, Add + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + Lighting Off +CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + +float4 _Color; +float4 _AdditiveColor; +sampler2D _MainTex; +sampler2D _ExtraTex; +sampler2D _BaseTex; + +struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +float4 _MainTex_ST; + +v2f vert (appdata_base v) +{ + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; +} + +float BlendMode_SoftLight(float base, float blend) +{ + if (blend <= 0.5) + { + return base - (1-2*blend)*base*(1-base); + } + else + { + float d = (base <= 0.25) ? ((16*base-12)*base+4)*base : sqrt(base); + return base + (2*blend-1)*(d-base); + } +} + +float3 BlendMode_SoftLight(float3 base, float3 blend) +{ + return float3( BlendMode_SoftLight(base.r, blend.r), + BlendMode_SoftLight(base.g, blend.g), + BlendMode_SoftLight(base.b, blend.b) ); +} + + float4 frag (v2f i) : COLOR + { + float4 texcol = tex2D(_MainTex, i.uv); // get the color from the overlay + float4 basecol = tex2D(_BaseTex, i.uv); // get the color from the previous pass + texcol.rgb = BlendMode_SoftLight(basecol.rgb, texcol.rgb); // subtract the overlay from the previous pass + half4 mask = tex2D(_ExtraTex, i.uv); + return float4(texcol.rgb, mask.a)*_Color+_AdditiveColor; + } + +ENDCG + } +} + +Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_SoftLight.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_SoftLight.shader.meta new file mode 100644 index 000000000..b9f405257 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_SoftLight.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e929ee9992023f74c9c670807abae009 +timeCreated: 1467924405 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Subtract.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Subtract.shader new file mode 100644 index 000000000..c7dd4cc62 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Subtract.shader @@ -0,0 +1,76 @@ +Shader "UMA/AtlasDiffuseShader_Subtract" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + // _MainTex contains the texture from the overlay + _MainTex ("Base Texture", 2D) = "white" {} + // _ExtraTex is the alpha mask from the overlay. + _ExtraTex ("mask", 2D) = "white" {} + // _BaseTex is the image from the previous layer. We use Graphics.Blit + // to copy the result of the previous layer into this texture. + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags { "LightMode" = "Vertex" } + Fog { Mode Off } + BlendOp Add, Add + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + Lighting Off + Cull Off + ZWrite Off + ZTest Always + + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert (appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos (v.vertex); + o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); + return o; + } + + float3 BlendMode_Subtract(float3 base, float3 blend) + { + return max(0, base - blend); + } + + float4 frag (v2f i) : COLOR + { + float4 texcol = tex2D(_MainTex, i.uv); // get the color from the overlay + float4 basecol = tex2D(_BaseTex, i.uv); // get the color from the previous pass + texcol.rgb = BlendMode_Subtract(basecol.rgb, texcol.rgb); // subtract the overlay from the previous pass + half4 mask = tex2D(_ExtraTex, i.uv); + return float4(texcol.rgb, mask.a)*_Color+_AdditiveColor; + } + + ENDCG + } +} + +//Fallback "Transparent/VertexLit" +} \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Subtract.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Subtract.shader.meta new file mode 100644 index 000000000..8a366d5f8 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Diffuse/AtlasDiffuseShader_Subtract.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5319104211becc640a93c5310f80c8e3 +timeCreated: 1467924405 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/New Folder.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/New Folder.meta new file mode 100644 index 000000000..7721aed24 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/New Folder.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c14e56850a47d045beff5e9bc793b48 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal.meta new file mode 100644 index 000000000..626f386a0 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce7c89a6011421648a75238af443e2ea +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasNormalShader.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader.shader similarity index 100% rename from UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasNormalShader.shader rename to UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader.shader diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasNormalShader.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader.shader.meta similarity index 100% rename from UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasNormalShader.shader.meta rename to UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader.shader.meta diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasNormalShader32.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader32.shader similarity index 100% rename from UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasNormalShader32.shader rename to UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader32.shader diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasNormalShader32.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader32.shader.meta similarity index 100% rename from UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/AtlasNormalShader32.shader.meta rename to UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader32.shader.meta diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorBurn.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorBurn.shader new file mode 100644 index 000000000..2b83f1bb1 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorBurn.shader @@ -0,0 +1,92 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNormal_ColorBurn" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Normalmap", 2D) = "bump" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags{ "LightMode" = "Vertex" } + Fog{ Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + float BlendMode_ColorBurn(float base, float blend) + { + if (base >= 1.0) + return 1.0; + else if (blend <= 0.0) + return 0.0; + else + return 1.0 - min(1.0, (1.0-base) / blend); + } + + float3 BlendMode_ColorBurn(float3 base, float3 blend) + { + return float3( BlendMode_ColorBurn(base.r, blend.r), + BlendMode_ColorBurn(base.g, blend.g), + BlendMode_ColorBurn(base.b, blend.b) ); + } + + half4 frag(v2f i) : COLOR + { + half4 n = tex2D(_MainTex, i.uv); + half4 extra = tex2D(_ExtraTex, i.uv); + float4 basecol = tex2D(_BaseTex, i.uv); + +#if !defined(UNITY_NO_DXT5nm) + //swizzle the alpha and red channel, we will swizzle back in the post process SwizzleShader + n.r = n.a; +#endif + n.rgb = BlendMode_ColorBurn(basecol.rgb, n.rgb); // subtract the overlay from the previous pass + n.a = min(extra.a, _Color.a); + return n * _Color + _AdditiveColor; + } + ENDCG + } +} + +Fallback "Transparent/VertexLit" +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorBurn.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorBurn.shader.meta new file mode 100644 index 000000000..0d1294a44 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorBurn.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1b36f82cfa28c484fbdf7a39407c9a5a +timeCreated: 1426630728 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorDodge.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorDodge.shader new file mode 100644 index 000000000..86127378d --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorDodge.shader @@ -0,0 +1,85 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNormal_ColorDodge" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Normalmap", 2D) = "bump" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags{ "LightMode" = "Vertex" } + Fog{ Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + float BlendMode_ColorDodge(float base, float blend) + { + if (base <= 0.0) + return 0.0; + if (blend >= 1.0) + return 1.0; + else + return min(1.0, base / (1.0-blend)); + } + + half4 frag(v2f i) : COLOR + { + half4 n = tex2D(_MainTex, i.uv); + half4 extra = tex2D(_ExtraTex, i.uv); + float4 basecol = tex2D(_BaseTex, i.uv); + +#if !defined(UNITY_NO_DXT5nm) + //swizzle the alpha and red channel, we will swizzle back in the post process SwizzleShader + n.r = n.a; +#endif + n.rgb = BlendMode_ColorDodge(basecol.rgb, n.rgb); // subtract the overlay from the previous pass + n.a = min(extra.a, _Color.a); + return n * _Color + _AdditiveColor; + } + ENDCG + } +} + +Fallback "Transparent/VertexLit" +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorDodge.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorDodge.shader.meta new file mode 100644 index 000000000..060e08c79 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_ColorDodge.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: da2c212080bb6784f83c40fc31d9d095 +timeCreated: 1426630728 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Darken.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Darken.shader new file mode 100644 index 000000000..f64bd8b56 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Darken.shader @@ -0,0 +1,80 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNormal_Darken" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Normalmap", 2D) = "bump" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags{ "LightMode" = "Vertex" } + Fog{ Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + float3 BlendMode_Darken(float3 base, float3 blend) + { + return min(base, blend); + } + + half4 frag(v2f i) : COLOR + { + half4 n = tex2D(_MainTex, i.uv); + half4 extra = tex2D(_ExtraTex, i.uv); + float4 basecol = tex2D(_BaseTex, i.uv); + +#if !defined(UNITY_NO_DXT5nm) + //swizzle the alpha and red channel, we will swizzle back in the post process SwizzleShader + n.r = n.a; +#endif + n.rgb = BlendMode_Darken(basecol.rgb, n.rgb); // subtract the overlay from the previous pass + n.a = min(extra.a, _Color.a); + return n * _Color + _AdditiveColor; + } + ENDCG + } +} + +Fallback "Transparent/VertexLit" +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Darken.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Darken.shader.meta new file mode 100644 index 000000000..4652f67da --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Darken.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 40384cfbf71c88144af1caadaf9a3c9d +timeCreated: 1426630728 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_HardLight.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_HardLight.shader new file mode 100644 index 000000000..95f68adb4 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_HardLight.shader @@ -0,0 +1,80 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNormal_HardLight" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Normalmap", 2D) = "bump" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags{ "LightMode" = "Vertex" } + Fog{ Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + +float BlendMode_HardLight(float base, float blend) +{ + return (blend <= 0.5) ? 2*base*blend : 1 - 2*(1-base)*(1-blend); +} + + half4 frag(v2f i) : COLOR + { + half4 n = tex2D(_MainTex, i.uv); + half4 extra = tex2D(_ExtraTex, i.uv); + float4 basecol = tex2D(_BaseTex, i.uv); + +#if !defined(UNITY_NO_DXT5nm) + //swizzle the alpha and red channel, we will swizzle back in the post process SwizzleShader + n.r = n.a; +#endif + n.rgb = BlendMode_HardLight(basecol.rgb, n.rgb); // subtract the overlay from the previous pass + n.a = min(extra.a, _Color.a); + return n * _Color + _AdditiveColor; + } + ENDCG + } +} + +Fallback "Transparent/VertexLit" +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_HardLight.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_HardLight.shader.meta new file mode 100644 index 000000000..f92efb74a --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_HardLight.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0e9d5d4b53916164e833537fa5111f40 +timeCreated: 1426630728 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Lighten.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Lighten.shader new file mode 100644 index 000000000..36f3c9d25 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Lighten.shader @@ -0,0 +1,80 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNormal_Lighten" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Normalmap", 2D) = "bump" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags{ "LightMode" = "Vertex" } + Fog{ Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + +float3 BlendMode_Lighten(float3 base, float3 blend) +{ + return max(base, blend); +} + + half4 frag(v2f i) : COLOR + { + half4 n = tex2D(_MainTex, i.uv); + half4 extra = tex2D(_ExtraTex, i.uv); + float4 basecol = tex2D(_BaseTex, i.uv); + +#if !defined(UNITY_NO_DXT5nm) + //swizzle the alpha and red channel, we will swizzle back in the post process SwizzleShader + n.r = n.a; +#endif + n.rgb = BlendMode_Lighten(basecol.rgb, n.rgb); // subtract the overlay from the previous pass + n.a = min(extra.a, _Color.a); + return n * _Color + _AdditiveColor; + } + ENDCG + } +} + +Fallback "Transparent/VertexLit" +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Lighten.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Lighten.shader.meta new file mode 100644 index 000000000..e50e20855 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Lighten.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 31a8c68ab6ab7a9488173d478b6e55bc +timeCreated: 1426630728 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Multiply.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Multiply.shader new file mode 100644 index 000000000..a76cc56a1 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Multiply.shader @@ -0,0 +1,80 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNormal_Multiply" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Normalmap", 2D) = "bump" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags{ "LightMode" = "Vertex" } + Fog{ Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + +float3 BlendMode_Multiply(float3 base, float3 blend) +{ + return base*blend; +} + + half4 frag(v2f i) : COLOR + { + half4 n = tex2D(_MainTex, i.uv); + half4 extra = tex2D(_ExtraTex, i.uv); + float4 basecol = tex2D(_BaseTex, i.uv); + +#if !defined(UNITY_NO_DXT5nm) + //swizzle the alpha and red channel, we will swizzle back in the post process SwizzleShader + n.r = n.a; +#endif + n.rgb = BlendMode_Multiply(basecol.rgb, n.rgb); // subtract the overlay from the previous pass + n.a = min(extra.a, _Color.a); + return n * _Color + _AdditiveColor; + } + ENDCG + } +} + +Fallback "Transparent/VertexLit" +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Multiply.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Multiply.shader.meta new file mode 100644 index 000000000..7d359ccce --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Multiply.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 87015b5156993da4e93eafba50a902f5 +timeCreated: 1426630728 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Overlay.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Overlay.shader new file mode 100644 index 000000000..5561b115a --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Overlay.shader @@ -0,0 +1,80 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNormal_Overlay" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Normalmap", 2D) = "bump" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags{ "LightMode" = "Vertex" } + Fog{ Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + +float BlendMode_Overlay(float base, float blend) +{ + return (base <= 0.5) ? 2*base*blend : 1 - 2*(1-base)*(1-blend); +} + + half4 frag(v2f i) : COLOR + { + half4 n = tex2D(_MainTex, i.uv); + half4 extra = tex2D(_ExtraTex, i.uv); + float4 basecol = tex2D(_BaseTex, i.uv); + +#if !defined(UNITY_NO_DXT5nm) + //swizzle the alpha and red channel, we will swizzle back in the post process SwizzleShader + n.r = n.a; +#endif + n.rgb = BlendMode_Overlay(basecol.rgb, n.rgb); // subtract the overlay from the previous pass + n.a = min(extra.a, _Color.a); + return n * _Color + _AdditiveColor; + } + ENDCG + } +} + +Fallback "Transparent/VertexLit" +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Overlay.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Overlay.shader.meta new file mode 100644 index 000000000..c7c4428c5 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Overlay.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 21ba2303a3daae841bb7dc952c75301c +timeCreated: 1426630728 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Screen.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Screen.shader new file mode 100644 index 000000000..1194e475c --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Screen.shader @@ -0,0 +1,81 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNormal_Screen" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Normalmap", 2D) = "bump" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags{ "LightMode" = "Vertex" } + Fog{ Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + +float3 BlendMode_Screen(float3 base, float3 blend) +{ + return base + blend - base*blend; +} + + + half4 frag(v2f i) : COLOR + { + half4 n = tex2D(_MainTex, i.uv); + half4 extra = tex2D(_ExtraTex, i.uv); + float4 basecol = tex2D(_BaseTex, i.uv); + +#if !defined(UNITY_NO_DXT5nm) + //swizzle the alpha and red channel, we will swizzle back in the post process SwizzleShader + n.r = n.a; +#endif + n.rgb = BlendMode_Screen(basecol.rgb, n.rgb); // subtract the overlay from the previous pass + n.a = min(extra.a, _Color.a); + return n * _Color + _AdditiveColor; + } + ENDCG + } +} + +Fallback "Transparent/VertexLit" +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Screen.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Screen.shader.meta new file mode 100644 index 000000000..93085b979 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Screen.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a7acb9f93a336674fbc4a94858aaab10 +timeCreated: 1426630728 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_SoftLight.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_SoftLight.shader new file mode 100644 index 000000000..cdf697abd --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_SoftLight.shader @@ -0,0 +1,95 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNormal_SoftLight" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Normalmap", 2D) = "bump" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags{ "LightMode" = "Vertex" } + Fog{ Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + +float BlendMode_SoftLight(float base, float blend) +{ + if (blend <= 0.5) + { + return base - (1-2*blend)*base*(1-base); + } + else + { + float d = (base <= 0.25) ? ((16*base-12)*base+4)*base : sqrt(base); + return base + (2*blend-1)*(d-base); + } +} + +float3 BlendMode_SoftLight(float3 base, float3 blend) +{ + return float3( BlendMode_SoftLight(base.r, blend.r), + BlendMode_SoftLight(base.g, blend.g), + BlendMode_SoftLight(base.b, blend.b) ); +} + + half4 frag(v2f i) : COLOR + { + half4 n = tex2D(_MainTex, i.uv); + half4 extra = tex2D(_ExtraTex, i.uv); + float4 basecol = tex2D(_BaseTex, i.uv); + +#if !defined(UNITY_NO_DXT5nm) + //swizzle the alpha and red channel, we will swizzle back in the post process SwizzleShader + n.r = n.a; +#endif + n.rgb = BlendMode_SoftLight(basecol.rgb, n.rgb); // subtract the overlay from the previous pass + n.a = min(extra.a, _Color.a); + return n * _Color + _AdditiveColor; + } + ENDCG + } +} + +Fallback "Transparent/VertexLit" +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_SoftLight.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_SoftLight.shader.meta new file mode 100644 index 000000000..4f9ddd12d --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_SoftLight.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e28ff790b707e184288004586c7dce45 +timeCreated: 1426630728 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Subtract.shader b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Subtract.shader new file mode 100644 index 000000000..72ea09393 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Subtract.shader @@ -0,0 +1,80 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +// ============================================================ +// Name: AtlasShader +// Author: Joen Joensen (@UnLogick) +// ============================================================ + +Shader "UMA/AtlasShaderNormal_Subtract" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _AdditiveColor ("Additive Color", Color) = (0,0,0,0) + _MainTex ("Normalmap", 2D) = "bump" {} + _ExtraTex ("mask", 2D) = "white" {} + _BaseTex ("Blendbase Texture", 2D) = "white" {} +} + +SubShader +{ + Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} + + Pass + { + Tags{ "LightMode" = "Vertex" } + Fog{ Mode Off } + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float4 _Color; + float4 _AdditiveColor; + sampler2D _MainTex; + sampler2D _ExtraTex; + sampler2D _BaseTex; + + struct v2f { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert(appdata_base v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + float3 BlendMode_Subtract(float3 base, float3 blend) + { + return max(0, base - blend); + } + + half4 frag(v2f i) : COLOR + { + half4 n = tex2D(_MainTex, i.uv); + half4 extra = tex2D(_ExtraTex, i.uv); + float4 basecol = tex2D(_BaseTex, i.uv); + +#if !defined(UNITY_NO_DXT5nm) + //swizzle the alpha and red channel, we will swizzle back in the post process SwizzleShader + n.r = n.a; +#endif + n.rgb = BlendMode_Subtract(basecol.rgb, n.rgb); // subtract the overlay from the previous pass + n.a = min(extra.a, _Color.a); + return n * _Color + _AdditiveColor; + } + ENDCG + } +} + +Fallback "Transparent/VertexLit" +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Subtract.shader.meta b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Subtract.shader.meta new file mode 100644 index 000000000..effb771d6 --- /dev/null +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/Normal/AtlasNormalShader_Subtract.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5bea09b9a5d0e7944981beef4092ebbe +timeCreated: 1426630728 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/TextureMerge.asset b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/TextureMerge.asset index 815a4751f..b82bcf62a 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/TextureMerge.asset +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Atlas/TextureMerge.asset @@ -24,3 +24,72 @@ MonoBehaviour: dataPostProcesses: [] detailNormalPostProcesses: - {fileID: 11400000, guid: 6723c87feec7dbc49914728f5b571b02, type: 2} + DiffuseBlendModeShaders: + - BlendMode: 0 + Combiner: {fileID: 4800000, guid: ae83be5246f311646b3043ed012d9d64, type: 3} + - BlendMode: 1 + Combiner: {fileID: 4800000, guid: 5319104211becc640a93c5310f80c8e3, type: 3} + - BlendMode: 21 + Combiner: {fileID: 4800000, guid: b2242db2c314abc49b2ff484123ea161, type: 3} + - BlendMode: 23 + Combiner: {fileID: 4800000, guid: ebfa7a5903b17e34494d3c74eb7fc305, type: 3} + - BlendMode: 24 + Combiner: {fileID: 4800000, guid: 744ac0ef59fda2f4db65e637e41f65f8, type: 3} + - BlendMode: 25 + Combiner: {fileID: 4800000, guid: 3254ca564125ccd448b4533e4dc6a54a, type: 3} + - BlendMode: 26 + Combiner: {fileID: 4800000, guid: 7b90e2d2fd21de84ea1e1895046ac3e7, type: 3} + - BlendMode: 27 + Combiner: {fileID: 4800000, guid: f9f9211b52af6604885380483f5968fd, type: 3} + - BlendMode: 28 + Combiner: {fileID: 4800000, guid: b2a1284fa6f898e4898d45fefe12fee1, type: 3} + - BlendMode: 29 + Combiner: {fileID: 4800000, guid: e929ee9992023f74c9c670807abae009, type: 3} + - BlendMode: 22 + Combiner: {fileID: 4800000, guid: 6059699f235f2824296f29d2abe77d5a, type: 3} + DataBlendModeShaders: + - BlendMode: 0 + Combiner: {fileID: 4800000, guid: 8179a5383e28f6840a80314368b93979, type: 3} + - BlendMode: 1 + Combiner: {fileID: 4800000, guid: b5d2bd7dde5a3164282c0b655f391fbd, type: 3} + - BlendMode: 21 + Combiner: {fileID: 4800000, guid: 9ffddd6feae61314c847684c042c3125, type: 3} + - BlendMode: 23 + Combiner: {fileID: 4800000, guid: 9931f25706937944ca44b618185a03f0, type: 3} + - BlendMode: 24 + Combiner: {fileID: 4800000, guid: e5c5b4cf426f2ea48a7cce0214a0bdb4, type: 3} + - BlendMode: 25 + Combiner: {fileID: 4800000, guid: 45f4712c260a06e4f9d269efa51b5ce8, type: 3} + - BlendMode: 26 + Combiner: {fileID: 4800000, guid: 353bcb59bc293294399a855b2881b1f7, type: 3} + - BlendMode: 27 + Combiner: {fileID: 4800000, guid: 59c382ffc8bc32f4d92e53948d3431e0, type: 3} + - BlendMode: 28 + Combiner: {fileID: 4800000, guid: da31722262eeee64f936b9ee3e310d37, type: 3} + - BlendMode: 29 + Combiner: {fileID: 4800000, guid: c21f293c9e1e3a6408c5f2f8feceaa00, type: 3} + - BlendMode: 22 + Combiner: {fileID: 4800000, guid: eff2e81e510ad8348b120d56d22fddf3, type: 3} + NormalBlendModeShaders: + - BlendMode: 0 + Combiner: {fileID: 4800000, guid: 0c7937a991ef0764fb16577ebf24911e, type: 3} + - BlendMode: 1 + Combiner: {fileID: 4800000, guid: 5bea09b9a5d0e7944981beef4092ebbe, type: 3} + - BlendMode: 21 + Combiner: {fileID: 4800000, guid: 87015b5156993da4e93eafba50a902f5, type: 3} + - BlendMode: 23 + Combiner: {fileID: 4800000, guid: 21ba2303a3daae841bb7dc952c75301c, type: 3} + - BlendMode: 24 + Combiner: {fileID: 4800000, guid: 40384cfbf71c88144af1caadaf9a3c9d, type: 3} + - BlendMode: 25 + Combiner: {fileID: 4800000, guid: 31a8c68ab6ab7a9488173d478b6e55bc, type: 3} + - BlendMode: 26 + Combiner: {fileID: 4800000, guid: da2c212080bb6784f83c40fc31d9d095, type: 3} + - BlendMode: 27 + Combiner: {fileID: 4800000, guid: 1b36f82cfa28c484fbdf7a39407c9a5a, type: 3} + - BlendMode: 28 + Combiner: {fileID: 4800000, guid: 0e9d5d4b53916164e833537fa5111f40, type: 3} + - BlendMode: 29 + Combiner: {fileID: 4800000, guid: e28ff790b707e184288004586c7dce45, type: 3} + - BlendMode: 22 + Combiner: {fileID: 4800000, guid: a7acb9f93a336674fbc4a94858aaab10, type: 3} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/DynamicUMADnaBase.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/DynamicUMADnaBase.cs index f62c8531e..3c9b83406 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/DynamicUMADnaBase.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/DynamicUMADnaBase.cs @@ -69,15 +69,7 @@ protected static void InitializeDynamicDNADictionary() { if (uda != null) { - if (DynamicDNADictionary.ContainsKey(uda.name)) - { - if (Debug.isDebugBuild) - Debug.LogWarning("DynamicDNADictionary already contained DNA asset " + uda.name); - } - else - { DynamicDNADictionary.Add(uda.name, uda); - } } } diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayColorData.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayColorData.cs index 4b4be261a..a784e07a1 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayColorData.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayColorData.cs @@ -24,6 +24,8 @@ public class OverlayColorData : System.IEquatable public UMAMaterialPropertyBlock PropertyBlock; // may be null. #if UNITY_EDITOR public bool foldout; + public bool showAdvanced; + public bool isBaseColor = false; #endif public Color color { @@ -125,7 +127,11 @@ public OverlayColorData Duplicate() { var res = new OverlayColorData(); res.name = name; - +#if UNITY_EDITOR + res.foldout = foldout; + res.isBaseColor = isBaseColor; +#endif + res.channelMask = new Color[channelMask.Length]; for (int i = 0; i < channelMask.Length; i++) { @@ -407,7 +413,11 @@ public void AssignTo(OverlayColorData dest) for (int i = 0; i < channelAdditiveMask.Length; i++) { dest.channelAdditiveMask[i] = channelAdditiveMask[i]; - } + } + +#if UNITY_EDITOR + dest.isBaseColor = isBaseColor; +#endif } public void AssignFrom(OverlayColorData src) { @@ -436,6 +446,9 @@ public void AssignFrom(OverlayColorData src) PropertyBlock.shaderProperties.Add(up.Clone()); } } - } - } +#if UNITY_EDITOR + isBaseColor = src.isBaseColor; +#endif + } + } } diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayData.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayData.cs index ab9cccabc..564ca478b 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayData.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayData.cs @@ -21,10 +21,18 @@ public class OverlayData : System.IEquatable /// public Rect rect; - #if (UNITY_STANDALONE || UNITY_IOS || UNITY_ANDROID || UNITY_PS4 || UNITY_XBOXONE) && !UNITY_2017_3_OR_NEWER //supported platforms for procedural materials + public bool Tiling; // Only works for composite materials. + + public bool Supressed = false; + +#if UNITY_EDITOR + public Vector2 editorReferenceTextureSize = Vector2.zero; +#endif + +#if (UNITY_STANDALONE || UNITY_IOS || UNITY_ANDROID || UNITY_PS4 || UNITY_XBOXONE) && !UNITY_2017_3_OR_NEWER //supported platforms for procedural materials //https://docs.unity3d.com/Manual/ProceduralMaterials.html protected ProceduralTexture[] generatedTextures = null; - #endif +#endif const string proceduralSizeProperty = "$outputsize"; @@ -96,6 +104,30 @@ public Texture[] textureArray private OverlayBlend[] blendOverrides; + public Vector4 GetUV() + { + Vector4 uv = new Vector4(0,0, 1, 1); + + if (rect.width == 0 || rect.height == 0) + { + return uv; + } + else if (rect.width > 1.0f) + { + if (asset.textureList.Length > 0 && asset.textureList[0] != null) + { + uv.x = rect.x / asset.textureList[0].width; + uv.y = rect.y / asset.textureList[0].height; + uv.z = rect.width / asset.textureList[0].width; + uv.w = rect.height / asset.textureList[0].height; + } + } + else + { + uv = new Vector4(rect.x, rect.y, rect.width, rect.height); + } + return uv; + } public OverlayBlend[] textureBlendArray { @@ -109,20 +141,46 @@ public OverlayBlend[] textureBlendArray } } - public void SetOverlayBlend(int ChannelNumber, OverlayBlend overlayBlend) + public void SetOverlayBlendsLength(int count) + { + blendOverrides = new OverlayBlend[count]; + } + + public int GetOverlayBlendsLength() { - if (blendOverrides == null || blendOverrides.Length != textureArray.Length) + if (blendOverrides != null) { - blendOverrides = new OverlayBlend[asset.textureList.Length]; - for(int i=0; i + /// Have to be careful, because we can be merging recipes that have mismatched texture lists + /// + /// + /// + public void SetOverlayBlend(int ChannelNumber, OverlayBlend overlayBlend) + { + if (asset.textureList == null) return; + if (ChannelNumber >= asset.textureList.Length) return; + + if (blendOverrides == null || blendOverrides.Length != asset.textureList.Length) + { + blendOverrides = new OverlayBlend[asset.textureList.Length]; + for (int i = 0; i < blendOverrides.Length; i++) + { + blendOverrides[i] = asset.GetBlend(i); + } + } + + if (ChannelNumber < blendOverrides.Length) + { + blendOverrides[ChannelNumber] = overlayBlend; } - blendOverrides[ChannelNumber] = overlayBlend; - } + } - public OverlayBlend getTextureBlend(int ChannelNumber) + public OverlayBlend GetOverlayBlend(int ChannelNumber) { if (blendOverrides != null) { @@ -220,6 +278,14 @@ public OverlayData Duplicate() res.Scale = Scale; if (colorData != null) res.colorData = colorData.Duplicate(); + if (blendOverrides != null) + { + res.blendOverrides = new OverlayBlend[blendOverrides.Length]; + for (int i = 0; i < blendOverrides.Length; i++) + { + res.blendOverrides[i] = blendOverrides[i]; + } + } return res; } @@ -701,4 +767,4 @@ public ColorComponentAdjuster(ColorComponentAdjuster other) #endregion } -} \ No newline at end of file +} diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayDataAsset.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayDataAsset.cs index 6157d1c03..081824970 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayDataAsset.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/OverlayDataAsset.cs @@ -1,6 +1,7 @@ using UnityEngine; using System.Collections; using System; +using UnityEngine.Rendering; namespace UMA { @@ -31,10 +32,16 @@ public enum OverlayType public enum OverlayBlend { Normal = 0, - Multiply = 1, - Overlay = 2, - Screen = 3, - Divide = 4 + Multiply = BlendOp.Multiply, + Overlay = BlendOp.Overlay, + Screen = BlendOp.Screen, + Darken = BlendOp.Darken, + Lighten = BlendOp.Lighten, + ColorDodge = BlendOp.ColorDodge, + ColorBurn = BlendOp.ColorBurn, + SoftLight = BlendOp.SoftLight, + HardLight = BlendOp.HardLight, + Subtract = BlendOp.Subtract } /// @@ -58,10 +65,10 @@ public enum OverlayBlend /// Array of textures required for the overlay material. /// [Tooltip("Array of textures required for the overlay material.")] - public Texture[] textureList = new Texture[0]; + public Texture[] textureList = new Texture[1]; [Tooltip("Overlay Blend Mode. Not used on the base overlay. Similar to standard blend modes on paint apps. Use the alpha channel ")] - public OverlayBlend[] overlayBlend = new OverlayBlend[0]; + public OverlayBlend[] overlayBlend = new OverlayBlend[1]; /// /// Use this to identify what kind of overlay this is and what it fits diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SkinnedMeshCombiner.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SkinnedMeshCombiner.cs index cd06f3595..d0c94a95f 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SkinnedMeshCombiner.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SkinnedMeshCombiner.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System; +using Unity.Burst; #if UNITY_2019_3_OR_NEWER using Unity.Collections; #endif @@ -638,7 +639,9 @@ public static void ConvertData(ref ClothSkinningCoefficient source, ref Vector2 dest.x = source.collisionSphereDistance; dest.y = source.maxDistance; } - +#if UMA_BURSTCOMPILE + [BurstCompile] +#endif private static void MergeSortedTransforms(UMATransform[] mergedTransforms, ref int len1, UMATransform[] umaTransforms) { int newBones = 0; @@ -931,7 +934,11 @@ internal void AddIndex(int idx) } } - private static bool CompareSkinningMatrices(Matrix4x4 m1, ref Matrix4x4 m2) +#if UMA_BURSTCOMPILE + [BurstCompile] +#endif + + private static bool CompareSkinningMatrices(Matrix4x4 m1, ref Matrix4x4 m2) { if (Mathf.Abs(m1.m00 - m2.m00) > 0.0001) return false; if (Mathf.Abs(m1.m01 - m2.m01) > 0.0001) return false; @@ -983,7 +990,10 @@ private static int TranslateBoneIndex(int index, int[] bonesHashes, Matrix4x4[] } } - private static void CopyColorsToColors32(Color[] source, int sourceIndex, Color32[] dest, int destIndex, int count) +#if UMA_BURSTCOMPILE + [BurstCompile] +#endif + private static void CopyColorsToColors32(Color[] source, int sourceIndex, Color32[] dest, int destIndex, int count) { while (count-- > 0) { @@ -992,7 +1002,10 @@ private static void CopyColorsToColors32(Color[] source, int sourceIndex, Color3 } } - private static void FillArray(Vector4[] array, int index, int count, Vector4 value) +#if UMA_BURSTCOMPILE + [BurstCompile] +#endif + private static void FillArray(Vector4[] array, int index, int count, Vector4 value) { while (count-- > 0) { @@ -1000,7 +1013,10 @@ private static void FillArray(Vector4[] array, int index, int count, Vector4 val } } - private static void FillArray(Vector3[] array, int index, int count, Vector3 value) +#if UMA_BURSTCOMPILE + [BurstCompile] +#endif + private static void FillArray(Vector3[] array, int index, int count, Vector3 value) { while (count-- > 0) { @@ -1008,7 +1024,10 @@ private static void FillArray(Vector3[] array, int index, int count, Vector3 val } } - private static void FillArray(Vector2[] array, int index, int count, Vector2 value) +#if UMA_BURSTCOMPILE + [BurstCompile] +#endif + private static void FillArray(Vector2[] array, int index, int count, Vector2 value) { while (count-- > 0) { @@ -1016,7 +1035,10 @@ private static void FillArray(Vector2[] array, int index, int count, Vector2 val } } - private static void FillArray(Color[] array, int index, int count, Color value) +#if UMA_BURSTCOMPILE + [BurstCompile] +#endif + private static void FillArray(Color[] array, int index, int count, Color value) { while (count-- > 0) { @@ -1024,7 +1046,10 @@ private static void FillArray(Color[] array, int index, int count, Color value) } } - private static void FillArray(Color32[] array, int index, int count, Color32 value) +#if UMA_BURSTCOMPILE + [BurstCompile] +#endif + private static void FillArray(Color32[] array, int index, int count, Color32 value) { while (count-- > 0) { @@ -1032,7 +1057,11 @@ private static void FillArray(Color32[] array, int index, int count, Color32 val } } - private static void CopyIntArrayAdd(NativeArray source, int sourceIndex, NativeArray dest, int destIndex, int count, int add) + +#if UMA_BURSTCOMPILE + [BurstCompile] +#endif + private static void CopyIntArrayAdd(NativeArray source, int sourceIndex, NativeArray dest, int destIndex, int count, int add) { for (int i = 0; i < count; i++) { @@ -1040,7 +1069,10 @@ private static void CopyIntArrayAdd(NativeArray source, int sourceIndex, Na } } - public static bool MaskedCopyIntArrayAdd(NativeArray source, int sourceIndex, NativeArray dest, int destIndex, int count, int add, BitArray mask) +#if UMA_BURSTCOMPILE + [BurstCompile] +#endif + public static bool MaskedCopyIntArrayAdd(NativeArray source, int sourceIndex, NativeArray dest, int destIndex, int count, int add, BitArray mask) { if ((mask.Count*3) != source.Length) { @@ -1060,6 +1092,17 @@ public static bool MaskedCopyIntArrayAdd(NativeArray source, int sourceInde { if (!mask[(i/3)]) { + if (destIndex+2 > dest.Length) + { + Debug.Log("destIndex+2 > dest.Length"); + return false; + } + if (sourceIndex + 2 > source.Length) + { + Debug.Log("sourceIndex + 2 > source.Length"); + return false; + } + dest[destIndex++] = source[sourceIndex + i + 0] + add; dest[destIndex++] = source[sourceIndex + i + 1] + add; dest[destIndex++] = source[sourceIndex + i + 2] + add; diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SlotData.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SlotData.cs index 77b8fe639..30a2d5afb 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SlotData.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SlotData.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System; +using System.Linq; namespace UMA { @@ -328,6 +329,34 @@ public SlotData Copy() return res; } + public void RemoveOverlayTags(List HideTags) + { + // if we have only one, or no overlays, then we can skip this + if (overlayList.Count < 2) + { + return; + } + // if we have no tags to hide, then we can skip this + if (HideTags.Count < 1) + { + return; + } + // List newOverlays = new List(overlayList); + + foreach (var tag in HideTags) + { + for (int i = 0; i < overlayList.Count; i++) + { + if (overlayList[i].asset.tags.Contains(tag)) + { + overlayList.RemoveAt(i); + break; + //newOverlays.Remove(overlayList[i]); + } + } + } + //overlayList = newOverlays; + } public bool RemoveOverlay(params string[] names) { diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SlotDataAsset.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SlotDataAsset.cs index 350f4cd44..0b7b072f7 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SlotDataAsset.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/SlotDataAsset.cs @@ -56,7 +56,7 @@ public class Welding public List Welds = new List(); - public Welding CalculateWelds(SlotDataAsset slot, bool CopyNormals, bool CopyBoneWeights) + public Welding CalculateWelds(SlotDataAsset slot, bool CopyNormals, bool CopyBoneWeights, bool AverageNormals) { Welding thisWeld = new Welding(); @@ -84,6 +84,10 @@ public Welding CalculateWelds(SlotDataAsset slot, bool CopyNormals, bool CopyBon { meshData.tangents[Src] = slot.meshData.tangents[Dest]; } + if (AverageNormals) + { + meshData.normals[Src] = (slot.meshData.normals[Dest] + meshData.normals[Src]).normalized; + } } misMatch = true; } @@ -334,9 +338,18 @@ public int GetNameHash() [Tooltip("This object is a clipping plane, and is not added to the model.")] public bool isClippingPlane = false; + [Tooltip("You can adjust the corners of the clipping plane here. Do not make the plane non-planar!")] + public Vector3[] clippingPlaneOffset = new Vector3[4]; + [Tooltip("This object is a smooshable. Any overriden vertexes will be cleared before smooshing.")] public bool isSmooshable = false; + [Tooltip("This is used to offset the slot for some reason")] + public Vector3 smooshOffset = Vector3.zero; + + [Tooltip("This is used to grow around the center. Negative values subtract. Positive values add.")] + public Vector3 smooshExpand = Vector3.one; + [Tooltip("This object can process events ")] public GameObject SlotObject; private bool SlotObjectHookedUp = false; diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureMerge.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureMerge.cs index 479e89fa7..6ec68ae9b 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureMerge.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureMerge.cs @@ -1,7 +1,11 @@ +#define UMA_ADVANCED_BLENDMODES + using UnityEngine; using System.Collections; using System.Collections.Generic; - +using UnityEngine.Rendering; +using System; +using System.Data; namespace UMA { @@ -9,24 +13,36 @@ namespace UMA /// Utility class that sets up materials for atlasing. /// [ExecuteInEditMode] - [CreateAssetMenu(menuName = "UMA/Rendering/TextureMerge")] - public class TextureMerge : ScriptableObject + [CreateAssetMenu(menuName = "UMA/Rendering/TextureMerge")] + public class TextureMerge : ScriptableObject { + [Serializable] + public class BlendModeShaders + { + public BlendOp BlendMode; + public Shader Combiner; + } + public Material material; - public Shader normalShader; + public Shader normalShader; public Shader diffuseShader; public Shader dataShader; public Shader cutoutShader; public Shader detailNormalShader; private Vector2 pivotPoint = new Vector2(); - [System.NonSerialized] + [System.NonSerialized] public Color camBackgroundColor = new Color(0, 0, 0, 0); public List diffusePostProcesses = new List(); public List normalPostProcesses = new List(); public List dataPostProcesses = new List(); public List detailNormalPostProcesses = new List(); + [Header("Blend Mode Shaders.", order = 1)] + [Header("Note 'logical' blend modes are only available on DX11", order = 2)] + public List DiffuseBlendModeShaders = new List(); + public List DataBlendModeShaders = new List(); + public List NormalBlendModeShaders = new List(); private int textureMergeRectCount; private TextureMergeRect[] textureMergeRects; @@ -41,7 +57,10 @@ public struct TextureMergeRect public float rotation; public Vector3 scale; public Vector3 position; - } + public bool advancedBlending; + public int textureType; + public UMAMaterial.ChannelType channelType; + } public void RefreshMaterials() { @@ -49,29 +68,139 @@ public void RefreshMaterials() { for (int i = 0; i < textureMergeRects.Length; i++) { - if (textureMergeRects[i].mat == null) - textureMergeRects[i].mat = new Material(material); + if (textureMergeRects[i].mat == null) + { + textureMergeRects[i].mat = new Material(material); + } + + textureMergeRects[i].advancedBlending = false; } } } - public void DrawAllRects(RenderTexture target, int width, int height, Color background = default(Color), bool sharperFitTextures=true) + static public Texture2D GetRTPixels(RenderTexture rt) + { + Texture2D tex = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false, true); + RenderTexture activeTexture = RenderTexture.active; + bool bkUpSRGBWrite = GL.sRGBWrite; + + // Disabling linear to srgb conversion is not enough. It seems that Unity always does the conversion when reading from a RenderTexture. + // As a workaround, we will nead to create a non-linear texture to blit to, so the conversion happens, but it's OK for it to happen. + GL.sRGBWrite = false; + RenderTexture outputMap = new RenderTexture(rt.width, rt.height, 32, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); + outputMap.enableRandomWrite = true; + outputMap.Create(); + RenderTexture.active = outputMap; + GL.Clear(true, true, Color.black); + Graphics.Blit(rt, outputMap); + // End of workaround. + + tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0); + + GL.sRGBWrite = bkUpSRGBWrite; + RenderTexture.active = activeTexture; + + outputMap.Release(); + DestroyImmediate(outputMap); + return tex; + } + + public static void SaveRenderTexture(RenderTexture texture, string textureName, bool isNormal = false) + { + Texture2D tex; + tex = GetRTPixels(texture); + SaveTexture2D(tex, textureName); + } + + private static void SaveTexture2D(Texture2D texture, string textureName) + { + if (texture.isReadable) + { + byte[] data = texture.EncodeToPNG(); + System.IO.File.WriteAllBytes(textureName, data); + } + else + { + Debug.LogError("Texture: " + texture.name + " is not readable. Skipping."); + } + } + + public void DrawAllRects(RenderTexture target, int width, int height, Color background = default(Color), bool sharperFitTextures = true) { if (textureMergeRects != null) { RenderTexture backup = RenderTexture.active; RenderTexture.active = target; - +#if UMA_ADVANCED_BLENDMODES + RenderTexture scratch = null; +#endif GL.Clear(true, true, background); GL.PushMatrix(); //the matrix needs to be in the original atlas dimensions because the textureMergeRects are in that space. GL.LoadPixelMatrix(0, width, height, 0); +#if UMA_ADVANCED_BLENDMODES + + // This draws the entire atlas. + // We need to set the base texture on any overlay that is not a base overlay. + // To do this, we will probably need to track that on the textureMergeRects. + // We should hard code base overlays to be normal blend mode (ie, they blend with the basic shaders) + + Rect Destination = new Rect(0, 0, 0, 0); + Rect Src = new Rect(0, 0, 0, 0); for (int i = 0; i < textureMergeRectCount; i++) { - DrawRect(ref textureMergeRects[i], sharperFitTextures); + var tr = textureMergeRects[i]; + + if (tr.advancedBlending) + { + // Create a temporary texture that is the size of the overlay rect in atlas space. + //Debug.Log("SRC texture location is " +tr.rect.ToString()); + scratch = RenderTexture.GetTemporary((int)tr.rect.width, (int)tr.rect.height, 0, target.format, RenderTextureReadWrite.Linear); + //Debug.Log("Scratch texture is " + scratch.width + "x" + scratch.height + " " + scratch.format.ToString()); + + float fw = (float)width; + float fh = (float)height; + + GL.PushMatrix(); + GL.LoadPixelMatrix(0, scratch.width, scratch.height, 0); + + // Set the destination (The entire scratch texture) + Destination.Set(0, 0, scratch.width, scratch.height); + + // Set the source rect in UV space + Src.Set(tr.rect.x/fw, 1.0f-((tr.rect.y+tr.rect.height)/fh), (tr.rect.width/fw), (tr.rect.height / fh)); // get the rect in UV space + + //SaveRenderTexture(target, System.IO.Path.Combine(Application.dataPath, "target-before.png")); + // should be drawing to the scratch texture now + RenderTexture.active = scratch; + Graphics.DrawTexture(Destination, target, Src, 0, 0, 0, 0); + Debug.Log("Src Texture is "+Src.ToString()); + RenderTexture.active = target; + //SaveRenderTexture(scratch, System.IO.Path.Combine(Application.dataPath, "scratch-after.png")); + //SaveRenderTexture(target, System.IO.Path.Combine(Application.dataPath, "target-after.png")); + GL.PopMatrix(); + tr.mat.SetTexture("_BaseTex", scratch); + DrawRect (ref tr, sharperFitTextures); + } + else + { + DrawRect(ref tr, sharperFitTextures); + } + + if (scratch != null) + { + RenderTexture.ReleaseTemporary(scratch); + scratch = null; + } } +#else + for (int i = 0; i < textureMergeRectCount; i++) + { + DrawRect(ref textureMergeRects[i], sharperFitTextures); + } +#endif GL.PopMatrix(); RenderTexture.active = backup; } @@ -83,7 +212,7 @@ public static void RotateAroundPivot(float angle, Vector2 pivotPoint) GL.MultMatrix(newMat); } - private void DrawRect(ref TextureMergeRect tr,bool sharperFitTextures) + private void DrawRect(ref TextureMergeRect tr, bool sharperFitTextures)//, Material overrideMat = null) { if (tr.tex == null) return; @@ -93,8 +222,8 @@ private void DrawRect(ref TextureMergeRect tr,bool sharperFitTextures) GL.PushMatrix(); // rotate around the pivot - pivotPoint.Set(tr.rect.x + (tr.rect.width/2.0f), tr.rect.y + (tr.rect.height / 2.0f)); - Matrix4x4 newMat = Matrix4x4.TRS(pivotPoint, Quaternion.Euler(0, 0, tr.rotation), tr.scale) * Matrix4x4.TRS(-pivotPoint, Quaternion.identity, Vector3.one); + pivotPoint.Set(tr.rect.x + (tr.rect.width / 2.0f), tr.rect.y + (tr.rect.height / 2.0f)); + Matrix4x4 newMat = Matrix4x4.TRS(pivotPoint, Quaternion.Euler(0, 0, tr.rotation), tr.scale) * Matrix4x4.TRS(-pivotPoint, Quaternion.identity, Vector3.one); GL.MultMatrix(newMat); } @@ -104,11 +233,16 @@ private void DrawRect(ref TextureMergeRect tr,bool sharperFitTextures) tr.tex.mipMapBias = -1.0f; } else - { + { tr.tex.mipMapBias = 0f; } - Graphics.DrawTexture(tr.rect, tr.tex, tr.mat); + if (tr.channelType == UMAMaterial.ChannelType.DiffuseTexture) + { + Debug.Log($"Drawing = {tr.textureType} with texture {tr.mat.mainTexture.name} and shader {tr.mat.shader.name}"); + } + + Graphics.DrawTexture(tr.rect, tr.tex, tr.mat); if (tr.transform) { GL.PopMatrix(); @@ -117,6 +251,15 @@ private void DrawRect(ref TextureMergeRect tr,bool sharperFitTextures) public void PostProcess(RenderTexture destination, UMAMaterial.ChannelType channelType) { + if (channelType == UMAMaterial.ChannelType.DiffuseTexture && diffusePostProcesses.Count == 0) + return; + if (channelType == UMAMaterial.ChannelType.NormalMap && normalPostProcesses.Count == 0) + return; + if (channelType == UMAMaterial.ChannelType.Texture && dataPostProcesses.Count == 0) + return; + if (channelType == UMAMaterial.ChannelType.DetailNormalMap && detailNormalPostProcesses.Count == 0) + return; + var source = RenderTexture.GetTemporary(destination.width, destination.height, 0, destination.format, RenderTextureReadWrite.Linear); switch (channelType) @@ -175,7 +318,7 @@ internal void EnsureCapacity(int moduleCount) for (idx = 0; idx < oldTextureMerge.Length; idx++) { textureMergeRects[idx].mat = oldTextureMerge[idx].mat; - } + } } for (; idx < newLength; idx++) { @@ -191,13 +334,18 @@ private void SetupMaterial(ref TextureMergeRect textureMergeRect, UMAData.Materi camBackgroundColor.a = 0.0f; if (textureType >= source.baseOverlay.textureList.Length) - { - Debug.LogWarning("Out of range (" + textureType + ") on base overlay: " + source.overlayData[0].overlayName+" on slot: "+source.slotData.slotName); + { + Debug.LogWarning("Out of range (" + textureType + ") on base overlay: " + source.overlayData[0].overlayName + " on slot: " + source.slotData.slotName); return; - } + } textureMergeRect.tex = source.baseOverlay.textureList[textureType]; + textureMergeRect.advancedBlending = false; - switch (source.slotData.material.channels[textureType].channelType) + // JRRM debug + textureMergeRect.textureType = textureType; + textureMergeRect.channelType = source.slotData.material.channels[textureType].channelType; + + switch (source.slotData.material.channels[textureType].channelType) { case UMAMaterial.ChannelType.NormalMap: textureMergeRect.mat.shader = normalShader; @@ -212,6 +360,7 @@ private void SetupMaterial(ref TextureMergeRect textureMergeRect, UMAData.Materi textureMergeRect.mat.shader = detailNormalShader; break; } + textureMergeRect.mat.SetTexture("_MainTex", source.baseOverlay.textureList[textureType]); textureMergeRect.mat.SetTexture("_ExtraTex", source.baseOverlay.alphaTexture); textureMergeRect.mat.SetColor("_Color", source.GetMultiplier(0, textureType)); @@ -261,50 +410,98 @@ private void SetupOverlay(UMAData.MaterialFragment source, int OverlayIndex, int Rect overlayRect; - if (source.rects[OverlayIndex].width != 0) + if (source.rects[OverlayIndex].width != 0) { overlayRect = new Rect(atlasRect.xMin + source.rects[OverlayIndex].x * resolutionScale.x, atlasRect.yMax - source.rects[OverlayIndex].y * resolutionScale.y - source.rects[OverlayIndex].height * resolutionScale.y, source.rects[OverlayIndex].width * resolutionScale.x, source.rects[OverlayIndex].height * resolutionScale.y); - } - else - { + } + else + { overlayRect = atlasRect; - } + } SetupMaterial(ref textureMergeRects[textureMergeRectCount], source, OverlayIndex, ref overlayRect, textureType); - // for some reason, the overlayData is stored on the next textureMergeRect. - // Check the generator. There must be a reason, but I just can't fathom it. - if (source.overlayData[OverlayIndex+1].instanceTransformed) - { - OverlayData od = source.overlayData[OverlayIndex+1]; + // We only get here if we have more than one overlay. + // The overlay we are blending is the current overlay +1. + // when there are more than one overlay, that means we are blending the overlay in. + if (source.overlayData[OverlayIndex + 1].instanceTransformed) + { + OverlayData od = source.overlayData[OverlayIndex + 1]; textureMergeRects[textureMergeRectCount].transform = true; textureMergeRects[textureMergeRectCount].rotation = od.Rotation; textureMergeRects[textureMergeRectCount].scale = od.Scale; } else - { + { textureMergeRects[textureMergeRectCount].transform = false; } textureMergeRectCount++; } - private void SetupMaterial(ref TextureMergeRect textureMergeRect, UMAData.MaterialFragment source, int i2, ref Rect overlayRect, int textureType) + private Shader GetBlendModeDiffuseShader(OverlayData od, int TextureType, out bool isAdvanced) + { + var blendmode = od.GetOverlayBlend(TextureType); + + isAdvanced = false; + if (blendmode == OverlayDataAsset.OverlayBlend.Normal) + { + return DiffuseBlendModeShaders[0].Combiner; + } + foreach (var s in DiffuseBlendModeShaders) + { + if ((int)s.BlendMode == (int)blendmode) + { + isAdvanced = true; + return s.Combiner; + } + } + return diffuseShader; + } + + private Shader GetBlendModeShader(List shaderList, OverlayData od, int TextureType, out bool isAdvanced) + { + var blendmode = od.GetOverlayBlend(TextureType); + + isAdvanced = false; + if (blendmode == OverlayDataAsset.OverlayBlend.Normal) + { + return shaderList[0].Combiner; + } + foreach (var s in shaderList) + { + if ((int)s.BlendMode == (int)blendmode) + { + isAdvanced = true; + return s.Combiner; + } + } + return shaderList[0].Combiner; + } + + private void SetupMaterial(ref TextureMergeRect textureMergeRect, UMAData.MaterialFragment source, int i2, ref Rect overlayRect, int textureType) { textureMergeRect.rect = overlayRect; textureMergeRect.tex = source.overlays[i2].textureList[textureType]; + textureMergeRect.advancedBlending = false; + // JRRM debug + textureMergeRect.textureType = textureType; + textureMergeRect.channelType = source.slotData.material.channels[textureType].channelType; - if (source.overlays[i2].overlayType == OverlayDataAsset.OverlayType.Normal) + + if (source.overlays[i2].overlayType == OverlayDataAsset.OverlayType.Normal) { - switch (source.slotData.material.channels[textureType].channelType) + OverlayData od = source.overlayData[i2 + 1]; + + switch (source.slotData.material.channels[textureType].channelType) { - case UMAMaterial.ChannelType.NormalMap: - textureMergeRect.mat.shader = normalShader; + case UMAMaterial.ChannelType.NormalMap: + textureMergeRect.mat.shader = GetBlendModeShader(NormalBlendModeShaders,od, textureType, out textureMergeRect.advancedBlending); break; case UMAMaterial.ChannelType.Texture: - textureMergeRect.mat.shader = dataShader; + textureMergeRect.mat.shader = GetBlendModeShader(DataBlendModeShaders, od, textureType, out textureMergeRect.advancedBlending); break; case UMAMaterial.ChannelType.DiffuseTexture: - textureMergeRect.mat.shader = diffuseShader; + textureMergeRect.mat.shader = GetBlendModeDiffuseShader(od, textureType, out textureMergeRect.advancedBlending); break; case UMAMaterial.ChannelType.DetailNormalMap: textureMergeRect.mat.shader = detailNormalShader; diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureProcessPro.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureProcessPro.cs index 0ce599460..ff894dc89 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureProcessPro.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/TextureProcessPro.cs @@ -273,50 +273,7 @@ public void ProcessTexture(UMAData _umaData, UMAGeneratorBase _umaGenerator) if (textureChannelNumber == 0 && isCompositor) { /* set all the properties on the material */ - int numChannels = fragment.baseOverlay.textureList.Length; - int numOverlays = 1 + fragment.overlays.Length; - - Color[] ColorTints = new Color[numChannels * numOverlays]; - Color[] ColorAdds = new Color[numChannels * numOverlays]; - - var overlays = fragment.slotData.GetOverlayList(); - - int i = 0, ovl = 0; - - foreach (var overlay in overlays) - { - for (int c = 0; c < numChannels; c++) - { - // Some shaders use arrays, and some use hardcoded prop names. - if (overlay != null) - { - ColorTints[i] = overlay.GetColor(c); - ColorAdds[i] = overlay.GetAdditive(c); - } - else - { - ColorTints[i] = Color.white; - ColorAdds[i] = OverlayColorData.EmptyAdditive; - } - // don't go out of bounds if someone goes crazy with overlays and channels - if (c < tintProperties.GetLength(1) && ovl < tintProperties.GetLength(0)) - { - if (generatedMaterial.material.HasProperty(tintProperties[ovl, c])) - { - generatedMaterial.material.SetColor(tintProperties[ovl, c], ColorTints[i]); - } - if (generatedMaterial.material.HasProperty(addProperties[ovl, c])) - { - generatedMaterial.material.SetColor(addProperties[ovl, c], ColorAdds[i]); - } - } - i++; - } - ovl++; - } - - - generatedMaterial.material.SetInt("_OverlayCount", numOverlays); + SetCompositingProperties(generatedMaterial, generatedMaterial.material, fragment); /* We will revert these to arrays in the future generatedMaterial.material.SetColorArray("ColorTints", ColorTints); generatedMaterial.material.SetColorArray("ColorAdds", ColorAdds); */ @@ -338,7 +295,71 @@ public void ProcessTexture(UMAData _umaData, UMAGeneratorBase _umaGenerator) RenderTexture.active = null; } } - + + public static void SetCompositingProperties(UMAData.GeneratedMaterial generatedMaterial, Material material, UMAData.MaterialFragment fragment) + { + int numChannels = fragment.baseOverlay.textureList.Length; + int numOverlays = 1 + fragment.overlays.Length; + + Color[] ColorTints = new Color[numChannels * numOverlays]; + Color[] ColorAdds = new Color[numChannels * numOverlays]; + + var overlays = fragment.slotData.GetOverlayList(); + + int i = 0, ovl = 0; + + foreach (var overlay in overlays) + { + // apply tileable properties. + // apply UV offset properties. + // x,y,z,w = xuv, yuv, xwidth, ywidth + if (material.HasProperty("_UseTiling" + ovl)) + { + float tiling = 0; + if (overlay.Tiling) + { + tiling = 1; + } + material.SetFloat("_UseTiling" + ovl, tiling); + } + if (material.HasProperty("_UV_Offset" + ovl)) + { + Vector4 uv = overlay.GetUV(); + material.SetVector("_UV_Offset" + ovl, uv); + } + + for (int c = 0; c < numChannels; c++) + { + // Some shaders use arrays, and some use hardcoded prop names. + if (overlay != null) + { + ColorTints[i] = overlay.GetColor(c); + ColorAdds[i] = overlay.GetAdditive(c); + } + else + { + ColorTints[i] = Color.white; + ColorAdds[i] = OverlayColorData.EmptyAdditive; + } + // don't go out of bounds if someone goes crazy with overlays and channels + if (c < tintProperties.GetLength(1) && ovl < tintProperties.GetLength(0)) + { + if (material.HasProperty(tintProperties[ovl, c])) + { + material.SetColor(tintProperties[ovl, c], ColorTints[i]); + } + if (material.HasProperty(addProperties[ovl, c])) + { + material.SetColor(addProperties[ovl, c], ColorAdds[i]); + } + } + i++; + } + ovl++; + } + material.SetInt("_OverlayCount", numOverlays); + } + private static void SetChannelTexture(UMAData umaData, int textureChannelNumber, int overlayNumber, Material mat, OverlayData overlay0) { var theTex = overlay0.GetTexture(textureChannelNumber); diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAData.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAData.cs index 8616dbe62..ce63a841e 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAData.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAData.cs @@ -444,16 +444,16 @@ public void RegisterAnimatedBoneHierarchy(int hash) public event Action OnAnimatorStateRestored { add { if (AnimatorStateRestored == null) { AnimatorStateRestored = new UMADataEvent(); } AnimatorStateRestored.AddAction(value); } remove { AnimatorStateRestored.RemoveAction(value); } } public event Action OnPreUpdateUMABody { add { if(PreUpdateUMABody == null) { PreUpdateUMABody = new UMADataEvent(); } PreUpdateUMABody.AddAction(value); } remove { PreUpdateUMABody.RemoveAction(value); } } //VES added - public UMADataEvent CharacterCreated = new UMADataEvent(); - public UMADataEvent CharacterDestroyed = new UMADataEvent(); - public UMADataEvent CharacterUpdated = new UMADataEvent(); - public UMADataEvent CharacterBeforeUpdated = new UMADataEvent(); - public UMADataEvent CharacterBeforeDnaUpdated = new UMADataEvent(); - public UMADataEvent CharacterDnaUpdated = new UMADataEvent(); - public UMADataEvent CharacterBegun = new UMADataEvent(); - public UMADataEvent AnimatorStateSaved = new UMADataEvent(); - public UMADataEvent AnimatorStateRestored = new UMADataEvent(); - public UMADataEvent PreUpdateUMABody = new UMADataEvent(); + public UMADataEvent CharacterCreated; + public UMADataEvent CharacterDestroyed; + public UMADataEvent CharacterUpdated; + public UMADataEvent CharacterBeforeUpdated; + public UMADataEvent CharacterBeforeDnaUpdated; + public UMADataEvent CharacterDnaUpdated; + public UMADataEvent CharacterBegun; + public UMADataEvent AnimatorStateSaved; + public UMADataEvent AnimatorStateRestored; + public UMADataEvent PreUpdateUMABody; public GameObject umaRoot; @@ -705,6 +705,7 @@ public class GeneratedMaterial { public UMAMaterial umaMaterial; public Material material; + public Material secondPassMaterial; public List materialFragments = new List(); public Texture[] resultingAtlasList; public Vector2 cropResolution; @@ -2067,6 +2068,11 @@ public void CleanTextures() { UMAUtils.DestroySceneObject(generatedMaterials.materials[atlasIndex].material); } + if (generatedMaterials.materials[atlasIndex].secondPassMaterial != null) + { + UMAUtils.DestroySceneObject(generatedMaterials.materials[atlasIndex].secondPassMaterial); + generatedMaterials.materials[atlasIndex].secondPassMaterial = null; + } for (int textureIndex = 0; textureIndex < generatedMaterials.materials[atlasIndex].resultingAtlasList.Length; textureIndex++) { if (generatedMaterials.materials[atlasIndex].resultingAtlasList[textureIndex] != null) @@ -2102,27 +2108,28 @@ public void CleanMesh(bool destroyRenderer) { continue; } - /* This is being cleaned up in CleanTextures -var mats = renderer.sharedMaterials; -for (int i = 0; i < mats.Length; i++) -{ - if (mats[i]) - { + if (this.blendShapeSettings.loadAllBlendShapes && renderer.sharedMesh != null) + { + for (int i = 0; i < renderer.sharedMesh.blendShapeCount; i++) + { + if (renderer.GetBlendShapeWeight(i) != 0.0f) + { + renderer.SetBlendShapeWeight(i, 0.0f); + } + } - UMAUtils.DestroySceneObject(mats[i]); - } -} */ - if (destroyRenderer) - { - // need to kill cloth first if it exists. - var cloth = renderer.gameObject.GetComponent(); - if (cloth != null) - { - UMAUtils.DestroySceneObject(cloth); + if (destroyRenderer) + { + // need to kill cloth first if it exists. + var cloth = renderer.gameObject.GetComponent(); + if (cloth != null) + { + UMAUtils.DestroySceneObject(cloth); + } + UMAUtils.DestroySceneObject(renderer.sharedMesh); + UMAUtils.DestroySceneObject(renderer); } - UMAUtils.DestroySceneObject(renderer.sharedMesh); - UMAUtils.DestroySceneObject(renderer); } } } @@ -2344,6 +2351,10 @@ public int[] GetAnimatedBones() /// public void FireCharacterBegunEvents() { + if (CharacterBegun != null) + { + CharacterBegun.Invoke(this); + } foreach (var slotData in umaRecipe.slotDataList) { @@ -2354,12 +2365,6 @@ public void FireCharacterBegunEvents() slotData.asset.SlotBeginProcessing.Invoke(this,slotData); } } - - if (CharacterBegun != null) - { - CharacterBegun.Invoke(this); - } - } /// diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMADefaultMeshCombiner.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMADefaultMeshCombiner.cs index 534754b10..acffb920f 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMADefaultMeshCombiner.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMADefaultMeshCombiner.cs @@ -1,7 +1,10 @@ using UnityEngine; -using System.Collections; using System.Collections.Generic; using System.Linq; +using UnityEngine.Rendering; +using System.Runtime.ExceptionServices; +using System; +using System.Runtime.CompilerServices; namespace UMA { @@ -209,16 +212,44 @@ public override void UpdateUMAMesh(bool updatedAtlas, UMAData umaData, int atlas UMAUtils.DestroySceneObject(cloth); } - Material[] materials = new Material[combinedMaterialList.Count]; + //Material[] materials = new Material[combinedMaterialList.Count]; + + // allocate enough space to avoid extra allocations + List materials = new List(combinedMaterialList.Count+2); + + var renderer = renderers[currentRendererIndex]; + var submeshes = new List(); + for(int i=0;i 0) - { - for (int oi = 0; oi < matfrag.overlayData.Length; oi++) - { - OverlayData od = matfrag.overlayData[oi]; - if (od == null) continue; - if (od.colorData.HasProperties) - { - foreach (var s in od.colorData.PropertyBlock.shaderProperties) - { - if (isCompositor) - { - s.Apply(ugm.material, oi); - } - else - { - s.Apply(ugm.material, -1); - } - } - } - } - } - } + //**************************************************** + //* Set parameters based on shader parameter mapping + //**************************************************** + public static void ApplyMaterialParameters(GeneratedMaterial ugm, UMAData umaData, Material material) + { + for (int j = 0; j < ugm.materialFragments.Count; j++) + { + UMAData.MaterialFragment matfrag = ugm.materialFragments[j]; - if (ugm.umaMaterial.shaderParms != null) - { + bool isCompositor = material.HasProperty("_OverlayCount"); - // Set Shader properties from shared colors - for(int j=0;j 0) + { + for (int oi = 0; oi < matfrag.overlayData.Length; oi++) + { + OverlayData od = matfrag.overlayData[oi]; + if (od == null) continue; + if (od.colorData.HasProperties) + { + foreach (var s in od.colorData.PropertyBlock.shaderProperties) + { + if (isCompositor) + { + s.Apply(material, oi); + } + else + { + s.Apply(material, -1); + } + } + } + } + } + } - } - } - packTexture = new MaxRectsBinPack(umaGenerator.atlasResolution, umaGenerator.atlasResolution, false); - } + if (ugm.umaMaterial.shaderParms != null) + { - public class MaterialDefinitionComparer : IComparer + // Set Shader properties from shared colors + for (int j = 0; j < ugm.umaMaterial.shaderParms.Length; j++) + { + UMAMaterial.ShaderParms parm = ugm.umaMaterial.shaderParms[j]; + if (material.HasProperty(parm.ParameterName)) + { + foreach (OverlayColorData ocd in umaData.umaRecipe.sharedColors) + { + if (ocd.name == parm.ColorName) + { + material.SetColor(parm.ParameterName, ocd.color); + break; + } + } + } + } + + } + } + + public class MaterialDefinitionComparer : IComparer { public int Compare(UMAData.MaterialFragment x, UMAData.MaterialFragment y) { @@ -461,6 +470,34 @@ public void ProcessTexture(UMAGeneratorBase _umaGenerator, UMAData _umaData, boo newMats[materialIndex] = atlasses[i].material; atlasses[i].skinnedMeshRenderer = renderer; atlasses[i].materialIndex = materialIndex; + var cm = atlasses[i]; + var firstPass = newMats[materialIndex]; + UMAGeneratorPro.ApplyMaterialParameters(cm, umaData, firstPass); + UMADefaultMeshCombiner.CopyMaterialTextures(firstPass, cm.material, cm.umaMaterial); + if (cm.material.HasProperty("_OverlayCount")) + { + UMADefaultMeshCombiner.SetCompositingParameters(firstPass, cm); + } + + + if (atlasses[i].umaMaterial.secondPass != null) + { + Material secondPass = GameObject.Instantiate(cm.umaMaterial.secondPass); + cm.secondPassMaterial = secondPass; + // Apply shader property blocks to second pass material + UMAGeneratorPro.ApplyMaterialParameters(cm, umaData, secondPass); + // set textures based on overlay texture channels + UMADefaultMeshCombiner.CopyMaterialTextures(secondPass, cm.material, cm.umaMaterial); + // set compositing parameters if needed + if (cm.material.HasProperty("_OverlayCount")) + { + UMADefaultMeshCombiner.SetCompositingParameters(secondPass, cm); + } + //secondPass.CopyPropertiesFromMaterial(newMats[materialIndex]); + materialIndex++; + newMats[materialIndex] = secondPass; + //materials.Add(secondPass); + } materialIndex++; } } diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAMaterial.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAMaterial.cs index 646e9c6c9..07ca97194 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAMaterial.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAMaterial.cs @@ -1,5 +1,7 @@ using UnityEngine; using System; +using UnityEngine.Serialization; +using System.Collections.Generic; namespace UMA { @@ -18,8 +20,62 @@ public class ShaderParms public enum CompressionSettings { None, Fast, HighQuality }; public bool translateSRP; - [Tooltip("The material used either as a template, or as the direct Material")] - public Material material; + [SerializeField] + [FormerlySerializedAs("material")] + private Material _material; + + [Serializable] + public struct SRPMaterial + { + public UMAUtils.PipelineType SRP; + public Material material; + }; + + public List srpMaterials = new List(); + private Dictionary _srpMaterialLookup = new Dictionary(); + + public Material material + { + get + { + var pipe = UMAUtils.DetectPipeline(); + if (_srpMaterialLookup.ContainsKey(pipe)) + { + return _srpMaterialLookup[pipe]; + } + else + { + // NO SrpMaterials in the list, so just return the material + if (srpMaterials.Count == 0) + { + _srpMaterialLookup.Add(pipe, _material); + return _material; + } + + if (_srpMaterialLookup.Count == 0) + { + foreach (var srpMat in srpMaterials) + { + _srpMaterialLookup.Add(srpMat.SRP, srpMat.material); + } + } + if (_srpMaterialLookup.ContainsKey(pipe)) + { + return _srpMaterialLookup[pipe]; + } + else + { + // Just stick the default material in there. + _srpMaterialLookup.Add(pipe, _material); + return _material; + } + } + } + set { _material = value; } + } + + + [Tooltip("Used as a second pass when 'Use Existing Textures' is set. Leave null for most cases.")] public Material secondPass; @@ -105,6 +161,14 @@ public static void CreateMaterialAsset() } #endif + private bool isGeneratedTextures + { + get + { + return materialType == MaterialType.Atlas || materialType == MaterialType.NoAtlas; + } + } + public bool isNoAtlas() { return materialType == MaterialType.Atlas; diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAMeshData.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAMeshData.cs index dd10327ba..2099f3dd0 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAMeshData.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAMeshData.cs @@ -10,14 +10,17 @@ using Unity.Collections; using UnityEngine.Serialization; using System.Text; +using System.Runtime.InteropServices; +using UnityEngine.Rendering; namespace UMA { [Serializable] - /// - /// UMA version of Unity mesh triangle data. - /// - public struct SubMeshTriangles + /// + /// UMA version of Unity mesh triangle data. + /// + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct SubMeshTriangles { [SerializeField] private int[] triangles; @@ -112,7 +115,8 @@ public void Assign(UMATransform other) /// This is only used for compatibility in UMA 2.11 /// [Serializable] - public struct UMABoneWeight + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct UMABoneWeight { public int boneIndex0; public int boneIndex1; @@ -199,7 +203,8 @@ public static bool isAllZero(Vector3[] deltas) } [Serializable] - public class UMABlendShape + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public class UMABlendShape { public string shapeName; public UMABlendFrame[] frames; @@ -209,6 +214,7 @@ public class UMABlendShape /// UMA version of Unity mesh data. /// [Serializable] + [StructLayout(LayoutKind.Sequential, Pack = 1)] public class UMAMeshData { public Matrix4x4[] bindPoses; @@ -548,10 +554,11 @@ public void RetrieveDataFromUnityMesh(Mesh sharedMesh) { submeshes[i].SetTriangles(sharedMesh.GetTriangles(i)); } - - //Create the blendshape data on the slot asset from the unity mesh -#region Blendshape - blendShapes = new UMABlendShape[sharedMesh.blendShapeCount]; + //SubMeshDescriptor subMeshDescriptor = new SubMeshDescriptor(0, submeshes[i].GetTriangles().Length, MeshTopology.Triangles); + //mesh.SetSubMesh(i, subMeshDescriptor); + //Create the blendshape data on the slot asset from the unity mesh + #region Blendshape + blendShapes = new UMABlendShape[sharedMesh.blendShapeCount]; Vector3[] deltaVertices; Vector3[] deltaNormals; @@ -777,15 +784,42 @@ public void ApplyDataToUnityMesh(SkinnedMeshRenderer renderer, UMASkeleton skele #endif mesh.bindposes = bindPoses; +#if true var subMeshCount = submeshes.Length; mesh.subMeshCount = subMeshCount; + var Descriptors = new SubMeshDescriptor[subMeshCount]; for (int i = 0; i < subMeshCount; i++) { - mesh.SetIndices(submeshes[i].GetTriangles(),MeshTopology.Triangles,i); + mesh.SetIndices(submeshes[i].GetTriangles(),MeshTopology.Triangles,i); } +#else + // TODO: Gather all the triangles and vertexes here into a native arrays and then set them all at once. + int[] triangles = new int[0]; + + mesh.Clear(); + + mesh.SetVertexBufferParams(vertices.Length, GetVertexLayout()); + mesh.SetVertexBufferData(vertices, 0, 0, vertexCount); + + mesh.SetIndexBufferParams(indexCount, IndexFormat.UInt32); + mesh.SetIndexBufferData(meshData.Indices.AsArray(), 0, 0, indexCount); + mesh.SetIndexBufferData(triangles,0,0, triangles.Length, MeshUpdateFlags.DontValidateIndices); + mesh.SetIndexBufferParams(triangles.Length, UnityEngine.Rendering.IndexFormat.UInt32); + + var subMeshCount = submeshes.Length; + mesh.subMeshCount = subMeshCount; + var Descriptors = new SubMeshDescriptor[subMeshCount]; + for (int i = 0; i < subMeshCount; i++) + { + Descriptors[i] = new SubMeshDescriptor(0, submeshes[i].GetTriangles().Length, MeshTopology.Triangles); + } + mesh.SetSubMeshes(Descriptors, 0, subMeshCount,MeshUpdateFlags.DontValidateIndices); +#endif + //SubMeshDescriptor subMeshDescriptor = new SubMeshDescriptor(0, submeshes[i].GetTriangles().Length, MeshTopology.Triangles); + //mesh.SetSubMesh(i, subMeshDescriptor); //Apply the blendshape data from the slot asset back to the combined UMA unity mesh. -#region Blendshape + #region Blendshape mesh.ClearBlendShapes(); if (blendShapes != null && blendShapes.Length > 0) { @@ -848,6 +882,22 @@ public void ApplyDataToUnityMesh(SkinnedMeshRenderer renderer, UMASkeleton skele } } + private VertexAttributeDescriptor[] GetVertexLayout() + { + List list = new List(); + list.Add(new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 4, stream: 0)); + list.Add(new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float32, 4, stream: 1)); + list.Add(new VertexAttributeDescriptor(VertexAttribute.Tangent, VertexAttributeFormat.Float32, 4, stream: 2)); + // list.Add(new VertexAttributeDescriptor(VertexAttribute.Color, VertexAttributeFormat.Float32, 4, stream: 3)); + list.Add(new VertexAttributeDescriptor(VertexAttribute.TexCoord0, VertexAttributeFormat.Float32, 4, stream: 4)); + list.Add(new VertexAttributeDescriptor(VertexAttribute.TexCoord1, VertexAttributeFormat.Float32, 4, stream: 5)); + // list.Add(new VertexAttributeDescriptor(VertexAttribute.TexCoord2, VertexAttributeFormat.Float32, 4, stream: 6)); + // list.Add(new VertexAttributeDescriptor(VertexAttribute.TexCoord3, VertexAttributeFormat.Float32, 4, stream: 7)); + list.Add(new VertexAttributeDescriptor(VertexAttribute.BlendWeight, VertexAttributeFormat.Float32, 4, stream: 8)); + list.Add(new VertexAttributeDescriptor(VertexAttribute.BlendIndices, VertexAttributeFormat.Float32, 4, stream: 9)); + return list.ToArray(); + } + private void SetBoneWeightsFromMeshData(Mesh mesh) { #if USE_NATIVE_ARRAYS @@ -954,9 +1004,8 @@ public Mesh ToUnityMesh() mesh.subMeshCount = subMeshCount; for (int i = 0; i < subMeshCount; i++) { - NativeArray triangles = submeshes[i].GetTriangles(); - mesh.SetIndices(triangles, MeshTopology.Triangles, i); - triangles.Dispose(); + int[] tris = submeshes[i].getBaseTriangles(); + mesh.SetTriangles(tris, i); } return mesh; } diff --git a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAUtils.cs b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAUtils.cs index 88be7efff..0bf8eb5e1 100644 --- a/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAUtils.cs +++ b/UMAProject/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAUtils.cs @@ -68,19 +68,24 @@ public enum PipelineType { public static PipelineType DetectPipeline() { if(GraphicsSettings.renderPipelineAsset != null) { // SRP - var srpType = GraphicsSettings.renderPipelineAsset.GetType().ToString(); - if(srpType.Contains("HDRenderPipelineAsset")) { + var srpType = GraphicsSettings.currentRenderPipeline.GetType().ToString(); + if(srpType.Contains("HDRender")) { return PipelineType.HDPipeline; - } else if(srpType.Contains("UniversalRenderPipelineAsset")) { + } else if(srpType.Contains("Universal")) { return PipelineType.UniversalPipeline; - } else - return PipelineType.Unsupported; - } + } + else + { + return PipelineType.Unsupported; + } + } // no SRP return PipelineType.BuiltInPipeline; } - - public static Material GetDefaultDiffuseMaterial() + + + + public static Material GetDefaultDiffuseMaterial() { var pipe = DetectPipeline(); #if UNITY_EDITOR @@ -89,7 +94,18 @@ public static Material GetDefaultDiffuseMaterial() return AssetDatabase.GetBuiltinExtraResource("Default-Diffuse.mat"); } #endif - return new Material(Shader.Find("Lit")); + if (pipe == PipelineType.HDPipeline) + { + return new Material(Shader.Find("HDRP/Lit")); + } + else if (pipe == PipelineType.UniversalPipeline) + { + return new Material(Shader.Find("Universal Render Pipeline/Lit")); + } + else + { + return new Material(Shader.Find("Standard")); + } } public static string TranslatedSRPTextureName(string BuiltinName) { diff --git a/UMAProject/Assets/UMA/Editor/AddressableUtility.cs b/UMAProject/Assets/UMA/Editor/AddressableUtility.cs index b92e2bc7a..2d5a72efa 100644 --- a/UMAProject/Assets/UMA/Editor/AddressableUtility.cs +++ b/UMAProject/Assets/UMA/Editor/AddressableUtility.cs @@ -5,7 +5,6 @@ #if !UMA_NOASMDEF using UnityEditor.AddressableAssets.Settings; using UnityEditor.AddressableAssets.Settings.GroupSchemas; -using UnityEditor.VersionControl; using UnityEngine; namespace UMA diff --git a/UMAProject/Assets/UMA/Editor/No.jpg b/UMAProject/Assets/UMA/Editor/No.jpg new file mode 100644 index 000000000..2c1826e0d Binary files /dev/null and b/UMAProject/Assets/UMA/Editor/No.jpg differ diff --git a/UMAProject/Assets/UMA/Editor/No.jpg.meta b/UMAProject/Assets/UMA/Editor/No.jpg.meta new file mode 100644 index 000000000..d15f558e8 --- /dev/null +++ b/UMAProject/Assets/UMA/Editor/No.jpg.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: af95d61e9164cce45ba7e30c48081873 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + 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 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Editor/fail-waiting-for-hug.gif b/UMAProject/Assets/UMA/Editor/fail-waiting-for-hug.gif new file mode 100644 index 000000000..ba0b8f459 Binary files /dev/null and b/UMAProject/Assets/UMA/Editor/fail-waiting-for-hug.gif differ diff --git a/UMAProject/Assets/UMA/Editor/fail-waiting-for-hug.gif.meta b/UMAProject/Assets/UMA/Editor/fail-waiting-for-hug.gif.meta new file mode 100644 index 000000000..e396ca418 --- /dev/null +++ b/UMAProject/Assets/UMA/Editor/fail-waiting-for-hug.gif.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 06f6c0519a0a77640bd16aa9b9a1e080 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + 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 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Editor/grouphug.jpg b/UMAProject/Assets/UMA/Editor/grouphug.jpg new file mode 100644 index 000000000..a8ade6933 Binary files /dev/null and b/UMAProject/Assets/UMA/Editor/grouphug.jpg differ diff --git a/UMAProject/Assets/UMA/Editor/grouphug.jpg.meta b/UMAProject/Assets/UMA/Editor/grouphug.jpg.meta new file mode 100644 index 000000000..e81c090b7 --- /dev/null +++ b/UMAProject/Assets/UMA/Editor/grouphug.jpg.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 2e68251d6e628564fb620043037f9ee0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + 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 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Editor/rubeGoldberg.jpg b/UMAProject/Assets/UMA/Editor/rubeGoldberg.jpg new file mode 100644 index 000000000..60090b58d Binary files /dev/null and b/UMAProject/Assets/UMA/Editor/rubeGoldberg.jpg differ diff --git a/UMAProject/Assets/UMA/Editor/rubeGoldberg.jpg.meta b/UMAProject/Assets/UMA/Editor/rubeGoldberg.jpg.meta new file mode 100644 index 000000000..db262bc46 --- /dev/null +++ b/UMAProject/Assets/UMA/Editor/rubeGoldberg.jpg.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 3c904742b2ddd704babaedf1815cc896 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + 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 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Examples/Blendshape Examples/Assets/Slots/MaleAlienHead/MaleAlienHead_Slot.asset b/UMAProject/Assets/UMA/Examples/Blendshape Examples/Assets/Slots/MaleAlienHead/MaleAlienHead_Slot.asset index 287c33a1c..5793dfc26 100644 Binary files a/UMAProject/Assets/UMA/Examples/Blendshape Examples/Assets/Slots/MaleAlienHead/MaleAlienHead_Slot.asset and b/UMAProject/Assets/UMA/Examples/Blendshape Examples/Assets/Slots/MaleAlienHead/MaleAlienHead_Slot.asset differ diff --git a/UMAProject/Assets/UMA/Examples/DynamicCharacterSystem Examples/Assets/DemoAssetBundles/ToonFemale/Wardrobe1/Recipes/ToonHair1.asset b/UMAProject/Assets/UMA/Examples/DynamicCharacterSystem Examples/Assets/DemoAssetBundles/ToonFemale/Wardrobe1/Recipes/ToonHair1.asset index a3228a2df..4ec4da341 100644 --- a/UMAProject/Assets/UMA/Examples/DynamicCharacterSystem Examples/Assets/DemoAssetBundles/ToonFemale/Wardrobe1/Recipes/ToonHair1.asset +++ b/UMAProject/Assets/UMA/Examples/DynamicCharacterSystem Examples/Assets/DemoAssetBundles/ToonFemale/Wardrobe1/Recipes/ToonHair1.asset @@ -31,7 +31,7 @@ MonoBehaviour: MeshHideAssets: [] OverrideDNA: PreloadValues: [] - recipeString: '{"version":2,"packedSlotDataList":null,"slotsV2":[{"id":"Hair_Long_Braided_Hair_1","scale":100,"copyIdx":-1,"overlays":[{"id":"Long_Braided_Hair_1","colorIdx":0,"rect":[0,0,0,0]}]}],"colors":null,"fColors":[{"name":"Hair","colors":[179,21,21,255,0,0,0,0,255,255,255,255,0,0,0,0]}],"sharedColorCount":1,"race":"ToonFemale","umaDna":{},"packedDna":[]}' + recipeString: '{"version":3,"packedSlotDataList":[],"slotsV2":[],"slotsV3":[{"id":"Hair_Long_Braided_Hair_1","scale":100,"copyIdx":-1,"overlays":[{"id":"Long_Braided_Hair_1","colorIdx":0,"rect":[0.0,0.0,0.0,0.0],"isTransformed":false,"scale":{"x":1.0,"y":1.0,"z":1.0},"rotation":0.0,"blendModes":[]}],"Tags":[],"Races":[],"blendShapeTarget":"","overSmoosh":0.009999999776482582,"smooshDistance":0.0010000000474974514,"smooshInvertX":false,"smooshInvertY":true,"smooshInvertZ":false,"smooshInvertDist":true,"smooshTargetTag":"","smooshableTag":"","isSwapSlot":false,"swapTag":"LongHair"}],"colors":[],"fColors":[{"name":"Hair","colors":[179,21,21,255,0,0,0,0,255,255,255,255,0,0,0,0],"ShaderParms":[],"alwaysUpdate":false}],"sharedColorCount":1,"race":"ToonFemale","packedDna":[]}' IncompatibleRecipes: [] UserField: - replaces: + replaces: Nothing diff --git a/UMAProject/Assets/UMA/Examples/DynamicCharacterSystem Examples/UMA DCS Demo - Simple Setup.unity b/UMAProject/Assets/UMA/Examples/DynamicCharacterSystem Examples/UMA DCS Demo - Simple Setup.unity index 90ac62445..0c9d18733 100644 --- a/UMAProject/Assets/UMA/Examples/DynamicCharacterSystem Examples/UMA DCS Demo - Simple Setup.unity +++ b/UMAProject/Assets/UMA/Examples/DynamicCharacterSystem Examples/UMA DCS Demo - Simple Setup.unity @@ -279,7 +279,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 9131802} m_CullTransparentMesh: 0 ---- !u!1 &12291988 +--- !u!1 &17564263 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -287,30 +287,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 12291989} + - component: {fileID: 17564264} m_Layer: 0 - m_Name: LeftLowCheekAdjust + m_Name: NoseMiddleAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &12291989 +--- !u!4 &17564264 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 12291988} - m_LocalRotation: {x: 0.000000089406946, y: -0.00000013783571, z: 0.000000014901158, - w: 1} - m_LocalPosition: {x: -0.00027455122, y: -0.000000013038516, z: 0.016000055} - m_LocalScale: {x: 1.0000004, y: 1.0000007, z: 1.0000005} + m_GameObject: {fileID: 17564263} + m_LocalRotation: {x: 0.00000866271, y: 0.00050230644, z: -0.0009103442, w: 0.99999946} + m_LocalPosition: {x: -0.000047052028, y: -0.000000010322628, z: 0.0000585852} + m_LocalScale: {x: 0.9585979, y: 0.98290783, z: 0.99588007} m_Children: [] - m_Father: {fileID: 847484282} + m_Father: {fileID: 2014644937} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &21485304 +--- !u!1 &25607457 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -318,30 +317,33 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 21485305} + - component: {fileID: 25607458} m_Layer: 0 - m_Name: RightHandFinger03_02 + m_Name: LeftEye m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &21485305 +--- !u!4 &25607458 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 21485304} - m_LocalRotation: {x: -0.030660514, y: 0.2890941, z: -0.047623243, w: -0.9556237} - m_LocalPosition: {x: -0.053420868, y: -0.00000003252351, z: 0.0000000018584935} - m_LocalScale: {x: 0.9999998, y: 0.99999994, z: 0.99999917} + m_GameObject: {fileID: 25607457} + m_LocalRotation: {x: 0.71245664, y: -0.0000031774382, z: -0.7017162, w: 0.0000042312295} + m_LocalPosition: {x: -0.106625885, y: -0.034980286, z: 0.11798751} + m_LocalScale: {x: 0.9317244, y: 0.9317243, z: 0.9317244} m_Children: - - {fileID: 1821257656} - m_Father: {fileID: 554038113} - m_RootOrder: 0 + - {fileID: 1304226510} + - {fileID: 2136130299} + - {fileID: 974406623} + - {fileID: 1323019139} + m_Father: {fileID: 777013926} + m_RootOrder: 12 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &31683902 +--- !u!1 &40537099 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -349,60 +351,28 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 31683903} + - component: {fileID: 40537100} m_Layer: 0 - m_Name: Root + m_Name: RightForeArmTwistAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &31683903 +--- !u!4 &40537100 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 31683902} - m_LocalRotation: {x: 0.7071068, y: -0.00000008940696, z: -0.00000008940696, w: -0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1287567118} - m_Father: {fileID: 4983528355912461231} + m_GameObject: {fileID: 40537099} + m_LocalRotation: {x: 0.00000014505349, y: -3.709078e-18, z: 0.000000012187229, w: 1} + m_LocalPosition: {x: -0.035068978, y: -0.00000019557774, z: -0.000000029802322} + m_LocalScale: {x: 1, y: 1.0006863, z: 1.0006863} + m_Children: [] + m_Father: {fileID: 1009070251} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &32114947 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 32114948} - m_Layer: 0 - m_Name: LeftUpperLid - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &32114948 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 32114947} - m_LocalRotation: {x: -0.00035462173, y: 0.09056213, z: 0.000024150295, w: 0.9958908} - m_LocalPosition: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - m_LocalScale: {x: 1.0000001, y: 1.0000001, z: 1.0000001} - m_Children: - - {fileID: 570720871} - m_Father: {fileID: 1676033228} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &42561832 GameObject: m_ObjectHideFlags: 0 @@ -482,7 +452,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 42561832} m_CullTransparentMesh: 0 ---- !u!1 &50064553 +--- !u!1 &75335213 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -490,30 +460,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 50064554} + - component: {fileID: 75335214} m_Layer: 0 - m_Name: LowerBackAdjust + m_Name: LeftGluteus m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &50064554 +--- !u!4 &75335214 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 50064553} - m_LocalRotation: {x: 0, y: 0, z: -1.3322677e-15, w: 1} - m_LocalPosition: {x: -0.053665183, y: 0.000000004051634, z: 0.00000000558794} - m_LocalScale: {x: 0.9739008, y: 0.9402905, z: 0.9739004} - m_Children: - - {fileID: 1604480715} - m_Father: {fileID: 1673481952} - m_RootOrder: 0 + m_GameObject: {fileID: 75335213} + m_LocalRotation: {x: -0.08551736, y: 0.8838578, z: 0.037582725, w: -0.45833373} + m_LocalPosition: {x: -0.00000016577542, y: -0.000000007450581, z: -0.00000009313226} + m_LocalScale: {x: 0.5275692, y: 0.5275692, z: 0.5275692} + m_Children: [] + m_Father: {fileID: 250203169} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &56369774 +--- !u!1 &79703370 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -521,32 +490,34 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 56369775} + - component: {fileID: 79703371} m_Layer: 0 - m_Name: Hips + m_Name: RightHand m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &56369775 +--- !u!4 &79703371 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 56369774} - m_LocalRotation: {x: 0.0035801514, y: 0.013576352, z: 0.004495827, w: 0.9998914} - m_LocalPosition: {x: -1.0402155, y: 0.0055537606, z: 0.0036903908} - m_LocalScale: {x: 0.9999995, y: 0.9999998, z: 0.9999998} + m_GameObject: {fileID: 79703370} + m_LocalRotation: {x: 0.7253505, y: -0.05391813, z: 0.0029747318, w: 0.68625844} + m_LocalPosition: {x: -0.28055295, y: -0.0000001398679, z: -0.00000006804533} + m_LocalScale: {x: 0.92911935, y: 0.9291197, z: 0.9291198} m_Children: - - {fileID: 1673481952} - - {fileID: 516943256} - - {fileID: 1144845124} - m_Father: {fileID: 146223047} - m_RootOrder: 0 + - {fileID: 593010056} + - {fileID: 913669105} + - {fileID: 185626193} + - {fileID: 1463884908} + - {fileID: 2036767857} + m_Father: {fileID: 942796180} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &70715328 +--- !u!1 &80324536 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -554,28 +525,27 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 70715329} + - component: {fileID: 80324537} m_Layer: 0 - m_Name: Tongue01 + m_Name: MandibleAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &70715329 +--- !u!4 &80324537 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 70715328} - m_LocalRotation: {x: 0.0000019340207, y: 0.24886589, z: -0.000000716172, w: 0.968538} - m_LocalPosition: {x: -0.020923134, y: -0.000093799084, z: -0.017397886} - m_LocalScale: {x: 1.0000012, y: 1.000001, z: 1} - m_Children: - - {fileID: 150639758} - m_Father: {fileID: 1155095060} - m_RootOrder: 6 + m_GameObject: {fileID: 80324536} + m_LocalRotation: {x: -0.000000086586354, y: 1.0035632e-15, z: 1.3325589e-14, w: 1} + m_LocalPosition: {x: -0.000000045632643, y: -7.123e-12, z: 0.000029374492} + m_LocalScale: {x: 1.0007061, y: 1.0051047, z: 1} + m_Children: [] + m_Father: {fileID: 192158650} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &81231819 GameObject: @@ -686,7 +656,7 @@ MonoBehaviour: m_OnValueChanged: m_PersistentCalls: m_Calls: [] ---- !u!1 &81586791 +--- !u!1 &83340861 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -694,29 +664,90 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 81586792} + - component: {fileID: 83340862} m_Layer: 0 - m_Name: LeftNoseAdjust + m_Name: RightLipsInferiorAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &83340862 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 83340861} + m_LocalRotation: {x: -0.000000435859, y: 0.0000000025320332, z: 0.000000001047738, + w: 1} + m_LocalPosition: {x: 0.000000007101335, y: -0.000027452328, z: -0.000031358264} + m_LocalScale: {x: 1.000196, y: 1.0035326, z: 1.0035326} + m_Children: [] + m_Father: {fileID: 557585557} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &88013752 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 88013753} + m_Layer: 0 + m_Name: NoseBaseAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &81586792 +--- !u!4 &88013753 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 81586791} - m_LocalRotation: {x: 0.000010777495, y: -0.0000001141843, z: 0.000000041152806, - w: -1} - m_LocalPosition: {x: -0.00004896231, y: 0.000000024971087, z: 0.000048934347} - m_LocalScale: {x: 1.0000005, y: 1.000001, z: 1.0000008} + m_GameObject: {fileID: 88013752} + m_LocalRotation: {x: 0.000000017743167, y: 0.001379871, z: 0.000000006371647, w: 0.99999905} + m_LocalPosition: {x: -0.00009805932, y: 4.719e-12, z: 0.00009791722} + m_LocalScale: {x: 0.92919564, y: 0.98112905, z: 0.96640825} m_Children: [] - m_Father: {fileID: 550966024} + m_Father: {fileID: 1839520114} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &97508320 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 97508321} + m_Layer: 0 + m_Name: LeftLips + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &97508321 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 97508320} + m_LocalRotation: {x: -0.0227199, y: 0.26825505, z: -0.08127732, w: 0.95964426} + m_LocalPosition: {x: -0.07606585, y: 0.024972262, z: 0.024242245} + m_LocalScale: {x: 0.9999998, y: 1, z: 1} + m_Children: + - {fileID: 1000778176} + m_Father: {fileID: 192158650} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &101892215 GameObject: m_ObjectHideFlags: 0 @@ -798,7 +829,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 101892215} m_CullTransparentMesh: 0 ---- !u!1 &102204983 +--- !u!1 &104073983 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -806,28 +837,90 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 102204984} + - component: {fileID: 104073984} m_Layer: 0 - m_Name: NoseTopAdjust + m_Name: NeckAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &102204984 +--- !u!4 &104073984 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 102204983} - m_LocalRotation: {x: -0.00004252278, y: 0.00000005476248, z: 0.00000006565823, w: -1} - m_LocalPosition: {x: -0.000029324656, y: 8.95515e-10, z: -0.000049009494} - m_LocalScale: {x: 1.0000005, y: 1.0000008, z: 1.0000004} + m_GameObject: {fileID: 104073983} + m_LocalRotation: {x: 0.00000043290004, y: -0.0000000074505975, z: 8.75684e-14, w: 1} + m_LocalPosition: {x: -0.035558783, y: 0.00000000268461, z: 0.000000070780516} + m_LocalScale: {x: 1, y: 0.9402963, z: 0.9103723} m_Children: [] - m_Father: {fileID: 1574501202} + m_Father: {fileID: 1576221013} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &121517495 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 121517496} + m_Layer: 0 + m_Name: LeftHandFinger05_02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &121517496 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 121517495} + m_LocalRotation: {x: -0.06402303, y: -0.17543037, z: -0.123573236, w: 0.974605} + m_LocalPosition: {x: -0.033299264, y: -0.0000000915309, z: 0.00000003159443} + m_LocalScale: {x: 0.9999998, y: 1.0000002, z: 1} + m_Children: + - {fileID: 1320276542} + m_Father: {fileID: 1197681946} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &125241560 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 125241561} + m_Layer: 0 + m_Name: LeftEar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &125241561 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125241560} + m_LocalRotation: {x: -0.11281152, y: -0.5704384, z: 0.08211996, w: 0.80940104} + m_LocalPosition: {x: -0.07060859, y: -0.07847363, z: 0.05354617} + m_LocalScale: {x: 1.0000001, y: 1, z: 1} + m_Children: + - {fileID: 210192099} + m_Father: {fileID: 777013926} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &125780984 GameObject: m_ObjectHideFlags: 0 @@ -982,38 +1075,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 125780984} m_CullTransparentMesh: 0 ---- !u!1 &131065585 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 131065586} - m_Layer: 0 - m_Name: HeadAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &131065586 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 131065585} - m_LocalRotation: {x: -0.000000029801402, y: -0.000000014901158, z: -2.2618968e-10, - w: 1} - m_LocalPosition: {x: -0.051950034, y: 0.000000003922105, z: 0.000000033527613} - m_LocalScale: {x: 1.0000001, y: 0.959976, z: 1} - m_Children: - - {fileID: 352658160} - m_Father: {fileID: 1421548625} - m_RootOrder: 9 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &135518292 GameObject: m_ObjectHideFlags: 0 @@ -1106,38 +1167,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 135518292} m_CullTransparentMesh: 0 ---- !u!1 &141078874 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 141078875} - m_Layer: 0 - m_Name: LeftHandFinger01_01 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &141078875 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 141078874} - m_LocalRotation: {x: 0.26908997, y: 0.19874924, z: -0.006046741, w: -0.9423656} - m_LocalPosition: {x: -0.0860299, y: 0.03509524, z: -0.008257651} - m_LocalScale: {x: 0.99999994, y: 1.0000002, z: 0.9999997} - m_Children: - - {fileID: 1344540801} - m_Father: {fileID: 2112796547} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &146223046 +--- !u!1 &146691368 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1145,93 +1175,28 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 146223047} + - component: {fileID: 146691369} m_Layer: 0 - m_Name: Position - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &146223047 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 146223046} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.014117638, y: -0.0000000046566133, z: 8.4147667e-10} - m_LocalScale: {x: 0.91100955, y: 0.91100955, z: 0.91100955} - m_Children: - - {fileID: 56369775} - m_Father: {fileID: 1287567118} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &150639757 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 150639758} - m_Layer: 0 - m_Name: Tongue02 + m_Name: RightArmAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &150639758 +--- !u!4 &146691369 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 150639757} - m_LocalRotation: {x: 0.9989919, y: -0.000000041880856, z: -0.04489069, w: 0.0000072369353} - m_LocalPosition: {x: -0.02847365, y: 0.000000002149267, z: -0.00000007008269} - m_LocalScale: {x: 0.99999994, y: 1.0000001, z: 0.99999994} + m_GameObject: {fileID: 146691368} + m_LocalRotation: {x: -0.23795994, y: 0.000000052737636, z: -0.00000017091787, w: 0.971275} + m_LocalPosition: {x: -0.06949079, y: 0.0000002924353, z: -0.00000015646219} + m_LocalScale: {x: 0.99999994, y: 0.97192353, z: 0.9719233} m_Children: [] - m_Father: {fileID: 70715329} + m_Father: {fileID: 857432015} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &154241127 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 154241128} - m_Layer: 0 - m_Name: RightEye - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &154241128 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 154241127} - m_LocalRotation: {x: 0.7124565, y: 0.000003167384, z: -0.70171624, w: 0.0000040531154} - m_LocalPosition: {x: -0.10662591, y: 0.03498037, z: 0.117987506} - m_LocalScale: {x: 0.9317243, y: 0.9317242, z: 0.9317242} - m_Children: - - {fileID: 561632092} - - {fileID: 1250228983} - - {fileID: 1369112791} - - {fileID: 525714721} - m_Father: {fileID: 1421548625} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!224 &154293107 RectTransform: m_ObjectHideFlags: 0 @@ -1319,7 +1284,7 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &177980829 +--- !u!1 &170274353 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1327,28 +1292,88 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 177980830} - - component: {fileID: 177980832} - - component: {fileID: 177980831} - m_Layer: 5 - m_Name: Text + - component: {fileID: 170274354} + m_Layer: 0 + m_Name: RightEyebrowUpAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &177980830 -RectTransform: +--- !u!4 &170274354 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 177980829} - 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_GameObject: {fileID: 170274353} + m_LocalRotation: {x: -0.00000015512614, y: -1.7496293e-10, z: 4.5474735e-11, w: 1} + m_LocalPosition: {x: -0.000029371318, y: 0.00000000721775, z: -0.000023490848} + m_LocalScale: {x: 0.99999994, y: 0.9999999, z: 1} m_Children: [] - m_Father: {fileID: 1983033410} + m_Father: {fileID: 840770351} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &175812134 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 175812135} + m_Layer: 0 + m_Name: LipsSuperiorAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &175812135 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175812134} + m_LocalRotation: {x: -0.00000077400637, y: -2.7770085e-14, z: -8.823163e-12, w: 1} + m_LocalPosition: {x: -6.742e-12, y: -1.842e-12, z: -0.000000055927874} + m_LocalScale: {x: 1.000196, y: 1.0035326, z: 1.0035326} + m_Children: [] + m_Father: {fileID: 1555366471} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &177980829 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 177980830} + - component: {fileID: 177980832} + - component: {fileID: 177980831} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &177980830 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 177980829} + 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_Children: [] + m_Father: {fileID: 1983033410} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -1400,7 +1425,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 177980829} m_CullTransparentMesh: 0 ---- !u!1 &197333686 +--- !u!1 &185626192 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1408,30 +1433,61 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 197333687} + - component: {fileID: 185626193} m_Layer: 0 - m_Name: LeftLipsSuperiorMiddleAdjust + m_Name: RightHandFinger04_01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &185626193 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 185626192} + m_LocalRotation: {x: -0.03430946, y: 0.14151148, z: -0.07796852, w: -0.9862649} + m_LocalPosition: {x: -0.09379475, y: 0.03950914, z: 0.0025049506} + m_LocalScale: {x: 1.0000002, y: 1.0000001, z: 1.0000001} + m_Children: + - {fileID: 246363602} + m_Father: {fileID: 79703371} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &186027781 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 186027782} + m_Layer: 0 + m_Name: LeftEyebrowLowAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &197333687 +--- !u!4 &186027782 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 197333686} - m_LocalRotation: {x: -0.00012638416, y: 0.000000047963095, z: 0.00000048801286, + m_GameObject: {fileID: 186027781} + m_LocalRotation: {x: -0.000000037469214, y: 0.000000003725296, z: 5.861684e-14, w: 1} - m_LocalPosition: {x: -0.00000008393545, y: 0.000027440221, z: 0.00000010083659} - m_LocalScale: {x: 1.0001965, y: 1.0035336, z: 1.0035331} + m_LocalPosition: {x: -0.000029447287, y: -0.000000001343401, z: -0.00004894579} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 967217784} + m_Father: {fileID: 1278441916} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &211980796 +--- !u!1 &192158649 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1439,28 +1495,97 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 211980797} + - component: {fileID: 192158650} m_Layer: 0 - m_Name: NoseBase + m_Name: Mandible m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &211980797 +--- !u!4 &192158650 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 211980796} - m_LocalRotation: {x: -0.7066935, y: -0.000000005227299, z: 0.70751995, w: -0.00000025150896} - m_LocalPosition: {x: -0.06767554, y: -0.00009390456, z: 0.14743026} - m_LocalScale: {x: 1, y: 0.9999999, z: 0.99999994} + m_GameObject: {fileID: 192158649} + m_LocalRotation: {x: -0.49723664, y: 0.00000012683061, z: 0.867615, w: 0.000000028697787} + m_LocalPosition: {x: -0.044175807, y: -0.00009392362, z: 0.05363187} + m_LocalScale: {x: 1.0006862, y: 1.0006863, z: 1.0006864} m_Children: - - {fileID: 1818343891} - m_Father: {fileID: 1421548625} - m_RootOrder: 5 + - {fileID: 2053899631} + - {fileID: 2115680349} + - {fileID: 1710025056} + - {fileID: 1209391245} + - {fileID: 80324537} + - {fileID: 557585557} + - {fileID: 656709315} + - {fileID: 97508321} + - {fileID: 1581031857} + m_Father: {fileID: 777013926} + m_RootOrder: 21 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &210192098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 210192099} + m_Layer: 0 + m_Name: LeftEarAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &210192099 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 210192098} + m_LocalRotation: {x: -0.00000013236368, y: -0.00000001760205, z: -0.09022358, w: 0.99592155} + m_LocalPosition: {x: 0.0013333394, y: 0.004000003, z: 0.008313744} + m_LocalScale: {x: 0.9764206, y: 0.9764206, z: 0.9764206} + m_Children: [] + m_Father: {fileID: 125241561} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &214584816 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 214584817} + m_Layer: 0 + m_Name: RightHandFinger02_02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &214584817 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 214584816} + m_LocalRotation: {x: -0.040853627, y: 0.23755768, z: -0.05761201, w: -0.96880245} + m_LocalPosition: {x: -0.04282187, y: -0.000000014867958, z: 0.000000118014434} + m_LocalScale: {x: 0.9999995, y: 1, z: 0.99999976} + m_Children: + - {fileID: 1460826253} + m_Father: {fileID: 1463884908} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &222486130 GameObject: @@ -1545,7 +1670,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 79cf30e5fc3dcc7429e74b5aef657480, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!1 &225039828 +--- !u!1 &234059480 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1553,30 +1678,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 225039829} + - component: {fileID: 234059481} m_Layer: 0 - m_Name: LeftHandFinger05_02 + m_Name: RightNoseAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &225039829 +--- !u!4 &234059481 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 225039828} - m_LocalRotation: {x: -0.064022854, y: -0.17543057, z: -0.12357284, w: 0.974605} - m_LocalPosition: {x: -0.033299074, y: 0.000000020443384, z: -0.000000016726437} - m_LocalScale: {x: 1.0000001, y: 1.0000004, z: 0.99999934} - m_Children: - - {fileID: 1432625347} - m_Father: {fileID: 1435048361} + m_GameObject: {fileID: 234059480} + m_LocalRotation: {x: -0.00000013016053, y: -2.9376684e-10, z: 6.730262e-11, w: 1} + m_LocalPosition: {x: -0.00004904163, y: -0.00000001990702, z: 0.000049047285} + m_LocalScale: {x: 0.99999994, y: 0.99999994, z: 0.99999994} + m_Children: [] + m_Father: {fileID: 819733585} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &239701298 +--- !u!1 &246363601 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1584,30 +1708,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 239701299} + - component: {fileID: 246363602} m_Layer: 0 - m_Name: LeftEyeGlobe + m_Name: RightHandFinger04_02 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &239701299 +--- !u!4 &246363602 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 239701298} - m_LocalRotation: {x: -0.000004153084, y: -0.00000014901465, z: 0.00000000549653, - w: -1} - m_LocalPosition: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - m_LocalScale: {x: 0.99999994, y: 1, z: 1.0000002} - m_Children: [] - m_Father: {fileID: 1676033228} - m_RootOrder: 1 + m_GameObject: {fileID: 246363601} + m_LocalRotation: {x: -0.054675087, y: 0.27263975, z: -0.012284948, w: -0.9604829} + m_LocalPosition: {x: -0.060066346, y: -0.000000038099135, z: -0.000000104075724} + m_LocalScale: {x: 0.99999964, y: 0.9999997, z: 0.9999999} + m_Children: + - {fileID: 1577755937} + m_Father: {fileID: 185626193} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &242179407 +--- !u!1 &250203168 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1615,28 +1739,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 242179408} + - component: {fileID: 250203169} m_Layer: 0 - m_Name: RightLipsInferior + m_Name: LeftUpLeg m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &242179408 +--- !u!4 &250203169 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 242179407} - m_LocalRotation: {x: 0.009207051, y: 0.16402112, z: 0.066096246, w: 0.98419696} - m_LocalPosition: {x: -0.084927976, y: -0.010590785, z: 0.028449215} - m_LocalScale: {x: 0.99999976, y: 0.9999999, z: 0.9999999} + m_GameObject: {fileID: 250203168} + m_LocalRotation: {x: -0.09457829, y: -0.05886421, z: 0.99240446, w: 0.05218579} + m_LocalPosition: {x: 0.017580085, y: -0.10126285, z: 0.0031646618} + m_LocalScale: {x: 0.9999998, y: 1, z: 0.99999994} m_Children: - - {fileID: 542810917} - m_Father: {fileID: 1155095060} - m_RootOrder: 5 + - {fileID: 1119597545} + - {fileID: 1902958432} + - {fileID: 75335214} + m_Father: {fileID: 744565323} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &252230850 GameObject: @@ -1857,7 +1983,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 255716615} m_CullTransparentMesh: 0 ---- !u!1 &274576205 +--- !u!1 &261170370 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1865,30 +1991,31 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 274576206} + - component: {fileID: 261170371} m_Layer: 0 - m_Name: RightEyebrowLowAdjust + m_Name: LowerBack m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &274576206 +--- !u!4 &261170371 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 274576205} - m_LocalRotation: {x: -0.00000005665234, y: 0.00000005960465, z: 0.00000003493151, - w: -1} - m_LocalPosition: {x: -0.000029352806, y: 0.00000000223472, z: -0.00004881392} - m_LocalScale: {x: 0.99999994, y: 0.9999997, z: 1.0000001} - m_Children: [] - m_Father: {fileID: 509495084} + m_GameObject: {fileID: 261170370} + m_LocalRotation: {x: 0.00000007636843, y: -0.07920218, z: 0.00000016123518, w: 0.9968586} + m_LocalPosition: {x: -0.05387843, y: 0.0000000035984864, z: 0.000000019341865} + m_LocalScale: {x: 0.97259873, y: 0.97259897, z: 0.97259873} + m_Children: + - {fileID: 1528634806} + - {fileID: 363565567} + m_Father: {fileID: 744565323} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &283919242 +--- !u!1 &265529209 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1896,30 +2023,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 283919243} + - component: {fileID: 265529210} m_Layer: 0 - m_Name: LipsInferior + m_Name: LipsInferiorAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &283919243 +--- !u!4 &265529210 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 283919242} - m_LocalRotation: {x: 0.000000059604588, y: 0.17807618, z: -0.00000008940688, w: 0.98401666} - m_LocalPosition: {x: -0.08628865, y: -0.000000034794642, z: 0.02867831} - m_LocalScale: {x: 0.9999999, y: 1, z: 0.9999999} - m_Children: - - {fileID: 1395580845} - m_Father: {fileID: 1155095060} - m_RootOrder: 3 + m_GameObject: {fileID: 265529209} + m_LocalRotation: {x: -0.0000003619587, y: -2.1623064e-14, z: -4.323093e-12, w: 1} + m_LocalPosition: {x: 0.000000022340513, y: 2.862e-12, z: -0.00003133205} + m_LocalScale: {x: 1.000196, y: 1.0039253, z: 1.0039253} + m_Children: [] + m_Father: {fileID: 1209391245} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &319322167 +--- !u!1 &297584665 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1927,30 +2053,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 319322168} + - component: {fileID: 297584666} m_Layer: 0 - m_Name: LeftLegAdjust + m_Name: RightGluteus m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &319322168 +--- !u!4 &297584666 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 319322167} - m_LocalRotation: {x: 0.000000026077032, y: -0.000000026077032, z: -0.0000000041909516, - w: 1} - m_LocalPosition: {x: -0.11892719, y: 0.000000031199306, z: 0.000000044703484} - m_LocalScale: {x: 1.0000001, y: 1.0386349, z: 1.0190157} + m_GameObject: {fileID: 297584665} + m_LocalRotation: {x: 0.08551729, y: 0.88385797, z: -0.037582517, w: -0.45833334} + m_LocalPosition: {x: -0.00000017827551, y: 0.000000001862645, z: -0.00000005401671} + m_LocalScale: {x: 0.5275692, y: 0.5275691, z: 0.5275692} m_Children: [] - m_Father: {fileID: 1851445319} + m_Father: {fileID: 1732343611} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &345180470 +--- !u!1 &330322803 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1958,29 +2083,61 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 345180471} + - component: {fileID: 330322804} m_Layer: 0 - m_Name: RightEarAdjust + m_Name: UpperLips m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &345180471 +--- !u!4 &330322804 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 345180470} - m_LocalRotation: {x: 0.0000002556218, y: 0.000000096539885, z: 0.090223595, w: 0.99592155} - m_LocalPosition: {x: 0.0013332947, y: -0.003999993, z: 0.0083134975} - m_LocalScale: {x: 0.9764207, y: 0.9764207, z: 0.9764208} - m_Children: [] - m_Father: {fileID: 1552303634} + m_GameObject: {fileID: 330322803} + m_LocalRotation: {x: 0.7071068, y: -0.00000013452524, z: -0.7071068, w: -0.00000013452524} + m_LocalPosition: {x: -0.0443894, y: -0.0002419103, z: 0.11719049} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 851450535} + m_Father: {fileID: 777013926} + m_RootOrder: 17 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &339829188 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 339829189} + m_Layer: 0 + m_Name: Root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &339829189 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 339829188} + m_LocalRotation: {x: 0.7071068, y: -0.00000008940696, z: -0.00000008940696, w: -0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 517238091} + m_Father: {fileID: 4983528355912461231} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &346289980 +--- !u!1 &347008811 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1988,29 +2145,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 346289981} + - component: {fileID: 347008812} m_Layer: 0 - m_Name: RightLipsSuperiorMiddleAdjust + m_Name: LeftForeArmTwistAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &346289981 +--- !u!4 &347008812 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 346289980} - m_LocalRotation: {x: -0.00012683493, y: 0.0000002009328, z: 0.000000033527606, w: -1} - m_LocalPosition: {x: -0.00000006984919, y: -0.000027435564, z: -0.000000013395038} - m_LocalScale: {x: 1.0001968, y: 1.0035329, z: 1.0035328} + m_GameObject: {fileID: 347008811} + m_LocalRotation: {x: -0.00000007136259, y: -0.000000001862645, z: -0.000000010142686, + w: 1} + m_LocalPosition: {x: -0.035068855, y: 0.000000066298526, z: -0.000000026077032} + m_LocalScale: {x: 1, y: 1.0006862, z: 1.0006863} m_Children: [] - m_Father: {fileID: 596350214} + m_Father: {fileID: 696943349} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &350256265 +--- !u!1 &363565566 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2018,30 +2176,31 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 350256266} + - component: {fileID: 363565567} m_Layer: 0 - m_Name: RightLowCheek + m_Name: Spine m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &350256266 +--- !u!4 &363565567 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 350256265} - m_LocalRotation: {x: -0.6591185, y: 0.2391581, z: 0.670226, w: -0.24323557} - m_LocalPosition: {x: -0.030948676, y: 0.03773913, z: 0.10849106} - m_LocalScale: {x: 0.9999996, y: 0.9999999, z: 0.9999998} + m_GameObject: {fileID: 363565566} + m_LocalRotation: {x: -0.0049763666, y: -0.0010152532, z: -0.006682734, w: 0.99996483} + m_LocalPosition: {x: -0.19275983, y: 0.000000044398398, z: -0.00012543198} + m_LocalScale: {x: 1.0000001, y: 1.0000001, z: 0.99999994} m_Children: - - {fileID: 979747860} - m_Father: {fileID: 1421548625} - m_RootOrder: 6 + - {fileID: 1770316070} + - {fileID: 569566892} + m_Father: {fileID: 261170371} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &352658159 +--- !u!1 &372295192 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2049,30 +2208,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 352658160} + - component: {fileID: 372295193} m_Layer: 0 - m_Name: PonyTail1 + m_Name: LeftLipsSuperiorMiddleAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &352658160 +--- !u!4 &372295193 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 352658159} - m_LocalRotation: {x: 0.011335289, y: -0.5194425, z: -0.0072508324, w: 0.85439944} - m_LocalPosition: {x: -0.064857766, y: 0.000000004896644, z: 0} - m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} - m_Children: - - {fileID: 1766753953} - m_Father: {fileID: 131065586} + m_GameObject: {fileID: 372295192} + m_LocalRotation: {x: -0.00012644996, y: -0.0000000023719622, z: 0.000000005122274, + w: 1} + m_LocalPosition: {x: -0.000000019441359, y: 0.00002745419, z: 0.000000105774234} + m_LocalScale: {x: 1.000196, y: 1.0035326, z: 1.0035326} + m_Children: [] + m_Father: {fileID: 2091838471} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &357493180 +--- !u!1 &383046517 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2080,30 +2239,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 357493181} + - component: {fileID: 383046518} m_Layer: 0 - m_Name: RightForeArmTwistAdjust + m_Name: LeftForeArmAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &357493181 +--- !u!4 &383046518 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 357493180} - m_LocalRotation: {x: 0.00000009313224, y: 0.000000007450594, z: -0.00000003306194, - w: 1} - m_LocalPosition: {x: -0.03506889, y: -0.00000013626413, z: -0.000000020489097} - m_LocalScale: {x: 1.0000006, y: 1.0006868, z: 1.0006864} + m_GameObject: {fileID: 383046517} + m_LocalRotation: {x: 0.0000002514571, y: -9.313226e-10, z: 0.00000000819273, w: 1} + m_LocalPosition: {x: -0.03506906, y: -0.0000001618755, z: -0.00000013411045} + m_LocalScale: {x: 1, y: 1.0012745, z: 1.0012746} m_Children: [] - m_Father: {fileID: 1429391140} - m_RootOrder: 0 + m_Father: {fileID: 439627130} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &372920305 +--- !u!1 &384613856 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2111,28 +2269,59 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 372920306} + - component: {fileID: 384613857} m_Layer: 0 - m_Name: RightLowerLidAdjust + m_Name: RightToeBase m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &372920306 +--- !u!4 &384613857 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 372920305} - m_LocalRotation: {x: 0.0002784026, y: 0.00046008814, z: -0.000036914105, w: -0.9999999} - m_LocalPosition: {x: 0.000000067076826, y: 0.00000000257387, z: -0.000000065832864} - m_LocalScale: {x: 1.0000008, y: 1.0000008, z: 1.0000011} + m_GameObject: {fileID: 384613856} + m_LocalRotation: {x: 0.034933556, y: -0.11464062, z: 0.011687321, w: 0.9927238} + m_LocalPosition: {x: -0.1838719, y: -0.000000008385592, z: -0.00000003354236} + m_LocalScale: {x: 1.0000002, y: 1.0000001, z: 1.0000004} m_Children: [] - m_Father: {fileID: 561632092} + m_Father: {fileID: 598925227} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &392675249 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 392675250} + m_Layer: 0 + m_Name: LeftFoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &392675250 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 392675249} + m_LocalRotation: {x: 0.85123897, y: 0.024415243, z: -0.5130373, w: 0.10765224} + m_LocalPosition: {x: -0.47571132, y: 0.00000011515159, z: 0.000000028787898} + m_LocalScale: {x: 0.85825497, y: 0.85825473, z: 0.85825485} + m_Children: + - {fileID: 1507630577} + m_Father: {fileID: 1119597545} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &394387163 GameObject: m_ObjectHideFlags: 0 @@ -2236,7 +2425,7 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 126 m_CollisionDetection: 0 ---- !u!1 &417819212 +--- !u!1 &439627129 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2244,30 +2433,32 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 417819213} + - component: {fileID: 439627130} m_Layer: 0 - m_Name: LeftEyebrowMiddle + m_Name: LeftForeArm m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &417819213 +--- !u!4 &439627130 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 417819212} - m_LocalRotation: {x: 0.7770956, y: -0.00000019629408, z: -0.62938267, w: 0.00000017990683} - m_LocalPosition: {x: -0.11220421, y: -0.036671754, z: 0.08122144} - m_LocalScale: {x: 0.99999976, y: 0.99999994, z: 0.9999999} + m_GameObject: {fileID: 439627129} + m_LocalRotation: {x: 0.030486196, y: 0.10408734, z: -0.018480193, w: 0.993929} + m_LocalPosition: {x: -0.27796414, y: 0.000000287631, z: 0.000000055690723} + m_LocalScale: {x: 1.0078585, y: 1.0078585, z: 1.0078586} m_Children: - - {fileID: 1501523163} - m_Father: {fileID: 1421548625} - m_RootOrder: 10 + - {fileID: 593377386} + - {fileID: 696943349} + - {fileID: 383046518} + m_Father: {fileID: 698060973} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &428302478 +--- !u!1 &489756723 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2275,30 +2466,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 428302479} + - component: {fileID: 489756724} m_Layer: 0 - m_Name: LeftLips + m_Name: RightHandFinger03_02 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &428302479 +--- !u!4 &489756724 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 428302478} - m_LocalRotation: {x: -0.021914452, y: 0.26832196, z: -0.07839588, w: 0.9598839} - m_LocalPosition: {x: -0.075910136, y: 0.025399094, z: 0.024111979} - m_LocalScale: {x: 0.9999999, y: 1.0000001, z: 0.9999999} + m_GameObject: {fileID: 489756723} + m_LocalRotation: {x: -0.030660983, y: 0.28909233, z: -0.047623627, w: -0.9556242} + m_LocalPosition: {x: -0.053421285, y: -0.000000106863425, z: -0.00000028156202} + m_LocalScale: {x: 0.9999999, y: 0.9999998, z: 0.99999964} m_Children: - - {fileID: 1587736274} - m_Father: {fileID: 1155095060} - m_RootOrder: 7 + - {fileID: 1784344585} + m_Father: {fileID: 593010056} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &468922688 +--- !u!1 &517238090 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2306,29 +2497,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 468922689} + - component: {fileID: 517238091} m_Layer: 0 - m_Name: LeftForeArmAdjust + m_Name: Global m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &468922689 +--- !u!4 &517238091 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 468922688} - m_LocalRotation: {x: 0.00000028312203, y: -0, z: -0.00000002235174, w: 1} - m_LocalPosition: {x: -0.03506903, y: -0.000000095926225, z: -0.00000011920929} - m_LocalScale: {x: 1.0000001, y: 1.0012742, z: 1.0012745} - m_Children: [] - m_Father: {fileID: 1143473323} - m_RootOrder: 2 + m_GameObject: {fileID: 517238090} + m_LocalRotation: {x: 0.5000002, y: 0.49999982, z: -0.5000002, w: 0.49999976} + m_LocalPosition: {x: 0.000000005122274, y: 0.010510059, z: -0.01146551} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 931790418} + m_Father: {fileID: 339829189} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &485220947 +--- !u!1 &525861670 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2336,292 +2528,12 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 485220948} - m_Layer: 0 - m_Name: RightHandFinger04_03 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &485220948 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 485220947} - m_LocalRotation: {x: -0.058842868, y: 0.19823223, z: -0.018510772, w: -0.9782121} - m_LocalPosition: {x: -0.0360733, y: -0.000000011150909, z: -0.00000005575477} - m_LocalScale: {x: 1.0000002, y: 1, z: 0.9999997} - m_Children: [] - m_Father: {fileID: 1843644514} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &485493929 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 485493930} - m_Layer: 0 - m_Name: RightHandFinger01_03 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &485493930 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 485493929} - m_LocalRotation: {x: -0.072893724, y: 0.2120598, z: -0.07187101, w: -0.97188056} - m_LocalPosition: {x: -0.024524767, y: 0.000000020443332, z: -0.00000014031612} - m_LocalScale: {x: 1.0000005, y: 1.0000006, z: 0.99999976} - m_Children: [] - m_Father: {fileID: 616450559} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &488539668 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 488539669} - m_Layer: 0 - m_Name: LeftCheekAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &488539669 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 488539668} - m_LocalRotation: {x: -0.00000013411044, y: -0.000000059604638, z: -0.0000000745058, - w: -1} - m_LocalPosition: {x: 0.00000004551967, y: 0.000000001862645, z: 0.000117586125} - m_LocalScale: {x: 1.0041221, y: 1.0041219, z: 1.004122} - m_Children: [] - m_Father: {fileID: 2110346792} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &490603574 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 490603575} - m_Layer: 0 - m_Name: LipsSuperiorAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &490603575 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 490603574} - m_LocalRotation: {x: -0.00000072097384, y: 0.00000011920936, z: 0.000000009991907, - w: 1} - m_LocalPosition: {x: 0.00000001489442, y: 5.434e-12, z: 0.00000005769348} - m_LocalScale: {x: 1.0001968, y: 1.003533, z: 1.0035337} - m_Children: [] - m_Father: {fileID: 1641886480} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &504943650 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 504943651} - m_Layer: 0 - m_Name: LeftHandFinger03_01 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &504943651 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 504943650} - m_LocalRotation: {x: -0.09825912, y: -0.19951366, z: -0.017844122, w: 0.97479284} - m_LocalPosition: {x: -0.09688432, y: -0.012628429, z: 0.0041935667} - m_LocalScale: {x: 1.0000001, y: 1.0000004, z: 1.0000004} - m_Children: - - {fileID: 2014503524} - m_Father: {fileID: 2112796547} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &509495083 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 509495084} - m_Layer: 0 - m_Name: RightEyebrowLow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &509495084 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 509495083} - m_LocalRotation: {x: 0.77709675, y: -0.00000012301177, z: -0.6293812, w: -0.00000007944375} - m_LocalPosition: {x: -0.10751021, y: 0.0190231, z: 0.083702885} - m_LocalScale: {x: 1.0000001, y: 0.99999994, z: 0.9999998} - m_Children: - - {fileID: 274576206} - m_Father: {fileID: 1421548625} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &514920772 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 514920773} - m_Layer: 0 - m_Name: LeftArm - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &514920773 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 514920772} - m_LocalRotation: {x: 0.18370807, y: 0.11580143, z: 0.48498634, w: 0.84713024} - m_LocalPosition: {x: -0.16176572, y: 0.00006614078, z: 0.000022999886} - m_LocalScale: {x: 1.0629758, y: 1.0629759, z: 1.0629758} - m_Children: - - {fileID: 1143473323} - - {fileID: 585997224} - m_Father: {fileID: 745306986} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &516943255 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 516943256} - m_Layer: 0 - m_Name: LeftUpLeg - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &516943256 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 516943255} - m_LocalRotation: {x: -0.09222492, y: -0.04466411, z: 0.99419785, w: 0.03271697} - m_LocalPosition: {x: 0.017579967, y: -0.101263665, z: 0.003165588} - m_LocalScale: {x: 1.0000013, y: 1.0000013, z: 1} - m_Children: - - {fileID: 1851445319} - - {fileID: 1760136390} - - {fileID: 1460144664} - m_Father: {fileID: 56369775} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &525714720 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 525714721} - m_Layer: 0 - m_Name: RightEyeGlobe - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &525714721 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 525714720} - m_LocalRotation: {x: -0.000004225848, y: -0.0000000894048, z: 0.000000076694484, - w: 1} - m_LocalPosition: {x: 0.00000008089521, y: 0.000000109731694, z: -0.0000005722835} - m_LocalScale: {x: 1, y: 1.0000004, z: 1.0000005} - m_Children: [] - m_Father: {fileID: 154241128} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &525861670 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 525861671} - - component: {fileID: 525861674} - - component: {fileID: 525861673} - - component: {fileID: 525861672} - m_Layer: 5 - m_Name: Scrollbar Horizontal + - component: {fileID: 525861671} + - component: {fileID: 525861674} + - component: {fileID: 525861673} + - component: {fileID: 525861672} + m_Layer: 5 + m_Name: Scrollbar Horizontal m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -2938,7 +2850,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 540069363} m_CullTransparentMesh: 0 ---- !u!1 &542810916 +--- !u!1 &555165697 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2946,30 +2858,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 542810917} + - component: {fileID: 555165698} m_Layer: 0 - m_Name: RightLipsInferiorAdjust + m_Name: LeftHandFinger04_01 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &542810917 +--- !u!4 &555165698 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 542810916} - m_LocalRotation: {x: -0.0000007441263, y: 0.00000011920922, z: -0.00000006856858, - w: 1} - m_LocalPosition: {x: -0.000000044936314, y: -0.000027450465, z: -0.000031365915} - m_LocalScale: {x: 1.0001969, y: 1.0035335, z: 1.0035323} - m_Children: [] - m_Father: {fileID: 242179408} + m_GameObject: {fileID: 555165697} + m_LocalRotation: {x: -0.030852014, y: -0.1049572, z: -0.101374805, w: 0.9888151} + m_LocalPosition: {x: -0.09379434, y: -0.03950874, z: 0.0025045457} + m_LocalScale: {x: 0.9999999, y: 1.0000001, z: 0.99999994} + m_Children: + - {fileID: 802230426} + m_Father: {fileID: 593377386} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &545709066 +--- !u!1 &557585556 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2977,30 +2889,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 545709067} + - component: {fileID: 557585557} m_Layer: 0 - m_Name: LeftLowMaxilarAdjust + m_Name: RightLipsInferior m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &545709067 +--- !u!4 &557585557 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 545709066} - m_LocalRotation: {x: -0.00000049173815, y: 0.000000111758666, z: -0.000000050524232, - w: 1} - m_LocalPosition: {x: -0.00000010430813, y: 0.000049087404, z: 0.00005890882} - m_LocalScale: {x: 1.0000008, y: 1.0000006, z: 0.9999998} - m_Children: [] - m_Father: {fileID: 1035587263} - m_RootOrder: 0 + m_GameObject: {fileID: 557585556} + m_LocalRotation: {x: 0.00966821, y: 0.15690862, z: 0.06593587, w: 0.98536223} + m_LocalPosition: {x: -0.08509559, y: -0.010239196, z: 0.028546672} + m_LocalScale: {x: 0.9999997, y: 0.99999994, z: 1.0000001} + m_Children: + - {fileID: 83340862} + m_Father: {fileID: 192158650} + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &550966023 +--- !u!1 &562759539 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3008,30 +2920,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 550966024} + - component: {fileID: 562759540} m_Layer: 0 - m_Name: LeftNose + m_Name: LeftHandFinger03_01 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &550966024 +--- !u!4 &562759540 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 550966023} - m_LocalRotation: {x: 0.7088708, y: 0.001175211, z: -0.7053236, w: 0.0044189156} - m_LocalPosition: {x: -0.057662286, y: -0.026324952, z: 0.10326293} - m_LocalScale: {x: 0.9999998, y: 1.0000002, z: 1.0000001} + m_GameObject: {fileID: 562759539} + m_LocalRotation: {x: -0.098259315, y: -0.19951159, z: -0.017843096, w: 0.9747933} + m_LocalPosition: {x: -0.09688441, y: -0.012628436, z: 0.0041934834} + m_LocalScale: {x: 0.99999994, y: 1, z: 0.9999999} m_Children: - - {fileID: 81586792} - m_Father: {fileID: 1421548625} - m_RootOrder: 13 + - {fileID: 2139624979} + m_Father: {fileID: 593377386} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &554038112 +--- !u!1 &563126981 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3039,30 +2951,35 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 554038113} - m_Layer: 0 - m_Name: RightHandFinger03_01 + - component: {fileID: 563126982} + m_Layer: 5 + m_Name: Sliding Area m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &554038113 -Transform: +--- !u!224 &563126982 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 554038112} - m_LocalRotation: {x: -0.09865161, y: 0.23845544, z: -0.009857506, w: -0.9660796} - m_LocalPosition: {x: -0.09688493, y: 0.012628765, z: 0.004193704} - m_LocalScale: {x: 1.0000007, y: 1.0000004, z: 1.0000006} + m_GameObject: {fileID: 563126981} + 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_Children: - - {fileID: 21485305} - m_Father: {fileID: 2069044636} + - {fileID: 1835331872} + m_Father: {fileID: 1842147399} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &561632091 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &569566891 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3070,30 +2987,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 561632092} + - component: {fileID: 569566892} m_Layer: 0 - m_Name: RightLowerLid + m_Name: SpineAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &561632092 +--- !u!4 &569566892 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 561632091} - m_LocalRotation: {x: -0.0002753267, y: -0.17976472, z: -0.000011421973, w: 0.98370963} - m_LocalPosition: {x: 0.000000058543428, y: 0.00000006502823, z: -0.0000005722841} - m_LocalScale: {x: 1, y: 1.0000001, z: 1.0000001} - m_Children: - - {fileID: 372920306} - m_Father: {fileID: 154241128} - m_RootOrder: 0 + m_GameObject: {fileID: 569566891} + m_LocalRotation: {x: -0.000000027040965, y: 5.759587e-16, z: -8.901179e-16, w: 1} + m_LocalPosition: {x: -0.037511434, y: 0.00000000287668, z: -0.00009689666} + m_LocalScale: {x: 1, y: 0.9014118, z: 0.80094117} + m_Children: [] + m_Father: {fileID: 363565567} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &563126981 +--- !u!1 &576555415 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3101,75 +3017,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 563126982} - m_Layer: 5 - m_Name: Sliding Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &563126982 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 563126981} - 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_Children: - - {fileID: 1835331872} - m_Father: {fileID: 1842147399} - m_RootOrder: 0 - 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: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &570720870 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 570720871} - m_Layer: 0 - m_Name: LeftUpperLidAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &570720871 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 570720870} - m_LocalRotation: {x: -0.00034918456, y: 0.00035879752, z: -0.00003603795, w: 0.9999999} - m_LocalPosition: {x: 0.000000021716517, y: -0.000000004901267, z: -0.000000053663825} - m_LocalScale: {x: 1.0000006, y: 1.0000006, z: 1.0000007} - m_Children: [] - m_Father: {fileID: 32114948} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &576555415 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 576555416} - - component: {fileID: 576555418} - - component: {fileID: 576555417} + - component: {fileID: 576555416} + - component: {fileID: 576555418} + - component: {fileID: 576555417} m_Layer: 5 m_Name: Text m_TagString: Untagged @@ -3238,7 +3088,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 576555415} m_CullTransparentMesh: 0 ---- !u!1 &585997223 +--- !u!1 &593010055 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3246,29 +3096,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 585997224} + - component: {fileID: 593010056} m_Layer: 0 - m_Name: LeftArmAdjust + m_Name: RightHandFinger03_01 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &585997224 +--- !u!4 &593010056 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 585997223} - m_LocalRotation: {x: 0.23795915, y: 0.00000005960463, z: 0.00000006231129, w: 0.9712752} - m_LocalPosition: {x: -0.06949084, y: -0.0000004498288, z: -0.00000018626451} - m_LocalScale: {x: 1, y: 0.97192377, z: 0.9719234} - m_Children: [] - m_Father: {fileID: 514920773} - m_RootOrder: 1 + m_GameObject: {fileID: 593010055} + m_LocalRotation: {x: -0.09865191, y: 0.23845354, z: -0.009856311, w: -0.96608} + m_LocalPosition: {x: -0.09688494, y: 0.012628765, z: 0.004194003} + m_LocalScale: {x: 1, y: 1.0000001, z: 1} + m_Children: + - {fileID: 489756724} + m_Father: {fileID: 79703371} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &594232507 +--- !u!1 &593377385 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3276,30 +3127,34 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 594232508} + - component: {fileID: 593377386} m_Layer: 0 - m_Name: RightEyebrowMiddle + m_Name: LeftHand m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &594232508 +--- !u!4 &593377386 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 594232507} - m_LocalRotation: {x: 0.7770956, y: 0.00000008287696, z: -0.62938255, w: 0.00000008730825} - m_LocalPosition: {x: -0.1122042, y: 0.03667182, z: 0.08122143} - m_LocalScale: {x: 0.9999998, y: 0.99999994, z: 0.99999994} + m_GameObject: {fileID: 593377385} + m_LocalRotation: {x: -0.7436888, y: 0.041129563, z: -0.04176847, w: 0.6659511} + m_LocalPosition: {x: -0.28055185, y: 0.00000031912762, z: -0.0000000065293304} + m_LocalScale: {x: 0.9291198, y: 0.9291197, z: 0.9291198} m_Children: - - {fileID: 1818034872} - m_Father: {fileID: 1421548625} - m_RootOrder: 22 + - {fileID: 555165698} + - {fileID: 1220445883} + - {fileID: 1453453780} + - {fileID: 562759540} + - {fileID: 1197681946} + m_Father: {fileID: 439627130} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &596350213 +--- !u!1 &593995683 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3307,28 +3162,27 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 596350214} + - component: {fileID: 593995684} m_Layer: 0 - m_Name: RightLipsSuperiorMiddle + m_Name: LeftHandFinger04_03 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &596350214 +--- !u!4 &593995684 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 596350213} - m_LocalRotation: {x: 0.7925747, y: -0.06697429, z: -0.6038794, w: 0.051667} - m_LocalPosition: {x: -0.03283036, y: 0.010835797, z: 0.14380059} - m_LocalScale: {x: 0.99999964, y: 0.99999964, z: 0.9999999} - m_Children: - - {fileID: 346289981} - m_Father: {fileID: 1421548625} - m_RootOrder: 2 + m_GameObject: {fileID: 593995683} + m_LocalRotation: {x: -0.05882363, y: -0.27057984, z: -0.017010076, w: 0.9607482} + m_LocalPosition: {x: -0.036073398, y: 0.00000007062281, z: -0.00000054639787} + m_LocalScale: {x: 1.0000002, y: 1.0000002, z: 1} + m_Children: [] + m_Father: {fileID: 802230426} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &597229520 GameObject: @@ -3366,7 +3220,7 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -20, y: -20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &597519370 +--- !u!1 &598925226 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3374,30 +3228,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 597519371} + - component: {fileID: 598925227} m_Layer: 0 - m_Name: LeftLowerLid + m_Name: RightFoot m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &597519371 +--- !u!4 &598925227 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 597519370} - m_LocalRotation: {x: 0.00027554593, y: -0.17976484, z: 0.0000110231795, w: 0.98370963} - m_LocalPosition: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - m_LocalScale: {x: 1, y: 1, z: 1} + m_GameObject: {fileID: 598925226} + m_LocalRotation: {x: 0.82832015, y: 0.037307814, z: -0.5421479, w: -0.1362704} + m_LocalPosition: {x: -0.47571182, y: -0.00000017272734, z: 0.00000009356064} + m_LocalScale: {x: 0.85825455, y: 0.85825455, z: 0.8582546} m_Children: - - {fileID: 2054152572} - m_Father: {fileID: 1676033228} - m_RootOrder: 3 + - {fileID: 384613857} + m_Father: {fileID: 2056414476} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &616450558 +--- !u!1 &599412594 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3405,27 +3259,27 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 616450559} + - component: {fileID: 599412595} m_Layer: 0 - m_Name: RightHandFinger01_02 + m_Name: RightLowMaxilarAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &616450559 +--- !u!4 &599412595 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 616450558} - m_LocalRotation: {x: -0.021405112, y: 0.21453467, z: -0.08453148, w: -0.9728161} - m_LocalPosition: {x: -0.0409741, y: -0.000000066440855, z: 0.000000008827844} - m_LocalScale: {x: 1.0000007, y: 1.0000004, z: 1.000001} - m_Children: - - {fileID: 485493930} - m_Father: {fileID: 1192534077} + m_GameObject: {fileID: 599412594} + m_LocalRotation: {x: 0.00000036228442, y: 0.00000001164153, z: -0.0000000065192576, + w: 1} + m_LocalPosition: {x: 0.000000055879354, y: -0.00004908368, z: 0.00005857587} + m_LocalScale: {x: 1.0000001, y: 1.0000001, z: 1.0000001} + m_Children: [] + m_Father: {fileID: 2115680349} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &618055743 @@ -3518,7 +3372,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_ShowMaskGraphic: 0 ---- !u!1 &635050027 +--- !u!1 &632308850 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3526,30 +3380,57 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 635050028} + - component: {fileID: 632308851} m_Layer: 0 - m_Name: RightShoulder + m_Name: NoseTopAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &635050028 +--- !u!4 &632308851 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 635050027} - m_LocalRotation: {x: 0.025253516, y: 0.02595921, z: 0.8427623, w: -0.5370663} - m_LocalPosition: {x: -0.18975347, y: 0.056619897, z: 0.0033298074} - m_LocalScale: {x: 1.000001, y: 1.000001, z: 1.0000001} - m_Children: - - {fileID: 1751247434} - - {fileID: 938814030} - - {fileID: 909787820} - m_Father: {fileID: 1351996167} - m_RootOrder: 2 + m_GameObject: {fileID: 632308850} + m_LocalRotation: {x: 0.00000021748883, y: -2.9012878e-10, z: 2.1827875e-11, w: 1} + m_LocalPosition: {x: -0.00002934142, y: -0.000000002706724, z: -0.000049009606} + m_LocalScale: {x: 1.0000001, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1841463895} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &646858834 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 646858835} + m_Layer: 0 + m_Name: LeftNoseAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &646858835 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 646858834} + m_LocalRotation: {x: -0.00000008801636, y: -2.619345e-10, z: -1.1823431e-10, w: 1} + m_LocalPosition: {x: -0.00004894553, y: 0.000000027677743, z: 0.00004893391} + m_LocalScale: {x: 0.99999994, y: 0.99999994, z: 0.99999994} + m_Children: [] + m_Father: {fileID: 2103373105} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &656206483 GameObject: @@ -3646,6 +3527,37 @@ MonoBehaviour: m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 +--- !u!1 &656709314 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 656709315} + m_Layer: 0 + m_Name: Tongue01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &656709315 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 656709314} + m_LocalRotation: {x: 0.0000019909912, y: 0.24886586, z: -0.0000007833872, w: 0.968538} + m_LocalPosition: {x: -0.020923058, y: -0.00009379909, z: -0.017397892} + m_LocalScale: {x: 0.99999976, y: 1, z: 0.99999976} + m_Children: + - {fileID: 1291811651} + m_Father: {fileID: 192158650} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &669959031 PrefabInstance: m_ObjectHideFlags: 0 @@ -3765,38 +3677,7 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 9e2576d087e70de4d892394fd86d4bf5, type: 3} ---- !u!1 &670809787 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 670809788} - m_Layer: 0 - m_Name: RightLowMaxilar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &670809788 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 670809787} - m_LocalRotation: {x: -0.029741721, y: 0.105628826, z: -0.22734705, w: 0.96761113} - m_LocalPosition: {x: -0.029504841, y: -0.057597507, z: -0.027499013} - m_LocalScale: {x: 0.99999994, y: 1.0000001, z: 0.99999994} - m_Children: - - {fileID: 1118227932} - m_Father: {fileID: 1155095060} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &679493386 +--- !u!1 &686553213 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3804,27 +3685,27 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 679493387} + - component: {fileID: 686553214} m_Layer: 0 - m_Name: RightHandFinger02_02 + m_Name: LeftHandFinger01_02 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &679493387 +--- !u!4 &686553214 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 679493386} - m_LocalRotation: {x: -0.040853184, y: 0.23756416, z: -0.057611406, w: -0.9688009} - m_LocalPosition: {x: -0.0428221, y: -0.0000000074339472, z: -0.000000020443442} - m_LocalScale: {x: 1.000001, y: 1.0000007, z: 1.000001} + m_GameObject: {fileID: 686553213} + m_LocalRotation: {x: -0.02139535, y: -0.19133328, z: -0.07597176, w: 0.9783467} + m_LocalPosition: {x: -0.040974036, y: -0.00000006644121, z: 0.000000015797216} + m_LocalScale: {x: 0.99999994, y: 0.99999994, z: 1.0000002} m_Children: - - {fileID: 2056216098} - m_Father: {fileID: 1143318031} + - {fileID: 1720370106} + m_Father: {fileID: 1220445883} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &690012332 @@ -3916,7 +3797,7 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: a54fde34eec40964b94d71ee0aba9889, type: 3} ---- !u!1 &707941064 +--- !u!1 &696943348 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3924,29 +3805,31 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 707941065} + - component: {fileID: 696943349} m_Layer: 0 - m_Name: LeftHandFinger01_03 + m_Name: LeftForeArmTwist m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &707941065 +--- !u!4 &696943349 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 707941064} - m_LocalRotation: {x: -0.07405331, y: -0.28212893, z: -0.09921199, w: 0.95135504} - m_LocalPosition: {x: -0.024524596, y: 0.0000000042977564, z: -0.0000000315944} - m_LocalScale: {x: 1, y: 1.0000001, z: 1.0000002} - m_Children: [] - m_Father: {fileID: 1344540801} - m_RootOrder: 0 + m_GameObject: {fileID: 696943348} + m_LocalRotation: {x: 0.0000003917376, y: -0.0000000013969839, z: -0.000000009436918, + w: 1} + m_LocalPosition: {x: -0.14027613, y: -0.00000010023359, z: -0.00000008381903} + m_LocalScale: {x: 1, y: 0.99999994, z: 1} + m_Children: + - {fileID: 347008812} + m_Father: {fileID: 439627130} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &719071506 +--- !u!1 &698060972 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3954,30 +3837,61 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 719071507} + - component: {fileID: 698060973} m_Layer: 0 - m_Name: NeckAdjust + m_Name: LeftArm m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &719071507 +--- !u!4 &698060973 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 719071506} - m_LocalRotation: {x: 0.00000041689458, y: 0.000000029802319, z: -0.00000014157611, - w: 1} - m_LocalPosition: {x: -0.035558783, y: 0.000000002684608, z: 0.000000070780516} - m_LocalScale: {x: 1.0000002, y: 0.9402967, z: 0.91037256} + m_GameObject: {fileID: 698060972} + m_LocalRotation: {x: 0.1837088, y: 0.11580195, z: 0.48498696, w: 0.84712964} + m_LocalPosition: {x: -0.1617659, y: 0.00006619941, z: 0.000023013876} + m_LocalScale: {x: 1.062976, y: 1.0629761, z: 1.0629759} + m_Children: + - {fileID: 439627130} + - {fileID: 1470668951} + m_Father: {fileID: 2040708668} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &703709923 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 703709924} + m_Layer: 0 + m_Name: RightShoulderAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &703709924 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 703709923} + m_LocalRotation: {x: -0.14658868, y: 0.000000041308006, z: 0.000000015093311, w: 0.98919755} + m_LocalPosition: {x: -0.040425725, y: 0.000000081723556, z: -0.000000026077032} + m_LocalScale: {x: 1, y: 1.0056933, z: 1.0056933} m_Children: [] - m_Father: {fileID: 1874345732} - m_RootOrder: 1 + m_Father: {fileID: 744722054} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &737185044 +--- !u!1 &744565322 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3985,31 +3899,32 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 737185045} + - component: {fileID: 744565323} m_Layer: 0 - m_Name: PonyTail4 + m_Name: Hips m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &737185045 +--- !u!4 &744565323 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 737185044} - m_LocalRotation: {x: 0.0000000031090683, y: -0.033606615, z: 0.0000000056039644, - w: 0.9994352} - m_LocalPosition: {x: -0.10673539, y: 0.00000000794777, z: 0.00000002981607} - m_LocalScale: {x: 0.99999994, y: 1, z: 0.9999999} + m_GameObject: {fileID: 744565322} + m_LocalRotation: {x: 0.002968615, y: 0.04003732, z: 0.0031918865, w: 0.99918866} + m_LocalPosition: {x: -1.0389221, y: 0.006084033, z: 0.013691942} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1415763196} - m_Father: {fileID: 1031667037} + - {fileID: 261170371} + - {fileID: 250203169} + - {fileID: 1732343611} + m_Father: {fileID: 931790418} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &745306985 +--- !u!1 &744722053 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4017,32 +3932,32 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 745306986} + - component: {fileID: 744722054} m_Layer: 0 - m_Name: LeftShoulder + m_Name: RightShoulder m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &745306986 +--- !u!4 &744722054 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 745306985} - m_LocalRotation: {x: 0.043838926, y: -0.03802965, z: 0.82744795, w: 0.55853546} - m_LocalPosition: {x: -0.18975353, y: -0.056619868, z: 0.0033298738} - m_LocalScale: {x: 0.99999976, y: 1, z: 1} + m_GameObject: {fileID: 744722053} + m_LocalRotation: {x: 0.025253497, y: 0.02595916, z: 0.8427624, w: -0.53706616} + m_LocalPosition: {x: -0.18975359, y: 0.056619957, z: 0.0033298011} + m_LocalScale: {x: 0.99999976, y: 1, z: 0.9999998} m_Children: - - {fileID: 1658702615} - - {fileID: 1038553324} - - {fileID: 514920773} - m_Father: {fileID: 1351996167} - m_RootOrder: 5 + - {fileID: 1244454510} + - {fileID: 857432015} + - {fileID: 703709924} + m_Father: {fileID: 1770316070} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &761643602 +--- !u!1 &777013925 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4050,29 +3965,54 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 761643603} + - component: {fileID: 777013926} m_Layer: 0 - m_Name: RightUpLegAdjust + m_Name: Head m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &761643603 +--- !u!4 &777013926 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 761643602} - m_LocalRotation: {x: 0.03335002, y: -0.000000042840842, z: -0.000000021886082, w: 0.99944377} - m_LocalPosition: {x: -0.10798966, y: 0.000000048195943, z: -0.0000002104789} - m_LocalScale: {x: 0.99999976, y: 0.90615094, z: 0.90615165} - m_Children: [] - m_Father: {fileID: 1144845124} - m_RootOrder: 2 + m_GameObject: {fileID: 777013925} + m_LocalRotation: {x: -0.025036035, y: -0.13455738, z: -0.021713091, w: 0.9903515} + m_LocalPosition: {x: -0.10225503, y: 9.871217e-10, z: -0.0000000969114} + m_LocalScale: {x: 1.4345257, y: 1.4345253, z: 1.4345256} + m_Children: + - {fileID: 816646190} + - {fileID: 1878168858} + - {fileID: 2134516430} + - {fileID: 2091838471} + - {fileID: 1792301781} + - {fileID: 1839520114} + - {fileID: 2125920642} + - {fileID: 1555366471} + - {fileID: 819733585} + - {fileID: 1166446701} + - {fileID: 1152129397} + - {fileID: 125241561} + - {fileID: 25607458} + - {fileID: 2103373105} + - {fileID: 1841463895} + - {fileID: 895930332} + - {fileID: 2014644937} + - {fileID: 330322804} + - {fileID: 1852367217} + - {fileID: 840770351} + - {fileID: 2042498013} + - {fileID: 192158650} + - {fileID: 1924404086} + - {fileID: 1589096301} + - {fileID: 1278441916} + m_Father: {fileID: 1576221013} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &770893463 +--- !u!1 &779779066 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4080,30 +4020,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 770893464} + - component: {fileID: 779779067} m_Layer: 0 - m_Name: LeftEyebrowLowAdjust + m_Name: LeftEyebrowMiddleAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &770893464 +--- !u!4 &779779067 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 770893463} - m_LocalRotation: {x: -0.00000006366759, y: 0.00000005960466, z: 0.000000032427817, - w: -1} - m_LocalPosition: {x: -0.000029469638, y: -0.000000001343547, z: -0.000048831236} - m_LocalScale: {x: 0.99999994, y: 0.9999997, z: 1.0000002} + m_GameObject: {fileID: 779779066} + m_LocalRotation: {x: -0.000000015157585, y: -0.0000000037252883, z: 2.2257568e-14, + w: 1} + m_LocalPosition: {x: -0.000029361872, y: -0.00000000408135, z: -0.00010771514} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 1931640042} + m_Father: {fileID: 1152129397} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &796421153 +--- !u!1 &790805935 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4111,26 +4051,58 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 796421154} + - component: {fileID: 790805936} m_Layer: 0 - m_Name: LeftEarAdjust + m_Name: LeftEyebrowUpAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &796421154 +--- !u!4 &790805936 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 796421153} - m_LocalRotation: {x: -0.00000018410877, y: 0.00000013294283, z: -0.090223566, w: 0.99592155} - m_LocalPosition: {x: 0.0013333301, y: 0.003999983, z: 0.0083137425} - m_LocalScale: {x: 0.9764205, y: 0.97642106, z: 0.9764207} + m_GameObject: {fileID: 790805935} + m_LocalRotation: {x: -0.00000010690791, y: 0.000000007571121, z: -3.4560795e-11, + w: 1} + m_LocalPosition: {x: -0.00002946544, y: -1.23691e-10, z: -0.000023496967} + m_LocalScale: {x: 1.0000001, y: 1, z: 1.0000001} m_Children: [] - m_Father: {fileID: 2080475099} + m_Father: {fileID: 1852367217} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &802230425 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 802230426} + m_Layer: 0 + m_Name: LeftHandFinger04_02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &802230426 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 802230425} + m_LocalRotation: {x: -0.054554164, y: -0.23593542, z: -0.012993615, w: 0.97014916} + m_LocalPosition: {x: -0.06006587, y: -0.00000003020054, z: 0.000000054825623} + m_LocalScale: {x: 0.99999994, y: 0.99999994, z: 0.99999976} + m_Children: + - {fileID: 593995684} + m_Father: {fileID: 555165698} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &812766629 @@ -4363,7 +4335,7 @@ MonoBehaviour: m_ChildScaleWidth: 0 m_ChildScaleHeight: 0 m_ReverseArrangement: 0 ---- !u!1 &820140025 +--- !u!1 &816646189 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4371,30 +4343,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 820140026} + - component: {fileID: 816646190} m_Layer: 0 - m_Name: LeftEyebrowUpAdjust + m_Name: RightEar m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &820140026 +--- !u!4 &816646190 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 820140025} - m_LocalRotation: {x: 0.000000060419545, y: -6.7871035e-11, z: 0.000000022933815, - w: -1} - m_LocalPosition: {x: -0.000029511999, y: -3.4197e-10, z: -0.000023493698} - m_LocalScale: {x: 1.0000007, y: 1.0000011, z: 1.000001} - m_Children: [] - m_Father: {fileID: 2131156994} + m_GameObject: {fileID: 816646189} + m_LocalRotation: {x: 0.112811014, y: -0.5704385, z: -0.08211965, w: 0.80940104} + m_LocalPosition: {x: -0.07060846, y: 0.07847385, z: 0.053546134} + m_LocalScale: {x: 1.0000001, y: 1, z: 1.0000001} + m_Children: + - {fileID: 1552520100} + m_Father: {fileID: 777013926} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &823496008 +--- !u!1 &819733584 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4402,17 +4374,48 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 823496009} - - component: {fileID: 823496012} - - component: {fileID: 823496010} - - component: {fileID: 823496011} - m_Layer: 5 - m_Name: ColorsHelpText + - component: {fileID: 819733585} + m_Layer: 0 + m_Name: RightNose m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 +--- !u!4 &819733585 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 819733584} + m_LocalRotation: {x: 0.70887095, y: -0.0011711541, z: -0.7053235, w: -0.004411299} + m_LocalPosition: {x: -0.05766216, y: 0.026325017, z: 0.103262894} + m_LocalScale: {x: 0.9999998, y: 1.0000001, z: 0.99999994} + m_Children: + - {fileID: 234059481} + m_Father: {fileID: 777013926} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &823496008 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 823496009} + - component: {fileID: 823496012} + - component: {fileID: 823496010} + - component: {fileID: 823496011} + m_Layer: 5 + m_Name: ColorsHelpText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 --- !u!224 &823496009 RectTransform: m_ObjectHideFlags: 0 @@ -4486,38 +4489,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 823496008} m_CullTransparentMesh: 0 ---- !u!1 &828697953 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 828697954} - m_Layer: 0 - m_Name: RightCheekAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &828697954 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 828697953} - m_LocalRotation: {x: -0.00000005960463, y: -0.00000010430811, z: 0.00000019371505, - w: -1} - m_LocalPosition: {x: 0.000000041325194, y: 0.000000012107193, z: 0.000117835225} - m_LocalScale: {x: 1.0041237, y: 1.0041233, z: 1.0041234} - m_Children: [] - m_Father: {fileID: 868397205} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &847484281 +--- !u!1 &824988369 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4525,30 +4497,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 847484282} + - component: {fileID: 824988370} m_Layer: 0 - m_Name: LeftLowCheek + m_Name: RightOuterBreast m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &847484282 +--- !u!4 &824988370 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 847484281} - m_LocalRotation: {x: -0.65911824, y: -0.23915756, z: 0.6702265, w: 0.24323519} - m_LocalPosition: {x: -0.030948685, y: -0.037739087, z: 0.1084911} - m_LocalScale: {x: 1.0000004, y: 1.0000001, z: 1.0000001} + m_GameObject: {fileID: 824988369} + m_LocalRotation: {x: -0.1244472, y: 0.702336, z: -0.11632976, w: 0.69116163} + m_LocalPosition: {x: -0.043685723, y: 0.06515683, z: 0.115223125} + m_LocalScale: {x: 1.0062846, y: 1.0062846, z: 1.0062847} m_Children: - - {fileID: 12291989} - m_Father: {fileID: 1421548625} - m_RootOrder: 23 + - {fileID: 1052633562} + m_Father: {fileID: 1770316070} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &847530661 +--- !u!1 &840770350 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4556,27 +4528,28 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 847530662} + - component: {fileID: 840770351} m_Layer: 0 - m_Name: RightArmAdjust + m_Name: RightEyebrowUp m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &847530662 +--- !u!4 &840770351 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 847530661} - m_LocalRotation: {x: -0.23796001, y: 0.000000055879347, z: -0.0000003056775, w: 0.971275} - m_LocalPosition: {x: -0.069490775, y: 0.00000030826777, z: -0.00000016763806} - m_LocalScale: {x: 1, y: 0.97192365, z: 0.9719234} - m_Children: [] - m_Father: {fileID: 938814030} - m_RootOrder: 0 + m_GameObject: {fileID: 840770350} + m_LocalRotation: {x: 0.77073634, y: 0.00088179106, z: -0.63715327, w: -0.0006876274} + m_LocalPosition: {x: -0.11164072, y: 0.051879745, z: 0.07084919} + m_LocalScale: {x: 1.0000002, y: 1, z: 1.0000001} + m_Children: + - {fileID: 170274354} + m_Father: {fileID: 777013926} + m_RootOrder: 19 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &849902318 GameObject: @@ -4732,7 +4705,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 849902318} m_CullTransparentMesh: 0 ---- !u!1 &860041906 +--- !u!1 &851450534 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4740,27 +4713,58 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 860041907} + - component: {fileID: 851450535} m_Layer: 0 - m_Name: RightLegAdjust + m_Name: UpperLipsAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &860041907 +--- !u!4 &851450535 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 860041906} - m_LocalRotation: {x: 0.000000096857555, y: -0.0000000037252907, z: 0.000000011525118, - w: 1} - m_LocalPosition: {x: -0.11892757, y: 0.000000030267984, z: -0.000000029802322} - m_LocalScale: {x: 1.0000007, y: 1.0386355, z: 1.0190154} + m_GameObject: {fileID: 851450534} + m_LocalRotation: {x: 0.0000000022733384, y: -8.7266476e-17, z: -7.330383e-15, w: 1} + m_LocalPosition: {x: -0.000000007443492, y: -3.17e-13, z: 0.000008952316} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 2001694907} + m_Father: {fileID: 330322804} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &857432014 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 857432015} + m_Layer: 0 + m_Name: RightArm + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &857432015 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 857432014} + m_LocalRotation: {x: -0.15975228, y: 0.032999173, z: -0.47923815, w: 0.8623927} + m_LocalPosition: {x: -0.16176614, y: -0.000066035216, z: 0.00002302058} + m_LocalScale: {x: 1.062976, y: 1.0629761, z: 1.0629758} + m_Children: + - {fileID: 146691369} + - {fileID: 942796180} + m_Father: {fileID: 744722054} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &860458268 @@ -4917,37 +4921,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 860458268} m_CullTransparentMesh: 0 ---- !u!1 &868397204 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 868397205} - m_Layer: 0 - m_Name: RightCheek - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &868397205 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 868397204} - m_LocalRotation: {x: 0.64207387, y: -0.30542296, z: -0.6339928, w: 0.3041566} - m_LocalPosition: {x: -0.08058888, y: 0.033353485, z: 0.11639312} - m_LocalScale: {x: 1.0000002, y: 0.9999999, z: 1.0000002} - m_Children: - - {fileID: 828697954} - m_Father: {fileID: 1421548625} - m_RootOrder: 15 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &876363994 PrefabInstance: m_ObjectHideFlags: 0 @@ -5069,7 +5042,7 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: a70e3506d4b0528439ba632e74af08b8, type: 3} ---- !u!1 &895313682 +--- !u!1 &895930331 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5077,28 +5050,28 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 895313683} + - component: {fileID: 895930332} m_Layer: 0 - m_Name: UpperLips + m_Name: RightCheek m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &895313683 +--- !u!4 &895930332 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 895313682} - m_LocalRotation: {x: 0.7071071, y: 0.00000005338665, z: -0.7071065, w: 0.000000053386696} - m_LocalPosition: {x: -0.044395097, y: -0.00009391423, z: 0.11719049} - m_LocalScale: {x: 0.99999994, y: 0.99999994, z: 0.99999994} + m_GameObject: {fileID: 895930331} + m_LocalRotation: {x: 0.64207387, y: -0.3054228, z: -0.6339929, w: 0.30415636} + m_LocalPosition: {x: -0.08058888, y: 0.033353485, z: 0.11639312} + m_LocalScale: {x: 1.0000002, y: 0.99999994, z: 1.0000002} m_Children: - - {fileID: 1424197589} - m_Father: {fileID: 1421548625} - m_RootOrder: 17 + - {fileID: 1937120916} + m_Father: {fileID: 777013926} + m_RootOrder: 15 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &900103629 GameObject: @@ -5333,7 +5306,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 901572570} m_CullTransparentMesh: 0 ---- !u!1 &909787819 +--- !u!1 &913669104 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5341,29 +5314,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 909787820} + - component: {fileID: 913669105} m_Layer: 0 - m_Name: RightShoulderAdjust + m_Name: RightHandFinger05_01 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &909787820 +--- !u!4 &913669105 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 909787819} - m_LocalRotation: {x: -0.14658868, y: 0.000000067055225, z: 0.000000004656613, w: 0.98919755} - m_LocalPosition: {x: -0.040425763, y: 0.00000008009374, z: -0.000000029802322} - m_LocalScale: {x: 1.0000012, y: 1.0056945, z: 1.0056937} - m_Children: [] - m_Father: {fileID: 635050028} - m_RootOrder: 2 + m_GameObject: {fileID: 913669104} + m_LocalRotation: {x: 0.42835367, y: -0.07300249, z: 0.37837088, w: -0.8173245} + m_LocalPosition: {x: -0.0385933, y: 0.04131473, z: -0.013679075} + m_LocalScale: {x: 1, y: 1, z: 0.99999964} + m_Children: + - {fileID: 1961770378} + m_Father: {fileID: 79703371} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &938814029 +--- !u!1 &920098870 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5371,31 +5345,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 938814030} + - component: {fileID: 920098871} m_Layer: 0 - m_Name: RightArm + m_Name: RightLegAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &938814030 +--- !u!4 &920098871 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 938814029} - m_LocalRotation: {x: -0.15975185, y: 0.032999348, z: -0.47923702, w: 0.8623933} - m_LocalPosition: {x: -0.1617662, y: -0.00006616084, z: 0.000023013296} - m_LocalScale: {x: 1.0629773, y: 1.0629772, z: 1.0629762} - m_Children: - - {fileID: 847530662} - - {fileID: 1482737566} - m_Father: {fileID: 635050028} + m_GameObject: {fileID: 920098870} + m_LocalRotation: {x: 0.00000009126961, y: -0.0000000018626451, z: -4.656613e-10, + w: 1} + m_LocalPosition: {x: -0.118927576, y: 0.000000017229468, z: -0.000000022351742} + m_LocalScale: {x: 1, y: 1.0386349, z: 1.0190157} + m_Children: [] + m_Father: {fileID: 2056414476} m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 47.289, y: 63.761, z: -22.072} ---- !u!1 &945853441 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &931790417 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5403,29 +5376,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 945853442} + - component: {fileID: 931790418} m_Layer: 0 - m_Name: RightInnerBreast + m_Name: Position m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &945853442 +--- !u!4 &931790418 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 945853441} - m_LocalRotation: {x: -0.025524477, y: -0.0444962, z: -0.0058081434, w: 0.9986666} - m_LocalPosition: {x: -0.058503173, y: 0.000000007450581, z: -0.00000013026875} - m_LocalScale: {x: 1.0000006, y: 1.0000004, z: 1.0000006} - m_Children: [] - m_Father: {fileID: 1771782171} + m_GameObject: {fileID: 931790417} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.014117641, y: 0.000000004656613, z: 0} + m_LocalScale: {x: 0.91100955, y: 0.91100955, z: 0.91100955} + m_Children: + - {fileID: 744565323} + m_Father: {fileID: 517238091} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &967217783 +--- !u!1 &942796179 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5433,30 +5407,32 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 967217784} + - component: {fileID: 942796180} m_Layer: 0 - m_Name: LeftLipsSuperiorMiddle + m_Name: RightForeArm m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &967217784 +--- !u!4 &942796180 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 967217783} - m_LocalRotation: {x: 0.79257464, y: 0.066974595, z: -0.6038795, w: -0.051666934} - m_LocalPosition: {x: -0.032830365, y: -0.010835715, z: 0.14380059} - m_LocalScale: {x: 0.9999998, y: 0.9999998, z: 0.9999998} + m_GameObject: {fileID: 942796179} + m_LocalRotation: {x: -0.018632501, y: 0.15032122, z: 0.026599633, w: 0.9881037} + m_LocalPosition: {x: -0.27796435, y: -0.0000006717688, z: 0.000000026703267} + m_LocalScale: {x: 1.0078585, y: 1.0078585, z: 1.0078588} m_Children: - - {fileID: 197333687} - m_Father: {fileID: 1421548625} - m_RootOrder: 3 + - {fileID: 1139126074} + - {fileID: 1009070251} + - {fileID: 79703371} + m_Father: {fileID: 857432015} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &967376453 +--- !u!1 &974406622 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5464,30 +5440,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 967376454} + - component: {fileID: 974406623} m_Layer: 0 - m_Name: LeftHandFinger04_02 + m_Name: LeftUpperLid m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &967376454 +--- !u!4 &974406623 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 967376453} - m_LocalRotation: {x: -0.0545542, y: -0.23594235, z: -0.012994406, w: 0.97014755} - m_LocalPosition: {x: -0.060065947, y: 0.000000033452785, z: -0.00000021279743} - m_LocalScale: {x: 1.0000001, y: 1.0000001, z: 0.99999994} + m_GameObject: {fileID: 974406622} + m_LocalRotation: {x: -0.00035462168, y: 0.09056212, z: 0.000024150286, w: 0.9958908} + m_LocalPosition: {x: 0.00000002410814, y: -0.00000010529145, z: -0.00000045256985} + m_LocalScale: {x: 0.9999998, y: 0.99999994, z: 0.9999998} m_Children: - - {fileID: 1685022365} - m_Father: {fileID: 1276979479} - m_RootOrder: 0 + - {fileID: 1516223663} + m_Father: {fileID: 25607458} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &979747859 +--- !u!1 &1000778175 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5495,30 +5471,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 979747860} + - component: {fileID: 1000778176} m_Layer: 0 - m_Name: RightLowCheekAdjust + m_Name: LeftLipsAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &979747860 +--- !u!4 &1000778176 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 979747859} - m_LocalRotation: {x: -0.000000044703473, y: -0.000000081956365, z: -0.00000020861621, - w: 1} - m_LocalPosition: {x: -0.00027455867, y: 0.000000007450581, z: 0.01600009} - m_LocalScale: {x: 1.000002, y: 1.0000021, z: 1.0000013} + m_GameObject: {fileID: 1000778175} + m_LocalRotation: {x: 0.000000010291436, y: -8.107054e-15, z: 3.7437315e-15, w: 1} + m_LocalPosition: {x: -0.000000016890226, y: 0.000058818427, z: -0.00000015910103} + m_LocalScale: {x: 0.99999994, y: 0.99999994, z: 0.99999994} m_Children: [] - m_Father: {fileID: 350256266} + m_Father: {fileID: 97508321} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &980251866 +--- !u!1 &1002287082 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5526,29 +5501,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 980251867} + - component: {fileID: 1002287083} m_Layer: 0 - m_Name: SpineAdjust + m_Name: RightHandFinger05_03 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &980251867 +--- !u!4 &1002287083 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 980251866} - m_LocalRotation: {x: -0.00000006253777, y: 0, z: -0.000000023019917, w: 1} - m_LocalPosition: {x: -0.037511554, y: 0.000000002876673, z: -0.00009686686} - m_LocalScale: {x: 1.0000008, y: 0.90141255, z: 0.80094117} + m_GameObject: {fileID: 1002287082} + m_LocalRotation: {x: 0.0065342863, y: 0.21400094, z: -0.14787583, w: -0.9655536} + m_LocalPosition: {x: -0.038922872, y: 0.00000007433977, z: 0.00000015239665} + m_LocalScale: {x: 1.0000002, y: 0.99999976, z: 1.0000001} m_Children: [] - m_Father: {fileID: 2108140655} - m_RootOrder: 1 + m_Father: {fileID: 1961770378} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1010893072 +--- !u!1 &1009070250 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5556,27 +5531,27 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1010893073} + - component: {fileID: 1009070251} m_Layer: 0 - m_Name: RightHandFinger05_01 + m_Name: RightForeArmTwist m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1010893073 +--- !u!4 &1009070251 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1010893072} - m_LocalRotation: {x: 0.4283534, y: -0.07300298, z: 0.3783717, w: -0.8173242} - m_LocalPosition: {x: -0.038593277, y: 0.041314706, z: -0.01367897} - m_LocalScale: {x: 1.0000013, y: 1.000001, z: 1.0000002} + m_GameObject: {fileID: 1009070250} + m_LocalRotation: {x: -0.00000043807086, y: -3.0327363e-18, z: -7.2759576e-11, w: 1} + m_LocalPosition: {x: -0.14027601, y: -0.00000006845221, z: -0.00000008381903} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 1414506737} - m_Father: {fileID: 2069044636} + - {fileID: 40537100} + m_Father: {fileID: 942796180} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1013361380 @@ -5654,7 +5629,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1013361380} m_CullTransparentMesh: 0 ---- !u!1 &1029355625 +--- !u!1 &1014523275 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5662,7 +5637,7 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1029355626} + - component: {fileID: 1014523276} m_Layer: 0 m_Name: LeftOuterBreast m_TagString: Untagged @@ -5670,22 +5645,22 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1029355626 +--- !u!4 &1014523276 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1029355625} - m_LocalRotation: {x: 0.12444672, y: 0.7023361, z: 0.116329275, w: 0.69116175} + m_GameObject: {fileID: 1014523275} + m_LocalRotation: {x: 0.12444687, y: 0.7023361, z: 0.11632934, w: 0.6911617} m_LocalPosition: {x: -0.043685734, y: -0.06515668, z: 0.11522319} - m_LocalScale: {x: 1.0062852, y: 1.0062851, z: 1.0062855} + m_LocalScale: {x: 1.0062846, y: 1.0062845, z: 1.0062847} m_Children: - - {fileID: 2126351174} - m_Father: {fileID: 1351996167} + - {fileID: 1699817985} + m_Father: {fileID: 1770316070} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1031667036 +--- !u!1 &1021386245 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5693,27 +5668,27 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1031667037} + - component: {fileID: 1021386246} m_Layer: 0 - m_Name: PonyTail3 + m_Name: LeftCheekAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1031667037 +--- !u!4 &1021386246 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1031667036} - m_LocalRotation: {x: 0.000000007902672, y: -0.5174137, z: 0.000000046576517, w: 0.8557354} - m_LocalPosition: {x: -0.05932556, y: 0.000000004401257, z: -0.00000000737743} - m_LocalScale: {x: 1, y: 1, z: 1.0000001} - m_Children: - - {fileID: 737185045} - m_Father: {fileID: 1766753953} + m_GameObject: {fileID: 1021386245} + m_LocalRotation: {x: -0.0000000119325705, y: 1.704548e-11, z: -0.00000000743074, + w: 1} + m_LocalPosition: {x: 0.000000035501223, y: -0.000000005587935, z: 0.00011760645} + m_LocalScale: {x: 1.004122, y: 1.004122, z: 1.004122} + m_Children: [] + m_Father: {fileID: 2042498013} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1034896863 @@ -5791,68 +5766,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1034896863} m_CullTransparentMesh: 0 ---- !u!1 &1035587262 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1035587263} - m_Layer: 0 - m_Name: LeftLowMaxilar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1035587263 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1035587262} - m_LocalRotation: {x: 0.029741673, y: 0.10562913, z: 0.2273467, w: 0.9676112} - m_LocalPosition: {x: -0.02950471, y: 0.057409532, z: -0.027499085} - m_LocalScale: {x: 0.9999998, y: 1, z: 0.99999994} - m_Children: - - {fileID: 545709067} - m_Father: {fileID: 1155095060} - m_RootOrder: 8 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1038553323 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1038553324} - m_Layer: 0 - m_Name: LeftTrapezius - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1038553324 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1038553323} - m_LocalRotation: {x: 0.69468355, y: -0.06968856, z: -0.14096293, w: 0.7019173} - m_LocalPosition: {x: -0.034978047, y: 0.037129175, z: -0.036507383} - m_LocalScale: {x: 1.0106091, y: 1.0106091, z: 1.0106089} - m_Children: [] - m_Father: {fileID: 745306986} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1042620534 +--- !u!1 &1052633561 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5860,29 +5774,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1042620535} + - component: {fileID: 1052633562} m_Layer: 0 - m_Name: RightGluteus + m_Name: RightInnerBreast m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1042620535 +--- !u!4 &1052633562 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1042620534} - m_LocalRotation: {x: 0.08551739, y: 0.883858, z: -0.03758245, w: -0.45833328} - m_LocalPosition: {x: -0.000000059058948, y: 0.000000002328306, z: -0.000000055879354} - m_LocalScale: {x: 0.5275694, y: 0.52756906, z: 0.52756906} + m_GameObject: {fileID: 1052633561} + m_LocalRotation: {x: -0.02552438, y: -0.04449612, z: -0.0058081676, w: 0.9986666} + m_LocalPosition: {x: -0.058503173, y: 0.000000005587935, z: -0.00000013021054} + m_LocalScale: {x: 0.9999998, y: 0.99999994, z: 0.99999994} m_Children: [] - m_Father: {fileID: 1144845124} + m_Father: {fileID: 824988370} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1047791515 +--- !u!1 &1065320579 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5890,7 +5804,7 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1047791516} + - component: {fileID: 1065320580} m_Layer: 0 m_Name: LeftHandFinger03_03 m_TagString: Untagged @@ -5898,18 +5812,18 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1047791516 +--- !u!4 &1065320580 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1047791515} - m_LocalRotation: {x: -0.027502147, y: -0.3513241, z: -0.009436637, w: 0.93580234} - m_LocalPosition: {x: -0.042907912, y: 0.00000001579715, z: -0.000000014867935} - m_LocalScale: {x: 0.99999964, y: 0.99999946, z: 1.0000001} + m_GameObject: {fileID: 1065320579} + m_LocalRotation: {x: -0.027502315, y: -0.3513241, z: -0.009436338, w: 0.93580234} + m_LocalPosition: {x: -0.0429081, y: 0.00000003995765, z: 0.000000057613367} + m_LocalScale: {x: 0.99999994, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 2014503524} + m_Father: {fileID: 2139624979} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1067156889 @@ -5991,6 +5905,37 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1067156889} m_CullTransparentMesh: 0 +--- !u!1 &1070406254 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1070406255} + m_Layer: 0 + m_Name: RightEyebrowLowAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1070406255 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1070406254} + m_LocalRotation: {x: 0.0000000030950762, y: 0.0000000037252903, z: -1.06580385e-14, + w: 1} + m_LocalPosition: {x: -0.000029323004, y: 0.000000002234751, z: -0.00004892661} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1792301781} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1082848062 GameObject: m_ObjectHideFlags: 0 @@ -6070,7 +6015,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1082848062} m_CullTransparentMesh: 0 ---- !u!1 &1118227931 +--- !u!1 &1089175568 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6078,27 +6023,26 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1118227932} + - component: {fileID: 1089175569} m_Layer: 0 - m_Name: RightLowMaxilarAdjust + m_Name: RightLipsAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1118227932 +--- !u!4 &1089175569 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1118227931} - m_LocalRotation: {x: 0.0000003948807, y: -0.00000005960463, z: 0.000000072177485, - w: 1} - m_LocalPosition: {x: 0.000000037252903, y: -0.00004905667, z: 0.000058704336} - m_LocalScale: {x: 1.0000006, y: 1.0000007, z: 0.9999994} + m_GameObject: {fileID: 1089175568} + m_LocalRotation: {x: -0.000000010476545, y: 6.6322516e-16, z: -2.4260076e-15, w: 1} + m_LocalPosition: {x: -0.00000001953427, y: -0.000058820584, z: -0.00000003997357} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 670809788} + m_Father: {fileID: 1710025056} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1119047824 stripped @@ -6113,7 +6057,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 5fd2661724b5ab24ea2d5da16a31cb27, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!1 &1137907169 +--- !u!1 &1119597544 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6121,30 +6065,31 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1137907170} + - component: {fileID: 1119597545} m_Layer: 0 - m_Name: LeftLipsInferiorAdjust + m_Name: LeftLeg m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1137907170 +--- !u!4 &1119597545 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1137907169} - m_LocalRotation: {x: 0.0000005736945, y: -0.000000059604623, z: 0.000000009313222, - w: 1} - m_LocalPosition: {x: -0.000000053318217, y: 0.000027448603, z: -0.000031365904} - m_LocalScale: {x: 1.0001968, y: 1.0035341, z: 1.0035329} - m_Children: [] - m_Father: {fileID: 1445918170} + m_GameObject: {fileID: 1119597544} + m_LocalRotation: {x: -0.016406387, y: -0.14757176, z: -0.02747032, w: 0.9885337} + m_LocalPosition: {x: -0.43195647, y: 0.00000008636367, z: 0.000000033286003} + m_LocalScale: {x: 0.9999999, y: 0.9999998, z: 0.9999999} + m_Children: + - {fileID: 1512695314} + - {fileID: 392675250} + m_Father: {fileID: 250203169} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1140123693 +--- !u!1 &1139126073 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6152,29 +6097,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1140123694} + - component: {fileID: 1139126074} m_Layer: 0 - m_Name: RightHandFinger05_03 + m_Name: RightForeArmAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1140123694 +--- !u!4 &1139126074 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1140123693} - m_LocalRotation: {x: 0.0065344055, y: 0.2140011, z: -0.14787558, w: -0.9655536} - m_LocalPosition: {x: -0.03892283, y: -0.000000081773265, z: -0.000000027877409} - m_LocalScale: {x: 1.0000006, y: 1, z: 1.0000005} + m_GameObject: {fileID: 1139126073} + m_LocalRotation: {x: -0.00000023597386, y: -9.313225e-10, z: -0.000000008178176, + w: 1} + m_LocalPosition: {x: -0.035068914, y: 0.00000005349284, z: -0.00000012852252} + m_LocalScale: {x: 1, y: 1.0012746, z: 1.0012746} m_Children: [] - m_Father: {fileID: 1414506737} + m_Father: {fileID: 942796180} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1143318030 +--- !u!1 &1152129396 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6182,139 +6128,34 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1143318031} + - component: {fileID: 1152129397} m_Layer: 0 - m_Name: RightHandFinger02_01 + m_Name: LeftEyebrowMiddle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1143318031 +--- !u!4 &1152129397 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1143318030} - m_LocalRotation: {x: -0.19621174, y: 0.22136356, z: 0.0068291565, w: -0.9552238} - m_LocalPosition: {x: -0.09333098, y: -0.014842883, z: 0.0014493624} - m_LocalScale: {x: 0.9999995, y: 1, z: 0.9999999} + m_GameObject: {fileID: 1152129396} + m_LocalRotation: {x: 0.7770956, y: -0.00000023417655, z: -0.62938267, w: -0.00000016947865} + m_LocalPosition: {x: -0.11220409, y: -0.036671754, z: 0.08122144} + m_LocalScale: {x: 0.99999964, y: 1, z: 1} m_Children: - - {fileID: 679493387} - m_Father: {fileID: 2069044636} - m_RootOrder: 3 + - {fileID: 779779067} + m_Father: {fileID: 777013926} + m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1143473322 +--- !u!1 &1157492096 GameObject: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1143473323} - m_Layer: 0 - m_Name: LeftForeArm - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1143473323 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1143473322} - m_LocalRotation: {x: 0.030485366, y: 0.10408798, z: -0.018479588, w: 0.9939291} - m_LocalPosition: {x: -0.27796423, y: -0.0000000957726, z: -0.000000021101565} - m_LocalScale: {x: 1.0078585, y: 1.0078588, z: 1.0078591} - m_Children: - - {fileID: 2112796547} - - {fileID: 1872466546} - - {fileID: 468922689} - m_Father: {fileID: 514920773} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1144845123 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1144845124} - m_Layer: 0 - m_Name: RightUpLeg - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1144845124 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1144845123} - m_LocalRotation: {x: 0.06591454, y: -0.09158068, z: -0.9935317, w: -0.012768806} - m_LocalPosition: {x: 0.017583834, y: 0.10126299, z: 0.0031659158} - m_LocalScale: {x: 1.0000005, y: 1.0000007, z: 0.99999994} - m_Children: - - {fileID: 1042620535} - - {fileID: 2001694907} - - {fileID: 761643603} - m_Father: {fileID: 56369775} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1155095059 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1155095060} - m_Layer: 0 - m_Name: Mandible - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1155095060 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1155095059} - m_LocalRotation: {x: -0.49723658, y: 0.000000175787, z: 0.86761504, w: 0.000000107567665} - m_LocalPosition: {x: -0.044175882, y: -0.000093924966, z: 0.05363187} - m_LocalScale: {x: 1.0006866, y: 1.000687, z: 1.0006868} - m_Children: - - {fileID: 1445918170} - - {fileID: 670809788} - - {fileID: 1424639455} - - {fileID: 283919243} - - {fileID: 1196120667} - - {fileID: 242179408} - - {fileID: 70715329} - - {fileID: 428302479} - - {fileID: 1035587263} - m_Father: {fileID: 1421548625} - m_RootOrder: 21 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1157492096 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 1762988864767988, guid: bed4541f5004e2840a1f4c91a13abaed, - type: 2} + m_CorrespondingSourceObject: {fileID: 1762988864767988, guid: bed4541f5004e2840a1f4c91a13abaed, + type: 2} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 @@ -6410,7 +6251,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1157492096} m_CullTransparentMesh: 0 ---- !u!1 &1192534076 +--- !u!1 &1164930732 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6418,30 +6259,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1192534077} + - component: {fileID: 1164930733} m_Layer: 0 - m_Name: RightHandFinger01_01 + m_Name: RightLowerLid m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1192534077 +--- !u!4 &1164930733 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1192534076} - m_LocalRotation: {x: -0.26814163, y: 0.2199041, z: -0.003498002, w: -0.9379393} - m_LocalPosition: {x: -0.08603042, y: -0.035094928, z: -0.008257206} - m_LocalScale: {x: 1.0000004, y: 1.0000007, z: 1.0000006} + m_GameObject: {fileID: 1164930732} + m_LocalRotation: {x: -0.00027532675, y: -0.17976472, z: -0.00001142198, w: 0.98370963} + m_LocalPosition: {x: 0.000000047319382, y: 0.000000065029994, z: -0.00000045202356} + m_LocalScale: {x: 1, y: 1, z: 1.0000001} m_Children: - - {fileID: 616450559} - m_Father: {fileID: 2069044636} - m_RootOrder: 4 + - {fileID: 1749136558} + m_Father: {fileID: 1878168858} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1196120666 +--- !u!1 &1166285465 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6449,30 +6290,91 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1196120667} + - component: {fileID: 1166285466} m_Layer: 0 - m_Name: MandibleAdjust + m_Name: LeftLowMaxilarAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1196120667 +--- !u!4 &1166285466 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1196120666} - m_LocalRotation: {x: -0.00000004828186, y: 0.000000029802308, z: -0.000000035736438, + m_GameObject: {fileID: 1166285465} + m_LocalRotation: {x: -0.0000003396999, y: -0.0000000052386904, z: 0.000000013038516, w: 1} - m_LocalPosition: {x: -0.00000011920712, y: 7.393e-12, z: 0.000029381012} - m_LocalScale: {x: 1.0007063, y: 1.0051053, z: 1.0000001} + m_LocalPosition: {x: -0.00000010058284, y: 0.000049045495, z: 0.00005890486} + m_LocalScale: {x: 1, y: 1, z: 0.99999994} m_Children: [] - m_Father: {fileID: 1155095060} + m_Father: {fileID: 1581031857} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1166446700 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1166446701} + m_Layer: 0 + m_Name: HeadAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1166446701 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1166446700} + m_LocalRotation: {x: -0.000000049617448, y: 2.5394543e-15, z: -4.825835e-15, w: 1} + m_LocalPosition: {x: -0.051949915, y: 0.000000003922104, z: 0.000000035390258} + m_LocalScale: {x: 1, y: 0.95997614, z: 1} + m_Children: [] + m_Father: {fileID: 777013926} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1197681945 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1197681946} + m_Layer: 0 + m_Name: LeftHandFinger05_01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1197681946 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1197681945} + m_LocalRotation: {x: 0.4424592, y: 0.05036176, z: 0.36686075, w: 0.8167661} + m_LocalPosition: {x: -0.038593225, y: -0.041314427, z: -0.013679166} + m_LocalScale: {x: 0.9999999, y: 0.9999998, z: 0.99999994} + m_Children: + - {fileID: 121517496} + m_Father: {fileID: 593377386} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1231246519 +--- !u!1 &1209391244 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6480,75 +6382,120 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1231246520} + - component: {fileID: 1209391245} m_Layer: 0 - m_Name: RightToeBase + m_Name: LipsInferior + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1209391245 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1209391244} + m_LocalRotation: {x: 0.000000011632809, y: 0.1707706, z: -0.00000006887932, w: 0.98531085} + m_LocalPosition: {x: -0.086433426, y: 0.00026018507, z: 0.028863424} + m_LocalScale: {x: 0.9999999, y: 1, z: 1} + m_Children: + - {fileID: 265529210} + m_Father: {fileID: 192158650} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1220445882 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1220445883} + m_Layer: 0 + m_Name: LeftHandFinger01_01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1220445883 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1220445882} + m_LocalRotation: {x: 0.26908928, y: 0.19875, z: -0.006044699, w: -0.9423656} + m_LocalPosition: {x: -0.08602997, y: 0.035095282, z: -0.008257786} + m_LocalScale: {x: 0.9999997, y: 0.9999998, z: 0.9999998} + m_Children: + - {fileID: 686553214} + m_Father: {fileID: 593377386} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1242331339 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1242331340} + m_Layer: 0 + m_Name: LeftTrapezius m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1231246520 +--- !u!4 &1242331340 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1231246519} - m_LocalRotation: {x: 0.06492504, y: -0.10979839, z: 0.028169323, w: 0.99143106} - m_LocalPosition: {x: -0.18387163, y: 0.00000006708468, z: -0.000000050313552} - m_LocalScale: {x: 1.0000006, y: 1.0000004, z: 1.0000005} + m_GameObject: {fileID: 1242331339} + m_LocalRotation: {x: 0.69468373, y: -0.06968858, z: -0.14096284, w: 0.7019171} + m_LocalPosition: {x: -0.03497813, y: 0.0371293, z: -0.036507364} + m_LocalScale: {x: 1.0106095, y: 1.0106096, z: 1.0106094} m_Children: [] - m_Father: {fileID: 1442530529} - m_RootOrder: 0 + m_Father: {fileID: 2040708668} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!28 &1244506361 -Texture2D: +--- !u!1 &1244454509 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - m_IsAlphaChannelOptional: 0 - serializedVersion: 2 - m_Width: 128 - m_Height: 128 - m_CompleteImageSize: 65536 - m_MipsStripped: 0 - m_TextureFormat: 5 - m_MipCount: 1 - m_IsReadable: 1 - m_IsPreProcessed: 0 - m_IgnoreMasterTextureLimit: 0 - m_StreamingMipmaps: 0 - m_StreamingMipmapsPriority: 0 - m_VTOnly: 0 - m_AlphaIsTransparency: 0 - m_ImageCount: 1 - m_TextureDimension: 2 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 1 - m_MipBias: 0 - m_WrapU: 1 - m_WrapV: 1 - m_WrapW: 1 - m_LightmapFormat: 0 - m_ColorSpace: 1 - m_PlatformBlob: - image data: 65536 - _typelessdata: 001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f11001a0f1000190e0f00190e0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a001608090015080800150708001506070014060600140506001305050013040400130404001203030012020200120202001101010011010000110000001000000010000000100000000f0000000f0000000e0000000e0000000e0000000e0000000f0000000f0000001000000010000000110000001100000012010000120100001302010014030200140402001504030015050400160605001607050017070600170807001809070019090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001e100f001e110f001f1210001f121100201312002014120021141300221514002216140023171500231716002418170024191700251a1800251a1900261b1900271c1a00271d1b00281d1c00281e1c00291f1d0029201e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00352e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f11001a0f1000190e0f00190e0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0016080900150808001507080015060700140606001405060013050500130404001304040012030300120202001202020011010100110100001100000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000001000000010000000110000001100000012010000120100001302010014030200140402001504030015050400160605001607050017070600170807001809070019090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001e100f001e110f001f1210001f121100201312002014120021141300211514002216140023171500231716002418170024191700251a1800251a1900261b1900271c1a00271d1b00281d1c00281e1c00291f1d0029201e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00352e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0016080900150808001507080014060700140606001405060013050500130404001304040012030300120202001202020011010100110100001100000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000001000000010000000110000001100000012010000120100001302010013030200140402001504030015050400160605001607050017070600170807001809070019090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001e100f001e110f001f1210001f121100201312002014120021141300211514002216140023171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0016080900150808001507080014060700140606001405060013050500130404001304040012030300120202001202020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000001000000010000000110000001100000012010000120100001302010013030200140402001504030015050400160605001607050017070600170807001809070018090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001f1210001f121100201312002014120021141300211514002216140023171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001303040012030300120202001202020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000000f00000010000000110000001100000012010000120100001302010013030200140402001504030015050400160605001607050017070600170807001809070018090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001f1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001303040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000000f00000010000000110000001100000012010000120100001302010013030200140402001404030015050400160605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001f1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001303040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000110000001100000012010000120100001302010013030200140402001404030015050400160605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001203040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000012010000120100001302010013030200140402001404030015050400150605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001203040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000012010000120100001302010013030200140402001404030015050400150605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f121100201312002014120021141300211514002216140022171500231716002318170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001305060013050500130404001203040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000011010000120100001302010013030200140402001404030015050400150605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080015070800140607001406060013050600130505001304040012030400120303001202020011020200110101001101000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000011010000120100001302010013030200140402001404030015050400150605001607050016070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080015070800140607001406060013050600130505001304040012030400120303001202020011020200110101001101000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000011010000120100001302010013030200140402001404030015050400150605001607050016070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001202020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000e0000000f0000000f00000010000000100000001100000011010000120100001202010013030200140402001404030015050400150605001607050016070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001202020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000e0000000f0000000f00000010000000100000001100000011010000120100001202010013030200140402001404030015050400150605001606050016070600170807001709070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120020141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000e0000000e0000000f00000010000000100000001100000011010000120100001202010013030200140402001404030015050400150605001606050016070600170807001709070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001e110f001e1210001f1211001f1312002014120020141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f00000010000000100000001100000011010000120100001202010013030200130402001404030015050400150605001606050016070600170807001709070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001e110f001e1110001f1211001f1312002014120020141300211514002216140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f00000010000000100000001100000011010000120100001202010013030200130402001404030015050400150605001606050016070600170807001709070018090800180a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001e110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001204040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001100000011010000120100001202010013030200130402001404030014050400150605001606050016070600170807001709070018090800180a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00160b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001204040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001100000011010000120100001202010013030200130402001404030014050400150605001606050016070600170807001709070018090800180a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00160b0c00160a0b0016090a0015090a001508090015080800140708001406070013060600130506001305050012040400120304001203030011020200110202001101010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001100000011010000120100001202010013030200130402001404030014050400150605001606050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00261d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090015080800140708001406070013060600130506001305050012040400120304001203030011020200110202001101010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000120100001202010013030200130402001404030014050400150605001506050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090015080800140708001406070013060600130506001305050012040400120304001203030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000120100001202010013030200130402001404030014050400150605001506050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261c1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001203030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000110100001202010013030200130402001404030014050400150605001506050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261c1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001203030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000110100001202010013030200130402001404030014050400150605001506050016070600160807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261c1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000110100001202010013030200130402001404030014050400150605001506050016070600160807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000f0000000f000000100000001000000011010000110100001202010012030200130402001404030014050400150605001506050016070600160807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000f0000000f000000100000001000000011010000110100001202010012030200130402001404030014050400150605001506050016070600160807001709070017090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a001508090014080800140708001406070013060600130506001205050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000e0000000f000000100000001000000011010000110100001202010012030200130302001404030014050400150605001506050016070600160807001709070017090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080014060700130606001305060012050500120404001203040011030300110202001102020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000e0000000f000000100000001000000011010000110100001202010012030200130302001304030014050400150605001506050016070600160807001709070017090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001c100f001d110f001e1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080014060700130606001305060012050500120404001203040011030300110202001102020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000e0000000f000000100000001000000011010000110100001202010012030200130302001304030014050400150605001506050016070600160807001709070017090800180a0900180b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001c100f001d110f001e1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080013060700130606001305060012050500120404001203040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000011010000110100001202010012030200130302001304030014050400140605001506050016070600160807001709070017090800180a0900180b0a00190c0a001a0c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001e1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080013060700130606001305060012050500120404001203040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000011010000110100001202010012030200130302001304030014050400140605001506050016070600160807001709070017090800180a0900180b0a00190c0a001a0c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080013060700130606001305060012050500120404001203040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001202010012030200130302001304030014050400140605001506050016070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140808001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001202010012030200130302001304030014050400140605001506050015070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140808001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001202010012030200130302001304030014050400140605001506050015070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140808001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001102010012030200130302001304030014050400140605001506050015070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700312a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140708001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001102010012030200130302001304030014050400140605001506050015070600160807001609070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f14120020141300201514002116140021171500221716002218170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700312a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080014070800130607001306060012050600120505001204040011030400110303001102020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001102010012030200130302001304030014050400140605001506050015070600160807001609070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f1412002014130020151400211614002117150022171600221817002319170024191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080014070800130607001306060012050600120505001204040011030400110303001102020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f0000001000000010010000110100001102010012030200120302001304030014050400140605001506050015070600160807001609070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f1412002014130020151400211614002117150022171600221817002319170024191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080014070800130607001306060012050600120505001204040011030400110303001102020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f0000001000000010010000110100001102010012030200120302001304030014050400140605001506050015070600160807001609070017090800170a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001d110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170024191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001204040011030400110303001002020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000001000000010010000110100001102010012030200120302001304030014050400140605001506050015070600160807001609070017090800170a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001d110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001204040011030400110303001002020010020200100101000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000001000000010000000110100001102010012030200120302001304030013050400140605001506050015070600160807001609070017090800170a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001d110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001204040011030400110303001002020010020200100101000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000001000000010000000110100001102010012030200120302001304030013050400140605001506050015070600160807001609070017090800170a0900180b0a00180c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001104040011030400110303001002020010020200100101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000110100001102010012030200120302001304030013050400140605001406050015070600160807001609070017090800170a0900180b0a00180c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a00140809001407080013070800130607001306060012050600120505001104040011030400110303001002020010020200100101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000110100001102010012030200120302001304030013050400140605001406050015070600160807001609070017090800170a0900180b0a00180b0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a00140809001407080013070800130607001306060012050600120505001104040011030400110303001002020010020200100101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010012030200120302001304030013050400140605001406050015070600160807001609070017090800170a0900180b0a00180b0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1213001a1113001910120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a001408090014070800130708001306070013060600120506001205050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010012030200120302001304030013050400140605001406050015070600150807001609070017090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1213001a1113001910120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001205050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010012030200120302001304030013050400140605001406050015070600150807001609070017090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1213001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001205050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010011030200120302001304030013050400140605001406050015070600150807001609070017090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001204050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010011030200120302001304030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001204050011040400110304001003030010020200100202000f0101000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f00000010000000100100001102010011030200120302001304030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001204050011040400110304001003030010020200100202000f0101000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f00000010000000100100001102010011030200120302001204030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001204050011040400110304001003030010020200100202000f0101000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f00000010000000100100001102010011030200120302001204030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001104050011040400110304001003030010020200100202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f00000010000000100100001102010011030200120302001204030013050400130605001406050015070600150807001609070016090800170a0900170b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001104050011040400110304001003030010020200100202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f00000010000000100100001102010011030200120302001204030013050400130605001406050015070600150807001609070016090800170a0900170b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001104050011040400110304001003030010020200100202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001102010011030200120302001204030013050400130605001406050015070600150807001609070016090800170a0900170b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080013060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001102010011030200120302001204030013050400130605001406050014070600150807001609070016090800170a0900170b0a00180b0a00180c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080013060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001102010011030200120302001204030013050400130605001406050014070600150807001608070016090800170a0900170b0a00180b0a00180c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200120302001204030013050400130605001406050014070600150807001608070016090800170a0900170b0a00180b0a00180c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200120302001204030013050400130605001406050014070600150807001608070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0202000f0101000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200120302001204030013050400130605001406050014070600150807001508070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0202000f0101000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200110302001204030013050400130605001406050014070600150807001508070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200110302001204030013050400130605001406050014070600150807001508070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180f1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f000000100100001002010011030200110302001204030013050400130605001406050014070600150807001508070016090800160a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001105060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f000000100100001002010011030200110302001204030012050400130605001406050014070600150807001508070016090800160a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001105060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f000000100100001002010011030200110302001204030012050400130605001406050014070600150807001508070016090800160a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a00130809001307080013070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f000000100100001002010011030200110302001204030012050400130605001406050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a00130809001307080013070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f000000100100001002010011030200110302001204030012050400130605001306050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080013070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010011030200110302001204030012050400130605001306050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010011030200110302001204030012050400130605001306050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000f0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010011030200110302001204030012050400130605001306050014070600140807001508070016090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001204030012050400130505001306050014070600140807001508070016090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001204030012050400130505001306050014070600140807001508070016090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001204030012050400130505001306050014070600140807001508070015090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0013090a00130809001307080012070800120607001106060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001104030012050400130505001306050014070600140807001508070015090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00150c0d00150b0c00150a0c00140a0b0014090a0013090a00130809001307080012070800120607001106060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001104030012050400130505001306050014070600140807001508070015090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f0100001002010010030200110302001104030012050400130505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f0100001002010010030200110302001104030012050400120505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b110f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100001002010010030200110302001104030012050400120505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100001002010010030200110302001104030012050400120505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100001002010010030200110302001104030012050400120505001306050013070600140807001508070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200110302001104030012050400120505001306050013070600140807001508070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200110302001104030012050400120505001306050013070600140807001508070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200110302001104030012050400120505001306050013070600140807001408070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200100302001104030012050400120505001306050013070600140807001408070015090800160a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001106070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030012050400120505001306050013070600140807001408070015090800160a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0013090a0013090a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030012050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00261e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030011050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00261e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030011050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0100000f02010010020200100302001104030011050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0100000f02010010020200100302001104030011050400120505001206050013070600140807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180e0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f02010010020200100302001104030011050400120505001206050013070600140807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180d0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f02010010020200100302001104030011050400120505001206050013070600140807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f02010010020200100302001104030011050400120505001206050013070600130807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001104030011050400120505001206050013070600130807001408070015090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001a1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001104030011050400120505001206050013070600130807001408070015090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001a1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a00120809001207080012070800110607001105060010050600100405000f0404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001104030011050400120505001206050013070600130807001408070014090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001e1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00261f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001a1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a00120809001207080011070800110607001105060010050600100405000f0404000f0304000f0303000e0202000e0102000d0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000a0000000a0000000b0000000b0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001004030011050400120505001206050013070600130807001408070014090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001b1211001c1312001d1312001d1413001e1514001e1614001f16150020171600201817002119170021191800221a1900231b1900231b1a00241c1b00251d1c00251e1c00261e1d00261f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011a12140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01140a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010f0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a0000010a0000010a0000010a0000010b0000010b0000010c0000010d0000010d0000010e0000010e0100010f0201010f020201100302011004030111050401120505011206050113070601130807011408070114090801150a0901160b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01251d1c01251e1c01261e1d01261f1e0127201e0128211f0128212001292221012a2321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011a12140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010f0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a0000010a0000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010e0000010e0100010f0201010f020201100302011004030111050401120505011206050113070601130807011408070114090801150a0901160b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01251d1c01251e1c01261e1d01261f1e0127201e0128211f0128212001292221012a2321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011a12140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010f0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010e0000010e0100010f0201010f020201100302011004030111050401110505011206050113070601130807011408070114090801150a0901150b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f0128212001292221012a2321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011912140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010e0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010d0000010e0100010f0201010f020201100302011004030111050401110505011206050113070601130807011408070114090801150a0901150b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f012821200129222101292321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011912140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011005060110050601100405010f0404010f0304010e0303010e0202010e0102010d0101010d0000010c0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010d0000010e0100010f0201010f020201100302011004030111050401110505011206050113070601130807011408070114090801150a0901150b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e0119100f011a100f011b1110011b1211011c1312011c1312011d1413011e1514011e1614011f1615011f171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f012821200129222101292321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011912140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01150d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011005060110050601100405010f0404010f0304010e0303010e0202010e0102010d0101010d0000010c0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010d0000010e0100010f0201010f020201100302011004030111050401110505011206050112070601130807011408070114090801150a0901150a0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e0119100f011a100f011b1110011b1211011c1312011c1312011d1413011e1514011e1614011f1615011f171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f012821200129222101292321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633021d1719021d1619021c1618021c1517021b1417021b1416021a1315021a1315021912140219111302191113021810120218101102170f1102170e1002160e0f02160d0f02150d0e02150c0e02150b0d02140b0c02140a0c02130a0b0213090a0212080a02120809021207080211070802110607021005060210050602100405020f0404020f0304020e0303020e0202020e0102020d0101020d0000020c0000020c0000020c0000020b0000020b0000020a0000020a0000020a000002090000020a0000020a0000020b0000020b0000020c0000020c0000020d0000020d0000020e0100020e0201020f020202100302021004030211050402110505021206050212070602130807021408070214090802150a0902150a0a02160b0a02160c0b02170d0c02180d0c02180e0d02190f0e0219100f021a100f021b1110021b1211021c1312021c1312021d1413021e1514021e1614021f1615021f171602201817022119170221191802221a1902221b1902231b1a02241c1b02241d1c02251e1c02261e1d02261f1e0227201e0228211f022821200229222102292321022a2422022b2423022b2523022c2624022d2725022d2726022e2826022f2927022f2a2802302a2902312b2902312c2a02322d2b02332d2b02332e2c02342f2d0235302e0235302e0236312f0237323002373330023833310239343202393533023a3633021d1719021d1619021c1618021c1517021b1417021b1416021a1315021a1315021912140219111302191113021810120218101102170f1102170e1002160e0f02160d0f02150d0e02150c0e02150b0d02140b0c02140a0c02130a0b0213090a0212080a02120809021207080211070802110607021005060210050602100405020f0404020f0304020e0303020e0202020e0102020d0101020d0000020c0000020c0000020c0000020b0000020b0000020a0000020a0000020a00000209000002090000020a0000020b0000020b0000020c0000020c0000020d0000020d0000020e0100020e0201020f020202100302021004030211050402110505021206050212070602130807021408070214090802150a0902150a0a02160b0a02160c0b02170d0c02180d0c02180e0d02190f0e0219100f021a100f021b1110021b1211021c1312021c1312021d1413021e1514021e1614021f1615021f171602201817022119170221191802221a1902221b1902231b1a02241c1b02241d1c02251e1c02261e1d02261f1e0227201e0227211f022821200229222102292321022a2422022b2423022b2523022c2624022d2725022d2726022e2826022f2927022f2a2802302a2902312b2902312c2a02322d2b02332d2b02332e2c02342f2d0235302e0235302e0236312f0237323002373330023833310239343202393533023a3633031d1719031d1619031c1618031c1517031b1417031b1416031a1315031a1315031912140319111303181113031810120318101103170f1103170e1003160e0f03160d0f03150d0e03150c0e03150b0d03140b0c03140a0c03130a0b0313090a0312080a03120809031207080311070803110607031005060310050603100405030f0404030f0304030e0203030e0202030e0102030d0101030d0000030c0000030c0000030c0000030b0000030b0000030a0000030a0000030a00000309000003090000030a0000030b0000030b0000030c0000030c0000030d0000030d0000030e0100030e0201030f020203100302031004030311050403110505031206050312070603130807031308070314090803150a0903150a0a03160b0a03160c0b03170d0c03180d0c03180e0d03190f0e0319100f031a100f031b1110031b1211031c1312031c1312031d1413031e1514031e1614031f1615031f171603201817032119170321191803221a1903221b1903231b1a03241c1b03241d1c03251e1c03261e1d03261f1e0327201e0327211f032821200329222103292321032a2422032b2423032b2523032c2624032d2725032d2726032e2826032f2927032f2a2803302a2903312b2903312c2a03322d2b03332d2b03332e2c03342f2d0335302e0335302e0336312f0337323003373330033833310339343203393533033a3633031d1719031d1619031c1618031c1517031b1417031b1416031a1315031a1315031912140319111303181113031810120318101103170f1103170e1003160e0f03160d0f03150d0e03150c0e03150b0d03140b0c03140a0c03130a0b0313090a0312080a031208090312070803110708031106070310050603100506030f0405030f0404030f0304030e0203030e0202030d0102030d0101030d0000030c0000030c0000030b0000030b0000030b0000030a0000030a0000030a00000309000003090000030a0000030a0000030b0000030c0000030c0000030d0000030d0000030e0100030e0201030f0202030f0302031004030311050403110505031206050312070603130807031308070314090803150a0903150a0a03160b0a03160c0b03170d0c03180d0c03180e0d03190f0e0319100f031a100f031a1110031b1211031c1312031c1312031d1413031d1514031e1614031f1615031f171603201817032119170321191803221a1903221b1903231b1a03241c1b03241d1c03251e1c03261e1d03261f1e0327201e0327211f032821200329222103292321032a2422032b2423032b2523032c2624032d2725032d2726032e2826032f2927032f2a2803302a2903312b2903312c2a03322d2b03332d2b03332e2c03342f2d0335302e0335302e0336312f0337323003373330033833310339343203393533033a3633041d1719041d1619041c1618041c1517041b1417041b1416041a1315041a1315041912140419111304181113041810120418101104170f1104170e1004160e0f04160d0f04150d0e04150c0e04140b0d04140b0c04140a0c04130a0b0413090a0412080a041208090412070804110708041106070410050604100506040f0405040f0404040f0304040e0203040e0202040d0102040d0101040d0000040c0000040c0000040b0000040b0000040b0000040a0000040a0000040a00000409000004090000040a0000040a0000040b0000040c0000040c0000040d0000040d0000040e0100040e0201040f0202040f0302041004030411050404110505041206050412070604130807041308070414090804150a0904150a0a04160b0a04160c0b04170d0c04170d0c04180e0d04190f0e0419100f041a100f041a1110041b1211041c1312041c1312041d1413041d1514041e1614041f1615041f171604201817042018170421191804221a1904221b1904231b1a04241c1b04241d1c04251e1c04251e1d04261f1e0427201e0427211f042821200429222104292321042a2422042b2423042b2523042c2624042d2725042d2726042e2826042f2927042f2a2804302a2904302b2904312c2a04322d2b04322d2b04332e2c04342f2d0435302e0435302e0436312f0437323004373330043833310439343204393533043a3633051d1719051d1619051c1618051c1517051b1417051b1416051a1315051a1315051912140519111305181113051810120518101105170f1105170e1005160e0f05160d0f05150d0e05150c0e05140b0d05140b0c05140a0c05130a0b0513090a0512080a051208090511070805110708051106070510050605100506050f0405050f0404050f0304050e0203050e0202050d0102050d0101050d0000050c0000050c0000050b0000050b0000050b0000050a0000050a0000050900000509000005090000050a0000050a0000050b0000050b0000050c0000050d0000050d0000050e0100050e0201050f0202050f0302051004030511050405110505051206050512070605130807051308070514090805150a0905150a0a05160b0a05160c0b05170d0c05170d0c05180e0d05190f0e0519100f051a100f051a1110051b1211051c1312051c1312051d1413051d1514051e1614051f1615051f171605201817052018170521191805221a1905221b1905231b1a05241c1b05241d1c05251e1c05251e1d05261f1e0527201e0527211f052821200529222105292321052a2422052b2423052b2523052c2624052d2725052d2726052e2826052e2927052f2a2805302a2905302b2905312c2a05322d2b05322d2b05332e2c05342f2d0535302e0535302e0536312f0537323005373330053833310539343205393533053a3633061d1719061d1619061c1618061c1517061b1417061b1416061a1315061a1315061912140619111306181113061810120617101106170f1106170e1006160e0f06160d0f06150d0e06150c0e06140b0d06140b0c06140a0c06130a0b0613090a0612080a061208090611070806110708061106070610050606100506060f0405060f0404060f0304060e0203060e0202060d0102060d0101060d0000060c0000060c0000060b0000060b0000060b0000060a0000060a0000060900000609000006090000060a0000060a0000060b0000060b0000060c0000060d0000060d0000060e0100060e0201060f0202060f0302061004030610050406110505061206050612070606130807061308070614090806140a0906150a0a06160b0a06160c0b06170d0c06170d0c06180e0d06190f0e0619100f061a100f061a1110061b1211061c1312061c1312061d1413061d1514061e1614061f1615061f171606201817062018170621191806221a1906221b1906231b1a06241c1b06241d1c06251e1c06251e1d06261f1e0627201e0627211f062821200629222106292321062a2422062b2423062b2523062c2624062d2725062d2726062e2826062e2927062f2a2806302a2906302b2906312c2a06322d2b06322d2b06332e2c06342f2d0634302e0635302e0636312f0637323006373330063833310639343206393533063a3633071d1719071c1619071c1618071c1517071b1417071b1416071a1315071a1315071912140719111307181113071810120717101107170f1107170e1007160e0f07160d0f07150d0e07150c0e07140b0d07140b0c07140a0c07130a0b0713090a0712080a071208090711070807110708071106070710050607100506070f0405070f0404070f0304070e0203070e0202070d0102070d0101070d0000070c0000070c0000070b0000070b0000070b0000070a0000070a0000070900000709000007090000070a0000070a0000070b0000070b0000070c0000070d0000070d0000070e0100070e0201070f0202070f0302071004030710050407110505071206050712070607130807071308070714090807140a0907150a0a07160b0a07160c0b07170d0c07170d0c07180e0d07190f0e0719100f071a100f071a1110071b1211071c1312071c1312071d1413071d1514071e1614071f1615071f171607201817072018170721191807221a1907221b1907231b1a07241c1b07241d1c07251e1c07251e1d07261f1e0727201e0727211f072821200729222107292321072a2422072b2423072b2523072c2624072c2725072d2726072e2826072e2927072f2a2807302a2907302b2907312c2a07322d2b07322d2b07332e2c07342f2d0734302e0735302e0736312f0737323007373330073833310739343207393533073a3633081d1719081c1619081c1618081c1517081b1417081b1416081a1315081a1315081912140819111308181113081810120817101108170f1108170e1008160e0f08160d0f08150d0e08150c0e08140b0d08140b0c08130a0c08130a0b0813090a0812080a081208090811070808110708081106070810050608100506080f0405080f0404080e0304080e0203080e0202080d0102080d0101080c0000080c0000080c0000080b0000080b0000080b0000080a0000080a0000080900000809000008090000080a0000080a0000080b0000080b0000080c0000080c0000080d0000080e0100080e0201080f0202080f0302081004030810050408110505081206050812070608130807081308070814090808140a0908150a0a08160b0a08160c0b08170d0c08170d0c08180e0d08180f0e0819100f081a100f081a1110081b1211081b1312081c1312081d1413081d1514081e1614081f1615081f171608201817082018170821191808221a1908221b1908231b1a08231c1b08241d1c08251e1c08251e1d08261f1e0827201e0827211f082821200829222108292321082a2422082b2423082b2523082c2624082c2725082d2726082e2826082e2927082f2a2808302a2908302b2908312c2a08322d2b08322d2b08332e2c08342f2d0834302e0835302e0836312f0837323008373330083833310839343208393533083a36330a1d17190a1c16190a1c16180a1c15170a1b14170a1b14160a1a13150a1a13150a1912140a1911130a1811130a1810120a1710110a170f110a170e100a160e0f0a160d0f0a150d0e0a150c0e0a140b0d0a140b0c0a130a0c0a130a0b0a13090a0a12080a0a1208090a1107080a1107080a1006070a1005060a1005060a0f04050a0f04040a0e03040a0e02030a0e02020a0d01020a0d01010a0c00000a0c00000a0c00000a0b00000a0b00000a0a00000a0a00000a0a00000a0900000a0900000a0900000a0a00000a0a00000a0b00000a0b00000a0c00000a0c00000a0d00000a0e01000a0e02010a0f02020a0f03020a1004030a1005040a1105050a1106050a1207060a1308070a1308070a1409080a140a090a150a0a0a160b0a0a160c0b0a170d0c0a170d0c0a180e0d0a180f0e0a19100f0a1a100f0a1a11100a1b12110a1b13120a1c13120a1d14130a1d15140a1e16140a1e16150a1f17160a2018170a2018170a2119180a221a190a221b190a231b1a0a231c1b0a241d1c0a251e1c0a251e1d0a261f1e0a27201e0a27211f0a2821200a2922210a2923210a2a24220a2a24230a2b25230a2c26240a2c27250a2d27260a2e28260a2e29270a2f2a280a302a290a302b290a312c2a0a322d2b0a322d2b0a332e2c0a342f2d0a34302e0a35302e0a36312f0a3732300a3733300a3833310a3934320a3935330a3a36330b1d17190b1c16190b1c16180b1c15170b1b14170b1b14160b1a13150b1a13150b1912140b1911130b1811130b1810120b1710110b170f110b160e100b160e0f0b160d0f0b150d0e0b150c0e0b140b0d0b140b0c0b130a0c0b130a0b0b13090a0b12080a0b1208090b1107080b1107080b1006070b1005060b1005060b0f04050b0f04040b0e03040b0e02030b0e02020b0d01020b0d01010b0c00000b0c00000b0c00000b0b00000b0b00000b0a00000b0a00000b0a00000b0900000b0900000b0900000b0a00000b0a00000b0b00000b0b00000b0c00000b0c00000b0d00000b0d01000b0e02010b0f02020b0f03020b1004030b1005040b1105050b1106050b1207060b1308070b1308070b1409080b140a090b150a0a0b150b0a0b160c0b0b170d0c0b170d0c0b180e0d0b180f0e0b19100f0b1a100f0b1a11100b1b12110b1b13120b1c13120b1d14130b1d15140b1e16140b1e16150b1f17160b2018170b2018170b2119180b221a190b221b190b231b1a0b231c1b0b241d1c0b251e1c0b251e1d0b261f1e0b27201e0b27211f0b2821200b2922210b2923210b2a24220b2a24230b2b25230b2c26240b2c27250b2d27260b2e28260b2e29270b2f2a280b302a290b302b290b312c2a0b322d2b0b322d2b0b332e2c0b342f2d0b34302e0b35302e0b36312f0b3732300b3733300b3833310b3934320b3935330b3a36330e1d17190e1c16190e1c16180e1b15170e1b14170e1b14160e1a13150e1a13150e1912140e1911130e1811130e1810120e1710110e170f110e160e100e160e0f0e160d0f0e150d0e0e150c0e0e140b0d0e140b0c0e130a0c0e130a0b0e13090a0e12080a0e1208090e1107080e1107080e1006070e1005060e1005060e0f04050e0f04040e0e03040e0e02030e0e02020e0d01020e0d01010e0c00000e0c00000e0c00000e0b00000e0b00000e0a00000e0a00000e0a00000e0900000e0900000e0900000e0a00000e0a00000e0b00000e0b00000e0c00000e0c00000e0d00000e0d01000e0e02010e0f02020e0f03020e1004030e1005040e1105050e1106050e1207060e1308070e1308070e1409080e140a090e150a0a0e150b0a0e160c0b0e170d0c0e170d0c0e180e0d0e180f0e0e19100f0e1a100f0e1a11100e1b12110e1b13120e1c13120e1d14130e1d15140e1e16140e1e16150e1f17160e2018170e2018170e2119180e211a190e221b190e231b1a0e231c1b0e241d1c0e251e1c0e251e1d0e261f1e0e27201e0e27211f0e2821200e2822210e2923210e2a24220e2a24230e2b25230e2c26240e2c27250e2d27260e2e28260e2e29270e2f2a280e302a290e302b290e312c2a0e322d2b0e322d2b0e332e2c0e342f2d0e34302e0e35302e0e36312f0e3632300e3733300e3833310e3934320e3935330e3a3633101d1719101c1619101c1618101b1517101b1417101b1416101a1315101a1315101912141019111310181113101810121017101110170f1110160e1010160e0f10160d0f10150d0e10150c0e10140b0d10140b0c10130a0c10130a0b1013090a1012080a101208091011070810110708101006071010050610100506100f0405100f0404100e0304100e0203100e0202100d0102100d0101100c0000100c0000100c0000100b0000100b0000100a0000100a0000100a0000100900001009000010090000100a0000100a0000100b0000100b0000100c0000100c0000100d0000100d0100100e0201100f0202100f0302101004031010050410110505101106051012070610120707101308071014090810140a0910150a0a10150b0a10160c0b10170d0c10170d0c10180e0d10180f0e1019100f101a100f101a1110101b1211101b1312101c1312101d1413101d1514101e1614101e1615101f171610201817102018171021191810211a1910221b1910231b1a10231c1b10241d1c10251e1c10251e1d10261f1e1027201e1027211f102821201028222110292321102a2422102a2423102b2523102c2624102c2725102d2726102e2826102e2927102f2a2810302a2910302b2910312c2a10322d2b10322d2b10332e2c10342f2d1034302e1035302e1036312f1036323010373330103833311039343210393533103a3633131d1719131c1619131c1618131b1517131b1417131b1416131a1315131a1315131912141319111313181113131810121317101113170f1113160e1013160e0f13160d0f13150d0e13150c0e13140b0d13140b0c13130a0c13130a0b1312090a1312080a131208091311070813110708131006071310050613100506130f0405130f0404130e0304130e0203130d0202130d0102130d0101130c0000130c0000130b0000130b0000130b0000130a0000130a0000130a0000130900001309000013090000130a0000130a0000130b0000130b0000130c0000130c0000130d0000130d0100130e0201130e0202130f0302131004031310050413110505131106051312070613120707131308071314090813140a0913150a0a13150b0a13160c0b13170d0c13170d0c13180e0d13180f0e1319100f1319100f131a1110131b1211131b1312131c1312131c1413131d1514131e1614131e1615131f171613201817132018171321191813211a1913221b1913231b1a13231c1b13241d1c13251e1c13251e1d13261f1e1326201e1327211f132821201328222113292321132a2422132a2423132b2523132c2624132c2725132d2726132e2826132e2927132f2a2813302a2913302b2913312c2a13322d2b13322d2b13332e2c13342f2d1334302e1335302e1336312f1336323013373330133833311339343213393533133a3633171d1719171c1619171c1618171b1517171b1417171b1416171a1315171a1315171912141719111317181113171810121717101117170f1117160e1017160e0f17150d0f17150d0e17150c0e17140b0d17140b0c17130a0c17130a0b1712090a1712080a1712080917110708171107081710060717100506170f0506170f0405170f0404170e0304170e0203170d0202170d0102170d0101170c0000170c0000170b0000170b0000170b0000170a0000170a00001709000017090000170900001709000017090000170a0000170b0000170b0000170c0000170c0000170d0000170d0100170e0201170e0202170f0302171004031710050417110505171106051712070617120707171308071714090817140a0917150a0a17150b0a17160c0b17160d0c17170d0c17180e0d17180f0e1719100f1719100f171a1110171b1211171b1312171c1312171c1413171d1514171e1614171e1615171f171617201817172018171721191817211a1917221b1917231b1a17231c1b17241d1c17251e1c17251e1d17261f1e1726201e1727211f172821201728222117292321172a2422172a2423172b2523172c2624172c2725172d2726172e2826172e2927172f2a2817302a2917302b2917312c2a17322d2b17322d2b17332e2c17342f2d1734302e1735302e1736312f1736323017373330173833311739343217393533173a36331c1d17191c1c16191c1c16181c1b15171c1b14171c1a14161c1a13151c1a13151c1912141c1911131c1811131c1810121c1710111c170f111c160e101c160e0f1c150d0f1c150d0e1c150c0e1c140b0d1c140b0c1c130a0c1c130a0b1c12090a1c12080a1c1208091c1107081c1107081c1006071c1005061c0f05061c0f04051c0f04041c0e03041c0e02031c0d02021c0d01021c0d01011c0c00001c0c00001c0b00001c0b00001c0b00001c0a00001c0a00001c0900001c0900001c0900001c0900001c0900001c0a00001c0b00001c0b00001c0c00001c0c00001c0d00001c0d01001c0e02011c0e02021c0f03021c1004031c1005041c1105051c1106051c1207061c1207071c1308071c1409081c140a091c150a0a1c150b0a1c160c0b1c160d0c1c170d0c1c180e0d1c180f0e1c19100f1c19100f1c1a11101c1b12111c1b13121c1c13121c1c14131c1d15141c1e15141c1e16151c1f17161c1f18171c2018171c2119181c211a191c221b191c231b1a1c231c1b1c241d1c1c251e1c1c251e1d1c261f1e1c26201e1c27211f1c2821201c2822211c2923211c2a24221c2a24231c2b25231c2c26241c2c27251c2d27261c2e28261c2e29271c2f2a281c302a291c302b291c312c2a1c322d2b1c322d2b1c332e2c1c342f2d1c34302e1c35302e1c36312f1c3632301c3733301c3833311c3934321c3935331c3a3633211d1719211c1619211c1618211b1517211b1417211a1416211a1315211a1315211912142119111321181113211810122117101121170f1121160e1021160e0f21150d0f21150d0e21150c0e21140b0d21140b0c21130a0c21130a0b2112090a2112080a2112080921110708211107082110060721100506210f0506210f0405210f0404210e0304210e0203210d0202210d0102210d0101210c0000210c0000210b0000210b0000210b0000210a0000210a00002109000021090000210900002109000021090000210a0000210a0000210b0000210c0000210c0000210d0000210d0100210e0201210e0202210f0302210f04032110050421110505211106052112070621120707211308072113090821140a0921150a0a21150b0a21160c0b21160d0c21170d0c21180e0d21180f0e2119100f2119100f211a1110211b1211211b1312211c1312211c1413211d1514211e1514211e1615211f1716211f1817212018172121191821211a1921221b1921231b1a21231c1b21241d1c21241e1c21251e1d21261f1e2126201e2127211f212821202128222121292321212a2422212a2423212b2523212c2624212c2725212d2726212e2826212e2927212f2a2821302a2921302b2921312c2a21322d2b21322d2b21332e2c21342f2d2134302e2135302e2136312f2136323021373330213833312139343221393533213a3633271d1719271c1619271c1618271b1517271b1417271a1416271a1315271a1315271912142719111327181113271810122717101127170f1127160e1027160e0f27150d0f27150d0e27150c0e27140b0d27140b0c27130a0c27130a0b2712090a2712080a2711080927110708271107082710060727100506270f0506270f0405270f0404270e0304270e0203270d0202270d0102270d0101270c0000270c0000270b0000270b0000270b0000270a0000270a00002709000027090000270900002709000027090000270a0000270a0000270b0000270c0000270c0000270d0000270d0100270e0201270e0202270f0302270f04032710050427110505271106052712070627120707271308072713090827140a0927150a0a27150b0a27160c0b27160d0c27170d0c27180e0d27180f0e2719100f2719100f271a1110271b1211271b1312271c1312271c1413271d1514271e1514271e1615271f1716271f1817272018172721191827211a1927221b1927231b1a27231c1b27241d1c27241e1c27251e1d27261f1e2726201e2727211f272821202728222127292321272a2422272a2423272b2523272c2624272c2725272d2726272e2826272e2927272f2a2827302a2927302b2927312c2a27322d2b27322d2b27332e2c27342f2d2734302e2735302e2736312f2736323027373330273833312739343227393533273a36332e1d17192e1c16192e1c16182e1b15172e1b14172e1a14162e1a13152e1913152e1912142e1911132e1811132e1810122e1710112e170f112e160e102e160e0f2e150d0f2e150d0e2e140c0e2e140b0d2e140b0c2e130a0c2e130a0b2e12090a2e12080a2e1108092e1107082e1107082e1006072e1005062e0f05062e0f04052e0f04042e0e03042e0e02032e0d02022e0d01022e0c01012e0c00002e0c00002e0b00002e0b00002e0a00002e0a00002e0a00002e0900002e0900002e0900002e0900002e0900002e0a00002e0a00002e0b00002e0b00002e0c00002e0d00002e0d01002e0e02012e0e02022e0f03022e0f04032e1005042e1105052e1106052e1207062e1207072e1308072e1309082e140a092e150a0a2e150b0a2e160c0b2e160d0c2e170d0c2e170e0d2e180f0e2e19100f2e19100f2e1a11102e1a12112e1b13122e1c13122e1c14132e1d15142e1e15142e1e16152e1f17162e1f18172e2018172e2119182e211a192e221b192e231b1a2e231c1b2e241d1c2e241e1c2e251e1d2e261f1e2e26201e2e27211f2e2821202e2822212e2923212e2a24222e2a24232e2b25232e2c26242e2c27252e2d27262e2e28262e2e29272e2f2a282e302a292e302b292e312c2a2e322d2b2e322d2b2e332e2c2e342f2d2e34302e2e35302e2e36312f2e3632302e3733302e3833312e3934322e3935332e3a3633361d1719361c1619361c1618361b1517361b1417361a1416361a131536191315361912143619111336181113361810123617101136170f1136160e1036160e0f36150d0f36150d0e36140c0e36140b0d36140b0c36130a0c36130a0b3612090a3612080a3611080936110708361107083610060736100506360f0506360f0405360e0404360e0304360e0203360d0202360d0102360c0101360c0000360c0000360b0000360b0000360a0000360a0000360a00003609000036090000360900003609000036090000360a0000360a0000360b0000360b0000360c0000360d0000360d0100360e0201360e0202360f0302360f04033610050436100505361106053612070636120707361308073613090836140a0936140a0a36150b0a36160c0b36160d0c36170d0c36170e0d36180f0e3619100f3619100f361a1110361a1211361b1312361c1312361c1413361d1514361d1514361e1615361f1716361f1817362018173621191836211a1936221b1936221b1a36231c1b36241d1c36241e1c36251e1d36261f1e3626201e3627211f362821203628222136292321362a2422362a2423362b2523362c2624362c2725362d2726362e2826362e2927362f2a2836302a2936302b2936312c2a36322d2b36322d2b36332e2c36342f2d3634302e3635302e3636312f3636323036373330363833313639343236393533363a3633401d1719401c1619401c1618401b1517401b1417401a1416401a131540191315401912144019111340181113401810124017101140170f1140160e1040160e0f40150d0f40150d0e40140c0e40140b0d40140b0c40130a0c40130a0b4012090a4012080a4011080940110708401107084010060740100506400f0506400f0405400e0404400e0304400e0203400d0202400d0102400c0101400c0000400c0000400b0000400b0000400a0000400a0000400a00004009000040090000400800004009000040090000400a0000400a0000400b0000400b0000400c0000400c0000400d0100400e0201400e0202400f0302400f04034010050440100505401106054012070640120707401308074013090840140a0940140a0a40150b0a40160c0b40160d0c40170d0c40170e0d40180f0e4019100f4019100f401a1110401a1211401b1312401c1312401c1413401d1514401d1514401e1615401f1716401f1817402018174021191840211a1940221b1940221b1a40231c1b40241d1c40241e1c40251e1d40261f1e4026201e4027211f402821204028222140292321402a2422402a2423402b2523402c2624402c2725402d2726402e2826402e2927402f2a2840302a2940302b2940312c2a40322d2b40322d2b40332e2c40342f2d4034302e4035302e4036312f4036323040373330403833314039343240393533403a36334b1d17194b1c16194b1c16184b1b15174b1b14174b1a14164b1a13154b1913154b1912144b1811134b1811134b1810124b1710114b170f114b160e104b160e0f4b150d0f4b150d0e4b140c0e4b140b0d4b140b0c4b130a0c4b130a0b4b12090a4b12080a4b1108094b1107084b1007084b1006074b1005064b0f05064b0f04054b0e04044b0e03044b0e02034b0d02024b0d01024b0c01014b0c00004b0c00004b0b00004b0b00004b0a00004b0a00004b0a00004b0900004b0900004b0800004b0900004b0900004b0a00004b0a00004b0b00004b0b00004b0c00004b0c00004b0d01004b0e02014b0e02024b0f03024b0f04034b1005044b1005054b1106054b1207064b1207074b1308074b1309084b140a094b140a0a4b150b0a4b160c0b4b160d0c4b170d0c4b170e0d4b180f0e4b19100f4b19100f4b1a11104b1a12114b1b13124b1c13124b1c14134b1d15144b1d15144b1e16154b1f17164b1f18174b2018174b2119184b211a194b221b194b221b1a4b231c1b4b241d1c4b241e1c4b251e1d4b261f1e4b26201e4b27211f4b2821204b2822214b2923214b2a24224b2a24234b2b25234b2c26244b2c27254b2d27264b2e28264b2e29274b2f2a284b302a294b302b294b312c2a4b322d2b4b322d2b4b332e2c4b342f2d4b34302e4b35302e4b36312f4b3632304b3733304b3833314b3934324b3935334b3a3633591d1719591c1619591c1618591b1517591b1417591a1416591a131559191315591912145918111359181113591810125917101159170f1159160e1059160e0f59150d0f59150d0e59140c0e59140b0d59130b0c59130a0c59130a0b5912090a5912080a5911080959110708591007085910060759100506590f0506590f0405590e0404590e0304590e0203590d0202590d0102590c0101590c0000590c0000590b0000590b0000590a0000590a0000590a00005909000059090000590800005909000059090000590a0000590a0000590b0000590b0000590c0000590c0000590d0100590e0201590e0202590f0302590f04035910050459100505591106055911070659120707591308075913090859140a0959140a0a59150b0a59160c0b59160d0c59170d0c59170e0d59180f0e5919100f5919100f591a1110591a1211591b1312591c1312591c1413591d1514591d1514591e1615591f1716591f1817592018175920191859211a1959221b1959221b1a59231c1b59241d1c59241e1c59251e1d59261f1e5926201e5927211f59282120592822215929232159292422592a2423592b2523592b2624592c2725592d2726592d2826592e2927592f2a2859302a2959302b2959312c2a59322d2b59322d2b59332e2c59342f2d5934302e5935302e5936312f5936323059373330593833315939343259393533593a3633681d1719681c1619681c1618681b1517681b1417681a1416681a131568191315681912146818111368181113681810126817101168170f1168160e1068160e0f68150d0f68150d0e68140c0e68140b0d68130b0c68130a0c68130a0b6812090a6812080a6811080968110708681007086810060768100506680f0506680f0405680e0404680e0304680d0203680d0202680d0102680c0101680c0000680b0000680b0000680b0000680a0000680a0000680a00006809000068090000680800006809000068090000680a0000680a0000680b0000680b0000680c0000680c0000680d0100680d0201680e0202680f0302680f04036810050468100505681106056811070668120707681308076813090868140a0968140a0a68150b0a68150c0b68160d0c68170d0c68170e0d68180f0e6818100f6819100f681a1110681a1211681b1312681b1312681c1413681d1514681d1514681e1615681f1716681f1817682018176820191868211a1968221b1968221b1a68231c1b68241d1c68241e1c68251e1d68261f1e6826201e6827211f68282120682822216829232168292422682a2423682b2523682b2624682c2725682d2726682d2826682e2927682f2a2868302a2968302b2968312c2a68322d2b68322d2b68332e2c68342f2d6834302e6835302e6836312f6836323068373330683833316839343268393533683a3633 - m_StreamData: - serializedVersion: 2 - offset: 0 - size: 0 - path: + serializedVersion: 6 + m_Component: + - component: {fileID: 1244454510} + m_Layer: 0 + m_Name: RightTrapezius + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1244454510 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1244454509} + m_LocalRotation: {x: -0.6946836, y: -0.069688484, z: 0.14096294, w: 0.7019171} + m_LocalPosition: {x: -0.034978103, y: -0.037129287, z: -0.036507398} + m_LocalScale: {x: 1.0106094, y: 1.0106093, z: 1.0106093} + m_Children: [] + m_Father: {fileID: 744722054} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1244586306 GameObject: m_ObjectHideFlags: 0 @@ -6641,7 +6588,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1244586306} m_CullTransparentMesh: 0 ---- !u!1 &1250228982 +--- !u!1 &1263201226 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6649,58 +6596,28 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1250228983} + - component: {fileID: 1263201227} m_Layer: 0 - m_Name: RightEyeAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1250228983 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1250228982} - m_LocalRotation: {x: -0.00034421866, y: -0.00000008940312, z: -0.000000007621011, - w: 0.99999994} - m_LocalPosition: {x: 0.00000010325148, y: 0.00000009111068, z: -0.00000116833} - m_LocalScale: {x: 0.9999997, y: 1, z: 1.0000001} - m_Children: [] - m_Father: {fileID: 154241128} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1268666854 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1268666855} - m_Layer: 0 - m_Name: LeftHandFinger02_03 + m_Name: RightUpLegAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1268666855 +--- !u!4 &1263201227 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1268666854} - m_LocalRotation: {x: -0.046116907, y: -0.32874954, z: -0.06279828, w: 0.9411978} - m_LocalPosition: {x: -0.035355754, y: -0.0000000065047123, z: 0.000000052967025} - m_LocalScale: {x: 1.0000001, y: 1.0000005, z: 1.0000007} + m_GameObject: {fileID: 1263201226} + m_LocalRotation: {x: 0.033350002, y: -0.0000000019219222, z: 0.0000000031158434, + w: 0.99944377} + m_LocalPosition: {x: -0.10798966, y: 0.00000004749745, z: -0.00000020861626} + m_LocalScale: {x: 1, y: 0.9061515, z: 0.9061515} m_Children: [] - m_Father: {fileID: 1641565329} - m_RootOrder: 0 + m_Father: {fileID: 1732343611} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1274425894 GameObject: @@ -6784,7 +6701,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1274425894} m_CullTransparentMesh: 0 ---- !u!1 &1276971770 +--- !u!1 &1278441915 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6792,30 +6709,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1276971771} + - component: {fileID: 1278441916} m_Layer: 0 - m_Name: RightHandFinger04_01 + m_Name: LeftEyebrowLow m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1276971771 +--- !u!4 &1278441916 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1276971770} - m_LocalRotation: {x: -0.03430983, y: 0.14151168, z: -0.07796859, w: -0.98626477} - m_LocalPosition: {x: -0.09379471, y: 0.039509147, z: 0.0025050202} - m_LocalScale: {x: 1.0000007, y: 1.0000006, z: 1.0000005} + m_GameObject: {fileID: 1278441915} + m_LocalRotation: {x: 0.77709675, y: -0.00000014604981, z: -0.6293812, w: -0.00000020221464} + m_LocalPosition: {x: -0.10751021, y: -0.019023033, z: 0.08370286} + m_LocalScale: {x: 0.99999976, y: 0.9999999, z: 0.9999999} m_Children: - - {fileID: 1843644514} - m_Father: {fileID: 2069044636} - m_RootOrder: 2 + - {fileID: 186027782} + m_Father: {fileID: 777013926} + m_RootOrder: 24 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1276979478 +--- !u!1 &1291748511 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6823,30 +6740,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1276979479} + - component: {fileID: 1291748512} m_Layer: 0 - m_Name: LeftHandFinger04_01 + m_Name: RightUpperLidAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1276979479 +--- !u!4 &1291748512 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1276979478} - m_LocalRotation: {x: -0.030851036, y: -0.1049572, z: -0.10137471, w: 0.9888151} - m_LocalPosition: {x: -0.093794145, y: -0.039508764, z: 0.0025047543} - m_LocalScale: {x: 0.9999998, y: 1.0000004, z: 1.0000001} - m_Children: - - {fileID: 967376454} - m_Father: {fileID: 2112796547} + m_GameObject: {fileID: 1291748511} + m_LocalRotation: {x: 0.00034949908, y: 0.0003591956, z: 0.000036168534, w: 0.9999999} + m_LocalPosition: {x: 0.00000001972657, y: 0.000000002725756, z: 0.000000022522727} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 1} + m_Children: [] + m_Father: {fileID: 1407510898} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1287567117 +--- !u!1 &1291811650 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6854,27 +6770,26 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1287567118} + - component: {fileID: 1291811651} m_Layer: 0 - m_Name: Global + m_Name: Tongue02 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1287567118 +--- !u!4 &1291811651 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1287567117} - m_LocalRotation: {x: 0.5000003, y: 0.49999973, z: -0.50000006, w: 0.49999988} - m_LocalPosition: {x: 0.000000005122274, y: 0.010510059, z: -0.01146551} - m_LocalScale: {x: 1, y: 0.99999994, z: 1} - m_Children: - - {fileID: 146223047} - m_Father: {fileID: 31683903} + m_GameObject: {fileID: 1291811650} + m_LocalRotation: {x: 0.9989919, y: 0.000000056601518, z: -0.04489076, w: -0.000007203647} + m_LocalPosition: {x: -0.02847365, y: 0.000000002149715, z: 0.00000004563414} + m_LocalScale: {x: 1.0000001, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 656709315} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1297450743 @@ -6956,6 +6871,97 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1297450743} m_CullTransparentMesh: 0 +--- !u!1 &1304226509 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1304226510} + m_Layer: 0 + m_Name: LeftEyeAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1304226510 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1304226509} + m_LocalRotation: {x: 0.00034436336, y: -3.92679e-12, z: -3.09142e-11, w: 0.99999994} + m_LocalPosition: {x: 0.00000010606917, y: -0.0000001611761, z: -0.0000010486151} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 25607458} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1320276541 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1320276542} + m_Layer: 0 + m_Name: LeftHandFinger05_03 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1320276542 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1320276541} + m_LocalRotation: {x: 0.0065306313, y: -0.21526596, z: -0.14870122, w: 0.9651456} + m_LocalPosition: {x: -0.03892253, y: 0.000000015797207, z: -0.00000023417046} + m_LocalScale: {x: 0.99999994, y: 0.99999976, z: 0.9999996} + m_Children: [] + m_Father: {fileID: 121517496} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1323019138 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1323019139} + m_Layer: 0 + m_Name: LeftLowerLid + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1323019139 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1323019138} + m_LocalRotation: {x: 0.00027554596, y: -0.1797648, z: 0.000011023197, w: 0.98370963} + m_LocalPosition: {x: 0.00000002410814, y: -0.00000010529145, z: -0.00000045256985} + m_LocalScale: {x: 1, y: 0.9999999, z: 1} + m_Children: + - {fileID: 2027139165} + m_Father: {fileID: 25607458} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1326273999 GameObject: m_ObjectHideFlags: 0 @@ -7037,38 +7043,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1326273999} m_CullTransparentMesh: 0 ---- !u!1 &1344540800 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1344540801} - m_Layer: 0 - m_Name: LeftHandFinger01_02 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1344540801 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1344540800} - m_LocalRotation: {x: -0.021397574, y: -0.19134401, z: -0.0759771, w: 0.9783441} - m_LocalPosition: {x: -0.040973965, y: -0.00000001115093, z: -0.000000041351484} - m_LocalScale: {x: 0.9999995, y: 0.9999996, z: 0.99999976} - m_Children: - - {fileID: 707941065} - m_Father: {fileID: 141078875} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1351996166 +--- !u!1 &1358516008 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7076,63 +7051,26 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1351996167} + - component: {fileID: 1358516009} m_Layer: 0 - m_Name: Spine1 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1351996167 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1351996166} - m_LocalRotation: {x: 0.0000005612315, y: 0.1107154, z: 0.000000037252903, w: 0.9938522} - m_LocalPosition: {x: -0.18375593, y: 0.00000002959892, z: -0.000021211345} - m_LocalScale: {x: 1.0000013, y: 1.0000013, z: 0.99999994} - m_Children: - - {fileID: 1874345732} - - {fileID: 1771782171} - - {fileID: 635050028} - - {fileID: 1029355626} - - {fileID: 1385739010} - - {fileID: 745306986} - m_Father: {fileID: 2108140655} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1360502357 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1360502358} - m_Layer: 0 - m_Name: RightEyebrowUpAdjust + m_Name: LeftHandFinger02_03 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1360502358 +--- !u!4 &1358516009 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1360502357} - m_LocalRotation: {x: -0.000000114319846, y: -0.00000011933912, z: 0.000000062340405, - w: 1} - m_LocalPosition: {x: -0.000029419754, y: 0.000000007574272, z: -0.000023492226} - m_LocalScale: {x: 1.0000006, y: 1.0000008, z: 1.0000008} + m_GameObject: {fileID: 1358516008} + m_LocalRotation: {x: -0.046116456, y: -0.32874957, z: -0.06279885, w: 0.9411979} + m_LocalPosition: {x: -0.03535605, y: 0.00000007271362, z: -0.00000021558547} + m_LocalScale: {x: 0.9999996, y: 0.9999997, z: 0.99999964} m_Children: [] - m_Father: {fileID: 1628254483} + m_Father: {fileID: 1421808980} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1364395613 @@ -7279,47 +7217,16 @@ MonoBehaviour: m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1364395618 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1364395613} - m_CullTransparentMesh: 0 ---- !u!1 &1369112790 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1369112791} - m_Layer: 0 - m_Name: RightUpperLid - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1369112791 -Transform: + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1364395618 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1369112790} - m_LocalRotation: {x: 0.0003545885, y: 0.09056162, z: -0.00002521045, w: 0.9958908} - m_LocalPosition: {x: 0.00000008089521, y: 0.000000109731694, z: -0.0000005722835} - m_LocalScale: {x: 0.99999994, y: 0.99999994, z: 1} - m_Children: - - {fileID: 1383366055} - m_Father: {fileID: 154241128} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_GameObject: {fileID: 1364395613} + m_CullTransparentMesh: 0 --- !u!1 &1378902860 GameObject: m_ObjectHideFlags: 0 @@ -7499,36 +7406,6 @@ RectTransform: m_AnchoredPosition: {x: -0.68999994, y: 1.136} m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1383366054 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1383366055} - m_Layer: 0 - m_Name: RightUpperLidAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1383366055 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1383366054} - m_LocalRotation: {x: -0.0003495343, y: -0.00035921476, z: -0.00003620913, w: -0.9999999} - m_LocalPosition: {x: 0.000000012275649, y: 0.000000003306013, z: 0.000000020669177} - m_LocalScale: {x: 1, y: 0.99999994, z: 1.0000001} - m_Children: [] - m_Father: {fileID: 1369112791} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1385234358 GameObject: m_ObjectHideFlags: 0 @@ -7655,7 +7532,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1385234358} m_CullTransparentMesh: 0 ---- !u!1 &1385739009 +--- !u!1 &1392754006 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7663,7 +7540,7 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1385739010} + - component: {fileID: 1392754007} m_Layer: 0 m_Name: Spine1Adjust m_TagString: Untagged @@ -7671,22 +7548,21 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1385739010 +--- !u!4 &1392754007 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1385739009} - m_LocalRotation: {x: 5.6843412e-14, y: 0.0000000074505797, z: 0.000000014901156, - w: 1} - m_LocalPosition: {x: -0.041975934, y: 0.000000003169064, z: -0.000000011823658} - m_LocalScale: {x: 1.0000005, y: 0.9010593, z: 0.70123535} + m_GameObject: {fileID: 1392754006} + m_LocalRotation: {x: 0.000000031643765, y: -5.804093e-14, z: 3.7611863e-15, w: 1} + m_LocalPosition: {x: -0.041975934, y: 0.000000003169071, z: -0.000000011823658} + m_LocalScale: {x: 1, y: 0.9010588, z: 0.70123535} m_Children: [] - m_Father: {fileID: 1351996167} + m_Father: {fileID: 1770316070} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1395580844 +--- !u!1 &1407510897 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7694,30 +7570,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1395580845} + - component: {fileID: 1407510898} m_Layer: 0 - m_Name: LipsInferiorAdjust + m_Name: RightUpperLid m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1395580845 +--- !u!4 &1407510898 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1395580844} - m_LocalRotation: {x: -0.00000035759732, y: 0.0000001530861, z: 0.000000009546054, - w: 1} - m_LocalPosition: {x: 0.000000011184806, y: 3.5237632e-11, z: -0.000031312244} - m_LocalScale: {x: 1.0001963, y: 1.0039256, z: 1.0039251} - m_Children: [] - m_Father: {fileID: 283919243} - m_RootOrder: 0 + m_GameObject: {fileID: 1407510897} + m_LocalRotation: {x: 0.00035458847, y: 0.09056164, z: -0.000025210455, w: 0.9958908} + m_LocalPosition: {x: 0.00000006967116, y: 0.000000109733456, z: -0.00000045202293} + m_LocalScale: {x: 0.9999998, y: 0.99999994, z: 1} + m_Children: + - {fileID: 1291748512} + m_Father: {fileID: 1878168858} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1398672784 +--- !u!1 &1411028891 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7725,28 +7601,28 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1398672785} + - component: {fileID: 1411028892} m_Layer: 0 - m_Name: RightNose + m_Name: LeftLowCheekAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1398672785 +--- !u!4 &1411028892 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1398672784} - m_LocalRotation: {x: 0.70887077, y: -0.001181514, z: -0.7053235, w: -0.004424751} - m_LocalPosition: {x: -0.05766228, y: 0.02632502, z: 0.103262894} - m_LocalScale: {x: 0.99999946, y: 0.9999998, z: 0.9999998} - m_Children: - - {fileID: 2044851267} - m_Father: {fileID: 1421548625} - m_RootOrder: 8 + m_GameObject: {fileID: 1411028891} + m_LocalRotation: {x: -0.00000033502607, y: -4.947652e-10, z: 0.0000000115396706, + w: 1} + m_LocalPosition: {x: -0.00027454563, y: -0.000000011175871, z: 0.01599998} + m_LocalScale: {x: 0.99999994, y: 0.9999998, z: 0.9999999} + m_Children: [] + m_Father: {fileID: 1589096301} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1411631488 GameObject: @@ -7829,124 +7705,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1411631488} m_CullTransparentMesh: 0 ---- !u!1 &1414506736 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1414506737} - m_Layer: 0 - m_Name: RightHandFinger05_02 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1414506737 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1414506736} - m_LocalRotation: {x: -0.06389076, y: 0.20705366, z: -0.1433001, w: -0.96566653} - m_LocalPosition: {x: -0.033299122, y: 0.000000035311217, z: -0.00000012916534} - m_LocalScale: {x: 1.0000005, y: 1.000001, z: 1.0000001} - m_Children: - - {fileID: 1140123694} - m_Father: {fileID: 1010893073} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1415763195 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1415763196} - m_Layer: 0 - m_Name: PonyTail5 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1415763196 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1415763195} - m_LocalRotation: {x: -0.0000000016659613, y: 0.010432789, z: -0.0000000024056517, - w: 0.9999456} - m_LocalPosition: {x: -0.09646316, y: 0.000000007761144, z: -1.4294e-11} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1602918218} - m_Father: {fileID: 737185045} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1421548624 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1421548625} - m_Layer: 0 - m_Name: Head - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1421548625 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1421548624} - m_LocalRotation: {x: -0.025036007, y: -0.1345574, z: -0.021713203, w: 0.99035156} - m_LocalPosition: {x: -0.10225476, y: 0.000000014799433, z: -0.000000003699869} - m_LocalScale: {x: 1.4345249, y: 1.4345251, z: 1.4345257} - m_Children: - - {fileID: 1552303634} - - {fileID: 154241128} - - {fileID: 596350214} - - {fileID: 967217784} - - {fileID: 509495084} - - {fileID: 211980797} - - {fileID: 350256266} - - {fileID: 1641886480} - - {fileID: 1398672785} - - {fileID: 131065586} - - {fileID: 417819213} - - {fileID: 2080475099} - - {fileID: 1676033228} - - {fileID: 550966024} - - {fileID: 1574501202} - - {fileID: 868397205} - - {fileID: 1457580548} - - {fileID: 895313683} - - {fileID: 2131156994} - - {fileID: 1628254483} - - {fileID: 2110346792} - - {fileID: 1155095060} - - {fileID: 594232508} - - {fileID: 847484282} - - {fileID: 1931640042} - m_Father: {fileID: 1874345732} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1421746633 GameObject: m_ObjectHideFlags: 0 @@ -8101,69 +7859,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1421746633} m_CullTransparentMesh: 0 ---- !u!1 &1424197588 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1424197589} - m_Layer: 0 - m_Name: UpperLipsAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1424197589 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1424197588} - m_LocalRotation: {x: -0.00000015128457, y: -0.000000059604616, z: -0.00000018214733, - w: -1} - m_LocalPosition: {x: -0.000000013031427, y: -3.49e-13, z: 0.000008992247} - m_LocalScale: {x: 1.0000002, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 895313683} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1424639454 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1424639455} - m_Layer: 0 - m_Name: RightLips - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1424639455 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1424639454} - m_LocalRotation: {x: 0.021914467, y: 0.26832202, z: 0.07839589, w: 0.9598839} - m_LocalPosition: {x: -0.075910136, y: -0.025586976, z: 0.024111979} - m_LocalScale: {x: 0.9999999, y: 1, z: 1} - m_Children: - - {fileID: 1765810493} - m_Father: {fileID: 1155095060} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1429391139 +--- !u!1 &1421808979 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8171,31 +7867,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1429391140} + - component: {fileID: 1421808980} m_Layer: 0 - m_Name: RightForeArmTwist + m_Name: LeftHandFinger02_02 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1429391140 +--- !u!4 &1421808980 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1429391139} - m_LocalRotation: {x: -0.0000003613531, y: 0.000000029802319, z: -0.000000020954756, - w: 1} - m_LocalPosition: {x: -0.14027604, y: -0.00000036379788, z: -0.000000063329935} - m_LocalScale: {x: 0.9999999, y: 1.0000002, z: 0.9999999} + m_GameObject: {fileID: 1421808979} + m_LocalRotation: {x: 0.040929914, y: 0.21251462, z: 0.05226905, w: -0.9749001} + m_LocalPosition: {x: -0.04282192, y: 0.000000011150973, z: -0.00000032709525} + m_LocalScale: {x: 1.0000001, y: 1.0000002, z: 1.0000001} m_Children: - - {fileID: 357493181} - m_Father: {fileID: 1482737566} - m_RootOrder: 1 + - {fileID: 1358516009} + m_Father: {fileID: 1453453780} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1432625346 +--- !u!1 &1432941636 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8203,60 +7898,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1432625347} + - component: {fileID: 1432941637} m_Layer: 0 - m_Name: LeftHandFinger05_03 + m_Name: RightLowCheekAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1432625347 +--- !u!4 &1432941637 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1432625346} - m_LocalRotation: {x: 0.0065312595, y: -0.21526636, z: -0.148701, w: 0.96514547} - m_LocalPosition: {x: -0.038922496, y: 0.00000011522631, z: -0.000000057613324} - m_LocalScale: {x: 1.0000005, y: 0.9999999, z: 0.99999994} + m_GameObject: {fileID: 1432941636} + m_LocalRotation: {x: 0.00000017915228, y: 1.5188567e-10, z: 0.000000019746949, w: 1} + m_LocalPosition: {x: -0.00027454563, y: 0.000000013038516, z: 0.016000034} + m_LocalScale: {x: 1, y: 1, z: 0.99999994} m_Children: [] - m_Father: {fileID: 225039829} + m_Father: {fileID: 2125920642} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1435048360 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1435048361} - m_Layer: 0 - m_Name: LeftHandFinger05_01 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1435048361 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1435048360} - m_LocalRotation: {x: 0.44245923, y: 0.05036184, z: 0.3668621, w: 0.8167655} - m_LocalPosition: {x: -0.038593147, y: -0.04131441, z: -0.013679148} - m_LocalScale: {x: 1, y: 0.99999964, z: 1} - m_Children: - - {fileID: 225039829} - m_Father: {fileID: 2112796547} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1442530528 +--- !u!1 &1453453779 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8264,30 +7928,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1442530529} + - component: {fileID: 1453453780} m_Layer: 0 - m_Name: RightFoot + m_Name: LeftHandFinger02_01 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1442530529 +--- !u!4 &1453453780 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1442530528} - m_LocalRotation: {x: 0.8227085, y: 0.011598594, z: -0.5668015, w: 0.041859712} - m_LocalPosition: {x: -0.47572884, y: 0.00000051818176, z: 0.0000021339029} - m_LocalScale: {x: 0.85825455, y: 0.85825485, z: 0.85825473} + m_GameObject: {fileID: 1453453779} + m_LocalRotation: {x: -0.19666323, y: -0.19859788, z: 0.010262442, w: 0.96009225} + m_LocalPosition: {x: -0.093330644, y: 0.0148432795, z: 0.0014489063} + m_LocalScale: {x: 0.9999998, y: 0.9999998, z: 0.9999999} m_Children: - - {fileID: 1231246520} - m_Father: {fileID: 2001694907} - m_RootOrder: 0 + - {fileID: 1421808980} + m_Father: {fileID: 593377386} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1445918169 +--- !u!1 &1460826252 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8295,30 +7959,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1445918170} + - component: {fileID: 1460826253} m_Layer: 0 - m_Name: LeftLipsInferior + m_Name: RightHandFinger02_03 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1445918170 +--- !u!4 &1460826253 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445918169} - m_LocalRotation: {x: -0.00920702, y: 0.16402113, z: -0.06609625, w: 0.98419696} - m_LocalPosition: {x: -0.084927976, y: 0.010402911, z: 0.028449215} - m_LocalScale: {x: 0.9999998, y: 0.9999999, z: 0.9999999} - m_Children: - - {fileID: 1137907170} - m_Father: {fileID: 1155095060} + m_GameObject: {fileID: 1460826252} + m_LocalRotation: {x: -0.044502333, y: 0.25471625, z: -0.047990106, w: -0.96479857} + m_LocalPosition: {x: -0.035355873, y: 0.00000003902839, z: -0.000000070622825} + m_LocalScale: {x: 0.99999976, y: 0.9999998, z: 1.0000001} + m_Children: [] + m_Father: {fileID: 214584817} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1457580547 +--- !u!1 &1463884907 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8326,58 +7989,28 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1457580548} + - component: {fileID: 1463884908} m_Layer: 0 - m_Name: NoseMiddle + m_Name: RightHandFinger02_01 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1457580548 +--- !u!4 &1463884908 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1457580547} - m_LocalRotation: {x: 0.7072902, y: 0.0011002349, z: -0.7069201, w: -0.0018578874} - m_LocalPosition: {x: -0.089603975, y: 0.000000049756913, z: 0.1414512} - m_LocalScale: {x: 0.9999998, y: 0.9999999, z: 1} + m_GameObject: {fileID: 1463884907} + m_LocalRotation: {x: -0.1962112, y: 0.22136392, z: 0.006830646, w: -0.95522386} + m_LocalPosition: {x: -0.09333131, y: -0.01484293, z: 0.0014491867} + m_LocalScale: {x: 0.9999998, y: 0.9999999, z: 1.0000001} m_Children: - - {fileID: 1771768650} - m_Father: {fileID: 1421548625} - m_RootOrder: 16 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1460144663 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1460144664} - m_Layer: 0 - m_Name: LeftGluteus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1460144664 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1460144663} - m_LocalRotation: {x: -0.08551703, y: 0.88385785, z: 0.037582923, w: -0.45833367} - m_LocalPosition: {x: -0.00000004861795, y: -0.000000020489097, z: -0.00000009126961} - m_LocalScale: {x: 0.52756983, y: 0.52756953, z: 0.5275701} - m_Children: [] - m_Father: {fileID: 516943256} - m_RootOrder: 2 + - {fileID: 214584817} + m_Father: {fileID: 79703371} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1467156324 GameObject: @@ -8409,7 +8042,7 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1482737565 +--- !u!1 &1470668950 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8417,32 +8050,76 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1482737566} + - component: {fileID: 1470668951} m_Layer: 0 - m_Name: RightForeArm + m_Name: LeftArmAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1482737566 +--- !u!4 &1470668951 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1482737565} - m_LocalRotation: {x: -0.018631788, y: 0.15032147, z: 0.026598325, w: 0.98810375} - m_LocalPosition: {x: -0.27796474, y: -0.00000006439211, z: 0.000000009789381} - m_LocalScale: {x: 1.0078583, y: 1.0078588, z: 1.0078588} - m_Children: - - {fileID: 1490588565} - - {fileID: 1429391140} - - {fileID: 2069044636} - m_Father: {fileID: 938814030} + m_GameObject: {fileID: 1470668950} + m_LocalRotation: {x: 0.2379592, y: 0.00000004842273, z: 0.000000013663839, w: 0.97127515} + m_LocalPosition: {x: -0.06949081, y: -0.00000037252903, z: -0.00000016018748} + m_LocalScale: {x: 0.9999999, y: 0.9719233, z: 0.9719233} + m_Children: [] + m_Father: {fileID: 698060973} m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: -6.4540005, y: 64.58501, z: -36.483} ---- !u!1 &1490588564 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!28 &1481971404 +Texture2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 2 + m_Width: 128 + m_Height: 128 + m_CompleteImageSize: 65536 + m_MipsStripped: 0 + m_TextureFormat: 5 + m_MipCount: 1 + m_IsReadable: 1 + m_IsPreProcessed: 0 + m_IgnoreMasterTextureLimit: 0 + m_StreamingMipmaps: 0 + m_StreamingMipmapsPriority: 0 + m_VTOnly: 0 + m_AlphaIsTransparency: 0 + m_ImageCount: 1 + m_TextureDimension: 2 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 1 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_LightmapFormat: 0 + m_ColorSpace: 1 + m_PlatformBlob: + image data: 65536 + _typelessdata: 001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f11001a0f1000190e0f00190e0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a001608090015080800150708001506070014060600140506001305050013040400130404001203030012020200120202001101010011010000110000001000000010000000100000000f0000000f0000000e0000000e0000000e0000000e0000000f0000000f0000001000000010000000110000001100000012010000120100001302010014030200140402001504030015050400160605001607050017070600170807001809070019090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001e100f001e110f001f1210001f121100201312002014120021141300221514002216140023171500231716002418170024191700251a1800251a1900261b1900271c1a00271d1b00281d1c00281e1c00291f1d0029201e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00352e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f11001a0f1000190e0f00190e0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0016080900150808001507080015060700140606001405060013050500130404001304040012030300120202001202020011010100110100001100000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000001000000010000000110000001100000012010000120100001302010014030200140402001504030015050400160605001607050017070600170807001809070019090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001e100f001e110f001f1210001f121100201312002014120021141300211514002216140023171500231716002418170024191700251a1800251a1900261b1900271c1a00271d1b00281d1c00281e1c00291f1d0029201e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00352e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0016080900150808001507080014060700140606001405060013050500130404001304040012030300120202001202020011010100110100001100000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000001000000010000000110000001100000012010000120100001302010013030200140402001504030015050400160605001607050017070600170807001809070019090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001e100f001e110f001f1210001f121100201312002014120021141300211514002216140023171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0016080900150808001507080014060700140606001405060013050500130404001304040012030300120202001202020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000001000000010000000110000001100000012010000120100001302010013030200140402001504030015050400160605001607050017070600170807001809070018090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001f1210001f121100201312002014120021141300211514002216140023171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001303040012030300120202001202020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000000f00000010000000110000001100000012010000120100001302010013030200140402001504030015050400160605001607050017070600170807001809070018090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001f1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001303040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000000f00000010000000110000001100000012010000120100001302010013030200140402001404030015050400160605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001f1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001303040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000110000001100000012010000120100001302010013030200140402001404030015050400160605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001203040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000012010000120100001302010013030200140402001404030015050400150605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001203040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000012010000120100001302010013030200140402001404030015050400150605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f121100201312002014120021141300211514002216140022171500231716002318170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001305060013050500130404001203040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000011010000120100001302010013030200140402001404030015050400150605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080015070800140607001406060013050600130505001304040012030400120303001202020011020200110101001101000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000011010000120100001302010013030200140402001404030015050400150605001607050016070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080015070800140607001406060013050600130505001304040012030400120303001202020011020200110101001101000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000011010000120100001302010013030200140402001404030015050400150605001607050016070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001202020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000e0000000f0000000f00000010000000100000001100000011010000120100001202010013030200140402001404030015050400150605001607050016070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001202020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000e0000000f0000000f00000010000000100000001100000011010000120100001202010013030200140402001404030015050400150605001606050016070600170807001709070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120020141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000e0000000e0000000f00000010000000100000001100000011010000120100001202010013030200140402001404030015050400150605001606050016070600170807001709070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001e110f001e1210001f1211001f1312002014120020141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f00000010000000100000001100000011010000120100001202010013030200130402001404030015050400150605001606050016070600170807001709070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001e110f001e1110001f1211001f1312002014120020141300211514002216140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f00000010000000100000001100000011010000120100001202010013030200130402001404030015050400150605001606050016070600170807001709070018090800180a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001e110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001204040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001100000011010000120100001202010013030200130402001404030014050400150605001606050016070600170807001709070018090800180a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00160b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001204040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001100000011010000120100001202010013030200130402001404030014050400150605001606050016070600170807001709070018090800180a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00160b0c00160a0b0016090a0015090a001508090015080800140708001406070013060600130506001305050012040400120304001203030011020200110202001101010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001100000011010000120100001202010013030200130402001404030014050400150605001606050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00261d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090015080800140708001406070013060600130506001305050012040400120304001203030011020200110202001101010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000120100001202010013030200130402001404030014050400150605001506050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090015080800140708001406070013060600130506001305050012040400120304001203030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000120100001202010013030200130402001404030014050400150605001506050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261c1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001203030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000110100001202010013030200130402001404030014050400150605001506050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261c1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001203030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000110100001202010013030200130402001404030014050400150605001506050016070600160807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261c1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000110100001202010013030200130402001404030014050400150605001506050016070600160807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000f0000000f000000100000001000000011010000110100001202010012030200130402001404030014050400150605001506050016070600160807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000f0000000f000000100000001000000011010000110100001202010012030200130402001404030014050400150605001506050016070600160807001709070017090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a001508090014080800140708001406070013060600130506001205050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000e0000000f000000100000001000000011010000110100001202010012030200130302001404030014050400150605001506050016070600160807001709070017090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080014060700130606001305060012050500120404001203040011030300110202001102020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000e0000000f000000100000001000000011010000110100001202010012030200130302001304030014050400150605001506050016070600160807001709070017090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001c100f001d110f001e1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080014060700130606001305060012050500120404001203040011030300110202001102020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000e0000000f000000100000001000000011010000110100001202010012030200130302001304030014050400150605001506050016070600160807001709070017090800180a0900180b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001c100f001d110f001e1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080013060700130606001305060012050500120404001203040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000011010000110100001202010012030200130302001304030014050400140605001506050016070600160807001709070017090800180a0900180b0a00190c0a001a0c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001e1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080013060700130606001305060012050500120404001203040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000011010000110100001202010012030200130302001304030014050400140605001506050016070600160807001709070017090800180a0900180b0a00190c0a001a0c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080013060700130606001305060012050500120404001203040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001202010012030200130302001304030014050400140605001506050016070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140808001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001202010012030200130302001304030014050400140605001506050015070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140808001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001202010012030200130302001304030014050400140605001506050015070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140808001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001102010012030200130302001304030014050400140605001506050015070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700312a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140708001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001102010012030200130302001304030014050400140605001506050015070600160807001609070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f14120020141300201514002116140021171500221716002218170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700312a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080014070800130607001306060012050600120505001204040011030400110303001102020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001102010012030200130302001304030014050400140605001506050015070600160807001609070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f1412002014130020151400211614002117150022171600221817002319170024191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080014070800130607001306060012050600120505001204040011030400110303001102020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f0000001000000010010000110100001102010012030200120302001304030014050400140605001506050015070600160807001609070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f1412002014130020151400211614002117150022171600221817002319170024191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080014070800130607001306060012050600120505001204040011030400110303001102020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f0000001000000010010000110100001102010012030200120302001304030014050400140605001506050015070600160807001609070017090800170a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001d110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170024191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001204040011030400110303001002020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000001000000010010000110100001102010012030200120302001304030014050400140605001506050015070600160807001609070017090800170a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001d110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001204040011030400110303001002020010020200100101000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000001000000010000000110100001102010012030200120302001304030013050400140605001506050015070600160807001609070017090800170a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001d110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001204040011030400110303001002020010020200100101000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000001000000010000000110100001102010012030200120302001304030013050400140605001506050015070600160807001609070017090800170a0900180b0a00180c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001104040011030400110303001002020010020200100101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000110100001102010012030200120302001304030013050400140605001406050015070600160807001609070017090800170a0900180b0a00180c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a00140809001407080013070800130607001306060012050600120505001104040011030400110303001002020010020200100101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000110100001102010012030200120302001304030013050400140605001406050015070600160807001609070017090800170a0900180b0a00180b0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a00140809001407080013070800130607001306060012050600120505001104040011030400110303001002020010020200100101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010012030200120302001304030013050400140605001406050015070600160807001609070017090800170a0900180b0a00180b0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1213001a1113001910120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a001408090014070800130708001306070013060600120506001205050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010012030200120302001304030013050400140605001406050015070600150807001609070017090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1213001a1113001910120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001205050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010012030200120302001304030013050400140605001406050015070600150807001609070017090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1213001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001205050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010011030200120302001304030013050400140605001406050015070600150807001609070017090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001204050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010011030200120302001304030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001204050011040400110304001003030010020200100202000f0101000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f00000010000000100100001102010011030200120302001304030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001204050011040400110304001003030010020200100202000f0101000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f00000010000000100100001102010011030200120302001204030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001204050011040400110304001003030010020200100202000f0101000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f00000010000000100100001102010011030200120302001204030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001104050011040400110304001003030010020200100202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f00000010000000100100001102010011030200120302001204030013050400130605001406050015070600150807001609070016090800170a0900170b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001104050011040400110304001003030010020200100202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f00000010000000100100001102010011030200120302001204030013050400130605001406050015070600150807001609070016090800170a0900170b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001104050011040400110304001003030010020200100202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001102010011030200120302001204030013050400130605001406050015070600150807001609070016090800170a0900170b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080013060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001102010011030200120302001204030013050400130605001406050014070600150807001609070016090800170a0900170b0a00180b0a00180c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080013060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001102010011030200120302001204030013050400130605001406050014070600150807001608070016090800170a0900170b0a00180b0a00180c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200120302001204030013050400130605001406050014070600150807001608070016090800170a0900170b0a00180b0a00180c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200120302001204030013050400130605001406050014070600150807001608070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0202000f0101000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200120302001204030013050400130605001406050014070600150807001508070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0202000f0101000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200110302001204030013050400130605001406050014070600150807001508070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200110302001204030013050400130605001406050014070600150807001508070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180f1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f000000100100001002010011030200110302001204030013050400130605001406050014070600150807001508070016090800160a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001105060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f000000100100001002010011030200110302001204030012050400130605001406050014070600150807001508070016090800160a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001105060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f000000100100001002010011030200110302001204030012050400130605001406050014070600150807001508070016090800160a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a00130809001307080013070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f000000100100001002010011030200110302001204030012050400130605001406050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a00130809001307080013070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f000000100100001002010011030200110302001204030012050400130605001306050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080013070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010011030200110302001204030012050400130605001306050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010011030200110302001204030012050400130605001306050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000f0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010011030200110302001204030012050400130605001306050014070600140807001508070016090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001204030012050400130505001306050014070600140807001508070016090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001204030012050400130505001306050014070600140807001508070016090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001204030012050400130505001306050014070600140807001508070015090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0013090a00130809001307080012070800120607001106060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001104030012050400130505001306050014070600140807001508070015090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00150c0d00150b0c00150a0c00140a0b0014090a0013090a00130809001307080012070800120607001106060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001104030012050400130505001306050014070600140807001508070015090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f0100001002010010030200110302001104030012050400130505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f0100001002010010030200110302001104030012050400120505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b110f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100001002010010030200110302001104030012050400120505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100001002010010030200110302001104030012050400120505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100001002010010030200110302001104030012050400120505001306050013070600140807001508070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200110302001104030012050400120505001306050013070600140807001508070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200110302001104030012050400120505001306050013070600140807001508070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200110302001104030012050400120505001306050013070600140807001408070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200100302001104030012050400120505001306050013070600140807001408070015090800160a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001106070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030012050400120505001306050013070600140807001408070015090800160a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0013090a0013090a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030012050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00261e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030011050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00261e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030011050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0100000f02010010020200100302001104030011050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0100000f02010010020200100302001104030011050400120505001206050013070600140807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180e0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f02010010020200100302001104030011050400120505001206050013070600140807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180d0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f02010010020200100302001104030011050400120505001206050013070600140807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f02010010020200100302001104030011050400120505001206050013070600130807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001104030011050400120505001206050013070600130807001408070015090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001a1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001104030011050400120505001206050013070600130807001408070015090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001a1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a00120809001207080012070800110607001105060010050600100405000f0404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001104030011050400120505001206050013070600130807001408070014090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001e1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00261f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001a1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a00120809001207080011070800110607001105060010050600100405000f0404000f0304000f0303000e0202000e0102000d0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000a0000000a0000000b0000000b0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001004030011050400120505001206050013070600130807001408070014090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001b1211001c1312001d1312001d1413001e1514001e1614001f16150020171600201817002119170021191800221a1900231b1900231b1a00241c1b00251d1c00251e1c00261e1d00261f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011a12140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01140a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010f0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a0000010a0000010a0000010a0000010b0000010b0000010c0000010d0000010d0000010e0000010e0100010f0201010f020201100302011004030111050401120505011206050113070601130807011408070114090801150a0901160b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01251d1c01251e1c01261e1d01261f1e0127201e0128211f0128212001292221012a2321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011a12140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010f0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a0000010a0000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010e0000010e0100010f0201010f020201100302011004030111050401120505011206050113070601130807011408070114090801150a0901160b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01251d1c01251e1c01261e1d01261f1e0127201e0128211f0128212001292221012a2321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011a12140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010f0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010e0000010e0100010f0201010f020201100302011004030111050401110505011206050113070601130807011408070114090801150a0901150b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f0128212001292221012a2321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011912140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010e0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010d0000010e0100010f0201010f020201100302011004030111050401110505011206050113070601130807011408070114090801150a0901150b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f012821200129222101292321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011912140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011005060110050601100405010f0404010f0304010e0303010e0202010e0102010d0101010d0000010c0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010d0000010e0100010f0201010f020201100302011004030111050401110505011206050113070601130807011408070114090801150a0901150b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e0119100f011a100f011b1110011b1211011c1312011c1312011d1413011e1514011e1614011f1615011f171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f012821200129222101292321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011912140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01150d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011005060110050601100405010f0404010f0304010e0303010e0202010e0102010d0101010d0000010c0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010d0000010e0100010f0201010f020201100302011004030111050401110505011206050112070601130807011408070114090801150a0901150a0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e0119100f011a100f011b1110011b1211011c1312011c1312011d1413011e1514011e1614011f1615011f171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f012821200129222101292321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633021d1719021d1619021c1618021c1517021b1417021b1416021a1315021a1315021912140219111302191113021810120218101102170f1102170e1002160e0f02160d0f02150d0e02150c0e02150b0d02140b0c02140a0c02130a0b0213090a0212080a02120809021207080211070802110607021005060210050602100405020f0404020f0304020e0303020e0202020e0102020d0101020d0000020c0000020c0000020c0000020b0000020b0000020a0000020a0000020a000002090000020a0000020a0000020b0000020b0000020c0000020c0000020d0000020d0000020e0100020e0201020f020202100302021004030211050402110505021206050212070602130807021408070214090802150a0902150a0a02160b0a02160c0b02170d0c02180d0c02180e0d02190f0e0219100f021a100f021b1110021b1211021c1312021c1312021d1413021e1514021e1614021f1615021f171602201817022119170221191802221a1902221b1902231b1a02241c1b02241d1c02251e1c02261e1d02261f1e0227201e0228211f022821200229222102292321022a2422022b2423022b2523022c2624022d2725022d2726022e2826022f2927022f2a2802302a2902312b2902312c2a02322d2b02332d2b02332e2c02342f2d0235302e0235302e0236312f0237323002373330023833310239343202393533023a3633021d1719021d1619021c1618021c1517021b1417021b1416021a1315021a1315021912140219111302191113021810120218101102170f1102170e1002160e0f02160d0f02150d0e02150c0e02150b0d02140b0c02140a0c02130a0b0213090a0212080a02120809021207080211070802110607021005060210050602100405020f0404020f0304020e0303020e0202020e0102020d0101020d0000020c0000020c0000020c0000020b0000020b0000020a0000020a0000020a00000209000002090000020a0000020b0000020b0000020c0000020c0000020d0000020d0000020e0100020e0201020f020202100302021004030211050402110505021206050212070602130807021408070214090802150a0902150a0a02160b0a02160c0b02170d0c02180d0c02180e0d02190f0e0219100f021a100f021b1110021b1211021c1312021c1312021d1413021e1514021e1614021f1615021f171602201817022119170221191802221a1902221b1902231b1a02241c1b02241d1c02251e1c02261e1d02261f1e0227201e0227211f022821200229222102292321022a2422022b2423022b2523022c2624022d2725022d2726022e2826022f2927022f2a2802302a2902312b2902312c2a02322d2b02332d2b02332e2c02342f2d0235302e0235302e0236312f0237323002373330023833310239343202393533023a3633031d1719031d1619031c1618031c1517031b1417031b1416031a1315031a1315031912140319111303181113031810120318101103170f1103170e1003160e0f03160d0f03150d0e03150c0e03150b0d03140b0c03140a0c03130a0b0313090a0312080a03120809031207080311070803110607031005060310050603100405030f0404030f0304030e0203030e0202030e0102030d0101030d0000030c0000030c0000030c0000030b0000030b0000030a0000030a0000030a00000309000003090000030a0000030b0000030b0000030c0000030c0000030d0000030d0000030e0100030e0201030f020203100302031004030311050403110505031206050312070603130807031308070314090803150a0903150a0a03160b0a03160c0b03170d0c03180d0c03180e0d03190f0e0319100f031a100f031b1110031b1211031c1312031c1312031d1413031e1514031e1614031f1615031f171603201817032119170321191803221a1903221b1903231b1a03241c1b03241d1c03251e1c03261e1d03261f1e0327201e0327211f032821200329222103292321032a2422032b2423032b2523032c2624032d2725032d2726032e2826032f2927032f2a2803302a2903312b2903312c2a03322d2b03332d2b03332e2c03342f2d0335302e0335302e0336312f0337323003373330033833310339343203393533033a3633031d1719031d1619031c1618031c1517031b1417031b1416031a1315031a1315031912140319111303181113031810120318101103170f1103170e1003160e0f03160d0f03150d0e03150c0e03150b0d03140b0c03140a0c03130a0b0313090a0312080a031208090312070803110708031106070310050603100506030f0405030f0404030f0304030e0203030e0202030d0102030d0101030d0000030c0000030c0000030b0000030b0000030b0000030a0000030a0000030a00000309000003090000030a0000030a0000030b0000030c0000030c0000030d0000030d0000030e0100030e0201030f0202030f0302031004030311050403110505031206050312070603130807031308070314090803150a0903150a0a03160b0a03160c0b03170d0c03180d0c03180e0d03190f0e0319100f031a100f031a1110031b1211031c1312031c1312031d1413031d1514031e1614031f1615031f171603201817032119170321191803221a1903221b1903231b1a03241c1b03241d1c03251e1c03261e1d03261f1e0327201e0327211f032821200329222103292321032a2422032b2423032b2523032c2624032d2725032d2726032e2826032f2927032f2a2803302a2903312b2903312c2a03322d2b03332d2b03332e2c03342f2d0335302e0335302e0336312f0337323003373330033833310339343203393533033a3633041d1719041d1619041c1618041c1517041b1417041b1416041a1315041a1315041912140419111304181113041810120418101104170f1104170e1004160e0f04160d0f04150d0e04150c0e04140b0d04140b0c04140a0c04130a0b0413090a0412080a041208090412070804110708041106070410050604100506040f0405040f0404040f0304040e0203040e0202040d0102040d0101040d0000040c0000040c0000040b0000040b0000040b0000040a0000040a0000040a00000409000004090000040a0000040a0000040b0000040c0000040c0000040d0000040d0000040e0100040e0201040f0202040f0302041004030411050404110505041206050412070604130807041308070414090804150a0904150a0a04160b0a04160c0b04170d0c04170d0c04180e0d04190f0e0419100f041a100f041a1110041b1211041c1312041c1312041d1413041d1514041e1614041f1615041f171604201817042018170421191804221a1904221b1904231b1a04241c1b04241d1c04251e1c04251e1d04261f1e0427201e0427211f042821200429222104292321042a2422042b2423042b2523042c2624042d2725042d2726042e2826042f2927042f2a2804302a2904302b2904312c2a04322d2b04322d2b04332e2c04342f2d0435302e0435302e0436312f0437323004373330043833310439343204393533043a3633051d1719051d1619051c1618051c1517051b1417051b1416051a1315051a1315051912140519111305181113051810120518101105170f1105170e1005160e0f05160d0f05150d0e05150c0e05140b0d05140b0c05140a0c05130a0b0513090a0512080a051208090511070805110708051106070510050605100506050f0405050f0404050f0304050e0203050e0202050d0102050d0101050d0000050c0000050c0000050b0000050b0000050b0000050a0000050a0000050900000509000005090000050a0000050a0000050b0000050b0000050c0000050d0000050d0000050e0100050e0201050f0202050f0302051004030511050405110505051206050512070605130807051308070514090805150a0905150a0a05160b0a05160c0b05170d0c05170d0c05180e0d05190f0e0519100f051a100f051a1110051b1211051c1312051c1312051d1413051d1514051e1614051f1615051f171605201817052018170521191805221a1905221b1905231b1a05241c1b05241d1c05251e1c05251e1d05261f1e0527201e0527211f052821200529222105292321052a2422052b2423052b2523052c2624052d2725052d2726052e2826052e2927052f2a2805302a2905302b2905312c2a05322d2b05322d2b05332e2c05342f2d0535302e0535302e0536312f0537323005373330053833310539343205393533053a3633061d1719061d1619061c1618061c1517061b1417061b1416061a1315061a1315061912140619111306181113061810120617101106170f1106170e1006160e0f06160d0f06150d0e06150c0e06140b0d06140b0c06140a0c06130a0b0613090a0612080a061208090611070806110708061106070610050606100506060f0405060f0404060f0304060e0203060e0202060d0102060d0101060d0000060c0000060c0000060b0000060b0000060b0000060a0000060a0000060900000609000006090000060a0000060a0000060b0000060b0000060c0000060d0000060d0000060e0100060e0201060f0202060f0302061004030610050406110505061206050612070606130807061308070614090806140a0906150a0a06160b0a06160c0b06170d0c06170d0c06180e0d06190f0e0619100f061a100f061a1110061b1211061c1312061c1312061d1413061d1514061e1614061f1615061f171606201817062018170621191806221a1906221b1906231b1a06241c1b06241d1c06251e1c06251e1d06261f1e0627201e0627211f062821200629222106292321062a2422062b2423062b2523062c2624062d2725062d2726062e2826062e2927062f2a2806302a2906302b2906312c2a06322d2b06322d2b06332e2c06342f2d0634302e0635302e0636312f0637323006373330063833310639343206393533063a3633071d1719071c1619071c1618071c1517071b1417071b1416071a1315071a1315071912140719111307181113071810120717101107170f1107170e1007160e0f07160d0f07150d0e07150c0e07140b0d07140b0c07140a0c07130a0b0713090a0712080a071208090711070807110708071106070710050607100506070f0405070f0404070f0304070e0203070e0202070d0102070d0101070d0000070c0000070c0000070b0000070b0000070b0000070a0000070a0000070900000709000007090000070a0000070a0000070b0000070b0000070c0000070d0000070d0000070e0100070e0201070f0202070f0302071004030710050407110505071206050712070607130807071308070714090807140a0907150a0a07160b0a07160c0b07170d0c07170d0c07180e0d07190f0e0719100f071a100f071a1110071b1211071c1312071c1312071d1413071d1514071e1614071f1615071f171607201817072018170721191807221a1907221b1907231b1a07241c1b07241d1c07251e1c07251e1d07261f1e0727201e0727211f072821200729222107292321072a2422072b2423072b2523072c2624072c2725072d2726072e2826072e2927072f2a2807302a2907302b2907312c2a07322d2b07322d2b07332e2c07342f2d0734302e0735302e0736312f0737323007373330073833310739343207393533073a3633081d1719081c1619081c1618081c1517081b1417081b1416081a1315081a1315081912140819111308181113081810120817101108170f1108170e1008160e0f08160d0f08150d0e08150c0e08140b0d08140b0c08130a0c08130a0b0813090a0812080a081208090811070808110708081106070810050608100506080f0405080f0404080e0304080e0203080e0202080d0102080d0101080c0000080c0000080c0000080b0000080b0000080b0000080a0000080a0000080900000809000008090000080a0000080a0000080b0000080b0000080c0000080c0000080d0000080e0100080e0201080f0202080f0302081004030810050408110505081206050812070608130807081308070814090808140a0908150a0a08160b0a08160c0b08170d0c08170d0c08180e0d08180f0e0819100f081a100f081a1110081b1211081b1312081c1312081d1413081d1514081e1614081f1615081f171608201817082018170821191808221a1908221b1908231b1a08231c1b08241d1c08251e1c08251e1d08261f1e0827201e0827211f082821200829222108292321082a2422082b2423082b2523082c2624082c2725082d2726082e2826082e2927082f2a2808302a2908302b2908312c2a08322d2b08322d2b08332e2c08342f2d0834302e0835302e0836312f0837323008373330083833310839343208393533083a36330a1d17190a1c16190a1c16180a1c15170a1b14170a1b14160a1a13150a1a13150a1912140a1911130a1811130a1810120a1710110a170f110a170e100a160e0f0a160d0f0a150d0e0a150c0e0a140b0d0a140b0c0a130a0c0a130a0b0a13090a0a12080a0a1208090a1107080a1107080a1006070a1005060a1005060a0f04050a0f04040a0e03040a0e02030a0e02020a0d01020a0d01010a0c00000a0c00000a0c00000a0b00000a0b00000a0a00000a0a00000a0a00000a0900000a0900000a0900000a0a00000a0a00000a0b00000a0b00000a0c00000a0c00000a0d00000a0e01000a0e02010a0f02020a0f03020a1004030a1005040a1105050a1106050a1207060a1308070a1308070a1409080a140a090a150a0a0a160b0a0a160c0b0a170d0c0a170d0c0a180e0d0a180f0e0a19100f0a1a100f0a1a11100a1b12110a1b13120a1c13120a1d14130a1d15140a1e16140a1e16150a1f17160a2018170a2018170a2119180a221a190a221b190a231b1a0a231c1b0a241d1c0a251e1c0a251e1d0a261f1e0a27201e0a27211f0a2821200a2922210a2923210a2a24220a2a24230a2b25230a2c26240a2c27250a2d27260a2e28260a2e29270a2f2a280a302a290a302b290a312c2a0a322d2b0a322d2b0a332e2c0a342f2d0a34302e0a35302e0a36312f0a3732300a3733300a3833310a3934320a3935330a3a36330b1d17190b1c16190b1c16180b1c15170b1b14170b1b14160b1a13150b1a13150b1912140b1911130b1811130b1810120b1710110b170f110b160e100b160e0f0b160d0f0b150d0e0b150c0e0b140b0d0b140b0c0b130a0c0b130a0b0b13090a0b12080a0b1208090b1107080b1107080b1006070b1005060b1005060b0f04050b0f04040b0e03040b0e02030b0e02020b0d01020b0d01010b0c00000b0c00000b0c00000b0b00000b0b00000b0a00000b0a00000b0a00000b0900000b0900000b0900000b0a00000b0a00000b0b00000b0b00000b0c00000b0c00000b0d00000b0d01000b0e02010b0f02020b0f03020b1004030b1005040b1105050b1106050b1207060b1308070b1308070b1409080b140a090b150a0a0b150b0a0b160c0b0b170d0c0b170d0c0b180e0d0b180f0e0b19100f0b1a100f0b1a11100b1b12110b1b13120b1c13120b1d14130b1d15140b1e16140b1e16150b1f17160b2018170b2018170b2119180b221a190b221b190b231b1a0b231c1b0b241d1c0b251e1c0b251e1d0b261f1e0b27201e0b27211f0b2821200b2922210b2923210b2a24220b2a24230b2b25230b2c26240b2c27250b2d27260b2e28260b2e29270b2f2a280b302a290b302b290b312c2a0b322d2b0b322d2b0b332e2c0b342f2d0b34302e0b35302e0b36312f0b3732300b3733300b3833310b3934320b3935330b3a36330e1d17190e1c16190e1c16180e1b15170e1b14170e1b14160e1a13150e1a13150e1912140e1911130e1811130e1810120e1710110e170f110e160e100e160e0f0e160d0f0e150d0e0e150c0e0e140b0d0e140b0c0e130a0c0e130a0b0e13090a0e12080a0e1208090e1107080e1107080e1006070e1005060e1005060e0f04050e0f04040e0e03040e0e02030e0e02020e0d01020e0d01010e0c00000e0c00000e0c00000e0b00000e0b00000e0a00000e0a00000e0a00000e0900000e0900000e0900000e0a00000e0a00000e0b00000e0b00000e0c00000e0c00000e0d00000e0d01000e0e02010e0f02020e0f03020e1004030e1005040e1105050e1106050e1207060e1308070e1308070e1409080e140a090e150a0a0e150b0a0e160c0b0e170d0c0e170d0c0e180e0d0e180f0e0e19100f0e1a100f0e1a11100e1b12110e1b13120e1c13120e1d14130e1d15140e1e16140e1e16150e1f17160e2018170e2018170e2119180e211a190e221b190e231b1a0e231c1b0e241d1c0e251e1c0e251e1d0e261f1e0e27201e0e27211f0e2821200e2822210e2923210e2a24220e2a24230e2b25230e2c26240e2c27250e2d27260e2e28260e2e29270e2f2a280e302a290e302b290e312c2a0e322d2b0e322d2b0e332e2c0e342f2d0e34302e0e35302e0e36312f0e3632300e3733300e3833310e3934320e3935330e3a3633101d1719101c1619101c1618101b1517101b1417101b1416101a1315101a1315101912141019111310181113101810121017101110170f1110160e1010160e0f10160d0f10150d0e10150c0e10140b0d10140b0c10130a0c10130a0b1013090a1012080a101208091011070810110708101006071010050610100506100f0405100f0404100e0304100e0203100e0202100d0102100d0101100c0000100c0000100c0000100b0000100b0000100a0000100a0000100a0000100900001009000010090000100a0000100a0000100b0000100b0000100c0000100c0000100d0000100d0100100e0201100f0202100f0302101004031010050410110505101106051012070610120707101308071014090810140a0910150a0a10150b0a10160c0b10170d0c10170d0c10180e0d10180f0e1019100f101a100f101a1110101b1211101b1312101c1312101d1413101d1514101e1614101e1615101f171610201817102018171021191810211a1910221b1910231b1a10231c1b10241d1c10251e1c10251e1d10261f1e1027201e1027211f102821201028222110292321102a2422102a2423102b2523102c2624102c2725102d2726102e2826102e2927102f2a2810302a2910302b2910312c2a10322d2b10322d2b10332e2c10342f2d1034302e1035302e1036312f1036323010373330103833311039343210393533103a3633131d1719131c1619131c1618131b1517131b1417131b1416131a1315131a1315131912141319111313181113131810121317101113170f1113160e1013160e0f13160d0f13150d0e13150c0e13140b0d13140b0c13130a0c13130a0b1312090a1312080a131208091311070813110708131006071310050613100506130f0405130f0404130e0304130e0203130d0202130d0102130d0101130c0000130c0000130b0000130b0000130b0000130a0000130a0000130a0000130900001309000013090000130a0000130a0000130b0000130b0000130c0000130c0000130d0000130d0100130e0201130e0202130f0302131004031310050413110505131106051312070613120707131308071314090813140a0913150a0a13150b0a13160c0b13170d0c13170d0c13180e0d13180f0e1319100f1319100f131a1110131b1211131b1312131c1312131c1413131d1514131e1614131e1615131f171613201817132018171321191813211a1913221b1913231b1a13231c1b13241d1c13251e1c13251e1d13261f1e1326201e1327211f132821201328222113292321132a2422132a2423132b2523132c2624132c2725132d2726132e2826132e2927132f2a2813302a2913302b2913312c2a13322d2b13322d2b13332e2c13342f2d1334302e1335302e1336312f1336323013373330133833311339343213393533133a3633171d1719171c1619171c1618171b1517171b1417171b1416171a1315171a1315171912141719111317181113171810121717101117170f1117160e1017160e0f17150d0f17150d0e17150c0e17140b0d17140b0c17130a0c17130a0b1712090a1712080a1712080917110708171107081710060717100506170f0506170f0405170f0404170e0304170e0203170d0202170d0102170d0101170c0000170c0000170b0000170b0000170b0000170a0000170a00001709000017090000170900001709000017090000170a0000170b0000170b0000170c0000170c0000170d0000170d0100170e0201170e0202170f0302171004031710050417110505171106051712070617120707171308071714090817140a0917150a0a17150b0a17160c0b17160d0c17170d0c17180e0d17180f0e1719100f1719100f171a1110171b1211171b1312171c1312171c1413171d1514171e1614171e1615171f171617201817172018171721191817211a1917221b1917231b1a17231c1b17241d1c17251e1c17251e1d17261f1e1726201e1727211f172821201728222117292321172a2422172a2423172b2523172c2624172c2725172d2726172e2826172e2927172f2a2817302a2917302b2917312c2a17322d2b17322d2b17332e2c17342f2d1734302e1735302e1736312f1736323017373330173833311739343217393533173a36331c1d17191c1c16191c1c16181c1b15171c1b14171c1a14161c1a13151c1a13151c1912141c1911131c1811131c1810121c1710111c170f111c160e101c160e0f1c150d0f1c150d0e1c150c0e1c140b0d1c140b0c1c130a0c1c130a0b1c12090a1c12080a1c1208091c1107081c1107081c1006071c1005061c0f05061c0f04051c0f04041c0e03041c0e02031c0d02021c0d01021c0d01011c0c00001c0c00001c0b00001c0b00001c0b00001c0a00001c0a00001c0900001c0900001c0900001c0900001c0900001c0a00001c0b00001c0b00001c0c00001c0c00001c0d00001c0d01001c0e02011c0e02021c0f03021c1004031c1005041c1105051c1106051c1207061c1207071c1308071c1409081c140a091c150a0a1c150b0a1c160c0b1c160d0c1c170d0c1c180e0d1c180f0e1c19100f1c19100f1c1a11101c1b12111c1b13121c1c13121c1c14131c1d15141c1e15141c1e16151c1f17161c1f18171c2018171c2119181c211a191c221b191c231b1a1c231c1b1c241d1c1c251e1c1c251e1d1c261f1e1c26201e1c27211f1c2821201c2822211c2923211c2a24221c2a24231c2b25231c2c26241c2c27251c2d27261c2e28261c2e29271c2f2a281c302a291c302b291c312c2a1c322d2b1c322d2b1c332e2c1c342f2d1c34302e1c35302e1c36312f1c3632301c3733301c3833311c3934321c3935331c3a3633211d1719211c1619211c1618211b1517211b1417211a1416211a1315211a1315211912142119111321181113211810122117101121170f1121160e1021160e0f21150d0f21150d0e21150c0e21140b0d21140b0c21130a0c21130a0b2112090a2112080a2112080921110708211107082110060721100506210f0506210f0405210f0404210e0304210e0203210d0202210d0102210d0101210c0000210c0000210b0000210b0000210b0000210a0000210a00002109000021090000210900002109000021090000210a0000210a0000210b0000210c0000210c0000210d0000210d0100210e0201210e0202210f0302210f04032110050421110505211106052112070621120707211308072113090821140a0921150a0a21150b0a21160c0b21160d0c21170d0c21180e0d21180f0e2119100f2119100f211a1110211b1211211b1312211c1312211c1413211d1514211e1514211e1615211f1716211f1817212018172121191821211a1921221b1921231b1a21231c1b21241d1c21241e1c21251e1d21261f1e2126201e2127211f212821202128222121292321212a2422212a2423212b2523212c2624212c2725212d2726212e2826212e2927212f2a2821302a2921302b2921312c2a21322d2b21322d2b21332e2c21342f2d2134302e2135302e2136312f2136323021373330213833312139343221393533213a3633271d1719271c1619271c1618271b1517271b1417271a1416271a1315271a1315271912142719111327181113271810122717101127170f1127160e1027160e0f27150d0f27150d0e27150c0e27140b0d27140b0c27130a0c27130a0b2712090a2712080a2711080927110708271107082710060727100506270f0506270f0405270f0404270e0304270e0203270d0202270d0102270d0101270c0000270c0000270b0000270b0000270b0000270a0000270a00002709000027090000270900002709000027090000270a0000270a0000270b0000270c0000270c0000270d0000270d0100270e0201270e0202270f0302270f04032710050427110505271106052712070627120707271308072713090827140a0927150a0a27150b0a27160c0b27160d0c27170d0c27180e0d27180f0e2719100f2719100f271a1110271b1211271b1312271c1312271c1413271d1514271e1514271e1615271f1716271f1817272018172721191827211a1927221b1927231b1a27231c1b27241d1c27241e1c27251e1d27261f1e2726201e2727211f272821202728222127292321272a2422272a2423272b2523272c2624272c2725272d2726272e2826272e2927272f2a2827302a2927302b2927312c2a27322d2b27322d2b27332e2c27342f2d2734302e2735302e2736312f2736323027373330273833312739343227393533273a36332e1d17192e1c16192e1c16182e1b15172e1b14172e1a14162e1a13152e1913152e1912142e1911132e1811132e1810122e1710112e170f112e160e102e160e0f2e150d0f2e150d0e2e140c0e2e140b0d2e140b0c2e130a0c2e130a0b2e12090a2e12080a2e1108092e1107082e1107082e1006072e1005062e0f05062e0f04052e0f04042e0e03042e0e02032e0d02022e0d01022e0c01012e0c00002e0c00002e0b00002e0b00002e0a00002e0a00002e0a00002e0900002e0900002e0900002e0900002e0900002e0a00002e0a00002e0b00002e0b00002e0c00002e0d00002e0d01002e0e02012e0e02022e0f03022e0f04032e1005042e1105052e1106052e1207062e1207072e1308072e1309082e140a092e150a0a2e150b0a2e160c0b2e160d0c2e170d0c2e170e0d2e180f0e2e19100f2e19100f2e1a11102e1a12112e1b13122e1c13122e1c14132e1d15142e1e15142e1e16152e1f17162e1f18172e2018172e2119182e211a192e221b192e231b1a2e231c1b2e241d1c2e241e1c2e251e1d2e261f1e2e26201e2e27211f2e2821202e2822212e2923212e2a24222e2a24232e2b25232e2c26242e2c27252e2d27262e2e28262e2e29272e2f2a282e302a292e302b292e312c2a2e322d2b2e322d2b2e332e2c2e342f2d2e34302e2e35302e2e36312f2e3632302e3733302e3833312e3934322e3935332e3a3633361d1719361c1619361c1618361b1517361b1417361a1416361a131536191315361912143619111336181113361810123617101136170f1136160e1036160e0f36150d0f36150d0e36140c0e36140b0d36140b0c36130a0c36130a0b3612090a3612080a3611080936110708361107083610060736100506360f0506360f0405360e0404360e0304360e0203360d0202360d0102360c0101360c0000360c0000360b0000360b0000360a0000360a0000360a00003609000036090000360900003609000036090000360a0000360a0000360b0000360b0000360c0000360d0000360d0100360e0201360e0202360f0302360f04033610050436100505361106053612070636120707361308073613090836140a0936140a0a36150b0a36160c0b36160d0c36170d0c36170e0d36180f0e3619100f3619100f361a1110361a1211361b1312361c1312361c1413361d1514361d1514361e1615361f1716361f1817362018173621191836211a1936221b1936221b1a36231c1b36241d1c36241e1c36251e1d36261f1e3626201e3627211f362821203628222136292321362a2422362a2423362b2523362c2624362c2725362d2726362e2826362e2927362f2a2836302a2936302b2936312c2a36322d2b36322d2b36332e2c36342f2d3634302e3635302e3636312f3636323036373330363833313639343236393533363a3633401d1719401c1619401c1618401b1517401b1417401a1416401a131540191315401912144019111340181113401810124017101140170f1140160e1040160e0f40150d0f40150d0e40140c0e40140b0d40140b0c40130a0c40130a0b4012090a4012080a4011080940110708401107084010060740100506400f0506400f0405400e0404400e0304400e0203400d0202400d0102400c0101400c0000400c0000400b0000400b0000400a0000400a0000400a00004009000040090000400800004009000040090000400a0000400a0000400b0000400b0000400c0000400c0000400d0100400e0201400e0202400f0302400f04034010050440100505401106054012070640120707401308074013090840140a0940140a0a40150b0a40160c0b40160d0c40170d0c40170e0d40180f0e4019100f4019100f401a1110401a1211401b1312401c1312401c1413401d1514401d1514401e1615401f1716401f1817402018174021191840211a1940221b1940221b1a40231c1b40241d1c40241e1c40251e1d40261f1e4026201e4027211f402821204028222140292321402a2422402a2423402b2523402c2624402c2725402d2726402e2826402e2927402f2a2840302a2940302b2940312c2a40322d2b40322d2b40332e2c40342f2d4034302e4035302e4036312f4036323040373330403833314039343240393533403a36334b1d17194b1c16194b1c16184b1b15174b1b14174b1a14164b1a13154b1913154b1912144b1811134b1811134b1810124b1710114b170f114b160e104b160e0f4b150d0f4b150d0e4b140c0e4b140b0d4b140b0c4b130a0c4b130a0b4b12090a4b12080a4b1108094b1107084b1007084b1006074b1005064b0f05064b0f04054b0e04044b0e03044b0e02034b0d02024b0d01024b0c01014b0c00004b0c00004b0b00004b0b00004b0a00004b0a00004b0a00004b0900004b0900004b0800004b0900004b0900004b0a00004b0a00004b0b00004b0b00004b0c00004b0c00004b0d01004b0e02014b0e02024b0f03024b0f04034b1005044b1005054b1106054b1207064b1207074b1308074b1309084b140a094b140a0a4b150b0a4b160c0b4b160d0c4b170d0c4b170e0d4b180f0e4b19100f4b19100f4b1a11104b1a12114b1b13124b1c13124b1c14134b1d15144b1d15144b1e16154b1f17164b1f18174b2018174b2119184b211a194b221b194b221b1a4b231c1b4b241d1c4b241e1c4b251e1d4b261f1e4b26201e4b27211f4b2821204b2822214b2923214b2a24224b2a24234b2b25234b2c26244b2c27254b2d27264b2e28264b2e29274b2f2a284b302a294b302b294b312c2a4b322d2b4b322d2b4b332e2c4b342f2d4b34302e4b35302e4b36312f4b3632304b3733304b3833314b3934324b3935334b3a3633591d1719591c1619591c1618591b1517591b1417591a1416591a131559191315591912145918111359181113591810125917101159170f1159160e1059160e0f59150d0f59150d0e59140c0e59140b0d59130b0c59130a0c59130a0b5912090a5912080a5911080959110708591007085910060759100506590f0506590f0405590e0404590e0304590e0203590d0202590d0102590c0101590c0000590c0000590b0000590b0000590a0000590a0000590a00005909000059090000590800005909000059090000590a0000590a0000590b0000590b0000590c0000590c0000590d0100590e0201590e0202590f0302590f04035910050459100505591106055911070659120707591308075913090859140a0959140a0a59150b0a59160c0b59160d0c59170d0c59170e0d59180f0e5919100f5919100f591a1110591a1211591b1312591c1312591c1413591d1514591d1514591e1615591f1716591f1817592018175920191859211a1959221b1959221b1a59231c1b59241d1c59241e1c59251e1d59261f1e5926201e5927211f59282120592822215929232159292422592a2423592b2523592b2624592c2725592d2726592d2826592e2927592f2a2859302a2959302b2959312c2a59322d2b59322d2b59332e2c59342f2d5934302e5935302e5936312f5936323059373330593833315939343259393533593a3633681d1719681c1619681c1618681b1517681b1417681a1416681a131568191315681912146818111368181113681810126817101168170f1168160e1068160e0f68150d0f68150d0e68140c0e68140b0d68130b0c68130a0c68130a0b6812090a6812080a6811080968110708681007086810060768100506680f0506680f0405680e0404680e0304680d0203680d0202680d0102680c0101680c0000680b0000680b0000680b0000680a0000680a0000680a00006809000068090000680800006809000068090000680a0000680a0000680b0000680b0000680c0000680c0000680d0100680d0201680e0202680f0302680f04036810050468100505681106056811070668120707681308076813090868140a0968140a0a68150b0a68150c0b68160d0c68170d0c68170e0d68180f0e6818100f6819100f681a1110681a1211681b1312681b1312681c1413681d1514681d1514681e1615681f1716681f1817682018176820191868211a1968221b1968221b1a68231c1b68241d1c68241e1c68251e1d68261f1e6826201e6827211f68282120682822216829232168292422682a2423682b2523682b2624682c2725682d2726682d2826682e2927682f2a2868302a2968302b2968312c2a68322d2b68322d2b68332e2c68342f2d6834302e6835302e6836312f6836323068373330683833316839343268393533683a3633 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: +--- !u!1 &1484246732 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8450,30 +8127,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1490588565} + - component: {fileID: 1484246733} m_Layer: 0 - m_Name: RightForeArmAdjust + m_Name: RightHandFinger01_03 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1490588565 +--- !u!4 &1484246733 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1490588564} - m_LocalRotation: {x: -0.00000018626449, y: 0.00000002235174, z: -0.000000061932944, - w: 1} - m_LocalPosition: {x: -0.035068974, y: -0.00000021187589, z: -0.00000010803342} - m_LocalScale: {x: 1.0000005, y: 1.0012747, z: 1.0012745} + m_GameObject: {fileID: 1484246732} + m_LocalRotation: {x: -0.072893806, y: 0.21205981, z: -0.07187105, w: -0.9718805} + m_LocalPosition: {x: -0.024524935, y: -0.000000023231186, z: -0.00000014403335} + m_LocalScale: {x: 0.9999997, y: 1.0000001, z: 0.99999994} m_Children: [] - m_Father: {fileID: 1482737566} + m_Father: {fileID: 1568915561} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1501523162 +--- !u!1 &1507630576 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8481,27 +8157,26 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1501523163} + - component: {fileID: 1507630577} m_Layer: 0 - m_Name: LeftEyebrowMiddleAdjust + m_Name: LeftToeBase m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1501523163 +--- !u!4 &1507630577 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1501523162} - m_LocalRotation: {x: -0.00000009624478, y: -0.000000059604606, z: 0.000000044068504, - w: -1} - m_LocalPosition: {x: -0.00002940285, y: -3.56321e-10, z: -0.00010783993} - m_LocalScale: {x: 1.0000005, y: 1.000001, z: 1.0000007} + m_GameObject: {fileID: 1507630576} + m_LocalRotation: {x: -0.050411653, y: -0.16645676, z: -0.018438566, w: 0.98458666} + m_LocalPosition: {x: -0.18387176, y: 0.00000011739829, z: -0.000000016771182} + m_LocalScale: {x: 0.9999998, y: 1.0000001, z: 0.99999994} m_Children: [] - m_Father: {fileID: 417819213} + m_Father: {fileID: 392675250} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1508354088 @@ -8763,7 +8438,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1509218970} m_CullTransparentMesh: 0 ---- !u!1 &1552303633 +--- !u!1 &1512695313 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8771,30 +8446,91 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1552303634} + - component: {fileID: 1512695314} m_Layer: 0 - m_Name: RightEar + m_Name: LeftLegAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1552303634 +--- !u!4 &1512695314 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1552303633} - m_LocalRotation: {x: 0.112811, y: -0.5704385, z: -0.08211961, w: 0.809401} - m_LocalPosition: {x: -0.07060846, y: 0.07847385, z: 0.053546134} - m_LocalScale: {x: 1, y: 0.99999994, z: 0.99999994} + m_GameObject: {fileID: 1512695313} + m_LocalRotation: {x: 0.000000051106326, y: -0.0000000018626451, z: -0.000000006519258, + w: 1} + m_LocalPosition: {x: -0.11892725, y: 0.00000003306195, z: 0.00000005401671} + m_LocalScale: {x: 1, y: 1.0386349, z: 1.0190157} + m_Children: [] + m_Father: {fileID: 1119597545} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1516223662 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1516223663} + m_Layer: 0 + m_Name: LeftUpperLidAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1516223663 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1516223662} + m_LocalRotation: {x: -0.00034927437, y: 0.00035876667, z: -0.000036076555, w: 0.9999999} + m_LocalPosition: {x: 0.000000051519066, y: -0.000000004775757, z: -0.00000006577284} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 0.9999999} + m_Children: [] + m_Father: {fileID: 974406623} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1528634805 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1528634806} + m_Layer: 0 + m_Name: LowerBackAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1528634806 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1528634805} + m_LocalRotation: {x: 0.00000002218172, y: -5.846853e-16, z: 8.901179e-16, w: 1} + m_LocalPosition: {x: -0.053665183, y: 0.00000000405162, z: 0.00000001303852} + m_LocalScale: {x: 0.9739005, y: 0.9402901, z: 0.9739005} m_Children: - - {fileID: 345180471} - m_Father: {fileID: 1421548625} + - {fileID: 1914616158} + m_Father: {fileID: 261170371} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1574501201 +--- !u!1 &1552520099 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8802,30 +8538,60 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1574501202} + - component: {fileID: 1552520100} m_Layer: 0 - m_Name: NoseTop + m_Name: RightEarAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1552520100 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1552520099} + m_LocalRotation: {x: 0.0000002847467, y: -0.000000015509572, z: 0.09022357, w: 0.99592155} + m_LocalPosition: {x: 0.0013333561, y: -0.003999997, z: 0.008313857} + m_LocalScale: {x: 0.9764206, y: 0.9764206, z: 0.9764206} + m_Children: [] + m_Father: {fileID: 816646190} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1555366470 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1555366471} + m_Layer: 0 + m_Name: LipsSuperior m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1574501202 +--- !u!4 &1555366471 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1574501201} - m_LocalRotation: {x: 0.7070856, y: 0.0062066345, z: -0.70708257, w: 0.0050717616} - m_LocalPosition: {x: -0.11778397, y: 0.00000004942573, z: 0.12102794} - m_LocalScale: {x: 1.0000005, y: 0.9999998, z: 0.99999994} + m_GameObject: {fileID: 1555366470} + m_LocalRotation: {x: 0.79790705, y: -0.00000026512797, z: -0.60278046, w: 0.00000013485689} + m_LocalPosition: {x: -0.033391424, y: -0.0003540721, z: 0.14576276} + m_LocalScale: {x: 1.0000004, y: 1, z: 1.0000002} m_Children: - - {fileID: 102204984} - m_Father: {fileID: 1421548625} - m_RootOrder: 14 + - {fileID: 175812135} + m_Father: {fileID: 777013926} + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1587736273 +--- !u!1 &1562969793 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8833,30 +8599,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1587736274} + - component: {fileID: 1562969794} m_Layer: 0 - m_Name: LeftLipsAdjust + m_Name: LeftLipsInferiorAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1587736274 +--- !u!4 &1562969794 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1587736273} - m_LocalRotation: {x: 0.00000083632744, y: 0.00000014901158, z: 0.000000044703473, + m_GameObject: {fileID: 1562969793} + m_LocalRotation: {x: 0.00000043318144, y: 0.0000000024665496, z: -4.656613e-10, w: 1} - m_LocalPosition: {x: -0.000000010323419, y: 0.000058822483, z: -0.000000034016526} - m_LocalScale: {x: 1.0000008, y: 1.0000006, z: 0.99999946} + m_LocalPosition: {x: 0.000000006402843, y: 0.000027440221, z: -0.000031358308} + m_LocalScale: {x: 1.000196, y: 1.0035326, z: 1.0035326} m_Children: [] - m_Father: {fileID: 428302479} + m_Father: {fileID: 2053899631} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1602918217 +--- !u!1 &1568915560 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8864,29 +8630,92 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1602918218} + - component: {fileID: 1568915561} m_Layer: 0 - m_Name: PonyTail_End + m_Name: RightHandFinger01_02 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1602918218 +--- !u!4 &1568915561 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1602918217} - m_LocalRotation: {x: 0.0038565006, y: 0.004927723, z: 0.003834895, w: 0.99997306} - m_LocalPosition: {x: -0.11367318, y: 0.000000008401842, z: 0.000000003723353} - m_LocalScale: {x: 0.99999994, y: 1, z: 1} + m_GameObject: {fileID: 1568915560} + m_LocalRotation: {x: -0.02140463, y: 0.21452914, z: -0.08452721, w: -0.9728177} + m_LocalPosition: {x: -0.040974047, y: 0.00000016494141, z: 0.0000003010762} + m_LocalScale: {x: 0.9999997, y: 1, z: 1.0000001} + m_Children: + - {fileID: 1484246733} + m_Father: {fileID: 2036767857} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1576221012 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1576221013} + m_Layer: 0 + m_Name: Neck + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1576221013 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1576221012} + m_LocalRotation: {x: -0.021084027, y: 0.08690195, z: 0.0033020223, w: 0.99598825} + m_LocalPosition: {x: -0.19709702, y: 0.000000016536626, z: -0.00000002095013} + m_LocalScale: {x: 1.0000001, y: 1, z: 0.99999994} + m_Children: + - {fileID: 777013926} + - {fileID: 104073984} + m_Father: {fileID: 1770316070} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1577755936 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1577755937} + m_Layer: 0 + m_Name: RightHandFinger04_03 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1577755937 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1577755936} + m_LocalRotation: {x: -0.058842197, y: 0.19823226, z: -0.018511383, w: -0.9782121} + m_LocalPosition: {x: -0.036073267, y: 0.000000009292475, z: -0.00000037169906} + m_LocalScale: {x: 0.9999998, y: 0.9999999, z: 0.99999964} m_Children: [] - m_Father: {fileID: 1415763196} + m_Father: {fileID: 246363602} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1604480714 +--- !u!1 &1581031856 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8894,27 +8723,89 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1604480715} + - component: {fileID: 1581031857} m_Layer: 0 - m_Name: LowerBackBelly + m_Name: LeftLowMaxilar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1581031857 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1581031856} + m_LocalRotation: {x: 0.029741706, y: 0.105629176, z: 0.22734667, w: 0.9676112} + m_LocalPosition: {x: -0.029504634, y: 0.05740953, z: -0.027499093} + m_LocalScale: {x: 0.9999999, y: 0.99999976, z: 0.9999999} + m_Children: + - {fileID: 1166285466} + m_Father: {fileID: 192158650} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1589096300 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1589096301} + m_Layer: 0 + m_Name: LeftLowCheek + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1589096301 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1589096300} + m_LocalRotation: {x: -0.65911853, y: -0.23915735, z: 0.6702262, w: 0.24323522} + m_LocalPosition: {x: -0.030948685, y: -0.037739087, z: 0.1084911} + m_LocalScale: {x: 1, y: 1.0000002, z: 1.0000001} + m_Children: + - {fileID: 1411028892} + m_Father: {fileID: 777013926} + m_RootOrder: 23 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1612345741 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1612345742} + m_Layer: 0 + m_Name: RightLipsSuperiorMiddleAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1604480715 +--- !u!4 &1612345742 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1604480714} - m_LocalRotation: {x: 0.000000059587457, y: -0.000000037252903, z: -0.0000000014303447, + m_GameObject: {fileID: 1612345741} + m_LocalRotation: {x: 0.00012648129, y: -0.000000009858923, z: 0.000000005122274, w: 1} - m_LocalPosition: {x: -0.034965567, y: 0.000000002639832, z: 0.000000022351745} - m_LocalScale: {x: 0.7603117, y: 0.916217, z: 0.7002415} + m_LocalPosition: {x: -0.00000002689194, y: -0.000027459779, z: -0.000000008770257} + m_LocalScale: {x: 1.000196, y: 1.0035326, z: 1.0035326} m_Children: [] - m_Father: {fileID: 50064554} + m_Father: {fileID: 2134516430} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1615611701 @@ -9183,99 +9074,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: b41d019fd27682f4fa2cadfe47b38e0a, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!1 &1628254482 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1628254483} - m_Layer: 0 - m_Name: RightEyebrowUp - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1628254483 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1628254482} - m_LocalRotation: {x: 0.7707363, y: 0.0008762584, z: -0.6371533, w: -0.0007097716} - m_LocalPosition: {x: -0.11164072, y: 0.05187975, z: 0.07084918} - m_LocalScale: {x: 0.99999994, y: 0.9999999, z: 0.99999994} - m_Children: - - {fileID: 1360502358} - m_Father: {fileID: 1421548625} - m_RootOrder: 19 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1641565328 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1641565329} - m_Layer: 0 - m_Name: LeftHandFinger02_02 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1641565329 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1641565328} - m_LocalRotation: {x: 0.04093072, y: 0.21251889, z: 0.05227016, w: -0.97489905} - m_LocalPosition: {x: -0.042821974, y: 0.000000026018833, z: 0.000000052037763} - m_LocalScale: {x: 0.99999976, y: 0.9999994, z: 0.9999997} - m_Children: - - {fileID: 1268666855} - m_Father: {fileID: 2035681653} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1641886479 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1641886480} - m_Layer: 0 - m_Name: LipsSuperior - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1641886480 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1641886479} - m_LocalRotation: {x: 0.7929806, y: -0.00000027194244, z: -0.6092469, w: -0.00000018440363} - m_LocalPosition: {x: -0.03346425, y: -0.00009391148, z: 0.14560841} - m_LocalScale: {x: 1.0000001, y: 0.99999994, z: 1} - m_Children: - - {fileID: 490603575} - m_Father: {fileID: 1421548625} - m_RootOrder: 7 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1645511932 GameObject: m_ObjectHideFlags: 0 @@ -9351,36 +9149,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1645511932} m_CullTransparentMesh: 0 ---- !u!1 &1658702614 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1658702615} - m_Layer: 0 - m_Name: LeftShoulderAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1658702615 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1658702614} - m_LocalRotation: {x: 0.14658885, y: 0.000000055879347, z: -0.000000021420417, w: 0.9891975} - m_LocalPosition: {x: -0.04042585, y: -0.00000015398837, z: -0.000000022351742} - m_LocalScale: {x: 1, y: 1.0056936, z: 1.0056933} - m_Children: [] - m_Father: {fileID: 745306986} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1666379408 GameObject: m_ObjectHideFlags: 0 @@ -9541,73 +9309,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_HorizontalFit: 0 m_VerticalFit: 1 ---- !u!1 &1673481951 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1673481952} - m_Layer: 0 - m_Name: LowerBack - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1673481952 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1673481951} - m_LocalRotation: {x: -0.0050231153, y: 0.0066429973, z: -0.0066470318, w: 0.9999433} - m_LocalPosition: {x: -0.053878788, y: 0, z: -0.000000008996218} - m_LocalScale: {x: 0.97259897, y: 0.97259927, z: 0.97259873} - m_Children: - - {fileID: 50064554} - - {fileID: 2108140655} - m_Father: {fileID: 56369775} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1676033227 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1676033228} - m_Layer: 0 - m_Name: LeftEye - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1676033228 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1676033227} - m_LocalRotation: {x: 0.7124564, y: -0.0000031179761, z: -0.7017165, w: -0.00000423193} - m_LocalPosition: {x: -0.10662593, y: -0.034980305, z: 0.11798751} - m_LocalScale: {x: 0.93172395, y: 0.9317242, z: 0.9317242} - m_Children: - - {fileID: 1759170276} - - {fileID: 239701299} - - {fileID: 32114948} - - {fileID: 597519371} - m_Father: {fileID: 1421548625} - m_RootOrder: 12 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1685022364 +--- !u!1 &1699817984 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -9615,26 +9317,26 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1685022365} + - component: {fileID: 1699817985} m_Layer: 0 - m_Name: LeftHandFinger04_03 + m_Name: LeftInnerBreast m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1685022365 +--- !u!4 &1699817985 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1685022364} - m_LocalRotation: {x: -0.05882321, y: -0.2705798, z: -0.017009465, w: 0.9607482} - m_LocalPosition: {x: -0.036073197, y: 4.6462198e-10, z: -0.000000030665134} - m_LocalScale: {x: 0.9999999, y: 1.0000005, z: 1.0000007} + m_GameObject: {fileID: 1699817984} + m_LocalRotation: {x: 0.025524417, y: -0.044496123, z: 0.00580812, w: 0.9986666} + m_LocalPosition: {x: -0.058503203, y: -0.00000000372529, z: 0.000000102387276} + m_LocalScale: {x: 1, y: 1.0000001, z: 1.0000001} m_Children: [] - m_Father: {fileID: 967376454} + m_Father: {fileID: 1014523276} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1701443289 @@ -9807,7 +9509,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1702273898} m_CullTransparentMesh: 0 ---- !u!1 &1751247433 +--- !u!1 &1710025055 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -9815,26 +9517,150 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1751247434} + - component: {fileID: 1710025056} m_Layer: 0 - m_Name: RightTrapezius + m_Name: RightLips + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1710025056 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1710025055} + m_LocalRotation: {x: 0.021914477, y: 0.26832202, z: 0.07839589, w: 0.9598839} + m_LocalPosition: {x: -0.076337785, y: -0.024662731, z: 0.024407163} + m_LocalScale: {x: 0.9999999, y: 1, z: 1} + m_Children: + - {fileID: 1089175569} + m_Father: {fileID: 192158650} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1720370105 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1720370106} + m_Layer: 0 + m_Name: LeftHandFinger01_03 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1720370106 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1720370105} + m_LocalRotation: {x: -0.07405193, y: -0.28212875, z: -0.099212594, w: 0.9513551} + m_LocalPosition: {x: -0.024524793, y: 0.00000027691587, z: -0.0000004302417} + m_LocalScale: {x: 1, y: 1.0000001, z: 0.9999998} + m_Children: [] + m_Father: {fileID: 686553214} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1732343610 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1732343611} + m_Layer: 0 + m_Name: RightUpLeg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1732343611 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1732343610} + m_LocalRotation: {x: -0.06963583, y: 0.1059366, z: 0.9919138, w: -0.0059482874} + m_LocalPosition: {x: 0.017578607, y: 0.10126442, z: 0.003164738} + m_LocalScale: {x: 0.9999999, y: 0.99999994, z: 0.9999999} + m_Children: + - {fileID: 297584666} + - {fileID: 2056414476} + - {fileID: 1263201227} + m_Father: {fileID: 744565323} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1744684481 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1744684482} + m_Layer: 0 + m_Name: LeftShoulderAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1744684482 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1744684481} + m_LocalRotation: {x: 0.14658882, y: 0.000000033893752, z: -0.0000000036924186, w: 0.98919755} + m_LocalPosition: {x: -0.04042592, y: -0.000000030588126, z: -0.000000017695129} + m_LocalScale: {x: 1, y: 1.0056933, z: 1.0056933} + m_Children: [] + m_Father: {fileID: 2040708668} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1749136557 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1749136558} + m_Layer: 0 + m_Name: RightLowerLidAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1751247434 +--- !u!4 &1749136558 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1751247433} - m_LocalRotation: {x: 0.6946836, y: 0.069688484, z: -0.14096293, w: -0.7019172} - m_LocalPosition: {x: -0.034978125, y: -0.037129283, z: -0.03650741} - m_LocalScale: {x: 1.0106096, y: 1.0106097, z: 1.0106091} + m_GameObject: {fileID: 1749136557} + m_LocalRotation: {x: -0.00027848384, y: -0.00046002783, z: 0.000036973906, w: 0.9999999} + m_LocalPosition: {x: 0.000000067077735, y: 0.000000002690285, z: -0.00000006769369} + m_LocalScale: {x: 0.9999999, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 635050028} + m_Father: {fileID: 1164930733} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1754034716 @@ -9943,130 +9769,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1754034716} m_CullTransparentMesh: 0 ---- !u!1 &1759170275 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1759170276} - m_Layer: 0 - m_Name: LeftEyeAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1759170276 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1759170275} - m_LocalRotation: {x: -0.00034413536, y: -0.0000001788317, z: -0.000000047118146, - w: -0.99999994} - m_LocalPosition: {x: 0.000000110966646, y: -0.0000001574491, z: -0.0000010318676} - m_LocalScale: {x: 1.0000002, y: 1.0000004, z: 1.0000006} - m_Children: [] - m_Father: {fileID: 1676033228} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1760136389 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1760136390} - m_Layer: 0 - m_Name: LeftUpLegAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1760136390 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1760136389} - m_LocalRotation: {x: -0.033350065, y: 0.000000022351742, z: -0.0000000013969839, - w: 0.99944377} - m_LocalPosition: {x: -0.107989594, y: -0.000000041211024, z: -0.00000011920929} - m_LocalScale: {x: 1.0000002, y: 0.90615153, z: 0.9061514} - m_Children: [] - m_Father: {fileID: 516943256} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1765810492 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1765810493} - m_Layer: 0 - m_Name: RightLipsAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1765810493 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1765810492} - m_LocalRotation: {x: -0.0000009927896, y: 0.000000029802315, z: -0.0000000018626447, - w: 1} - m_LocalPosition: {x: -0.000000008140205, y: -0.00005881765, z: -0.00000016986974} - m_LocalScale: {x: 1.0000014, y: 1.0000007, z: 1} - m_Children: [] - m_Father: {fileID: 1424639455} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1766753952 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1766753953} - m_Layer: 0 - m_Name: PonyTail2 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1766753953 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1766753952} - m_LocalRotation: {x: 0.00016778131, y: -0.45100555, z: 0.013454972, w: 0.89241976} - m_LocalPosition: {x: -0.102971084, y: 0.000000006519258, z: -0.000000100661055} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1031667037} - m_Father: {fileID: 352658160} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1769578872 GameObject: m_ObjectHideFlags: 0 @@ -10160,8 +9862,44 @@ CanvasRenderer: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1769578872} - m_CullTransparentMesh: 0 + m_GameObject: {fileID: 1769578872} + m_CullTransparentMesh: 0 +--- !u!1 &1770316069 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1770316070} + m_Layer: 0 + m_Name: Spine1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1770316070 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1770316069} + m_LocalRotation: {x: -0.007311102, y: 0.10351579, z: 0.0030986331, w: 0.9945962} + m_LocalPosition: {x: -0.18375579, y: 0.000000029598928, z: -0.00002125204} + m_LocalScale: {x: 0.9999999, y: 0.9999999, z: 1.0000001} + m_Children: + - {fileID: 1576221013} + - {fileID: 824988370} + - {fileID: 744722054} + - {fileID: 1014523276} + - {fileID: 1392754007} + - {fileID: 2040708668} + m_Father: {fileID: 363565567} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1770519436 GameObject: m_ObjectHideFlags: 0 @@ -10254,67 +9992,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1770519436} m_CullTransparentMesh: 0 ---- !u!1 &1771768649 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1771768650} - m_Layer: 0 - m_Name: NoseMiddleAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1771768650 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1771768649} - m_LocalRotation: {x: -0.000027814876, y: -0.0005024864, z: 0.00091035536, w: -0.9999995} - m_LocalPosition: {x: -0.000047065067, y: -0.000000010341424, z: 0.000058734793} - m_LocalScale: {x: 0.95859826, y: 0.98290855, z: 0.99588066} - m_Children: [] - m_Father: {fileID: 1457580548} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1771782170 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1771782171} - m_Layer: 0 - m_Name: RightOuterBreast - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1771782171 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1771782170} - m_LocalRotation: {x: -0.12444717, y: 0.7023361, z: -0.116329774, w: 0.69116163} - m_LocalPosition: {x: -0.043685723, y: 0.06515683, z: 0.115223125} - m_LocalScale: {x: 1.0062851, y: 1.006285, z: 1.0062854} - m_Children: - - {fileID: 945853442} - m_Father: {fileID: 1351996167} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1782093553 GameObject: m_ObjectHideFlags: 0 @@ -10623,6 +10300,67 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1782522099} m_CullTransparentMesh: 0 +--- !u!1 &1784344584 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1784344585} + m_Layer: 0 + m_Name: RightHandFinger03_03 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1784344585 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1784344584} + m_LocalRotation: {x: -0.025359176, y: 0.27393574, z: -0.0050096647, w: -0.9614006} + m_LocalPosition: {x: -0.042908017, y: 0.000000014867958, z: -0.00000008177382} + m_LocalScale: {x: 1.0000001, y: 1, z: 1.0000002} + m_Children: [] + m_Father: {fileID: 489756724} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1792301780 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1792301781} + m_Layer: 0 + m_Name: RightEyebrowLow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1792301781 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792301780} + m_LocalRotation: {x: 0.77709675, y: -0.00000009912893, z: -0.6293812, w: 0.00000006738275} + m_LocalPosition: {x: -0.10751021, y: 0.0190231, z: 0.08370289} + m_LocalScale: {x: 0.99999976, y: 0.9999999, z: 0.9999999} + m_Children: + - {fileID: 1070406255} + m_Father: {fileID: 777013926} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1809222217 GameObject: m_ObjectHideFlags: 0 @@ -10685,204 +10423,82 @@ MonoBehaviour: m_SelectOnLeft: {fileID: 0} m_SelectOnRight: {fileID: 0} m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, 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: Highlighted - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1809222220} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 0} - m_TargetAssemblyTypeName: - m_MethodName: onClickOpenConsole - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 ---- !u!114 &1809222220 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 6714678038641832911, guid: 9e2576d087e70de4d892394fd86d4bf5, - type: 3} - m_PrefabInstance: {fileID: 669959031} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1809222217} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 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: 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 &1809222221 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 6714678038641832908, guid: 9e2576d087e70de4d892394fd86d4bf5, - type: 3} - m_PrefabInstance: {fileID: 669959031} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1809222217} - m_CullTransparentMesh: 0 ---- !u!1 &1818034871 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1818034872} - m_Layer: 0 - m_Name: RightEyebrowMiddleAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1818034872 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1818034871} - m_LocalRotation: {x: 0.0000002508521, y: -0.000000029802322, z: 0.00000003496133, - w: 1} - m_LocalPosition: {x: -0.000029446084, y: 0.000000001299492, z: -0.00010786233} - m_LocalScale: {x: 1.0000001, y: 1, z: 1.0000001} - m_Children: [] - m_Father: {fileID: 594232508} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1818343890 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1818343891} - m_Layer: 0 - m_Name: NoseBaseAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1818343891 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1818343890} - m_LocalRotation: {x: 0.00000018294442, y: 0.0013798266, z: -0.000000043951403, w: 0.99999905} - m_LocalPosition: {x: -0.00009806863, y: 4.663e-12, z: 0.000097917335} - m_LocalScale: {x: 0.9291962, y: 0.9811298, z: 0.9664092} - m_Children: [] - m_Father: {fileID: 211980797} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1821257655 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1821257656} - m_Layer: 0 - m_Name: RightHandFinger03_03 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1821257656 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1821257655} - m_LocalRotation: {x: -0.025358723, y: 0.27393585, z: -0.0050094407, w: -0.9614005} - m_LocalPosition: {x: -0.042908024, y: 0.00000002323108, z: -0.00000011429744} - m_LocalScale: {x: 0.9999998, y: 0.99999946, z: 1.0000002} - m_Children: [] - m_Father: {fileID: 21485305} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1832011574 -GameObject: + m_Colors: + m_NormalColor: {r: 1, g: 1, 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: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1809222220} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: + m_MethodName: onClickOpenConsole + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1809222220 +MonoBehaviour: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 6714678038641832911, guid: 9e2576d087e70de4d892394fd86d4bf5, + type: 3} + m_PrefabInstance: {fileID: 669959031} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1832011575} - m_Layer: 0 - m_Name: LeftForeArmTwistAdjust - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1832011575 -Transform: + m_GameObject: {fileID: 1809222217} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 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: 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 &1809222221 +CanvasRenderer: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 6714678038641832908, guid: 9e2576d087e70de4d892394fd86d4bf5, + type: 3} + m_PrefabInstance: {fileID: 669959031} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1832011574} - m_LocalRotation: {x: -0.000000040978247, y: -0.000000007450599, z: -0.000000045169134, - w: 1} - m_LocalPosition: {x: -0.035069004, y: 0.00000009563519, z: -0.000000029802322} - m_LocalScale: {x: 0.9999999, y: 1.0006864, z: 1.0006862} - m_Children: [] - m_Father: {fileID: 1872466546} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_GameObject: {fileID: 1809222217} + m_CullTransparentMesh: 0 --- !u!1 &1835331871 GameObject: m_ObjectHideFlags: 0 @@ -11058,6 +10674,68 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1838101809} m_CullTransparentMesh: 0 +--- !u!1 &1839520113 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1839520114} + m_Layer: 0 + m_Name: NoseBase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1839520114 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1839520113} + m_LocalRotation: {x: 0.7071068, y: -0.00000009358418, z: -0.7071068, w: -0.00000009358418} + m_LocalPosition: {x: -0.067664914, y: -0.00009390455, z: 0.14743026} + m_LocalScale: {x: 1.0000001, y: 1, z: 1} + m_Children: + - {fileID: 88013753} + m_Father: {fileID: 777013926} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1841463894 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1841463895} + m_Layer: 0 + m_Name: NoseTop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1841463895 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1841463894} + m_LocalRotation: {x: 0.7070859, y: 0.006175447, z: -0.7070828, w: 0.005034505} + m_LocalPosition: {x: -0.11778397, y: 0.000000049425733, z: 0.12102794} + m_LocalScale: {x: 1.0000004, y: 1.0000001, z: 1} + m_Children: + - {fileID: 632308851} + m_Father: {fileID: 777013926} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1842147398 GameObject: m_ObjectHideFlags: 0 @@ -11184,37 +10862,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1842147398} m_CullTransparentMesh: 0 ---- !u!1 &1843644513 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1843644514} - m_Layer: 0 - m_Name: RightHandFinger04_02 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1843644514 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1843644513} - m_LocalRotation: {x: -0.0546754, y: 0.27264524, z: -0.012283994, w: -0.9604813} - m_LocalPosition: {x: -0.060066056, y: -0.000000016726371, z: -0.00000012730682} - m_LocalScale: {x: 1.0000012, y: 1.0000005, z: 1.0000007} - m_Children: - - {fileID: 485220948} - m_Father: {fileID: 1276971771} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1846544170 GameObject: m_ObjectHideFlags: 0 @@ -11301,45 +10948,136 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1846544170} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 252230851} - - {fileID: 528437992} - - {fileID: 135518293} - - {fileID: 1244586307} - - {fileID: 823496009} - - {fileID: 1770519437} - - {fileID: 1615809863} - - {fileID: 1364395614} - - {fileID: 849902319} - - {fileID: 9131803} - - {fileID: 860458269} - - {fileID: 125780985} - - {fileID: 1983033410} - - {fileID: 1421746634} - - {fileID: 1508354089} - - {fileID: 1782522100} - - {fileID: 1769578873} - - {fileID: 1938638559} - - {fileID: 1984487158} - - {fileID: 812766630} - - {fileID: 1274425895} - - {fileID: 1782093554} - - {fileID: 154293107} - - {fileID: 901572571} - - {fileID: 81231820} - m_Father: {fileID: 0} - m_RootOrder: 2 + m_GameObject: {fileID: 1846544170} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 252230851} + - {fileID: 528437992} + - {fileID: 135518293} + - {fileID: 1244586307} + - {fileID: 823496009} + - {fileID: 1770519437} + - {fileID: 1615809863} + - {fileID: 1364395614} + - {fileID: 849902319} + - {fileID: 9131803} + - {fileID: 860458269} + - {fileID: 125780985} + - {fileID: 1983033410} + - {fileID: 1421746634} + - {fileID: 1508354089} + - {fileID: 1782522100} + - {fileID: 1769578873} + - {fileID: 1938638559} + - {fileID: 1984487158} + - {fileID: 812766630} + - {fileID: 1274425895} + - {fileID: 1782093554} + - {fileID: 154293107} + - {fileID: 901572571} + - {fileID: 81231820} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1852367216 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1852367217} + m_Layer: 0 + m_Name: LeftEyebrowUp + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1852367217 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1852367216} + m_LocalRotation: {x: 0.77073634, y: -0.00088194804, z: -0.63715327, w: 0.00071391196} + m_LocalPosition: {x: -0.111640856, y: -0.051879685, z: 0.070849195} + m_LocalScale: {x: 1.0000002, y: 1, z: 1.0000001} + m_Children: + - {fileID: 790805936} + m_Father: {fileID: 777013926} + m_RootOrder: 18 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1854736290 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1854736291} + m_Layer: 0 + m_Name: RightEyeAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1854736291 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1854736290} + m_LocalRotation: {x: -0.0003443572, y: -1.8515666e-12, z: 3.0838627e-11, w: 0.99999994} + m_LocalPosition: {x: 0.000000092027435, y: 0.00000009111244, z: -0.0000010480694} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1878168858} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1878114839 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1878114840} + m_Layer: 0 + m_Name: RightEyebrowMiddleAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1878114840 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1878114839} + m_LocalRotation: {x: 0.00000015436667, y: 2.278524e-14, z: -2.1505074e-13, w: 1} + m_LocalPosition: {x: -0.000029423732, y: 0.000000008750015, z: -0.00010786233} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1924404086} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1 &1851445318 +--- !u!1 &1878168857 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -11347,31 +11085,33 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1851445319} + - component: {fileID: 1878168858} m_Layer: 0 - m_Name: LeftLeg + m_Name: RightEye m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1851445319 +--- !u!4 &1878168858 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1851445318} - m_LocalRotation: {x: -0.040088873, y: -0.14380577, z: -0.04356841, w: 0.9878333} - m_LocalPosition: {x: -0.43195608, y: 0.000000028787865, z: -0.0000000131429125} - m_LocalScale: {x: 1.0000001, y: 1.0000004, z: 0.99999976} + m_GameObject: {fileID: 1878168857} + m_LocalRotation: {x: 0.71245664, y: 0.00000317185, z: -0.7017162, w: -0.000004000261} + m_LocalPosition: {x: -0.106625825, y: 0.034980357, z: 0.11798749} + m_LocalScale: {x: 0.9317244, y: 0.9317243, z: 0.9317244} m_Children: - - {fileID: 319322168} - - {fileID: 2065639226} - m_Father: {fileID: 516943256} - m_RootOrder: 0 + - {fileID: 1164930733} + - {fileID: 1854736291} + - {fileID: 1407510898} + - {fileID: 1878689503} + m_Father: {fileID: 777013926} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1872466545 +--- !u!1 &1878689502 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -11379,30 +11119,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1872466546} + - component: {fileID: 1878689503} m_Layer: 0 - m_Name: LeftForeArmTwist + m_Name: RightEyeGlobe m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1872466546 +--- !u!4 &1878689503 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1872466545} - m_LocalRotation: {x: 0.0000004209578, y: 0.000000007450581, z: 4.656613e-10, w: 1} - m_LocalPosition: {x: -0.1402761, y: -0.00000006449409, z: -0.000000074505806} - m_LocalScale: {x: 1.0000002, y: 0.99999976, z: 0.99999994} - m_Children: - - {fileID: 1832011575} - m_Father: {fileID: 1143473323} - m_RootOrder: 1 + m_GameObject: {fileID: 1878689502} + m_LocalRotation: {x: -0.000004380941, y: 0.000000021051617, z: 0.000000021056278, + w: 1} + m_LocalPosition: {x: 0.00000006643813, y: 0.000000110726695, z: -0.0000004429046} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1878168858} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1874345731 +--- !u!1 &1902958431 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -11410,29 +11150,27 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1874345732} + - component: {fileID: 1902958432} m_Layer: 0 - m_Name: Neck + m_Name: LeftUpLegAdjust m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1874345732 +--- !u!4 &1902958432 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1874345731} - m_LocalRotation: {x: -0.021084255, y: 0.08690193, z: 0.003302198, w: 0.9959883} - m_LocalPosition: {x: -0.19709729, y: 0.000000014799442, z: -0.00000001042461} - m_LocalScale: {x: 1.0000008, y: 1.0000006, z: 0.99999994} - m_Children: - - {fileID: 1421548625} - - {fileID: 719071507} - m_Father: {fileID: 1351996167} - m_RootOrder: 0 + m_GameObject: {fileID: 1902958431} + m_LocalRotation: {x: -0.03335008, y: 0.0000000019801623, z: 3.2032033e-10, w: 0.99944377} + m_LocalPosition: {x: -0.10798965, y: -0.000000027706847, z: -0.000000117346644} + m_LocalScale: {x: 1, y: 0.9061515, z: 0.9061515} + m_Children: [] + m_Father: {fileID: 250203169} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1907274960 GameObject: @@ -11513,7 +11251,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1907274960} m_CullTransparentMesh: 0 ---- !u!1 &1924525488 +--- !u!1 &1914616157 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -11521,29 +11259,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1924525489} + - component: {fileID: 1914616158} m_Layer: 0 - m_Name: LeftToeBase + m_Name: LowerBackBelly m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1924525489 +--- !u!4 &1914616158 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1924525488} - m_LocalRotation: {x: -0.06362369, y: -0.16432627, z: -0.025657233, w: 0.9840176} - m_LocalPosition: {x: -0.18387164, y: 0.00000016771152, z: -0.00000008385591} - m_LocalScale: {x: 1.0000007, y: 1, z: 1.0000004} + m_GameObject: {fileID: 1914616157} + m_LocalRotation: {x: 0.000000062371456, y: -1.6493361e-15, z: 8.90118e-16, w: 1} + m_LocalPosition: {x: -0.034965567, y: 0.000000002639848, z: 0.000000022351745} + m_LocalScale: {x: 0.76031137, y: 0.9162166, z: 0.70024157} m_Children: [] - m_Father: {fileID: 2065639226} + m_Father: {fileID: 1528634806} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1931640041 +--- !u!1 &1924404085 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -11551,28 +11289,59 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1931640042} + - component: {fileID: 1924404086} m_Layer: 0 - m_Name: LeftEyebrowLow + m_Name: RightEyebrowMiddle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1931640042 +--- !u!4 &1924404086 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1931640041} - m_LocalRotation: {x: 0.77709675, y: -0.00000014916701, z: -0.6293812, w: 0.00000028182342} - m_LocalPosition: {x: -0.10751021, y: -0.019023033, z: 0.083702855} - m_LocalScale: {x: 1.0000001, y: 0.99999994, z: 0.9999998} + m_GameObject: {fileID: 1924404085} + m_LocalRotation: {x: 0.77709574, y: 0.00000003898883, z: -0.6293825, w: -0.000000084218456} + m_LocalPosition: {x: -0.11220408, y: 0.03667182, z: 0.081221424} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 770893464} - m_Father: {fileID: 1421548625} - m_RootOrder: 24 + - {fileID: 1878114840} + m_Father: {fileID: 777013926} + m_RootOrder: 22 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1937120915 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1937120916} + m_Layer: 0 + m_Name: RightCheekAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1937120916 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1937120915} + m_LocalRotation: {x: 0.00000004458707, y: 9.922373e-11, z: -0.0000000073712556, + w: 1} + m_LocalPosition: {x: 0.000000029004354, y: 0.000000016763806, z: 0.000117594616} + m_LocalScale: {x: 1.004122, y: 1.004122, z: 1.004122} + m_Children: [] + m_Father: {fileID: 895930332} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1938638558 GameObject: @@ -11743,6 +11512,37 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -20, y: -20} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1961770377 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1961770378} + m_Layer: 0 + m_Name: RightHandFinger05_02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1961770378 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1961770377} + m_LocalRotation: {x: -0.063890934, y: 0.20705345, z: -0.14330031, w: -0.96566653} + m_LocalPosition: {x: -0.033299208, y: 0.000000016726451, z: -0.00000017748636} + m_LocalScale: {x: 0.9999999, y: 1.0000001, z: 1.0000001} + m_Children: + - {fileID: 1002287083} + m_Father: {fileID: 913669105} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1968258222 GameObject: m_ObjectHideFlags: 0 @@ -12177,39 +11977,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1984487157} m_CullTransparentMesh: 0 ---- !u!1 &2001694906 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2001694907} - m_Layer: 0 - m_Name: RightLeg - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2001694907 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2001694906} - m_LocalRotation: {x: 0.15140572, y: -0.12250819, z: 0.036080416, w: 0.9801869} - m_LocalPosition: {x: -0.43195608, y: 0, z: 0.000000015441165} - m_LocalScale: {x: 0.99999994, y: 1.0000001, z: 1.0000001} - m_Children: - - {fileID: 1442530529} - - {fileID: 860041907} - m_Father: {fileID: 1144845124} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2014503523 +--- !u!1 &2014644936 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12217,28 +11985,28 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2014503524} + - component: {fileID: 2014644937} m_Layer: 0 - m_Name: LeftHandFinger03_02 + m_Name: NoseMiddle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2014503524 +--- !u!4 &2014644937 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2014503523} - m_LocalRotation: {x: -0.029902725, y: -0.24639955, z: -0.044371445, w: 0.96769017} - m_LocalPosition: {x: -0.053420726, y: 0.000000022301858, z: 0.000000052037787} - m_LocalScale: {x: 0.9999999, y: 0.99999994, z: 1.0000002} + m_GameObject: {fileID: 2014644936} + m_LocalRotation: {x: 0.7072904, y: 0.0010896614, z: -0.70691985, w: -0.0018559118} + m_LocalPosition: {x: -0.089603975, y: 0.00000004975691, z: 0.14145121} + m_LocalScale: {x: 1.0000004, y: 1, z: 1.0000001} m_Children: - - {fileID: 1047791516} - m_Father: {fileID: 504943651} - m_RootOrder: 0 + - {fileID: 17564264} + m_Father: {fileID: 777013926} + m_RootOrder: 16 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2017448183 GameObject: @@ -12345,7 +12113,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2017448183} m_CullTransparentMesh: 0 ---- !u!1 &2035681652 +--- !u!1 &2027139164 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12353,28 +12121,58 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2035681653} + - component: {fileID: 2027139165} m_Layer: 0 - m_Name: LeftHandFinger02_01 + m_Name: LeftLowerLidAdjust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2027139165 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2027139164} + m_LocalRotation: {x: 0.00027847113, y: -0.00046666607, z: -0.0000369699, w: 0.9999999} + m_LocalPosition: {x: 0.000000047466074, y: -0.000000001420631, z: 0.00000007624476} + m_LocalScale: {x: 0.99999994, y: 1.0000001, z: 1} + m_Children: [] + m_Father: {fileID: 1323019139} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2036767856 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2036767857} + m_Layer: 0 + m_Name: RightHandFinger01_01 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2035681653 +--- !u!4 &2036767857 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2035681652} - m_LocalRotation: {x: -0.19666246, y: -0.19859934, z: 0.010263172, w: 0.9600921} - m_LocalPosition: {x: -0.09333042, y: 0.0148432385, z: 0.0014490089} - m_LocalScale: {x: 1.0000001, y: 1.0000004, z: 1.0000008} + m_GameObject: {fileID: 2036767856} + m_LocalRotation: {x: -0.26814008, y: 0.21990542, z: -0.0034988213, w: -0.9379394} + m_LocalPosition: {x: -0.08603038, y: -0.035094995, z: -0.008256789} + m_LocalScale: {x: 1.0000001, y: 0.9999999, z: 1.0000001} m_Children: - - {fileID: 1641565329} - m_Father: {fileID: 2112796547} - m_RootOrder: 2 + - {fileID: 1568915561} + m_Father: {fileID: 79703371} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2038653419 GameObject: @@ -12466,7 +12264,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_ShowMaskGraphic: 0 ---- !u!1 &2044851266 +--- !u!1 &2040708667 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12474,30 +12272,32 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2044851267} + - component: {fileID: 2040708668} m_Layer: 0 - m_Name: RightNoseAdjust + m_Name: LeftShoulder m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2044851267 +--- !u!4 &2040708668 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2044851266} - m_LocalRotation: {x: -0.000002485234, y: 0.000000023964272, z: -0.000000041269228, - w: -1} - m_LocalPosition: {x: -0.00004905082, y: -0.000000016385457, z: 0.000048823622} - m_LocalScale: {x: 1.0000001, y: 1.0000005, z: 1.0000001} - m_Children: [] - m_Father: {fileID: 1398672785} - m_RootOrder: 0 + m_GameObject: {fileID: 2040708667} + m_LocalRotation: {x: 0.043838967, y: -0.038029674, z: 0.8274482, w: 0.55853516} + m_LocalPosition: {x: -0.18975376, y: -0.056619912, z: 0.003329853} + m_LocalScale: {x: 0.99999964, y: 0.9999998, z: 0.99999964} + m_Children: + - {fileID: 1744684482} + - {fileID: 1242331340} + - {fileID: 698060973} + m_Father: {fileID: 1770316070} + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2054152571 +--- !u!1 &2042498012 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12505,29 +12305,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2054152572} + - component: {fileID: 2042498013} m_Layer: 0 - m_Name: LeftLowerLidAdjust + m_Name: LeftCheek m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2054152572 +--- !u!4 &2042498013 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2054152571} - m_LocalRotation: {x: -0.0002785174, y: 0.00046665955, z: 0.000036992522, w: -0.9999999} - m_LocalPosition: {x: 0.000000092167966, y: -0.000000005253241, z: -0.000000018746505} - m_LocalScale: {x: 1.0000008, y: 1.0000008, z: 1.000001} - m_Children: [] - m_Father: {fileID: 597519371} - m_RootOrder: 0 + m_GameObject: {fileID: 2042498012} + m_LocalRotation: {x: 0.64207375, y: 0.3054233, z: -0.6339926, w: -0.3041567} + m_LocalPosition: {x: -0.080588885, y: -0.033353455, z: 0.116393134} + m_LocalScale: {x: 0.99999976, y: 1, z: 1.0000002} + m_Children: + - {fileID: 1021386246} + m_Father: {fileID: 777013926} + m_RootOrder: 20 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2056216097 +--- !u!1 &2053899630 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12535,29 +12336,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2056216098} + - component: {fileID: 2053899631} m_Layer: 0 - m_Name: RightHandFinger02_03 + m_Name: LeftLipsInferior m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2056216098 +--- !u!4 &2053899631 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2056216097} - m_LocalRotation: {x: -0.044502713, y: 0.2547161, z: -0.04798964, w: -0.9647986} - m_LocalPosition: {x: -0.035356056, y: 0.00000001022167, z: 0.00000017283985} - m_LocalScale: {x: 1.0000006, y: 0.9999998, z: 1.0000007} - m_Children: [] - m_Father: {fileID: 679493387} + m_GameObject: {fileID: 2053899630} + m_LocalRotation: {x: -0.010019769, y: 0.15689035, z: -0.0679555, w: 0.98522437} + m_LocalPosition: {x: -0.08500074, y: 0.010562154, z: 0.028516104} + m_LocalScale: {x: 0.9999999, y: 0.99999994, z: 1.0000001} + m_Children: + - {fileID: 1562969794} + m_Father: {fileID: 192158650} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2065639225 +--- !u!1 &2056414475 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12565,64 +12367,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2065639226} + - component: {fileID: 2056414476} m_Layer: 0 - m_Name: LeftFoot + m_Name: RightLeg m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2065639226 +--- !u!4 &2056414476 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2065639225} - m_LocalRotation: {x: 0.8348451, y: 0.056087248, z: -0.5435126, w: -0.06694794} - m_LocalPosition: {x: -0.47571176, y: 0.000000057575708, z: -0.000000025189415} - m_LocalScale: {x: 0.858255, y: 0.858255, z: 0.858255} + m_GameObject: {fileID: 2056414475} + m_LocalRotation: {x: 0.12878814, y: -0.12627262, z: 0.019574726, w: 0.9834052} + m_LocalPosition: {x: -0.43195614, y: 0.000000028787895, z: 0.00000006882106} + m_LocalScale: {x: 0.99999994, y: 1.0000001, z: 1.0000002} m_Children: - - {fileID: 1924525489} - m_Father: {fileID: 1851445319} + - {fileID: 598925227} + - {fileID: 920098871} + m_Father: {fileID: 1732343611} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2069044635 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2069044636} - m_Layer: 0 - m_Name: RightHand - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2069044636 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2069044635} - m_LocalRotation: {x: 0.72535044, y: -0.0539182, z: 0.0029746757, w: 0.68625855} - m_LocalPosition: {x: -0.28055274, y: -0.0000002305221, z: -0.000000005288215} - m_LocalScale: {x: 0.9291198, y: 0.92912, z: 0.9291198} - m_Children: - - {fileID: 554038113} - - {fileID: 1010893073} - - {fileID: 1276971771} - - {fileID: 1143318031} - - {fileID: 1192534077} - m_Father: {fileID: 1482737566} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 128.541, y: 307.969, z: 364.149} --- !u!1 &2077885938 GameObject: m_ObjectHideFlags: 0 @@ -12659,7 +12427,7 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -20, y: -20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &2080475098 +--- !u!1 &2091838470 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12667,28 +12435,59 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2080475099} + - component: {fileID: 2091838471} m_Layer: 0 - m_Name: LeftEar + m_Name: LeftLipsSuperiorMiddle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2080475099 +--- !u!4 &2091838471 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2080475098} - m_LocalRotation: {x: -0.11281155, y: -0.57043844, z: 0.08211995, w: 0.8094009} - m_LocalPosition: {x: -0.07060859, y: -0.07847363, z: 0.053546168} - m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} + m_GameObject: {fileID: 2091838470} + m_LocalRotation: {x: 0.79747313, y: 0.06742403, z: -0.5972371, w: -0.05290073} + m_LocalPosition: {x: -0.03278638, y: -0.0110418275, z: 0.14404063} + m_LocalScale: {x: 0.9999995, y: 0.9999999, z: 0.9999998} m_Children: - - {fileID: 796421154} - m_Father: {fileID: 1421548625} - m_RootOrder: 11 + - {fileID: 372295193} + m_Father: {fileID: 777013926} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2103373104 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2103373105} + m_Layer: 0 + m_Name: LeftNose + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2103373105 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2103373104} + m_LocalRotation: {x: 0.70887077, y: 0.0011841396, z: -0.7053235, w: 0.004423727} + m_LocalPosition: {x: -0.057662167, y: -0.02632495, z: 0.10326293} + m_LocalScale: {x: 0.99999994, y: 1.0000002, z: 1.0000002} + m_Children: + - {fileID: 646858835} + m_Father: {fileID: 777013926} + m_RootOrder: 13 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2107026387 GameObject: @@ -12769,7 +12568,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2107026387} m_CullTransparentMesh: 0 ---- !u!1 &2108140654 +--- !u!1 &2115680348 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12777,31 +12576,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2108140655} + - component: {fileID: 2115680349} m_Layer: 0 - m_Name: Spine + m_Name: RightLowMaxilar m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2108140655 +--- !u!4 &2115680349 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2108140654} - m_LocalRotation: {x: -0.00777879, y: -0.09403953, z: 0.0015996732, w: 0.99553686} - m_LocalPosition: {x: -0.19275974, y: 0.000000014799467, z: -0.00012539871} - m_LocalScale: {x: 1.0000007, y: 1.0000005, z: 1} + m_GameObject: {fileID: 2115680348} + m_LocalRotation: {x: -0.02974178, y: 0.10562888, z: -0.22734708, w: 0.96761113} + m_LocalPosition: {x: -0.029504767, y: -0.057597503, z: -0.027499018} + m_LocalScale: {x: 1.0000001, y: 1.0000002, z: 1} m_Children: - - {fileID: 1351996167} - - {fileID: 980251867} - m_Father: {fileID: 1673481952} + - {fileID: 599412595} + m_Father: {fileID: 192158650} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2110346791 +--- !u!1 &2125920641 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12809,30 +12607,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2110346792} + - component: {fileID: 2125920642} m_Layer: 0 - m_Name: LeftCheek + m_Name: RightLowCheek m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2110346792 +--- !u!4 &2125920642 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2110346791} - m_LocalRotation: {x: 0.64207375, y: 0.30542332, z: -0.63399243, w: -0.30415702} - m_LocalPosition: {x: -0.080588885, y: -0.033353455, z: 0.116393134} - m_LocalScale: {x: 0.99999976, y: 0.99999976, z: 0.9999998} + m_GameObject: {fileID: 2125920641} + m_LocalRotation: {x: -0.6591187, y: 0.23915777, z: 0.67022574, w: -0.24323563} + m_LocalPosition: {x: -0.030948676, y: 0.03773913, z: 0.10849106} + m_LocalScale: {x: 1, y: 0.9999999, z: 0.9999999} m_Children: - - {fileID: 488539669} - m_Father: {fileID: 1421548625} - m_RootOrder: 20 + - {fileID: 1432941637} + m_Father: {fileID: 777013926} + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2112796546 +--- !u!1 &2134516429 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12840,34 +12638,30 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2112796547} + - component: {fileID: 2134516430} m_Layer: 0 - m_Name: LeftHand + m_Name: RightLipsSuperiorMiddle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2112796547 +--- !u!4 &2134516430 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2112796546} - m_LocalRotation: {x: -0.7436887, y: 0.04112959, z: -0.041768458, w: 0.66595113} - m_LocalPosition: {x: -0.280552, y: 0.000000012411096, z: 0.000000002671089} - m_LocalScale: {x: 0.92912, y: 0.929121, z: 0.9291208} + m_GameObject: {fileID: 2134516429} + m_LocalRotation: {x: 0.7975585, y: -0.06643308, z: -0.59730166, w: 0.05213274} + m_LocalPosition: {x: -0.0328049, y: 0.010525083, z: 0.1441099} + m_LocalScale: {x: 0.9999999, y: 1.0000001, z: 1} m_Children: - - {fileID: 1276979479} - - {fileID: 141078875} - - {fileID: 2035681653} - - {fileID: 504943651} - - {fileID: 1435048361} - m_Father: {fileID: 1143473323} - m_RootOrder: 0 + - {fileID: 1612345742} + m_Father: {fileID: 777013926} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2126351173 +--- !u!1 &2136130298 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12875,29 +12669,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2126351174} + - component: {fileID: 2136130299} m_Layer: 0 - m_Name: LeftInnerBreast + m_Name: LeftEyeGlobe m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2126351174 +--- !u!4 &2136130299 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2126351173} - m_LocalRotation: {x: 0.025524419, y: -0.044496294, z: 0.005808189, w: 0.9986665} - m_LocalPosition: {x: -0.05850321, y: 0.000000001862645, z: -0.000000018218998} - m_LocalScale: {x: 1.0000002, y: 1.0000004, z: 1.0000005} + m_GameObject: {fileID: 2136130298} + m_LocalRotation: {x: 0.0000043511395, y: -2.3135275e-11, z: 1.6825654e-11, w: 1} + m_LocalPosition: {x: 0.00000002214749, y: -0.000000105189265, z: -0.000000442905} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 1029355626} - m_RootOrder: 0 + m_Father: {fileID: 25607458} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2131156993 +--- !u!1 &2139624978 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -12905,28 +12699,28 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2131156994} + - component: {fileID: 2139624979} m_Layer: 0 - m_Name: LeftEyebrowUp + m_Name: LeftHandFinger03_02 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2131156994 +--- !u!4 &2139624979 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2131156993} - m_LocalRotation: {x: 0.7707361, y: -0.00087633455, z: -0.6371536, w: 0.00070964516} - m_LocalPosition: {x: -0.111640856, y: -0.05187969, z: 0.07084919} - m_LocalScale: {x: 0.9999997, y: 0.9999999, z: 0.99999994} + m_GameObject: {fileID: 2139624978} + m_LocalRotation: {x: -0.029902978, y: -0.24640349, z: -0.04437208, w: 0.96768916} + m_LocalPosition: {x: -0.053420756, y: 0.000000041816136, z: -0.00000027691587} + m_LocalScale: {x: 1, y: 0.9999998, z: 1} m_Children: - - {fileID: 820140026} - m_Father: {fileID: 1421548625} - m_RootOrder: 18 + - {fileID: 1065320580} + m_Father: {fileID: 562759540} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &4983528355051440488 MonoBehaviour: @@ -13024,7 +12818,7 @@ MonoBehaviour: minWeight: 0 logResetErrors: 0 useDisableDistance: 0 - processing: 0 + processing: 1 disableDistance: 10 eyeMovementRange: 30 mutualGazeRange: 0.1 @@ -13033,7 +12827,7 @@ MonoBehaviour: minSaccade: -0.6 maxSaccade: 0.6 allowUpDownSaccades: 0 - animator: {fileID: 0} + animator: {fileID: 4983528355051440495} ExpressionChanged: m_PersistentCalls: m_Calls: [] @@ -13090,7 +12884,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 1b919db827b6a584a810dd3052866214, type: 3} m_Name: m_EditorClassIdentifier: - rootNode: {fileID: 31683903} + rootNode: {fileID: 0} DrawAsBones: 1 DrawAdjustBones: 0 AlwaysDrawGizmos: 0 @@ -13130,7 +12924,7 @@ MonoBehaviour: context: {fileID: 1119047824} umaData: {fileID: 0} defaultRendererAsset: {fileID: 0} - umaRecipe: {fileID: 11400000, guid: 4fb63e6b6f4986f48afbfc6ff09bed9f, type: 2} + umaRecipe: {fileID: 11400000, guid: e2de835db39554843a2896cd5920324f, type: 2} umaAdditionalRecipes: [] umaGenerator: {fileID: 1622264735} animationController: {fileID: 9100000, guid: ae859d58fdf844b73863d3833f955cdf, type: 2} @@ -13175,7 +12969,7 @@ MonoBehaviour: rawAvatar: 0 keepPredefinedDNA: 0 activeRace: - name: HumanMale + name: HumanMaleHighPoly defaultChangeRaceOptions: 8 cacheCurrentState: 1 rebuildSkeleton: 0 @@ -13185,22 +12979,24 @@ MonoBehaviour: loadDefaultRecipes: 1 recipes: - _recipeName: FemaleUndies2 + _enabledInDefaultWardrobe: 1 _compatibleRaces: - HumanFemaleDCS - HumanFemale - _recipeName: MaleSweatPants_Recipe + _enabledInDefaultWardrobe: 1 _compatibleRaces: - HumanMale - HumanMaleDCS - - _recipeName: TallShoes_Recipe + - _recipeName: MaleShirt2 + _enabledInDefaultWardrobe: 1 _compatibleRaces: - HumanMale - HumanMaleDCS - - HumanMaleHighPoly - - _recipeName: MaleShirt2 + - _recipeName: MaleHairSlick01_Recipe + _enabledInDefaultWardrobe: 1 _compatibleRaces: - HumanMale - - HumanMaleDCS raceAnimationControllers: defaultAnimationController: {fileID: 9100000, guid: ae859d58fdf844b73863d3833f955cdf, type: 2} @@ -13232,6 +13028,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 1 _name: _color: {r: 0.3529412, g: 0.21568629, b: 0.14117648, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13250,6 +13048,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 1 _name: _color: {r: 0.28627452, g: 0.40784317, b: 1, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13268,6 +13068,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 1 _name: _color: {r: 0.9632353, g: 0.82158303, b: 0.82158303, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13286,6 +13088,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 0 _name: _color: {r: 0.3529412, g: 0.4156863, b: 0.6392157, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13304,6 +13108,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 0 _name: _color: {r: 1, g: 1, b: 1, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13322,6 +13128,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 0 _name: _color: {r: 1, g: 1, b: 1, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13340,6 +13148,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 0 _name: _color: {r: 1, g: 1, b: 1, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13358,6 +13168,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 0 _name: _color: {r: 1, g: 1, b: 1, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13376,6 +13188,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 0 _name: _color: {r: 1, g: 1, b: 1, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13394,6 +13208,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 0 _name: _color: {r: 1, g: 1, b: 1, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13412,6 +13228,8 @@ MonoBehaviour: alwaysUpdate: 0 serializedProperties: [] foldout: 0 + showAdvanced: 0 + isBaseColor: 0 _name: _color: {r: 1, g: 1, b: 1, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -13454,7 +13272,7 @@ Transform: m_LocalPosition: {x: -0.75, y: 0, z: -0.404} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 31683903} + - {fileID: 339829189} m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 146.24, z: 0} diff --git a/UMAProject/Assets/UMA/Examples/Legacy Examples/Scripts/UMALODDemoScript.cs b/UMAProject/Assets/UMA/Examples/Legacy Examples/Scripts/UMALODDemoScript.cs index b459cac77..de80a435e 100644 --- a/UMAProject/Assets/UMA/Examples/Legacy Examples/Scripts/UMALODDemoScript.cs +++ b/UMAProject/Assets/UMA/Examples/Legacy Examples/Scripts/UMALODDemoScript.cs @@ -14,6 +14,7 @@ public class UMALODDemoScript : MonoBehaviour [Tooltip("This value is subtracted from the slot LOD counter.")] public int lodOffset = 0; + private bool isBuilding; UMACrowd crowd; void Start() { @@ -26,11 +27,17 @@ void Update() // Note: SwapSlots is now taken care of on UMASimpleLOD if (characterCount > 0) { + if (!isBuilding) + { characterCount--; + isBuilding = true; crowd.ResetSpawnPos(); var go = crowd.GenerateUMA(Random.Range(0, 2), transform.position + new Vector3(Random.Range(-range, range), 0, Random.Range(-range, range))); go.transform.localRotation = Quaternion.Euler(0, Random.Range(0, 360), 0); + UMAData umaData = go.GetComponent(); + umaData.CharacterCreated.AddListener(CharacterCreated); + var lod = go.AddComponent(); var display = go.AddComponent(); display.LODDisplayPrefab = LODDisplayPrefab; @@ -39,7 +46,14 @@ void Update() lod.swapSlots = swapSlots; lod.lodOffset = lodOffset; lod.Update(); + + } + } } + + void CharacterCreated(UMAData umaData) + { + isBuilding = false; } } } \ No newline at end of file diff --git a/UMAProject/Assets/UMA/Examples/Timeline Example/UMA Timeline Example.unity b/UMAProject/Assets/UMA/Examples/Timeline Example/UMA Timeline Example.unity index 6eaf16aa7..b715ccb54 100644 --- a/UMAProject/Assets/UMA/Examples/Timeline Example/UMA Timeline Example.unity +++ b/UMAProject/Assets/UMA/Examples/Timeline Example/UMA Timeline Example.unity @@ -43,7 +43,7 @@ RenderSettings: --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 11 + serializedVersion: 12 m_GIWorkflowMode: 1 m_GISettings: serializedVersion: 2 @@ -99,7 +99,8 @@ LightmapSettings: m_LightProbeSampleCountMultiplier: 4 m_LightingDataAsset: {fileID: 112000000, guid: c50082c757568bc47aeeef7b048c3f6c, type: 2} - m_UseShadowmask: 1 + m_LightingSettings: {fileID: 4890085278179872738, guid: f552fba85ff835a4f84eefcf620b7e33, + type: 2} --- !u!196 &4 NavMeshSettings: serializedVersion: 2 @@ -119,6 +120,8 @@ NavMeshSettings: manualTileSize: 0 tileSize: 256 accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 debug: m_Flags: 0 m_NavMeshData: {fileID: 0} @@ -145,8 +148,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 15965879} - m_LocalRotation: {x: 0.04093063, y: 0.21251893, z: 0.052270085, w: -0.97489905} - m_LocalPosition: {x: -0.042822007, y: 0.000000028774885, z: 0.0000000623017} + m_LocalRotation: {x: 0.040930543, y: 0.2125189, z: 0.052270114, w: -0.97489905} + m_LocalPosition: {x: -0.04282197, y: 0.000000024160347, z: 0.000000059471727} m_LocalScale: {x: 0.99999976, y: 0.9999994, z: 0.9999997} m_Children: - {fileID: 36833348} @@ -176,8 +179,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 36833347} - m_LocalRotation: {x: -0.04611678, y: -0.32874954, z: -0.0627983, w: 0.9411978} - m_LocalPosition: {x: -0.035355743, y: -0.0000000124075274, z: 0.00000007602921} + m_LocalRotation: {x: -0.04611673, y: -0.32874963, z: -0.062798314, w: 0.9411979} + m_LocalPosition: {x: -0.035355754, y: -0.000000008827824, z: 0.00000005668401} m_LocalScale: {x: 1.0000001, y: 1.0000005, z: 1.0000007} m_Children: [] m_Father: {fileID: 15965880} @@ -226,7 +229,6 @@ GameObject: - component: {fileID: 84425580} - component: {fileID: 84425582} - component: {fileID: 84425581} - - component: {fileID: 84425585} - component: {fileID: 84425584} m_Layer: 0 m_Name: UMADynamicCharacterAvatar @@ -248,9 +250,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: context: {fileID: 1489919384} - umaData: {fileID: 84425584} + umaData: {fileID: 0} defaultRendererAsset: {fileID: 0} - umaRecipe: {fileID: 11400000, guid: 1d97eb041589729479af9716fd5b42b3, type: 2} + umaRecipe: {fileID: 11400000, guid: e9c4ce3b586a9884f83db0fb2581ddfe, type: 2} umaAdditionalRecipes: - {fileID: 11400000, guid: 1f292487d7383514f97c491cadfb0442, type: 2} umaGenerator: {fileID: 1489919383} @@ -262,6 +264,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: m_MethodName: RandomHead m_Mode: 1 m_Arguments: @@ -290,6 +293,8 @@ MonoBehaviour: DelayUnload: 2 BundleCheck: 1 KeepAnimatorController: 0 + RecreateAnimatorOnRaceChange: 1 + userInformation: RecipeUpdated: m_PersistentCalls: m_Calls: [] @@ -302,20 +307,25 @@ MonoBehaviour: hide: 0 loadBlendShapes: 0 keepAvatar: 0 + rawAvatar: 0 + keepPredefinedDNA: 0 activeRace: name: HumanMale defaultChangeRaceOptions: 8 cacheCurrentState: 1 rebuildSkeleton: 0 alwaysRebuildSkeleton: 0 + forceRebindAnimator: 0 preloadWardrobeRecipes: loadDefaultRecipes: 1 recipes: - _recipeName: MaleUnderwear + _enabledInDefaultWardrobe: 1 _compatibleRaces: - HumanMale - HumanMaleDCS - _recipeName: FemaleUndies + _enabledInDefaultWardrobe: 1 _compatibleRaces: - HumanFemaleDCS - HumanFemale @@ -346,7 +356,11 @@ MonoBehaviour: - {r: 0, g: 0, b: 0, a: 0} - {r: 0, g: 0, b: 0, a: 0} PropertyBlock: + alwaysUpdate: 0 serializedProperties: [] + foldout: 0 + showAdvanced: 0 + isBaseColor: 1 _name: _color: {r: 0.3529412, g: 0.21568629, b: 0.14117648, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -362,7 +376,11 @@ MonoBehaviour: - {r: 0, g: 0, b: 0, a: 0} - {r: 0, g: 0, b: 0, a: 0} PropertyBlock: + alwaysUpdate: 0 serializedProperties: [] + foldout: 0 + showAdvanced: 0 + isBaseColor: 1 _name: _color: {r: 0.28627452, g: 0.40784317, b: 1, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -378,7 +396,11 @@ MonoBehaviour: - {r: 0, g: 0, b: 0, a: 0} - {r: 0, g: 0, b: 0, a: 0.23529412} PropertyBlock: + alwaysUpdate: 0 serializedProperties: [] + foldout: 0 + showAdvanced: 0 + isBaseColor: 0 _name: _color: {r: 0.9632353, g: 0.82158303, b: 0.82158303, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -394,7 +416,11 @@ MonoBehaviour: - {r: 0, g: 0, b: 0, a: 0} - {r: 0, g: 0, b: 0, a: 0} PropertyBlock: + alwaysUpdate: 0 serializedProperties: [] + foldout: 0 + showAdvanced: 0 + isBaseColor: 0 _name: _color: {r: 0.3529412, g: 0.4156863, b: 0.6392157, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -410,7 +436,11 @@ MonoBehaviour: - {r: 0, g: 0, b: 0, a: 0} - {r: 0, g: 0, b: 0, a: 0} PropertyBlock: + alwaysUpdate: 0 serializedProperties: [] + foldout: 0 + showAdvanced: 0 + isBaseColor: 1 _name: _color: {r: 1, g: 1, b: 1, a: 1} _metallicGloss: {r: 0, g: 0, b: 0, a: 0} @@ -471,6 +501,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: m_MethodName: SetActive m_Mode: 6 m_Arguments: @@ -482,6 +513,7 @@ MonoBehaviour: m_BoolArgument: 1 m_CallState: 2 - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: m_MethodName: SetActive m_Mode: 6 m_Arguments: @@ -493,6 +525,7 @@ MonoBehaviour: m_BoolArgument: 1 m_CallState: 2 - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: m_MethodName: SetAvatar m_Mode: 2 m_Arguments: @@ -504,6 +537,7 @@ MonoBehaviour: m_BoolArgument: 1 m_CallState: 2 - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: m_MethodName: SetActive m_Mode: 6 m_Arguments: @@ -515,6 +549,7 @@ MonoBehaviour: m_BoolArgument: 0 m_CallState: 2 - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: m_MethodName: SetActive m_Mode: 6 m_Arguments: @@ -537,211 +572,10 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1203893151} - - {fileID: 881342889} m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: -180, z: 0} ---- !u!114 &84425584 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 84425579} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 15ee0e75ac30e964b8dcd0ad5f953c15, type: 3} - m_Name: - m_EditorClassIdentifier: - renderers: - - {fileID: 881342890} - umaGenerator: {fileID: 1489919383} - atlasResolutionScale: 1 - isMeshDirty: 0 - isShapeDirty: 0 - isTextureDirty: 0 - isAtlasDirty: 0 - animationController: {fileID: 9100000, guid: eb280940c811fab4a9e3ddf09381c343, type: 2} - CharacterCreated: - m_PersistentCalls: - m_Calls: [] - CharacterDestroyed: - m_PersistentCalls: - m_Calls: [] - CharacterUpdated: - m_PersistentCalls: - m_Calls: [] - CharacterBeforeUpdated: - m_PersistentCalls: - m_Calls: [] - CharacterBeforeDnaUpdated: - m_PersistentCalls: - m_Calls: [] - CharacterDnaUpdated: - m_PersistentCalls: - m_Calls: [] - CharacterBegun: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 0} - m_MethodName: RandomHead - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 - AnimatorStateSaved: - m_PersistentCalls: - m_Calls: [] - AnimatorStateRestored: - m_PersistentCalls: - m_Calls: [] - PreUpdateUMABody: - m_PersistentCalls: - m_Calls: [] - umaRoot: {fileID: 1203893150} - _umaRecipe: - raceData: {fileID: 11400000, guid: 62688b7aa02fbc544916e522fcc239c7, type: 2} - slotDataList: - - asset: {fileID: 11400000, guid: 0b7ed825e2431f54c9f786a489da80bc, type: 2} - overlayScale: 1 - tags: - - Eyes - - Head - Races: [] - altMaterial: {fileID: 11400000, guid: 8e29dbac5d2e82f44a759a7e2cc568ab, type: 2} - Suppressed: 0 - dontSerialize: 0 - rendererAsset: {fileID: 0} - - asset: {fileID: 11400000, guid: cc6c17656f669be4bbb2e21d48e57a45, type: 2} - overlayScale: 1 - tags: - - InnerMouth - - Mouth - - Head - Races: [] - altMaterial: {fileID: 0} - Suppressed: 0 - dontSerialize: 0 - rendererAsset: {fileID: 0} - - asset: {fileID: 11400000, guid: 78bcc1abec57f9c409e43c37c84b131e, type: 2} - overlayScale: 1 - tags: - - Torso - Races: [] - altMaterial: {fileID: 11400000, guid: 8e29dbac5d2e82f44a759a7e2cc568ab, type: 2} - Suppressed: 0 - dontSerialize: 0 - rendererAsset: {fileID: 0} - - asset: {fileID: 11400000, guid: e7c8290369e5f724e8e185a77240e37e, type: 2} - overlayScale: 1 - tags: - - Feet - Races: [] - altMaterial: {fileID: 11400000, guid: 8e29dbac5d2e82f44a759a7e2cc568ab, type: 2} - Suppressed: 0 - dontSerialize: 0 - rendererAsset: {fileID: 0} - - asset: {fileID: 11400000, guid: 881f10d72572db34cb1150ac3df21a97, type: 2} - overlayScale: 1 - tags: - - Hands - Races: [] - altMaterial: {fileID: 11400000, guid: 8e29dbac5d2e82f44a759a7e2cc568ab, type: 2} - Suppressed: 0 - dontSerialize: 0 - rendererAsset: {fileID: 0} - - asset: {fileID: 11400000, guid: 2041a0dad0ad3894ea9590072acacf65, type: 2} - overlayScale: 1 - tags: - - Legs - Races: [] - altMaterial: {fileID: 11400000, guid: 8e29dbac5d2e82f44a759a7e2cc568ab, type: 2} - Suppressed: 0 - dontSerialize: 0 - rendererAsset: {fileID: 0} - - asset: {fileID: 11400000, guid: fe973a02183b3894296cc24e40283fde, type: 2} - overlayScale: 1 - tags: - - Head - Races: [] - altMaterial: {fileID: 0} - Suppressed: 0 - dontSerialize: 0 - rendererAsset: {fileID: 0} - - asset: {fileID: 11400000, guid: b520f86d1223e3b4999507cee7b6958c, type: 2} - overlayScale: 1 - tags: - - EyeLash - - Head - Races: [] - altMaterial: {fileID: 11400000, guid: 5b112eb59f279ce49a718737b5dfde81, type: 2} - Suppressed: 0 - dontSerialize: 0 - rendererAsset: {fileID: 0} - - asset: {fileID: 11400000, guid: 04442629189f10a48bc3238f44aa9856, type: 2} - overlayScale: 1 - tags: [] - Races: [] - altMaterial: {fileID: 0} - Suppressed: 0 - dontSerialize: 1 - rendererAsset: {fileID: 0} - sharedColors: - - name: Skin - channelMask: - - {r: 0.9338235, g: 0.9185755, b: 0.88575906, a: 1} - - {r: 1, g: 1, b: 1, a: 1} - - {r: 1, g: 1, b: 1, a: 1} - channelAdditiveMask: - - {r: 0, g: 0, b: 0, a: 0} - - {r: 0, g: 0, b: 0, a: 0} - - {r: 0, g: 0, b: 0, a: 0.23529412} - PropertyBlock: - serializedProperties: [] - - name: Hair - channelMask: - - {r: 0.3529412, g: 0.21568629, b: 0.14117648, a: 1} - - {r: 1, g: 1, b: 1, a: 1} - - {r: 1, g: 1, b: 1, a: 1} - channelAdditiveMask: - - {r: 0, g: 0, b: 0, a: 0} - - {r: 0, g: 0, b: 0, a: 0} - - {r: 0, g: 0, b: 0, a: 0} - PropertyBlock: - serializedProperties: [] - - name: Eyes - channelMask: - - {r: 0.28627452, g: 0.40784317, b: 1, a: 1} - - {r: 1, g: 1, b: 1, a: 1} - - {r: 1, g: 1, b: 1, a: 1} - channelAdditiveMask: - - {r: 0, g: 0, b: 0, a: 0} - - {r: 0, g: 0, b: 0, a: 0} - - {r: 0, g: 0, b: 0, a: 0} - PropertyBlock: - serializedProperties: [] - - name: Undies - channelMask: - - {r: 1, g: 1, b: 1, a: 1} - - {r: 1, g: 1, b: 1, a: 1} - - {r: 1, g: 1, b: 1, a: 1} - channelAdditiveMask: - - {r: 0, g: 0, b: 0, a: 0} - - {r: 0, g: 0, b: 0, a: 0} - - {r: 0, g: 0, b: 0, a: 0} - PropertyBlock: - serializedProperties: [] - animator: {fileID: 84425585} - KeepAvatar: 0 - characterHeight: 2 - characterRadius: 0.25 - characterMass: 50 ---- !u!95 &84425585 +--- !u!95 &84425584 Animator: serializedVersion: 3 m_ObjectHideFlags: 0 @@ -750,7 +584,7 @@ Animator: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 84425579} m_Enabled: 1 - m_Avatar: {fileID: 1051091819} + m_Avatar: {fileID: 0} m_Controller: {fileID: 9100000, guid: eb280940c811fab4a9e3ddf09381c343, type: 2} m_CullingMode: 0 m_UpdateMode: 0 @@ -876,8 +710,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 119291588} - m_LocalRotation: {x: 0.26908997, y: 0.19874923, z: -0.006046726, w: -0.9423655} - m_LocalPosition: {x: -0.086029895, y: 0.03509524, z: -0.008257686} + m_LocalRotation: {x: 0.26908985, y: 0.19874923, z: -0.006046741, w: -0.9423656} + m_LocalPosition: {x: -0.08602991, y: 0.035095245, z: -0.00825764} m_LocalScale: {x: 0.99999994, y: 1.0000002, z: 0.9999997} m_Children: - {fileID: 1243118705} @@ -938,8 +772,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 122230096} - m_LocalRotation: {x: -0.0546756, y: 0.27264524, z: -0.012283996, w: -0.96048135} - m_LocalPosition: {x: -0.06006603, y: -0.000000015839364, z: -0.000000039070606} + m_LocalRotation: {x: -0.054675583, y: 0.27264526, z: -0.012284068, w: -0.9604813} + m_LocalPosition: {x: -0.060066037, y: -0.000000022301828, z: -0.00000013009456} m_LocalScale: {x: 1.0000012, y: 1.0000005, z: 1.0000007} m_Children: - {fileID: 1163367684} @@ -1130,41 +964,6 @@ Transform: m_Father: {fileID: 332627399} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!84 &215664650 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 'Eyebrows Transparent 1 Chan 0 frame: 58' - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - serializedVersion: 3 - m_Width: 256 - m_Height: 256 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthFormat: 0 - m_ColorFormat: 8 - m_MipMap: 1 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 1 - m_MipBias: 0 - m_WrapU: 0 - m_WrapV: 0 - m_WrapW: 0 - m_Dimension: 2 - m_VolumeDepth: 1 --- !u!1 &227853234 GameObject: m_ObjectHideFlags: 0 @@ -1250,8 +1049,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 242588512} - m_LocalRotation: {x: 0.043838926, y: -0.03802964, z: 0.827448, w: 0.5585354} - m_LocalPosition: {x: -0.18975352, y: -0.056619875, z: 0.003329873} + m_LocalRotation: {x: 0.04383893, y: -0.038029637, z: 0.82744795, w: 0.55853534} + m_LocalPosition: {x: -0.18975355, y: -0.056619868, z: 0.0033298726} m_LocalScale: {x: 0.99999976, y: 1, z: 1} m_Children: - {fileID: 645745834} @@ -1313,8 +1112,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 299977211} - m_LocalRotation: {x: -0.040853348, y: 0.23756415, z: -0.05761145, w: -0.9688009} - m_LocalPosition: {x: -0.042822067, y: -0.000000016367352, z: -0.000000036958696} + m_LocalRotation: {x: -0.0408534, y: 0.23756412, z: -0.057611436, w: -0.9688009} + m_LocalPosition: {x: -0.04282208, y: -0.000000011150921, z: -0.000000020443442} m_LocalScale: {x: 1.000001, y: 1.0000007, z: 1.000001} m_Children: - {fileID: 524605509} @@ -1375,8 +1174,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 332627398} - m_LocalRotation: {x: 0.02525352, y: 0.025959212, z: 0.84276223, w: -0.5370662} - m_LocalPosition: {x: -0.18975343, y: 0.05661989, z: 0.0033298074} + m_LocalRotation: {x: 0.025253523, y: 0.025959203, z: 0.8427623, w: -0.53706634} + m_LocalPosition: {x: -0.18975358, y: 0.056619897, z: 0.0033298095} m_LocalScale: {x: 1.000001, y: 1.000001, z: 1.0000001} m_Children: - {fileID: 694677742} @@ -1439,8 +1238,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 365997833} - m_LocalRotation: {x: 0.0035803448, y: 0.013576398, z: 0.0044956794, w: 0.9998914} - m_LocalPosition: {x: -1.0403168, y: 0.005412909, z: 0.00486437} + m_LocalRotation: {x: 0.003580353, y: 0.013576445, z: 0.0044959174, w: 0.9998914} + m_LocalPosition: {x: -1.0402151, y: 0.0055537606, z: 0.0036904216} m_LocalScale: {x: 0.9999995, y: 0.9999998, z: 0.9999998} m_Children: - {fileID: 1255390824} @@ -1472,8 +1271,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 366293803} - m_LocalRotation: {x: -0.0211464, y: 0.06683572, z: 0.0028772424, w: 0.9975358} - m_LocalPosition: {x: -0.19709729, y: 0.000000016817543, z: -0.0000000070533455} + m_LocalRotation: {x: -0.02108426, y: 0.08690192, z: 0.003302175, w: 0.99598825} + m_LocalPosition: {x: -0.19709729, y: 0.000000014799442, z: -0.000000011594128} m_LocalScale: {x: 1.0000008, y: 1.0000006, z: 0.99999994} m_Children: - {fileID: 1078680525} @@ -1504,8 +1303,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 371214875} - m_LocalRotation: {x: 0.44245914, y: 0.050361782, z: 0.36686206, w: 0.81676555} - m_LocalPosition: {x: -0.03859311, y: -0.04131441, z: -0.013679149} + m_LocalRotation: {x: 0.4424591, y: 0.050361805, z: 0.36686212, w: 0.8167654} + m_LocalPosition: {x: -0.038593136, y: -0.04131441, z: -0.01367914} m_LocalScale: {x: 1, y: 0.99999964, z: 1} m_Children: - {fileID: 1853417510} @@ -1566,8 +1365,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 396650948} - m_LocalRotation: {x: -0.063890696, y: 0.20705368, z: -0.14330012, w: -0.96566653} - m_LocalPosition: {x: -0.033299077, y: 0.000000036958504, z: -0.00000007814121} + m_LocalRotation: {x: -0.06389073, y: 0.2070537, z: -0.14330007, w: -0.9656666} + m_LocalPosition: {x: -0.033299077, y: 0.000000066905464, z: -0.000000093853956} m_LocalScale: {x: 1.0000005, y: 1.000001, z: 1.0000001} m_Children: - {fileID: 1563447375} @@ -1628,8 +1427,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 406397462} - m_LocalRotation: {x: -0.063904345, y: -0.16430506, z: -0.024844628, w: 0.9840238} - m_LocalPosition: {x: -0.18387152, y: 0.00000009529064, z: -0.000000038116326} + m_LocalRotation: {x: -0.06362358, y: -0.16432627, z: -0.025657177, w: 0.98401767} + m_LocalPosition: {x: -0.1838716, y: 0.00000015094037, z: -0.00000008385591} m_LocalScale: {x: 1.0000007, y: 1, z: 1.0000004} m_Children: [] m_Father: {fileID: 1095707860} @@ -1788,41 +1587,6 @@ Transform: m_Father: {fileID: 1066984002} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!84 &514393606 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 'UMA_Diffuse_Normal_Metallic Chan 0 frame: 58' - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - serializedVersion: 3 - m_Width: 2048 - m_Height: 2048 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthFormat: 0 - m_ColorFormat: 8 - m_MipMap: 1 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 1 - m_MipBias: 0 - m_WrapU: 0 - m_WrapV: 0 - m_WrapW: 0 - m_Dimension: 2 - m_VolumeDepth: 1 --- !u!1 &520983811 GameObject: m_ObjectHideFlags: 0 @@ -1846,8 +1610,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 520983811} - m_LocalRotation: {x: -0.029902585, y: -0.24639958, z: -0.04437143, w: 0.96769017} - m_LocalPosition: {x: -0.05342071, y: 0.000000021647162, z: 0.000000053854034} + m_LocalRotation: {x: -0.029902734, y: -0.2463995, z: -0.044371463, w: 0.96769017} + m_LocalPosition: {x: -0.053420726, y: 0.000000021837236, z: 0.00000006133025} m_LocalScale: {x: 0.9999999, y: 0.99999994, z: 1.0000002} m_Children: - {fileID: 791518413} @@ -1877,8 +1641,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 524605508} - m_LocalRotation: {x: -0.04450289, y: 0.2547161, z: -0.04798966, w: -0.96479857} - m_LocalPosition: {x: -0.035356004, y: 0.0000000084476595, z: 0.00000015417042} + m_LocalRotation: {x: -0.044502817, y: 0.2547161, z: -0.04798966, w: -0.96479857} + m_LocalPosition: {x: -0.035356045, y: 0.0000000055754565, z: 0.0000001719106} m_LocalScale: {x: 1.0000006, y: 0.9999998, z: 1.0000007} m_Children: [] m_Father: {fileID: 299977212} @@ -1968,8 +1732,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 570415669} - m_LocalRotation: {x: 0.7124566, y: 0.0000031348318, z: -0.70171624, w: 0.0000040233135} - m_LocalPosition: {x: -0.10662594, y: 0.03498038, z: 0.11798749} + m_LocalRotation: {x: 0.7124565, y: 0.0000031678348, z: -0.7017163, w: 0.000004053116} + m_LocalPosition: {x: -0.106625974, y: 0.034980375, z: 0.11798749} m_LocalScale: {x: 0.9317243, y: 0.9317242, z: 0.9317242} m_Children: - {fileID: 1389674701} @@ -2033,8 +1797,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 586770652} - m_LocalRotation: {x: 0.72535056, y: -0.053918216, z: 0.0029746932, w: 0.68625844} - m_LocalPosition: {x: -0.28055248, y: -0.00000016482682, z: 0.0000000065305525} + m_LocalRotation: {x: 0.72535044, y: -0.053918194, z: 0.0029746958, w: 0.68625855} + m_LocalPosition: {x: -0.28055254, y: -0.0000002141179, z: 0.000000002967876} m_LocalScale: {x: 0.9291198, y: 0.92912, z: 0.9291198} m_Children: - {fileID: 882966432} @@ -2075,2015 +1839,6 @@ Transform: m_Father: {fileID: 1338292971} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!43 &598349075 -Mesh: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - serializedVersion: 10 - m_SubMeshes: - - serializedVersion: 2 - firstByte: 0 - indexCount: 33564 - topology: 0 - baseVertex: 0 - firstVertex: 0 - vertexCount: 6218 - localAABB: - m_Center: {x: 0.00000047683716, y: -0.0019429922, z: 0.998519} - m_Extent: {x: 0.7799995, y: 0.19456899, z: 0.99624604} - - serializedVersion: 2 - firstByte: 67128 - indexCount: 216 - topology: 0 - baseVertex: 0 - firstVertex: 6218 - vertexCount: 80 - localAABB: - m_Center: {x: 0, y: 0.0906775, z: 1.8617835} - m_Extent: {x: 0.049415, y: 0.0052955, z: 0.007591486} - m_Shapes: - vertices: [] - shapes: [] - channels: [] - fullWeights: [] - m_BindPose: - - e00: -0.00000007549739 - e01: 0.0000012218953 - e02: -1.0000001 - e03: 1.5025187 - e10: -1.0000001 - e11: 0.00000053546455 - e12: 0.00000007549804 - e13: -0.00000007074642 - e20: 0.00000053546466 - e21: 1.0000001 - e22: 0.0000012218953 - e23: 0.06282577 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.00000005200632 - e01: -0.18069652 - e02: -0.9835389 - e03: 1.6545593 - e10: -1.0000001 - e11: 0.0000007104011 - e12: -0.0000000776387 - e13: 0.00000017969408 - e20: 0.0000007127362 - e21: 0.9835389 - e22: -0.18069652 - e23: 0.36132324 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.95054615 - e01: 0.10106548 - e02: 0.29368028 - e03: -0.38774607 - e10: 0.31047198 - e11: 0.28382292 - e12: 0.9072221 - e13: -1.4967842 - e20: 0.008335645 - e21: 0.953536 - e22: -0.30116478 - e23: 0.5533019 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -1.0000001 - e01: -0.0000004256753 - e02: 0.000000113854114 - e03: 0.09371241 - e10: -0.00000042567547 - e11: 1.0000002 - e12: -0.000001393259 - e13: 0.0995377 - e20: -0.00000011385352 - e21: -0.000001393259 - e22: -1.0000001 - e23: 1.6764205 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.3356122 - e01: -0.94190186 - e02: 0.013615626 - e03: 0.050737854 - e10: -0.9419609 - e11: 0.33543083 - e12: -0.014001612 - e13: 0.06486164 - e20: 0.0086210435 - e21: -0.017524498 - e22: -0.99980927 - e23: 1.5042981 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.69847 - e01: 0.1511295 - e02: 0.6994997 - e03: -0.895739 - e10: 0.6968704 - e11: 0.36602554 - e12: 0.61676335 - e13: -1.1049999 - e20: -0.16282365 - e21: 0.9182513 - e22: -0.36097553 - e23: 0.68190217 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.9505462 - e01: 0.10106581 - e02: 0.2936803 - e03: -0.38774627 - e10: 0.31047207 - e11: -0.2838227 - e12: -0.9072222 - e13: 1.4967844 - e20: -0.008336011 - e21: 0.9535359 - e22: -0.3011646 - e23: 0.5533016 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.34227964 - e01: -0.9365419 - e02: -0.07572287 - e03: 0.24354456 - e10: -0.9355793 - e11: 0.34715304 - e12: -0.06462563 - e13: 0.13917014 - e20: 0.08681202 - e21: 0.048724707 - e22: -0.9950324 - e23: 1.4833647 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.33561227 - e01: -0.9419018 - e02: 0.013615627 - e03: 0.050737854 - e10: -0.94196075 - e11: -0.33543086 - e12: 0.014001751 - e13: -0.06486186 - e20: -0.008621174 - e21: -0.017524546 - e22: -0.99980927 - e23: 1.5042981 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.00000007549747 - e01: 0.22007065 - e02: -0.97548395 - e03: 1.2923183 - e10: -1.0000001 - e11: -0.000000518844 - e12: -0.000000039657102 - e13: 0.000000045374257 - e20: -0.00000051485137 - e21: 0.97548395 - e22: 0.22007065 - e23: -0.2600597 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.00000006013366 - e01: 0.047981042 - e02: -0.9988483 - e03: 1.1767652 - e10: -1.0000001 - e11: 0.00000076842343 - e12: 0.00000009711527 - e13: -0.000000093291874 - e20: 0.0000007721981 - e21: 0.9988483 - e22: 0.047981042 - e23: -0.039261576 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.000000060133665 - e01: 0.047981042 - e02: -0.9988483 - e03: 1.1417997 - e10: -1.0000001 - e11: 0.00000064382414 - e12: 0.00000009112997 - e13: -0.000000085754415 - e20: 0.0000006474551 - e21: 0.9988483 - e22: 0.047981042 - e23: -0.039261553 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.3422798 - e01: -0.9365418 - e02: -0.07572288 - e03: 0.24354453 - e10: -0.9355791 - e11: -0.34715316 - e12: 0.06462568 - e13: -0.13917023 - e20: -0.08681209 - e21: 0.048724677 - e22: -0.99503237 - e23: 1.4833646 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.116719894 - e01: -0.003881086 - e02: 0.9931572 - e03: -0.88970274 - e10: 0.9707085 - e11: -0.21189265 - e12: 0.113253586 - e13: -0.22550075 - e20: 0.21000315 - e21: 0.97728497 - e22: 0.02849949 - e23: -0.03470994 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 1.0000002 - e01: -0.00000028213006 - e02: 0.00000009126975 - e03: 0.093712404 - e10: -0.00000028213015 - e11: -1.0000001 - e12: 0.0000013578685 - e13: -0.099537686 - e20: 0.00000009126935 - e21: -0.0000013578685 - e22: -1.0000001 - e23: 1.6764203 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.000000093697 - e01: 0.82446927 - e02: -0.56590664 - e03: 0.5903696 - e10: 1.0000002 - e11: 0.00000077420384 - e12: 0.0000009623677 - e13: -0.109735206 - e20: 0.0000012315695 - e21: -0.56590664 - e22: -0.8244693 - e23: 0.8287745 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.0000000031606144 - e01: 0.8244689 - e02: -0.56590724 - e03: 0.5903704 - e10: 1.0000002 - e11: -0.000000075162724 - e12: -0.00000010391935 - e13: 0.10973435 - e20: -0.00000012821337 - e21: -0.56590724 - e22: -0.8244689 - e23: 0.82877433 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.6984695 - e01: 0.15112981 - e02: 0.6995001 - e03: -0.8957396 - e10: 0.69687074 - e11: -0.3660267 - e12: -0.61676246 - e13: 1.1049987 - e20: 0.16282451 - e21: 0.9182508 - e22: -0.36097643 - e23: 0.68190384 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.116719976 - e01: -0.0038809453 - e02: 0.9931572 - e03: -0.8897028 - e10: 0.97070855 - e11: 0.21189287 - e12: -0.113253705 - e13: 0.22550091 - e20: -0.2100034 - e21: 0.9772852 - e22: 0.028499398 - e23: -0.034709744 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.78268105 - e01: -0.06774567 - e02: 0.6187255 - e03: -0.5304519 - e10: 0.6203955 - e11: -0.0047366843 - e12: 0.78427494 - e13: -1.353945 - e20: -0.05020053 - e21: 0.9976916 - e22: 0.045736425 - e23: 0.0732774 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.782681 - e01: -0.06774567 - e02: 0.6187255 - e03: -0.39017594 - e10: 0.6203955 - e11: -0.004736475 - e12: 0.78427494 - e13: -1.3539451 - e20: -0.050200656 - e21: 0.9976916 - e22: 0.04573626 - e23: 0.073277675 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.77060735 - e01: -0.097777106 - e02: 0.62976533 - e03: -0.30906242 - e10: 0.04930858 - e11: -0.9943463 - e12: -0.09404574 - e13: -0.012739278 - e20: 0.6354002 - e21: -0.041419495 - e22: 0.77107155 - e23: -1.3505785 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.07434491 - e01: -0.6389985 - e02: 0.76560694 - e03: -0.9082598 - e10: 0.99254483 - e11: 0.026939042 - e12: 0.11886604 - e13: -0.77652264 - e20: -0.09657994 - e21: 0.7687362 - e22: 0.6322319 - e23: -0.65829086 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.7826805 - e01: -0.0677454 - e02: 0.6187259 - e03: -0.5304527 - e10: 0.62039596 - e11: 0.004736735 - e12: -0.7842745 - e13: 1.3539444 - e20: 0.050200254 - e21: 0.9976914 - e22: 0.045736328 - e23: 0.07327756 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.7826805 - e01: -0.06774541 - e02: 0.6187259 - e03: -0.39017668 - e10: 0.62039596 - e11: 0.0047365795 - e12: -0.7842745 - e13: 1.3539447 - e20: 0.05020035 - e21: 0.99769145 - e22: 0.045736205 - e23: 0.07327775 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.77060735 - e01: -0.097776696 - e02: 0.6297654 - e03: -0.30906242 - e10: 0.049308233 - e11: 0.99434626 - e12: 0.0940455 - e13: 0.012739594 - e20: -0.63540006 - e21: -0.041419525 - e22: 0.7710715 - e23: -1.3505781 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.074345104 - e01: -0.6389998 - e02: 0.7656059 - e03: -0.90825844 - e10: 0.992545 - e11: -0.026938906 - e12: -0.11886639 - e13: 0.7765231 - e20: 0.09658017 - e21: 0.76873535 - e22: 0.63223314 - e23: -0.65829223 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.36339983 - e01: -0.9237435 - e02: 0.12098649 - e03: 0.18494083 - e10: -0.92968 - e11: 0.36797205 - e12: 0.017078537 - e13: 0.24407361 - e20: -0.06029586 - e21: -0.10627242 - e22: -0.9925072 - e23: 0.052559182 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.37467548 - e01: -0.7746806 - e02: 0.50939935 - e03: -0.018440811 - e10: -0.9219485 - e11: 0.36944965 - e12: -0.11626633 - e13: 0.24506368 - e20: -0.09812819 - e21: -0.5132023 - e22: -0.85263973 - e23: 0.09546735 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.14345397 - e01: 0.0836103 - e02: 0.98611885 - e03: -0.43698186 - e10: 0.9599408 - e11: -0.23058659 - e12: 0.15919654 - e13: -0.2511091 - e20: 0.24069622 - e21: 0.969453 - e22: -0.04718237 - e23: 0.0047793016 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.36340088 - e01: -0.9237436 - e02: 0.12098675 - e03: 0.18494117 - e10: -0.92967963 - e11: -0.36797285 - e12: -0.01707761 - e13: -0.24407348 - e20: 0.06029516 - e21: -0.10627288 - e22: -0.9925071 - e23: 0.052558854 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.37467602 - e01: -0.7746809 - e02: 0.5093993 - e03: -0.018440569 - e10: -0.9219482 - e11: -0.36945048 - e12: 0.1162657 - e13: -0.2450635 - e20: 0.098129 - e21: -0.5132017 - e22: -0.85263973 - e23: 0.09546742 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.14345399 - e01: 0.08361004 - e02: 0.9861188 - e03: -0.43698135 - e10: 0.9599406 - e11: 0.23058735 - e12: -0.15919657 - e13: 0.25110903 - e20: -0.24069697 - e21: 0.969453 - e22: -0.047182005 - e23: 0.0047791293 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.4804786 - e01: -0.12621996 - e02: 0.8678763 - e03: -0.6027224 - e10: -0.032083504 - e11: -0.9863972 - e12: -0.16121936 - e13: 0.13572703 - e20: 0.8764196 - e21: -0.10530693 - e22: 0.46989304 - e23: -1.1898916 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.5596243 - e01: -0.0795529 - e02: 0.82491976 - e03: -0.53509146 - e10: -0.079893835 - e11: -0.9855676 - e12: -0.14924517 - e13: 0.1587837 - e20: 0.8248867 - e21: -0.14942716 - e22: 0.5451916 - e23: -1.2369646 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.678938 - e01: -0.11340676 - e02: 0.72538453 - e03: -0.38996634 - e10: -0.057644997 - e11: -0.9767148 - e12: -0.20665374 - e13: 0.20850627 - e20: 0.7319294 - e21: -0.1821198 - e22: 0.6565911 - e23: -1.2980287 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.7343301 - e01: -0.17150508 - e02: 0.65676904 - e03: -0.27601564 - e10: 0.055193495 - e11: -0.97943723 - e12: -0.19405332 - e13: 0.14159635 - e20: 0.6765451 - e21: -0.10624981 - e22: 0.7286961 - e23: -1.3347875 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.62787026 - e01: -0.03624946 - e02: 0.7774737 - e03: -0.48206022 - e10: -0.22019571 - e11: -0.9498322 - e12: -0.22211076 - e13: 0.31473416 - e20: 0.7465206 - e21: -0.31065303 - e22: 0.5883893 - e23: -1.2425137 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.646904 - e01: 0.08392809 - e02: 0.75793916 - e03: -0.4349532 - e10: -0.3900275 - e11: -0.8905002 - e12: -0.23428315 - e13: 0.4296008 - e20: 0.6552817 - e21: -0.44717565 - e22: 0.60880214 - e23: -1.2166003 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.11928437 - e01: -0.60616565 - e02: 0.7863428 - e03: -0.86948454 - e10: 0.9928542 - e11: -0.070025854 - e12: 0.09663051 - e13: -0.7536349 - e20: -0.0035097697 - e21: 0.79225 - e22: 0.6101869 - e23: -0.6913192 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.17092226 - e01: -0.55145144 - e02: 0.8165092 - e03: -0.8313222 - e10: 0.984252 - e11: -0.05763299 - e12: 0.16711238 - e13: -0.82886225 - e20: -0.045096498 - e21: 0.83221394 - e22: 0.5526179 - e23: -0.5980064 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.505083 - e01: -0.0910943 - e02: 0.85825026 - e03: -0.62571096 - e10: -0.20756862 - e11: -0.95240664 - e12: -0.22324283 - e13: 0.30665725 - e20: 0.837739 - e21: -0.29090187 - e22: 0.46213597 - e23: -1.1620134 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.36672363 - e01: -0.13227199 - e02: 0.9208792 - e03: -0.7663537 - e10: -0.19486423 - e11: -0.95696354 - e12: -0.21505618 - e13: 0.2877103 - e20: 0.9096933 - e21: -0.2583125 - e22: 0.3251659 - e23: -1.0596026 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.4661288 - e01: 0.009597503 - e02: 0.88466513 - e03: -0.6763157 - e10: -0.38546106 - e11: -0.9022481 - e12: -0.19331063 - e13: 0.3781448 - e20: 0.79633164 - e21: -0.4311114 - e22: 0.42426303 - e23: -1.1043081 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.39304134 - e01: -0.039667528 - e02: 0.91866505 - e03: -0.7488692 - e10: -0.433326 - e11: -0.87318766 - e12: -0.22309785 - e13: 0.44971907 - e20: 0.8110164 - e21: -0.48576793 - e22: 0.3260097 - e23: -1.0120618 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.48810858 - e01: -0.19647476 - e02: 0.85038096 - e03: -0.58374065 - e10: 0.0567191 - e11: -0.97941387 - e12: -0.19373085 - e13: 0.14062542 - e20: 0.8709382 - e21: -0.046328846 - e22: 0.4892042 - e23: -1.2073188 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.6083348 - e01: -0.20178822 - e02: 0.76760054 - e03: -0.4365458 - e10: 0.06788969 - e11: -0.97682554 - e12: -0.20298605 - e13: 0.1425494 - e20: 0.79077184 - e21: -0.07137132 - e22: 0.6079362 - e23: -1.2796285 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.4804784 - e01: -0.12622045 - e02: 0.8678763 - e03: -0.6027222 - e10: -0.032083336 - e11: 0.98639715 - e12: 0.16121978 - e13: -0.13572754 - e20: -0.8764196 - e21: -0.10530697 - e22: 0.4698928 - e23: -1.1898913 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.55962396 - e01: -0.079553455 - e02: 0.82491976 - e03: -0.5350914 - e10: -0.07989399 - e11: 0.98556733 - e12: 0.14924589 - e13: -0.1587848 - e20: -0.82488674 - e21: -0.14942767 - e22: 0.5451911 - e23: -1.2369641 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.67893785 - e01: -0.11340749 - e02: 0.72538465 - e03: -0.38996622 - e10: -0.05764494 - e11: 0.9767146 - e12: 0.20665461 - e13: -0.20850734 - e20: -0.7319296 - e21: -0.18212031 - e22: 0.6565908 - e23: -1.2980282 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.6278702 - e01: -0.036250312 - e02: 0.7774736 - e03: -0.48206005 - e10: -0.22019507 - e11: 0.9498322 - e12: 0.22211124 - e13: -0.3147344 - e20: -0.7465208 - e21: -0.31065282 - e22: 0.588389 - e23: -1.2425134 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.73433006 - e01: -0.17150572 - e02: 0.65676916 - e03: -0.27601543 - e10: 0.055193767 - e11: 0.9794371 - e12: 0.19405392 - e13: -0.14159696 - e20: -0.67654514 - e21: -0.10625002 - e22: 0.7286959 - e23: -1.3347872 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.6083348 - e01: -0.20178874 - e02: 0.7676004 - e03: -0.43654534 - e10: 0.067889534 - e11: 0.97682524 - e12: 0.2029868 - e13: -0.14255054 - e20: -0.7907717 - e21: -0.07137188 - e22: 0.60793597 - e23: -1.2796282 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.646904 - e01: 0.08392752 - e02: 0.7579393 - e03: -0.43495306 - e10: -0.39002708 - e11: 0.8905002 - e12: 0.2342834 - e13: -0.429601 - e20: -0.6552821 - e21: -0.4471756 - e22: 0.60880196 - e23: -1.2166002 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.119285524 - e01: -0.6061667 - e02: 0.78634167 - e03: -0.8694823 - e10: 0.9928541 - e11: 0.070022866 - e12: -0.09663429 - e13: 0.7536391 - e20: 0.0035145935 - e21: 0.7922494 - e22: 0.6101876 - e23: -0.69131696 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.17092134 - e01: -0.55145425 - e02: 0.8165075 - e03: -0.83132046 - e10: 0.98425245 - e11: 0.057631828 - e12: -0.16711226 - e13: 0.8288623 - e20: 0.045097936 - e21: 0.83221215 - e22: 0.55262053 - e23: -0.5980085 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.50508296 - e01: -0.09109511 - e02: 0.8582502 - e03: -0.6257108 - e10: -0.20756888 - e11: 0.9524063 - e12: 0.22324382 - e13: -0.30665877 - e20: -0.837739 - e21: -0.29090258 - e22: 0.4621355 - e23: -1.1620128 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.46612874 - e01: 0.009597257 - e02: 0.8846652 - e03: -0.67631555 - e10: -0.38546106 - e11: 0.90224785 - e12: 0.19331084 - e13: -0.37814522 - e20: -0.79633164 - e21: -0.43111154 - e22: 0.42426282 - e23: -1.104308 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.48810855 - e01: -0.1964753 - e02: 0.85038096 - e03: -0.58374023 - e10: 0.056718722 - e11: 0.9794137 - e12: 0.19373164 - e13: -0.14062674 - e20: -0.87093806 - e21: -0.046329547 - e22: 0.48920396 - e23: -1.2073185 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.39304134 - e01: -0.039667603 - e02: 0.9186651 - e03: -0.74886906 - e10: -0.43332553 - e11: 0.8731878 - e12: 0.22309774 - e13: -0.4497187 - e20: -0.81101656 - e21: -0.48576754 - e22: 0.32600978 - e23: -1.0120621 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.366726 - e01: -0.13227326 - e02: 0.92087805 - e03: -0.7663505 - e10: -0.1948642 - e11: 0.9569631 - e12: 0.2150582 - e13: -0.28771272 - e20: -0.9096924 - e21: -0.2583135 - e22: 0.32516778 - e23: -1.0596042 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.000000100069144 - e01: -0.015181005 - e02: -0.9998848 - e03: 1.8092852 - e10: -1 - e11: 0.000000012087811 - e12: 0.00000009989716 - e13: -0.00000017237966 - e20: 0.000000010569877 - e21: 0.9998848 - e22: -0.015181005 - e23: 0.071037 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.00000015215478 - e01: -0.85504633 - e02: 0.5185517 - e03: -0.9257021 - e10: 1 - e11: 0.000000066068225 - e12: -0.00000018448188 - e13: -0.00009360887 - e20: 0.00000012348075 - e21: 0.51855165 - e22: 0.8550462 - e23: -1.545581 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.44624972 - e01: -0.8465648 - e02: 0.29015392 - e03: -0.5194264 - e10: 0.8948579 - e11: 0.4255708 - e12: -0.13460727 - e13: 0.17692193 - e20: -0.009527254 - e21: 0.31971493 - e22: 0.9474659 - e23: -1.6762888 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.6413114 - e01: -0.76689124 - e02: 0.024443831 - e03: 0.03004838 - e10: 0.7672806 - e11: -0.64098316 - e12: 0.02051207 - e13: -0.024215955 - e20: -0.00006244261 - e21: 0.031909905 - e22: 0.9994906 - e23: -1.7886577 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.004567303 - e01: -0.99993813 - e02: 0.010146539 - e03: 0.0412428 - e10: 0.9999578 - e11: 0.0044863108 - e12: -0.007990662 - e13: -0.012094613 - e20: 0.007944646 - e21: 0.010182606 - e22: 0.99991643 - e23: -1.8149651 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.7778749 - e01: -0.62841934 - e02: -0.000000028336716 - e03: 0.07197807 - e10: 0.62841046 - e11: -0.7778639 - e12: 0.0052673323 - e13: 0.026344515 - e20: -0.0033101148 - e21: 0.004097307 - e22: 0.99998593 - e23: -1.8371876 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.00000045838433 - e01: -0.98122156 - e02: -0.19288486 - e03: 0.39982712 - e10: 1.0000001 - e11: 0.0000005081749 - e12: -0.00000020866209 - e13: -0.019022696 - e20: 0.0000003027629 - e21: -0.19288485 - e22: 0.9812215 - e23: -1.8215237 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.00000003701588 - e01: -0.98122156 - e02: -0.19288486 - e03: 0.39982703 - e10: 1.0000001 - e11: -0.00000006640378 - e12: 0.00000014589497 - e13: 0.019022806 - e20: -0.00000015596355 - e21: -0.19288485 - e22: 0.9812215 - e23: -1.8215237 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.0016050461 - e01: -0.9998831 - e02: 0.015189393 - e03: 0.049974963 - e10: 0.9998727 - e11: -0.0018456373 - e12: -0.01583866 - e13: 0.029828742 - e20: 0.015864847 - e21: 0.015162044 - e22: 0.9997591 - e23: -1.8748821 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.00000040334032 - e01: -0.98122245 - e02: -0.19288148 - e03: 0.3983687 - e10: 1 - e11: 0.0000004081687 - e12: 0.000000014703642 - e13: -0.036671825 - e20: 0.00000006430061 - e21: -0.1928814 - e22: 0.9812221 - e23: -1.8266318 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.0022550246 - e01: -0.9848948 - e02: -0.17313762 - e03: 0.35119575 - e10: 0.9999972 - e11: 0.0022170653 - e12: 0.00041263291 - e13: -0.052713174 - e20: -0.000022542601 - e21: -0.17313813 - e22: 0.98489743 - e23: -1.8356594 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.0000016105797 - e01: -0.9999999 - e02: -0.000007588406 - e03: 0.07525593 - e10: 1 - e11: -0.000001610686 - e12: 0.000013980031 - e13: -0.034966826 - e20: -0.000013980042 - e21: -0.000007588383 - e22: 0.9999999 - e23: -1.8630311 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.00015723197 - e01: -0.9350413 - e02: 0.35453838 - e03: -0.5901572 - e10: 0.9999994 - e11: 0.00024720427 - e12: 0.0010954472 - e13: -0.037000395 - e20: -0.0011119317 - e21: 0.35453832 - e22: 0.93504065 - e23: -1.7686489 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.0060028275 - e01: -0.99988854 - e02: 0.013648056 - e03: 0.07324382 - e10: 0.99998134 - e11: -0.0059868013 - e12: 0.0012149193 - e13: -0.001652929 - e20: -0.0011330759 - e21: 0.013655097 - e22: 0.99990606 - e23: -1.8468282 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.000000251841 - e01: -0.99984324 - e02: 0.017696364 - e03: 0.07180182 - e10: 1 - e11: 0.00000024572464 - e12: -0.00000034780425 - e13: -0.00009332546 - e20: 0.00000034340133 - e21: 0.017696366 - e22: 0.99984336 - e23: -1.825197 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.26163986 - e01: 0.89969784 - e02: -0.34941116 - e03: 0.6500231 - e10: -0.96105975 - e11: -0.2762121 - e12: 0.008425871 - e13: 0.062849626 - e20: -0.08893086 - e21: 0.33800957 - e22: 0.9369316 - e23: -1.7091997 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.44625014 - e01: -0.84656435 - e02: 0.2901544 - e03: -0.51942724 - e10: 0.8948575 - e11: -0.42557105 - e12: 0.13460766 - e13: -0.17692246 - e20: 0.009527276 - e21: 0.31971553 - e22: 0.9474657 - e23: -1.6762885 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.64131224 - e01: -0.76689076 - e02: 0.024443017 - e03: 0.030049823 - e10: 0.7672802 - e11: 0.6409841 - e12: -0.020512024 - e13: 0.024215821 - e20: 0.00006289491 - e21: 0.03190925 - e22: 0.99949086 - e23: -1.7886581 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.77787375 - e01: -0.6284202 - e02: -0.00000022398301 - e03: 0.07197843 - e10: 0.62841153 - e11: 0.7778631 - e12: -0.005267481 - e13: -0.026344156 - e20: 0.0033103656 - e21: 0.004097295 - e22: 0.99998593 - e23: -1.8371876 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.0045668185 - e01: -0.99993813 - e02: 0.010146315 - e03: 0.041243285 - e10: 0.99995786 - e11: -0.0044858307 - e12: 0.007990399 - e13: 0.012095072 - e20: -0.007944389 - e21: 0.010182378 - e22: 0.9999165 - e23: -1.8149652 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.00008876831 - e01: -0.98346585 - e02: -0.18109304 - e03: 0.41138318 - e10: 0.99999905 - e11: 0.00016601801 - e12: -0.0013917778 - e13: -0.032360487 - e20: 0.0013988308 - e21: -0.18109299 - e22: 0.9834649 - e23: -1.8186506 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.00000022642838 - e01: -0.9998848 - e02: 0.015179399 - e03: 0.046156347 - e10: 1 - e11: 0.0000002241452 - e12: -0.00000015211387 - e13: -0.00009368071 - e20: 0.00000014869396 - e21: 0.015179399 - e22: 0.9998848 - e23: -1.8017304 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.16856553 - e01: -0.9541822 - e02: -0.24723004 - e03: 0.53943825 - e10: 0.98569036 - e11: -0.16337065 - e12: -0.041532263 - e13: 0.079940416 - e20: -0.0007607874 - e21: -0.25069305 - e22: 0.96806645 - e23: -1.7066698 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.000000074698306 - e01: -0.9700416 - e02: -0.24293819 - e03: 0.5334291 - e10: 1 - e11: 0.00000033198478 - e12: -0.0000010181221 - e13: -0.00009214935 - e20: 0.0000010682727 - e21: -0.24293822 - e22: 0.9700417 - e23: -1.7111331 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.16226204 - e01: -0.98674786 - e02: -0.00000044703492 - e03: 0.090335235 - e10: 0.98674774 - e11: -0.16226202 - e12: 0.00000090241235 - e13: -0.010982302 - e20: -0.00000096299 - e21: -0.00000029468336 - e22: 0.99999994 - e23: -1.7828212 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.13312362 - e01: -0.96835667 - e02: 0.2111018 - e03: -0.28051922 - e10: 0.99109316 - e11: -0.12930273 - e12: 0.031864956 - e13: -0.054598898 - e20: -0.0035605999 - e21: 0.21346343 - e22: 0.9769445 - e23: -1.761508 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.00000002886116 - e01: -0.98254895 - e02: 0.18600452 - e03: -0.2344613 - e10: 1 - e11: -0.00000009834542 - e12: -0.00000067466294 - e13: -0.00009273897 - e20: 0.0000006811819 - e21: 0.18600449 - e22: 0.98254883 - e23: -1.768597 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.16226234 - e01: -0.98674774 - e02: -0.0000004470349 - e03: 0.09033521 - e10: 0.9867476 - e11: 0.16226232 - e12: -0.0000012701155 - e13: 0.010982956 - e20: 0.0000013258206 - e21: -0.0000002350187 - e22: 1 - e23: -1.7828213 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.1331239 - e01: -0.96835655 - e02: 0.21110179 - e03: -0.28051922 - e10: 0.99109304 - e11: 0.12930301 - e12: -0.031864937 - e13: 0.05459886 - e20: 0.0035605233 - e21: 0.21346341 - e22: 0.9769445 - e23: -1.7615079 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.1685658 - e01: -0.95418185 - e02: -0.24722992 - e03: 0.53943795 - e10: 0.98568994 - e11: 0.16337098 - e12: 0.04153219 - e13: -0.079940274 - e20: 0.00076093327 - e21: -0.250693 - e22: 0.96806633 - e23: -1.7066697 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.26163894 - e01: 0.89969814 - e02: -0.349411 - e03: 0.65002275 - e10: -0.96105975 - e11: 0.27621123 - e12: -0.008425492 - e13: -0.06285053 - e20: 0.08893087 - e21: 0.33800942 - e22: 0.93693155 - e23: -1.7091992 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.0022553212 - e01: -0.98489475 - e02: -0.17313798 - e03: 0.35119626 - e10: 0.99999714 - e11: -0.0022172742 - e12: -0.00041315766 - e13: 0.05271416 - e20: 0.000023022436 - e21: -0.17313848 - e22: 0.9848973 - e23: -1.835659 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.0000010910009 - e01: -0.9999999 - e02: -0.0000075753733 - e03: 0.075255886 - e10: 1 - e11: 0.0000010911103 - e12: -0.000014428429 - e13: 0.034967784 - e20: 0.000014428435 - e21: -0.000007575358 - e22: 0.9999999 - e23: -1.8630311 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.00000014710542 - e01: -0.98122203 - e02: -0.19288169 - e03: 0.3983691 - e10: 1 - e11: -0.00000015733401 - e12: 0.000000037713082 - e13: 0.03667173 - e20: -0.000000067351756 - e21: -0.19288169 - e22: 0.98122203 - e23: -1.8266318 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.00008632226 - e01: -0.9834659 - e02: -0.1810929 - e03: 0.4113828 - e10: 0.99999905 - e11: -0.00016854276 - e12: 0.0013919829 - e13: 0.0323603 - e20: -0.0013994896 - e21: -0.18109284 - e22: 0.9834649 - e23: -1.8186507 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.00015588375 - e01: -0.9350461 - e02: 0.35452577 - e03: -0.5901334 - e10: 0.9999994 - e11: -0.00024842774 - e12: -0.0010949133 - e13: 0.03699954 - e20: 0.0011118685 - e21: 0.35452572 - e22: 0.9350454 - e23: -1.7686568 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 1.9389588e-13 - e01: -1.0000002 - e02: 2.5473903e-14 - e03: 0.07524184 - e10: 1.0000001 - e11: 1.9389634e-13 - e12: 0.000018961413 - e13: -0.034976285 - e20: -0.000018961413 - e21: 2.5470221e-14 - e22: 1 - e23: -1.8630323 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 9.0133055e-15 - e01: -0.99999994 - e02: -6.26449e-13 - e03: 0.07524176 - e10: 1.0000001 - e11: 9.0252165e-15 - e12: -0.000019010644 - e13: 0.034976386 - e20: 0.000019010644 - e21: -6.264489e-13 - e22: 1 - e23: -1.8630325 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: 0.00000015215483 - e01: -0.8550465 - e02: 0.51855177 - e03: -0.9257022 - e10: 1.0000001 - e11: 0.00000015586734 - e12: -0.000000036411016 - e13: -0.000093876544 - e20: -0.00000004969216 - e21: 0.5185516 - e22: 0.8550462 - e23: -1.545581 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.0000005262808 - e01: -0.99886405 - e02: -0.04765552 - e03: 0.13178028 - e10: -1.0000001 - e11: 0.000000039643908 - e12: 0.000010212498 - e13: -0.00001797356 - e20: -0.000010199005 - e21: 0.047655504 - e22: -0.99886376 - e23: 1.7703738 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - - e00: -0.00000036923834 - e01: -0.9991125 - e02: 0.042125687 - e03: -0.056011163 - e10: 1.0000001 - e11: -0.00000019127263 - e12: 0.000004228665 - e13: -0.00000764503 - e20: -0.000004216854 - e21: 0.042125676 - e22: 0.99911225 - e23: -1.7750582 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_BoneNameHashes: - m_RootBoneNameHash: 0 - m_BonesAABB: - - m_Min: {x: -0.28063667, y: -0.28403503, z: -0.13368443} - m_Max: {x: 0.21905982, y: 0.2840351, z: 0.23373535} - - m_Min: {x: -0.11539364, y: -0.08899302, z: -0.061968714} - m_Max: {x: 0.012046337, y: 0.08899299, z: 0.10078412} - - m_Min: {x: -0.2289916, y: -0.24826157, z: -0.11443418} - m_Max: {x: 0.097396374, y: 0.07275605, z: 0.25483555} - - m_Min: {x: -0.08281238, y: -0.06600772, z: -0.08804369} - m_Max: {x: 0.09371266, y: 0.085024245, z: 0.017281413} - - m_Min: {x: -0.09924188, y: -0.13184462, z: -0.10418594} - m_Max: {x: -0.019144025, y: 0.09642204, z: 0.11206055} - - m_Min: {x: -0.22356588, y: -0.092725515, z: -0.086848676} - m_Max: {x: 0.18968695, y: 0.07686353, z: 0.110217035} - - m_Min: {x: -0.2289918, y: -0.07275605, z: -0.11443418} - m_Max: {x: 0.097396165, y: 0.24826169, z: 0.25483555} - - m_Min: {x: -0.036419854, y: -0.09716973, z: -0.04440415} - m_Max: {x: 0.014602706, y: 0.056365788, z: 0.07863212} - - m_Min: {x: -0.09924187, y: -0.09642206, z: -0.10418594} - m_Max: {x: -0.01914404, y: 0.13184461, z: 0.11206055} - - m_Min: {x: -0.18471873, y: -0.21642499, z: -0.1391878} - m_Max: {x: 0.25049782, y: 0.21642505, z: 0.20279956} - - m_Min: {x: -0.20973635, y: -0.18928699, z: 0.028834436} - m_Max: {x: 0.17646289, y: 0.18928708, z: 0.19323996} - - m_Min: {x: -0.22002172, y: -0.21471798, z: -0.16401187} - m_Max: {x: 0.24933171, y: 0.21471807, z: 0.19323999} - - m_Min: {x: -0.036419883, y: -0.056365825, z: -0.04440415} - m_Max: {x: 0.014602646, y: 0.09716967, z: 0.07863212} - - m_Min: {x: -0.3631934, y: -0.13895413, z: -0.15614642} - m_Max: {x: 0.5664645, y: 0.19085766, z: 0.14525798} - - m_Min: {x: -0.08281247, y: -0.085024305, z: -0.08804393} - m_Max: {x: 0.09371259, y: 0.06600763, z: 0.017281294} - - m_Min: {x: -0.2420317, y: -0.26295525, z: -0.1802476} - m_Max: {x: 0.105311155, y: 0.10001679, z: 0.13116807} - - m_Min: {x: -0.24203157, y: -0.100016795, z: -0.18024743} - m_Max: {x: 0.105311304, y: 0.26295528, z: 0.13116825} - - m_Min: {x: -0.22356576, y: -0.07686341, z: -0.0868485} - m_Max: {x: 0.18968707, y: 0.092725754, z: 0.11021733} - - m_Min: {x: -0.36319345, y: -0.19085771, z: -0.15614635} - m_Max: {x: 0.5664644, y: 0.13895422, z: 0.14525914} - - m_Min: {x: -0.16543832, y: -0.05227506, z: -0.06383358} - m_Max: {x: 0.06442881, y: 0.064944506, z: 0.07338772} - - m_Min: {x: -0.06778228, y: -0.038571715, z: -0.0600721} - m_Max: {x: 0.0946565, y: 0.058603525, z: 0.045511257} - - m_Min: {x: -0.09047097, y: -0.055985726, z: -0.052356005} - m_Max: {x: 0.04419613, y: 0.046315476, z: 0.031476736} - - m_Min: {x: -0.037249684, y: -0.02353251, z: -0.016764224} - m_Max: {x: 0.045010626, y: 0.02979666, z: 0.026434004} - - m_Min: {x: -0.16543841, y: -0.064944625, z: -0.063833416} - m_Max: {x: 0.06442875, y: 0.052274942, z: 0.07338787} - - m_Min: {x: -0.06778225, y: -0.058603644, z: -0.060071923} - m_Max: {x: 0.09465656, y: 0.03857076, z: 0.04551146} - - m_Min: {x: -0.090471745, y: -0.04631621, z: -0.052355647} - m_Max: {x: 0.04419616, y: 0.055985983, z: 0.031477094} - - m_Min: {x: -0.037249625, y: -0.02979672, z: -0.01676482} - m_Max: {x: 0.045010626, y: 0.02353239, z: 0.026434124} - - m_Min: {x: -0.09317668, y: -0.05940081, z: -0.027597375} - m_Max: {x: 0.008774832, y: 0.07578242, z: 0.018503115} - - m_Min: {x: -0.21050997, y: -0.06512366, z: -0.07559467} - m_Max: {x: 0.08391547, y: 0.074214056, z: 0.1287378} - - m_Min: {x: -0.3430308, y: -0.08386719, z: -0.12032222} - m_Max: {x: 0.19892019, y: 0.085392386, z: 0.091935836} - - m_Min: {x: -0.09317663, y: -0.07578249, z: -0.027597554} - m_Max: {x: 0.008774817, y: 0.059400797, z: 0.018502988} - - m_Min: {x: -0.21050993, y: -0.074214056, z: -0.07559481} - m_Max: {x: 0.08391563, y: 0.06512372, z: 0.1287376} - - m_Min: {x: -0.3430303, y: -0.085392505, z: -0.12032212} - m_Max: {x: 0.19892076, y: 0.08386713, z: 0.09193601} - - m_Min: {x: -0.039132237, y: -0.012761101, z: -0.010061741} - m_Max: {x: 0.0032718182, y: 0.010814436, z: 0.007373333} - - m_Min: {x: -0.047635436, y: -0.012609109, z: -0.011873126} - m_Max: {x: 0.0047542453, y: 0.011813864, z: 0.009379029} - - m_Min: {x: -0.059686154, y: -0.01585634, z: -0.01216507} - m_Max: {x: 0.0113862455, y: 0.013648868, z: 0.02126789} - - m_Min: {x: -0.0652231, y: -0.013156697, z: -0.010499477} - m_Max: {x: 0.0054571033, y: 0.015668258, z: 0.018831372} - - m_Min: {x: -0.047863632, y: -0.04095626, z: -0.024464726} - m_Max: {x: 0.01372534, y: 0.031671226, z: 0.01764965} - - m_Min: {x: -0.045113266, y: -0.027678758, z: -0.024335027} - m_Max: {x: 0.008491039, y: 0.013661265, z: 0.01835525} - - m_Min: {x: -0.04493308, y: -0.019858956, z: -0.016367853} - m_Max: {x: -0.0007581115, y: 0.0151872635, z: 0.012036204} - - m_Min: {x: -0.040724277, y: -0.014115512, z: -0.014764488} - m_Max: {x: 0.0035269856, y: 0.015559256, z: 0.010768175} - - m_Min: {x: -0.04003179, y: -0.015662909, z: -0.011366248} - m_Max: {x: 0.020725131, y: 0.010958016, z: 0.009441972} - - m_Min: {x: -0.036494076, y: -0.011397868, z: -0.009776473} - m_Max: {x: 0.0025843382, y: 0.010800421, z: 0.00797379} - - m_Min: {x: -0.028196156, y: -0.012576073, z: -0.008397102} - m_Max: {x: 0.021186888, y: 0.00786835, z: 0.00696671} - - m_Min: {x: -0.027186394, y: -0.010439843, z: -0.007637739} - m_Max: {x: 0.0023379922, y: 0.0074032843, z: 0.0060909986} - - m_Min: {x: -0.037702978, y: -0.011665955, z: -0.010642886} - m_Max: {x: 0.0039432645, y: 0.011793584, z: 0.008161783} - - m_Min: {x: -0.04008746, y: -0.012966841, z: -0.010453463} - m_Max: {x: 0.004331112, y: 0.012857348, z: 0.008357406} - - m_Min: {x: -0.039132357, y: -0.01081457, z: -0.010061741} - m_Max: {x: 0.0032721162, y: 0.012760937, z: 0.007373214} - - m_Min: {x: -0.04763508, y: -0.011813998, z: -0.011873126} - m_Max: {x: 0.004754603, y: 0.012608945, z: 0.0093791485} - - m_Min: {x: -0.059685767, y: -0.013648927, z: -0.012164831} - m_Max: {x: 0.011386603, y: 0.01585628, z: 0.02126813} - - m_Min: {x: -0.047863394, y: -0.031671345, z: -0.024464607} - m_Max: {x: 0.013725609, y: 0.04095614, z: 0.01764965} - - m_Min: {x: -0.06522265, y: -0.015668347, z: -0.010499358} - m_Max: {x: 0.00545758, y: 0.013156593, z: 0.018831372} - - m_Min: {x: -0.040087104, y: -0.012857512, z: -0.010453582} - m_Max: {x: 0.00433141, y: 0.012966707, z: 0.008357525} - - m_Min: {x: -0.045112938, y: -0.013661444, z: -0.024334788} - m_Max: {x: 0.008491427, y: 0.02767855, z: 0.01835537} - - m_Min: {x: -0.0449329, y: -0.015187323, z: -0.016367733} - m_Max: {x: -0.00075793266, y: 0.019858718, z: 0.012036145} - - m_Min: {x: -0.0407238, y: -0.015559435, z: -0.014764488} - m_Max: {x: 0.0035274625, y: 0.014116406, z: 0.0107681155} - - m_Min: {x: -0.040031552, y: -0.010957956, z: -0.011366129} - m_Max: {x: 0.02072537, y: 0.01566273, z: 0.009441972} - - m_Min: {x: -0.028195798, y: -0.007867634, z: -0.008397222} - m_Max: {x: 0.021187186, y: 0.012575924, z: 0.006966591} - - m_Min: {x: -0.037701726, y: -0.011793733, z: -0.010643005} - m_Max: {x: 0.0039436817, y: 0.011665806, z: 0.008161783} - - m_Min: {x: -0.027186155, y: -0.0074034333, z: -0.0076378584} - m_Max: {x: 0.0023381114, y: 0.010439694, z: 0.0060908794} - - m_Min: {x: -0.03649372, y: -0.0108006, z: -0.009776592} - m_Max: {x: 0.0025847554, y: 0.011397719, z: 0.00797379} - - m_Min: {x: -0.1851809, y: -0.08969098, z: -0.06735518} - m_Max: {x: 0.12185621, y: 0.08969101, z: 0.1751191} - - m_Min: {x: -0.106750846, y: -0.06641794, z: -0.068496585} - m_Max: {x: -0.033257067, y: 0.066230066, z: 0.026996255} - - m_Min: {x: -0.08504662, y: -0.02783981, z: -0.028253317} - m_Max: {x: 0.043373942, y: 0.019784719, z: 0.05692351} - - m_Min: {x: -0.02392445, y: -0.02281256, z: -0.03620994} - m_Max: {x: 0.014379716, y: 0.060329434, z: 0.05244422} - - m_Min: {x: -0.05935902, y: -0.018676935, z: -0.03663385} - m_Max: {x: -0.0077573285, y: 0.03502846, z: 0.033177495} - - m_Min: {x: -0.02487199, y: -0.031017218, z: -0.038980126} - m_Max: {x: -0.0037528053, y: 0.055555645, z: 0.034766316} - - m_Min: {x: -0.07216969, y: -0.028418045, z: -0.008848786} - m_Max: {x: -0.049549043, y: 0.027897954, z: 0.041016817} - - m_Min: {x: -0.07216978, y: -0.027897926, z: -0.008848786} - m_Max: {x: -0.049549162, y: 0.028418079, z: 0.041016817} - - m_Min: {x: -0.030502021, y: -0.024894215, z: -0.0043758154} - m_Max: {x: -0.025646172, y: 0.024159538, z: 0.02631116} - - m_Min: {x: -0.069820076, y: -0.012914756, z: -0.010913134} - m_Max: {x: -0.035806984, y: 0.025227237, z: 0.0338856} - - m_Min: {x: -0.07427314, y: -0.015023012, z: -0.025303483} - m_Max: {x: -0.025400221, y: 0.020817842, z: 0.031095743} - - m_Min: {x: -0.03071832, y: -0.023907904, z: -0.021312594} - m_Max: {x: -0.001407288, y: 0.025037088, z: 0.018775463} - - m_Min: {x: -0.021073043, y: -0.015018508, z: -0.007820725} - m_Max: {x: -0.0046263337, y: 0.018561456, z: 0.0025053024} - - m_Min: {x: -0.02548717, y: -0.02350986, z: -0.018973827} - m_Max: {x: 0.006462276, y: 0.023417264, z: 0.038743973} - - m_Min: {x: -0.027694494, y: -0.040338933, z: -0.030228257} - m_Max: {x: 0.010145642, y: 0.04015106, z: 0.031414628} - - m_Min: {x: -0.058602452, y: -0.017932475, z: -0.030370831} - m_Max: {x: 0.012512326, y: 0.009739891, z: 0.0454973} - - m_Min: {x: -0.08504656, y: -0.019784525, z: -0.028253198} - m_Max: {x: 0.04337406, y: 0.02783984, z: 0.056923628} - - m_Min: {x: -0.02392447, y: -0.06032944, z: -0.03620994} - m_Max: {x: 0.01437965, y: 0.022812609, z: 0.0524441} - - m_Min: {x: -0.024871975, y: -0.055555664, z: -0.038980126} - m_Max: {x: -0.003752865, y: 0.031017194, z: 0.034766316} - - m_Min: {x: -0.059358954, y: -0.03502845, z: -0.03663385} - m_Max: {x: -0.0077572837, y: 0.018676963, z: 0.033177495} - - m_Min: {x: -0.022708982, y: -0.018163733, z: -0.010282278} - m_Max: {x: -0.004521191, y: 0.019734684, z: 0.005053282} - - m_Min: {x: -0.04026276, y: -0.021424929, z: -0.0071400404} - m_Max: {x: -0.02775409, y: 0.02123707, z: 0.012859464} - - m_Min: {x: -0.012558162, y: -0.009800173, z: -0.0053782463} - m_Max: {x: 0.009641051, y: 0.021603502, z: 0.01250577} - - m_Min: {x: -0.012172282, y: -0.012070935, z: -0.0054830313} - m_Max: {x: 0.004733205, y: 0.011883065, z: 0.012147784} - - m_Min: {x: -0.01849828, y: -0.018491149, z: -0.038225293} - m_Max: {x: 0.009657033, y: 0.023988858, z: 0.026907802} - - m_Min: {x: -0.009491563, y: -0.0073609166, z: -0.028499365} - m_Max: {x: 0.0045514703, y: 0.018791333, z: 0.0031753778} - - m_Min: {x: -0.0093963295, y: -0.018201934, z: -0.028730512} - m_Max: {x: 0.0011407286, y: 0.018014064, z: 0.0032652617} - - m_Min: {x: -0.018498287, y: -0.023988824, z: -0.038225293} - m_Max: {x: 0.00965701, y: 0.018491173, z: 0.026907682} - - m_Min: {x: -0.009491593, y: -0.01879134, z: -0.028499246} - m_Max: {x: 0.0045514405, y: 0.0073609427, z: 0.003175497} - - m_Min: {x: -0.012558222, y: -0.021603454, z: -0.0053783655} - m_Max: {x: 0.009640992, y: 0.009800218, z: 0.0125056505} - - m_Min: {x: -0.058602512, y: -0.009740073, z: -0.030370474} - m_Max: {x: 0.012512326, y: 0.017932296, z: 0.045497656} - - m_Min: {x: -0.07427326, y: -0.020817846, z: -0.025303483} - m_Max: {x: -0.02540052, y: 0.015022997, z: 0.031095743} - - m_Min: {x: -0.030718341, y: -0.025037006, z: -0.021312356} - m_Max: {x: -0.0014072731, y: 0.023907974, z: 0.018775463} - - m_Min: {x: -0.06982002, y: -0.025227208, z: -0.0109142065} - m_Max: {x: -0.035806954, y: 0.012914786, z: 0.0338856} - - m_Min: {x: -0.022709042, y: -0.019734696, z: -0.010282397} - m_Max: {x: -0.0045212507, y: 0.018163694, z: 0.0050531626} - - m_Min: {x: -0.021072924, y: -0.018561423, z: -0.007820964} - m_Max: {x: -0.0046263933, y: 0.015018536, z: 0.0025053024} - - m_Min: {x: -0.01652418, y: -0.016522959, z: -0.016523004} - m_Max: {x: 0.0063208267, y: 0.016523048, z: 0.016522884} - - m_Min: {x: -0.016524233, y: -0.016523037, z: -0.016523123} - m_Max: {x: 0.006320767, y: 0.016522966, z: 0.016522765} - - m_Min: {x: -0.0899955, y: -0.03976194, z: -0.02467668} - m_Max: {x: -0.017537892, y: 0.03957407, z: 0.026858449} - - m_Min: {x: -0.038336143, y: -0.023468845, z: -0.0063203573} - m_Max: {x: 0.0005879551, y: 0.023469165, z: 0.0051374435} - - m_Min: {x: -0.030621853, y: -0.02346915, z: -0.0057349205} - m_Max: {x: -0.00000090152025, y: 0.02346886, z: 0.006489396} - m_VariableBoneCountWeights: - m_Data: - m_MeshCompression: 0 - m_IsReadable: 1 - m_KeepVertices: 0 - m_KeepIndices: 0 - m_IndexFormat: 0 - m_IndexBuffer: 0000010002000300010000000400030000000300050001000100060002000200060007000700080002000900020008000000020009000a00070006000b0000000900040000000b0001000c00060005000c00010008000d0009000e0009000d000b0009000e000f000e000d0010000f000d0010000d000800110010000800110008000700120011000700120007000a00130006000c000a00060013000e0014000b0015000b00140014001600150017001500160018001100120018001900110019001000110019001a0010001a000f0010001b001a0019001c001b0019001c00190018001d001c00180018001e001d0012001e00180012001f001e0020001b001c00210020001c0021001c001d0022001f0012001200230022000a00230012000a00240023001a001b00250025001b0026001b002000260026002000270028001a00250029002700200029002000210021002a0029002a00270029002a002b0027002c0027002b00260027002c002d0026002c00250026002d0025002d00280028002d002e002f0028002e0030002f002e0031002e002d0030002e0031002d002c00310032003000310031002c0033003100330032002c002b00330032003300340033002b003500350034003300360035002b0036002b002a00370036002a0037002a00210021003800370038003900370039003600370039003a0036003a00350036003a003b0035003b00340035003c00300032003c003d0030003d002f0030003e003d003c0032003f003c00320034003f003c003f0040003c0040003e003e00400041003f003400420034003b00420042003b004300430044004200420045003f004400450042003f0046004000460041004000450046003f004400470045004500480046004700480045004700490048004a003e00410043003b004b004b004c0043004c00440043004c004d0044004d00470044004d004e0047004e00490047004e004f00490050004f004e00510050004e0051004e004d00500052004f00530051004d0053004d004c00540053004c0054004c004b00550054004b004b0056005500560057005500560058005700580059005700570059005a0058005b0059005c0057005a0059005d005a005a005d005e0059005f005d005b005f0059005b0060005f005d0061005e0062005a005e005c005a0062005e0063006200610063005e006100640063005f0065005d005d0065006600660061005d006500670066005f0068006500600068005f0060006900680066006a0061006a006400610067006a0066006a006b00640067006c006a006c006b006a006b006d00640064006d00630063006d006e0063006e00620062006e006f006c0070006b00700071006b0072006700650073006700720065007300720068007300650068007400730069007400680074007500730073007500760076006700730076006c006700760077006c00750077007600770070006c006e0078006f006f00780079006e007a0078006d007a006e007b0078007a006d007c007a007a007c007d007c0071007d007a007d007b007d0071007e007b007d007f007d007e007f007f007e008000780081007900810078007b0079008100820079008200830084007900830083008200850084008300860086008300870083008500870087008800860087008500890089008a0087008a00880087008a008b0088008c008a0089008c008d008a008d008b008a008d008e008b0088008f00860086008f009000860090008400880091008f008b00910088008b00920091008e0092008b00840090005c005c006f00840062006f005c006f00790084008f00930090009000930055008f0094009300910094008f00910095009400920095009100930054005500930096005400940096009300940097009600950097009400970095009800980095009900950092009900990092009a009b009700980098009c009b00980099009d009d009c0098009d0099009e0099009a009e009e009a009f009f00a0009e009e00a1009d00a000a1009e00a000a200a100a300a100a200a4009d00a100a400a100a3009c009d00a400a200a500a3009a00a6009f009f00a600a7009a008e00a600a700a8009f00a800a0009f00a800a900a000a900a200a000aa00a200a900a900ab00aa00ab00a900a800a800ac00ab00ab00ac00ad00aa00ab00ad00aa00ad00ae00a600af00a700a700af00b000a600b100af008e00b100a600b000b200a700b200a800a700b200ac00a800b200b300ac00b400ac00b300b300b500b400b600b000af00af00b700b600b100b700af00b500b800b400b900b200b000b900b300b200ba00b900b000ba00b000b600ae00ad00bb00ad00bc00bb00bc00b400bd00bd00b400b800bb00bc00bd00bc00ac00b400be00b500b300b300bf00be00b900bf00b300bf00b900ba00c000b800b500ad00ac00bc00b700b100c100c100b1008d00c1008d008c00b1008e008d0092008e009a00c2002800c3000f002800c200c30028002f000f001a002800c2000e000f00c300c400c200c3002f00c400c200c400c500c200c5000e00c4002f00c6002f00c700c6000e00c500c800c800c500c900c900c500ca00c500c400ca00ca00c400cb00c400cc00cb00c600cc00c400c600cd00cc00c700cd00c600c700ce00cd00cf00c800c900c900ca00d000d000ca00d100ca00cb00d100d100cb00d200cb00cc00d200d200cc00d300cc00cd00d300d300cd00d400cd00ce00d400d400ce00d500d600c900d000cf00c900d600d700cf00d600d700d600d800d800d600d900d600d000d900d900da00d800db00d800da00dc00d700d800da00dd00db00d900d000de00d000d100de00de00d100df00d100d200df00de00e000d900e000da00d900df00d200e100d200d300e100e100d300e200d300d400e200e200d400e300d400d500e300e300d500e400df00e500de00e500e000de00e600d800db00e700d800e600dc00d800e700e800dc00e700e000e900da00e000e500e900da00e900ea00e900e500eb00e500ec00eb00e100e200ec00ed00e100ec00ed00ec00e500df00e100ed00ed00e500df00ec00e200ee00ec00ee00eb00e200e300ee00eb00ee00ef00eb00ef00e900ee00e300f000ee00f000ef00e300e400f000ef00f000f100f000e400f200f000f200f100f100f200f300e900ef00f400ef00f100f400f400f500e900e900f500ea00f500f400f600f600f700f500dd00f500f700ea00f500dd00f400f100f800f600f400f800f100f300f800f600f800f900f900fa00f600fa00f700f600f800f300fb00f900f800fb00fc00fb00f300f200fc00f300fd00fa00f900fe00fb00fc00ff00fc00f200fc00ff0000010001ff00010102010101ff000301fc000001fe00fc0003010001040103010101050100010501040100010501060104010701050101010801070101010801010102010901080102010a01060105010a010b01060105010c010a0107010c01050107010d010c010d010e010c010c010e010f010c010f010a010d0110010e010a010f01110111010b010a010f0112011101110112011301110113010b010f01140112010e0114010f010e0115011401100115010e011001160115010b011301170118010b01170119010b0118011a011901180117011b01180118011b011c011d0118011c011c011b011d011a0118011d011d011b011e011f011d011e0120011a011d0120011d011f01170121011b0113012101170113012201210123011b0121011e011b01230121012401230122012401210125011e0123011f011e0125012601240122011201260122012301270125012401270123012401280127012901280124012901240126012a01290126012b01280129012b0129012a0114012a0126011401260112012c0128012b012b012d012c012c012d012e012b012f012d012a012f012b0115012f012a0115012a01140116012f011501120122011301300116011001100131013001300131013201330132013101330131013401340131010d01310110010d013501330134013601330135013601370133013701320133013801360135013901370136013a01390136013a01360138013b013a013801350134013c013c013401070134010d0107013d0135013c01380135013d013e0138013d013b0138013e013f013b013e013c010701080140013c0108013d013c01400141013d0140013e013d01410142013e0141013f013e01420143013f01420143014201440144014201450142014101450145014101460141014001460146014001090140010801090147013f014301470148013f0149014801470149014a0148014b014a0149014b014c014a014d014a014c014a014e0148014e014a014d0148014e013b0148013b013f0143014f01470147014f015001470150014901490150015101490151014b014b01510152014f01530150015001530154014f015501530156015001540151015001560157015101560152015101570153015801540153015501580158015501590159015a01580154015b015601540158015b0158015c015b0158015a015c015d0155014f0143015d014f015d015e0155015f0155015e01590155015f01600159015f015a015901600144015d0143015f015e01610161015e01620163015f01610160015f0163015e016401620164015e015d015d01440164016201640165016401440166016401660165016501660167016601680167016701680169016a0169016801680146016a016601450168014501460168014401450166016b0169016a016b016c0169016d0169016c01670169016d016e0167016d01650167016e016f0165016e01620165016f01700162016f0171016c016b01710172016c0173016c0172016d016c01730174016d0173016e016d01740175016e0174016f016e01750176016f01750170016f0176017701700176017801720171017801790172017a0172017901730172017a014f007a0179017b0173017a01740173017b0152007b017a0152007a014f007c0174017b01750174017c017d0175017c01760175017d017e0176017d01770176017e017f017e017d017d0180017f017c0180017d017c018101800181017b0152007b0181017c018201810152004f0079014900490079018301830179017801840181018201810184018001850184018201800184018601800186017f017f01860187018801870186018901860184018901840185018801860189019c0089018501a40088018901a40089019c0087018a017f018a017e017f019c0085019b009b0085018b01850182018b018b01820150009b008b018c018c018b0151008b0150005100a3008801a400a3008d0188018d01870188018d018e0187018e018a018701a5008d01a300a5008f018d018f018e018d0190018f01a50091019001a5008c0197009b009101a500a2009101a200aa009101aa0092019201900191019201aa00ae0097008c01960096008c0153008c015100530096005300540038001e0093019301940138001e00950193019301950194019401950196019601970194011d001e0038001f0095011e009801970196019801990197019a019901980197019b019401380094019b019c019b01970199019c0197019d019c0199011d00380021009b01390038009b019e0139009c019e019b019c019f019e019d019f019c019e013a0039009e01a0013a009f01a0019e01a101a0019f019f019d01a101a1019d01a201a0013b003a004b003b00a0014b00a001a101a10156004b00a101a3015600a201a301a101a30158005600a4015b005800a401a5015b00a601a501a401a601a701a501a801a701a601a701a901a501a501a9016000a50160005b00a90169006000aa01ab01ac01ad01ab01aa01ad01ae01ab01ab01af01ac01ac01af01b001ab01b101af01ae01b101ab01ae01b201b101b301ae01ad01b301b401ae01b401b201ae01b401b501b201b601b401b301b601b701b401b701b501b401b701b801b501b901b701b601ba01b901b601b601b301ba01ba01b301bb01b301ad01bb01bc01ba01bb01bb01ad01bd01bb01bd01bc01bc01bd01be01b901bf01b701bf01b801b701c001bc01be01c101c001be01be01c201c101bd01c201be01bd01aa01c201c301ba01bc01c301c401ba01c401b901ba01c401c501b901c501bf01b901c501c601bf01c601b801bf01c701b801c601bc01c801c301c801c901c301c901c401c301c901ca01c401ca01c501c401ca01cb01c501cb01c601c501cb01cc01c601c601cc01cd01c601cd01c701c701cd01ce01cc01cf01cd01cd01cf01d001cd01d001ce01ce01d001d101d201ca01c901d201d301ca01d301cb01ca01d401cb01d301cc01cb01d401d501d401d301d501d301d201d601cc01d401cf01cc01d601d701d501d201d801d201c901d701d201d801d901d701d801d601d401da01da01d401db01db01d401d501dc01db01d501dc01d501d701dd01dc01d701dd01d701d901db01de01da01df01dc01dd01df01e001dc01dc01e001e101e101db01dc01e101de01db01e101e201de01e001e201e101e001e301e201df01e401e001e001e401e301e401e501e301df01e601e401dd01e601df01e401e701e501e601e701e401dd01e801e601d901e801dd01e801e901e601e601e901e701e901ea01e701e701eb01e501ea01eb01e701ea01ec01eb01e301e501ed01e501eb01ed01e301ed01ee01e201e301ee01ed01eb01ef01eb01f001ef01ec01f001eb01e801f101e901f201f101e801f101f301e901f301ea01e901f301f401ea01f401ec01ea01f401f501ec01f601ec01f501f001ec01f601f701f001f601f201f801f101f901f801f201f901fa01f801fb01f801fa01f801fc01f101fc01f301f101fc01fd01f301fd01f401f301fd01fe01f401fe01f501f401fe01ff01f5010002f501ff01f601f50100020102f6010002f701f60101020202f901f2010202f201d9010302f901020203020202040204020202c8010202d801c801d901d801020203020402050205020402c00106020502c00105020702030208020502060208020902050205020902070209020a0207020602c001c1010402bc01c0010402c801bc01d801c901c801d901f201e80107020a02fa010702fa01f90103020702f901fa010a02fb01fb010a020b020c02fb010b020d02fb010c020d020e02fb010f020e020d020e02f801fb010f0210020e020e021002fc010e02fc01f8011002fd01fc01fd011002110211021002120210020f02120212020f0213020f02140213020d0214020f020d02150214020c0215020d021102fe01fd0111021602fe0117021602110211021202170217021202180212021902180213021902120213021a02190214021a02130214021b021a0215021b02140217021c0216021602ff01fe0116021d02ff011c021d0216021e02ff011d021d021f021e021c0220021d0220021f021d021f0221021e021e022102220201021e02220200021e0201020002ff011e0223021c021702170218022302230224021c02240220021c022302180225022502260223022602240223022702260225022802270225022502190228021902290228022a02280229021a02290219021a022b0229022c0229022b022a0229022c021b022b021a022d02270228022d0228022a022e0227022d022f022d022a022e022d022f022f022a02300230022a022c02180219022502310227022e0231022602270232022602310232022402260233022402320233022002240234022002330234021f02200235021f023402350221021f023602210235023702ef013802ef0139023802ed01ef013702f0013902ef013902f001f701ee01ed013702480083013a0283013b023a0249008301480048003a02460046003a023c023a023d023c023b023d023a023d0241003c023c02410046003b023e023d023e023f023d023e0240023f02d5003f0240023d023f024a004a0041003d023f0241024a00ce0041023f02ce003f02d5004102ce00c7003d004102c7003e0041023d0041023e004a003d00c7002f00d5004002e400e40040024202ff00e40042024302ff004202440242024002430242024402440240023e024502430244020201ff0043024602020143024602430245026b0146024502f200e400ff000901020146026a01090146026a0146026b01460109016a016b0145027101710145024702450244024702470244023e02710147027801780147023b0247023e023b0278013b0283014802030049024902030004004a02030048024a0205000300490204004b0249024b0248024b020400150048024b024c024b02150017004d024b0217004c024b024d0204000b0015004d0217004e024e0217004f02170016004f024f021600d7001600cf00d700cf00160014004f02d700dc0050024f02dc004e024f0250021400c800cf00c80014000e005002dc00e800510252021a01530252025102530254025202520219011a0152025502190154025502520254025602550204015502560206011901550206015502040151021a0120015702560254025802570254025802540253025902570258020b01190106015a025b025c025d025a025c025e025b025a025e025f025b0260025f025e025b0261025c025c02610262025b02630261025f0263025b0264025c0262025d025c02640265025d0264026602650264026402620266026602620267026202680267026102680262026102690268026302690261026a026602670267026b026a0268026b02670268026c026b0269026c0268026d02650266026e026d0266026e0266026a026f0265026d0270026d026e026d0270026f026f02700271027202710270027002730272026e02730270026e02740273026a0274026e026a02750274026b0275026a026b02760275026c0276026b02760277027502750277027402740277027802740278027302790277027602730278027a0273027a02720272027a027b027c027b027a027a0278027c027c0278027d02780277027d027d0277027e02770279027e027e0279027f027b02800272028002710272028002810271028202710281027d027e02830283027e0284027e027f02840284027f02850286027d0283027c027d02860287027c02860288027c02870288027b027c028902880287028a02810280028b028a0280028b0288028c028c02880289028d028b028c028e028c0289028d028c028e028a028f0281028f029002810281029002820290029102820292028a028b0292028b028d02920293028a0293028f028a027b0288028b028b0280027b029002940291029502940290028f0295029002960295028f02930296028f029702960293029802970293028d0298029202980293029202990298028d029a02960297029b02940295029c02950296029c0296029a029b0295029c029d029c029a029e029b029c029e029c029d0299029f0298029f0297029802a0029f029902a10297029f029f02a002a1029a029702a102a102a002a202a3029a02a1029d029a02a302a102a402a302a202a402a102a202a502a4028e0299028d02a60299028e02a602a0029902a702a002a602a002a702a202a202a702a802a802a502a202a9029b029e02a902aa029b02ab02aa02a902ab02ac02aa02aa02ac02ad02ab02ae02ac02ac02af02ad02ad02af02b002ac02b102af02ae02b102ac02ae02b202b102aa02ad029402aa0294029b029402ad02b302ad02b402b302b002b402ad02b302b402b5029102b302b5029402b30291029102b502b602b602b502b702b702b802b602b502b902b702b502b402b902ba02b802b702b702bb02ba02ba026502b802bc02bb02b702b702b902bc02bb02bd02ba02ba02bd02be02be026502ba02be025d026502be02bf025d02bd02bf02be02bf025a025d02b602b802820282029102b6028202b8026f02b80265026f026f0271028202c002c102c202c2025601c00256015b01c0025b01c302c002c002c302c1025b015c01c30257015601c202c202c40257015701c402c502c6025701c502c702c402c202c202c102c70252015701c602c8025201c6024b015201c802c8024c014b01c902c402c702ca0261017001610162017001ca027001770163016101ca029e02cb02cc029d02cb029e029d02cd02cb02a302cd029d02a302ce02cd02cb02cf02cc02cc02cf02d002cb02d102cf02cd02d102cb02cd02d202d102ce02d202cd02ce02d302d202d302d402d202d202d402d102d102d402d502d102d502cf02d602d502d402cf02d502d702cf02d702d002d002d702d802d902d702d502d902d502d602da02d802d702da02d702d902d902d602db02da02d902dc02dc02d902db02dd02d302ce02a402dd02ce02a502dd02a402a402ce02a302de02d402d302df02d402de02d602d402df02d602df02e002db02d602e002e102d802da02e102e202d802e302d802e202e102da02e402e402da02dc02e502e202e102e502e602e202e702e202e602e302e202e702e502e102e802e802e102e402e902e502e802e302e702ea02ea02d002e302ea02e702eb02ab02ea02eb02cc02d002ea02a902cc02ea02a902ea02ab029e02cc02a902eb02ae02ab02eb02ec02ae02e702ec02eb02e702ed02ec02e602ed02e702ec02b202ae02ec02ee02b202ed02ee02ec02ed02e602ef02f002ed02ef02ee02ed02f002f002ef02f102f102ef02f202ef02f302f202ef02e602f302f202f302e902f302e602e502f302e502e9024e01f4023a014d01f4024e01f40239013a014e013a013b01ad01aa01bd01820152005000130024000a00900057005c005500570090007c006d006b006b0071007c00ea00dd00da00d002d802e302e002df02f502f602f702f802f902f702f602f902fa02f702fb02f902f602fa02fc02f702f702fc02fd02f702fd02f802fe02fd02fc02ff02fc02fa02f802fd0200030103fd02fe02fe020203010302030303010301030303fd02fd0203030403fd02040300030303050304030003040306030403050306030603050307030503080307030903070308030a03090308030b030a0308030b030803050305030c030b030d03030302030e030d0302030d030f0303030f0305030303100305030f0311030503100311030c03050312030c03110311031303120310031303110310031403130314030f030d030f03140310030d031503140315031303140316031203130316031303150317030d030e03170315030d0318030c0312031903180312031903120316031a031803190318031b030c030c031b031c0318031d031b031a031d0318031e031b031d031f031b031e0320031b031f031c031b0320031c03200321031e0322031f031f032203200320032203230321032003230322032403230323032403210321032403250326032103250327032603250325032403270327032403280328032903270321030c031c03270329032a032a03260327032a0329032b0329032c032b032a032d0326032b032e032a032e032d032a032f032b032c032d030a03260330032d032e0331032d03300331030a032d03300332033103320309033103310309030a033303090332033303320334033403350333033603350334033603340337033703380336033803000336033903380337033903f8023803f802000338033a03340332033b03320330033a0332033b0334033c03370337033d03390339033d033e033e03f6023903f602f80239033f033e033d033f03fb023e03fb02f6023e033d0340033f0340033d034103370341033d033c03410337034103420340034303fb023f034403fb0243033f03450343034603430345034403430346034703fb02440344034803470348034903470347034903f9024703f902fb024a03f90249034b03490348034c03f9024a0349034d034a034a034d034c034c034d034e034e03fa024c034c03fa02f9024f034e034d03ff02fa024e035003ff024e0350034e034f035103ff02500351035203ff02530352035103530354035203fe02520354035203fc02ff02fc025203fe0255035403530355030203540354030203fe020e03020355034f034d03560356034d03570357034b03560356034b03580358034b03590359034b035a034b0348035a035a0348035b0344035a035b035b0348034403570349034b0346035a0344035c035a03460359035a035c03460345035c035c0345035d035e035d0345035e0345033f035f035d035e035f035e0342033f0340035e0342035e03400357034d0349036003420341034103610360036003610362034103630361036103640362036203640365036103660364036303660361036603670364036403670365036503670368036903680367036a03690367036a03670366036a0366036b036c036a036b036b0366036d03660363036d036d0363036e036f036a036c036f0369036a036c0370036f036f03700371036f03710369036903710372037003730371037103730374037103740372037203740375037603680369036903720376037603720377037203780377037503780372036e0363037903790363037a0379037a037b037b037a037c037a033a037c037c037d037b037b037d037e037c033b037d033a033b037c037d037f037e0380033a037a037a033c03800363033c037a0381037f037d03810382037f037f0382038303800334033a0380033c0334033c03630341038203810384038403810385038103860385037d03860381037d03870386033b0387037d038803860387038903880387033b03890387038a03880389032e038a038903890330032e038a038b0388038c038a032e032f038a038c032f038d038a038d038b038a038d038e038b038e038f038b038b038f03880388038f03900390038603880391038603900385038603910390038f03910392038503910391038f039303910393039203920393039403950394039303960393038f038f038e03960395039303960396039703950398038d032f038d039803990399038e038d03990398039a039b0399039a039b039c0399038e0399039c039c039b039d039e039c039d039f039e039d039d03a0039f039b03a0039d039b03a103a0039a039803a1039a03a1039b03a1039803a20398032c03a2039e03a3039c03a3039e03a403a503a4039e03a5039e039f03a603a303a403a703a603a403a703a403a503a303a603a803a603a903a803aa03a903a603aa03a603a703ab03a803a903ac03ab03a903ac03a903aa03ab03ad03a803ad03ae03a803a8038e03a303ae038e03a8038e039c03a30396038e03ae03aa03af03ac03ac03af03b003b103b003af03aa03b203af03a703b203aa03b303af03b203b103af03b303b303b203b403b403b203b503b603b003b103b703b003b603b803b003b703b503b203b903b903b203ba03a703ba03b203bb03b903ba03a503bb03ba03a503ba03a703b803bc03b003b003bc03bd03bc03be03bd03bf03bd03be03c003bd03bf03c003b003bd039f03bb03a5039f03c103bb03a003c1039f03a003c203c103c203c303c103c103c303bb03bb03c303c403bb03c403c503bb03c503c603c603b903bb03c703be03bc03bf03c803c003c003c803ab03c903c303c203c203ca03c903c203cb03ca03c203cc03cb03cd03cc03c203ce03cc03cd03a203ce03cd032c03ce03a203ce032c032903cf03cc03ce03ce03d003cf032903d003ce03d003d103cf03cf03d103d203d0032403d103d203d103d303d303d1032203d1032403220328032403d003d00329032803a203cd03a103a103cd03c203d30322031e03a103c203a0032f032c0398038c032b032f038c032e032b03d4039403d503d503d603d40392039403d403d703d603d503d5039403d703d7039403d803d703d803d603d603d803d9039503d903d803d803940395039703d9039503840385039203da03970396039603db03da03ae03db039603db03ae03ad03c803ad03ab03c003ab03ac03ac03b003c003350307033303330307030903060307033503360306033503000306033603dc03dd03de03df03dd03dc03e003df03dc03df03e103dd03e003dc03e203e203dc03e303dc03de03e303e403e203e303e203e503e003e303de03e603e703e403e303e703e303e803e803e303e903e303e603e903e903e603ea03e703e803eb03e703eb03e403eb03e803ec03e403eb03ed03eb03ee03ed03ef03e403ed03ef03e503e203e203e403ef03ef03f003e503ed03f103ef03f103f003ef03ee03f103ed03eb03ec03f203f203ee03eb03f203ec03f303e803f403ec03ec03f403f503f603ec03f503f303ec03f603e803f703f403e903ea03f703e903f703e803f703ea03f803f903f403f703f403f903f503fa03f603f503f503f903fa03fb03f903f703f903fb03fa03fa03fb03fc03fc03fd03fa03fd03f603fa03fb03f703fe03fb03fe03fc03fe03f703ff03fc03fe030004f7030104ff03f8030104f7030204fe03ff03ff030304020401040304ff030404020403040504030401040104f80305040504f803060406040704050407040804050408040304050409040304080404040304090409040a04040408040b0409040b04080407040b040c0409040c040a0409040c040d040a040e040a040d0406040f0407040f040604100411040f041004110412040f04120411041304e60313041104140412041304de0314041304de031304e6030f0415040704070416040b0415041604070417041604150418040c040b04160418040b0412041404190414041a041904dd031a041404dd031404de031b0419041a04e1031b041a04e1031a04dd0319041b041c041c041d0419041e041d041c041f041b04e10320041b041f041f04210420041f04e1032204220421041f042204e103230424042204230422042504210424042504260426042204240426042504220425042704210421042704200420042704280428042904200429041b04200429041e041c041c041b0429042a041e0429042a0429042804240423042b042b042304df032c042b04df032b042d0424042d04250424042d042e0425042e04270425042f042c04df032f04df03e003e00330042f0431042f0430042c042f0431042c0431042b043004320431042b043104330433042d042b0434042d043304310434043304320434043104e5033004e003e50335043004350432043004f0033504e50336042d04340436042e042d042304e103df0337043804390439043a0437043b04380437043c043b04370437043d043c043a043d0437043d043a043e043f043d043e0440043e043a0440043a04390441044004390439044204410438044204390443043e0440044004440443044404400441044504440441044104460445044204460441044304440447044704440445044804470445044504490448044604490445044a0449044604460442044a044a0442044b044c044b0442044d044c04420447044e04430447044f044e044f04470448044e044f0450044f0451045004480451044f044804520451044904520448044904530452045304540452045204540451045104540455045104550450045604550454045404570456045704580456045804590456045904550456045a0455045904500455045b045b0455045a0450045c044e0450045b045c045c045b045a045d045c045a045e044e045c045d045e045c045e0443044e045e043e0443045a045f045d045a0460045f04590460045a046004590458040e0460045804580461040e0462040e0461046104630462045f0464045d045f04650464045f040d0465040d0460040e0460040d045f040c046404650465040d040c04640466045d0466045e045d045e04660467046804670466046804660464046904630461046a04690461046b0469046a046b046c04690469046c046d0469046d04630463046d046e04620463046f046f046304700404046f0470040a046f0404046f040a040e047004020404046304020470046e040204630402046e0471046e046d04710471046d0472047304020471047404710472047304710474047404fe0373047304fe0302047504740472046d04750472046c0475046d040004fe037404760400047404760474047504770400047604780400047704fc03000478047804fd03fc036f040e04620479043b047a047b047a043b047c047b043b0438043b0479044d04380479047c043b047d047d043b047e04420438044d047e047f047d047d047f0480047f047e04810481047e043c047e043b043c043c04820481043d0482043c0482043d043f0483043f043e0484043f048304830485048404840485048604850487048604850483045e0483043e045e04670485045e0488048704850485048904880467048904850467048a0489048a048b0489048c048b048a048a048d048c0489048b048e0489048e04880488048e048f04900488048f0487048804900491048b048c04920491048c048c048d04920492048d0493049304940492049504940493049504930496049604930417049704960417049804960497041704150497049704150499049a04970499040f049a049904990415040f0493041604170493049b041604920494049c049c04910492049c0494049d0412049a040f0412041d049a0497049e0498049e0497049a049a041d049e0498049e049f049e04a0049f049e041d04a104a204a1041d04a304a104a204a304a404a104a504a104a404a504a0049e049e04a104a504a004a504a604a604a504a704a504a804a704a404a804a504a604a704a904a904a704aa04aa04ab04a904a704ac04aa04a804ac04a704ad04ac04a804a804ae04ad04ae04a404a304a404ae04a804af04ab04aa04aa04ac04af04af04b004ab04af04ac04b104b204b004af04af04b104b204b204b104b304b104b404b304b504ac04ad04ac04b504b104b104b504b604b604b404b1044904b704b8044904b804b904b90453044904b70449044a04ba04540453045404ba04bb045404bb04bc04bc04570454046a04580457046a0461045804680418049b04640418046804180464040c049b048d04680468048d04bd04bd048d048a04bd0467046804bd048a0467048d049b0493049b04180416048e04be04bf04c004bf04be04c1048e04bf04c104bf04c004c0048f04c1048f048e04c1048b04be048e0490048f04c004f80310040604ea031004f803ea0311041004e6031104ea030a032103260321030a030b030b030c032103300389033b03a2041d041e0419041d041204c204c304c404c504c304c204c404c504c204c304c604c404c404c604c704c804c404c704c604c804c704c304c904c604c604c904ca04cb04c904c304cb04c304c504cc04c904cb04cc04cd04c904c904cd04ca04ca04cd04ce04ce04cf04ca04d004ca04cf04c604ca04d004d004c804c604d104ce04cd04d204d104cd04d204cd04cc04d304c404c804d304c504c404d404cf04ce04d504d404ce04d504ce04d104d104d604d504d104d704d604d504d604d804d904d504d804da04d804d604d604d704da04da04d704db04dc04d904d804dc04d804da04dd04dc04da04da04db04dd04dd04db04de04df04d504d904df04d404d504e004dc04dd04e004dd04e104e104dd04e204e304e104e204e204e404e304e504e004e104e104e604e504e704e604e104e704e104e304e704e804e604e804e904e604e604e904ea04e604ea04e504e504ea04eb04e804ec04e904ed04eb04ea04ea04e904ed04ed04e904ee04e904ec04ee04ee04ec04ef04ef04f004ee04f104ee04f004ed04ee04f104f004f204f104f304f104f204f404ec04e804f404f504ec04f604f504f404f404e804f604f604e804f704f704f804f604f604f804f904f904f504f604fa04f504f904f804fa04f904f704e304f804e304e404f804f804e404fb04fb04fa04f804e404fc04fb04fb04fc04fa04fa04fc04fd04fc04fe04fd04fd04fe04ff04fc040005fe0401050005fc04e704e304f704f704e804e704fe04000502050205000503050405fe040205ff04fe0404050005050503050005010505050305050506050505010507050805050507050905050508050a0505050905060505050a05080507050b050b0507050c05070501050c050c0501050d050d0501050e050e05e4040d050d05e4040f050f05e40410051005e40411051105e404e204e204dd0411051105dd0412051105120510051005120513050e05fc04e4040a0509051405140509051505150516051405170516051505170518051605190518051705190517051a0519051a05180517051b051a05170515051b0518051a051c051a051d051c051b051d051e051a051b051e051e051d051a051b0515051f051f0520051b0520051d051b0509051f051505210520051f051f050b05210508051f05090508050b051f05220523052405240525052205260523052205260527052305230527052805270529052805280529052305230529052a0523052a05240524052a052b052a052c052b052a0529052d0529052e052d052e052a052d052f052b052c0530052905270530052e05290531052c052a0531052a052e0532052505240524052b05320532052b05330533052b052f05320534052505350533052f0536053205330536053305350536053505370537053505380539053705380537053a05360534053a053b0536053a053c053c053a0534053c05340532053c05320536053d053a0537053d05370539053a053e053b053f053a053d053f053e053a0540053f053d053d0541054005390541053d0541054205400543054205410542054305440544054305450546054405450547054205440548054405460544054805470547054805490546054a05480548054b0549054a054b0548054b054c05490549054c05470547054c054d054d054e0547054e05420547054f0542054e05400542054f05f30440054f054e0550054f05500551054f054b054a05520552054a05530552055305540554055505520554055305560557055605530553055805570559055205550556055a05540554055a055b055c0554055b055a055c055b0556055d055a0556055e055d055e055a055d055f0554055c055f055505540560055e05560560055605570561055a055e0561055c055a054a055805530558054a0546054b055205590559054c054b0562056305640563056505640565056605640567056405660562056405670568056305620568056205690568056a056305690562056b056c0569056b0562056c056b0567056c0562056d05680569056e0568056d0569056e056d056a056f0563056f0565056305700568056e0570056a05680571056e056905710569056c05670566057205670572056c057205660573056c057205740575056c05740572057505740576057305660577057505720572057805770573057805720573057905780577057a05750577057b057a057c057a057b0575057a057c05770578057d057d057b0577057d0578057e0578057f057e0579057f0578057c056c0575058005790573058005730576057605660565056505810576056505820581058305810582058205840583058505840582058205860585058705810583058805810587058905810588058a0589058805760581058905760589058005800589058b058b0589058a058a058c058b058b058c058d0579058b058d058e0579058d058d058c058e058e058c058f058705830590059005830591059105920590059305870590058805870593059405880593058a058805940551058a0594058c058a05510595055105940596058c0551058f058c059605970590059205940597059505930590059705930597059405980595059705920598059705990595059805ed049905980599054f0595054f0551059505eb04980592059805eb04ed049a05eb0492059a0592059105f1049905ed049905f104f304f3044f059905e504eb049a059a05e004e504960551055005e0049a059b059b059a059c059b059c059d059d059c059e059f059d059e05a0059f059e059e05a105a0059c05a1059e059c059a05a105a2059b059d05a305a2059d05a3059d059f059f05a405a305a1059a05a505a6059f05a005a7059f05a605a805a205a305a305a905a805a405a905a305a905a405aa05aa05a405ab05ac05ab05a405ac059f05a705ac05a4059f05aa05ab05ad05ad05ab05ae05ad05ae05af05af05ae05b005b105af05b005b105b005ae05ae05b205b105b105b205b305b205b405b305b405b105b305ae05b505b205b505ab05ac05ab05b505ae05ac05b605b505a705b605ac05b705b505b605b205b505b705b705b405b205b805af05b105b805b105b405b905ba05bb05bb05bc05b905ba05bc05bb05b905bc05bd05bd05be05b905bd05bc05bf05c005bd05bf05bc05c005bf05c105ba05b905b905be05c105c105be05c205be05c305c205c405bd05c005c405c505bd05bd05c505c605c605be05bd05c705c605c505c605c805be05c805c305be05c905c605c705c905c805c605ca05c005bc05ca05bc05ba05c805c905cb05cb05c905cc05cc05cd05cb05ce05cb05cd05cf05c805cb05cf05cb05ce05c305c805cf05c905d005cc05c705d005c905cd05d105ce05d005d205cc05cc05d205d305d305cd05cc05d305d405cd05d405d105cd05d405d505d105d605d305d205d705d505d405d805d505d705d905d705d405d905d405d305d905d305d605da05d905d605db05d505d805d805dc05db05db05dc05dd05d805de05dc05dc05df05dd05dd05df05e005dc05e105df05de05e105dc05e205df05e105de05e305e105e105e405e205e305e405e105e505e005df05e405e605e205e205e605e705e805e205e705e405e905e605e605e905ea05e905ef04ea05e405eb05e905e305eb05e405e305f204eb05ec05ef04e905e905f004ec05ec05f004ef04eb05f004e905eb05f204f004ed05e205e805e505ed05ee05ed05ef05ee05e805ef05ed05f005ee05ef05f105ee05f005ee05f105e505e505f105f205f205f105f305f305f105f405f105f005f405f405f005f505f605f405f505f305f405f705f705f405f805f805f405f605f905f805f605f805fa05f705fb05fa05f805fb05f805f905fb05f905fa05f705fa05fc05fa05f905fd05fa05fe05fc05fc05fe05f705fd05fe05fa05f705fe05ff05f705ff05f305f305ff050006f3050006f205f2050006010601060206f205f2050206e5050206e005e505df05ed05e505ed05df05e2050306040605060606030605060406060605060706060604060806060607060706090608060906060608060a060706040604060b060a060b060c060a060d060a060c060e06040603060e060b0604060f06090607060f06070610061006070611060d061006110611060a060d06110607060a0612060c060b06130610060d061406060609061406030606060c061206150615061206160617060c0615060d060c0617060d0617061306130617061806150619061706170619061806180619061a061b061a061906150616061c061c06190615061c0616061d061d061e061c061e0619061c061b0619061e061e06dd041b06dd041f061b061f061a061b0620061e061d0613051e0620061205dd041e0612051e061305de041f06dd042106f20422062206230621062406210623062306d7052406f304f2042106de05230622062306de05d805d805d705230621064005f3044005210624062206e305de052206f204e30524063f054005da053f0524062406d705d9052406d905da053e053f05da052506e0042606e00427062606dc04e00425062506d904dc049b052706e00427069b05a205910584052806830584059105910528069a059a052806a50529062a062b062b062c0629062c062a0629062b062a062d062a062e062d062a062f062e062f062d062e062b062d06300630062d063106320631062d0632062d062f0633062c062b062b063006330633063006340635063406300630063106350635063106360637062f062a0637062a062c063806310632063106380636063606380639063a06340635063b063a063506350636063b063b0636063c06360639063c063c0639063d063d063e063c063c063e063f0640063c063f063b063c064006400641063b063b064106420642063a063b0640064306410640063f06430641064306440643063f0645063f063e06450645063e06460646064706450648064506470643064506480643064806440644064806490648064a06490647064b06480648064b064c064b064d064c064e0648064c064c064f064e064d064f064c0650064f064d064d065106500652064d064b06520651064d0652064b06530653064b0654064b0647065406550652065306510652065506540647065606570656064706550653065806580653065906530654065906590654065a06540656065a065b06550658065a0656065c065d064f0650065e064f065d065f065e065d0660065e065f065e0660066106610660066206630661066206610664065e065e06640665065e066506660666064f065e06670664066106670661066306660665066806660668064f064f06680669066a064f0669065d0650065f065f0650066b065f066b066c0650066d066b066c066b066d0651066d065006510655066d066d0655066e066e066c066d065b066c066e066e0655065b066f06640667066f0670066406710670066f067106720670067006720673067306740670067006740675067606750674066506700675066406700665067306770674067406770676067606770678067706790678067a06650675067a06750676067b06790677067b067c0679067d067b0677067d067706730673067e067d0672067e0673067f067d067e0680067c067b0681067c068006810680067b06820681067b0682067b067d0682067d067f06830681068206840682067f0684068106830683068206840685068106840685067c068106680665067a068606870688068906880687068a06870686068a0686068b068b0686068c068d068b068c068c0686068d0686068e068d06860688068e068e0688068f0690068e068f068e0691068d0692068d0691068e069206910693068b068d0693068d06920694068e069006940692068e06950688068906880695068f068f069506960697068f06960690068f06970698069506890699069506980698069a0699069a069b0699069b0695069906960695069b069c0696069b06970696069c069d069a0698069e069a069d069b069f069c069f069b069a069c069f06a006a0069f06a106a1069f06a2069f069a06a206a2069a06a306a3069a069e06a206a406a106a206a306a506a506a406a206a606a406a506a706a606a506a506a306a806a806a906a506aa06a506a906a706a506aa06a906ab06aa06a306ac06a8069e06ac06a306ac06ad06a806ad06ae06a806ab06af06aa06aa06af06b006aa06b006a706a706b006b106ab06b206af06b106b306a706b306b406a706b006b506b106b106b506b606b5065c06b606b006b706b506af06b706b006b7065a06b5065a065c06b506af06b806b706b206b806af06b206b906b8065806b706b8065b06b806b9065806b8065b06ba06b6065c065c06bb06ba06bc06ba06bb06bd06b906b206b206be06bd06bd06be06b906b906be06bf06be06c006bf06c106c006be06c206c106be06c106c306c006c006c306c406c406c306c506c506c306c606c306c706c606c206be06b206c206b206ab06ab06c806c206c806c106c206c906c106c806c906c706c306c306c106c906c906ca06c706ca06cb06c706c706cb06cc06cb06ca06cd06cd06ca06ce06ce06cf06cd06d006ce06ca06d006ca06c906c906c806d006d006c806d106d106c806ab06d106d206d006d206ce06d006d206ae06ce06ae06cf06ce06d106ab06a906a906d206d106d206a906a806a806ae06d206ae06d306cf06cf06d306d406d306d506d406d406d506d606d706d606d506d306d806d506d906d506d806d706d506d906da06d706d906db06d606d706dc06db06d706dc06d706da06dd06dc06da06de06dd06da06da06df06de06d906df06da06d906e006df06d806e006d906e106dd06de06e106e206dd06e306e206e106e306e406e206e206e406e506e406e606e506e206e506e606e706e206e606e806e706e606e906e706e806e606e906e806ea06e206e706dd06e206ea06ea06dc06dd06eb06ea06e706eb06e706e906ec06ea06eb06ed06ea06ec06dc06ea06ed06ee06e606e406ee06e906e606ed06db06dc06ef06f006f106f206ef06f106f306f106f006f406f006ef06f406f506f006f606f406ef06f506f706f006f506f806f706f806f006f706f306f006f806f906f506f406f406fa06f906fa06f506f906fb06f606ef06fb06ef06f206f206fc06fb06fd06fa06f406fd06f406f606fe06f506fa06fe06f806f506ff06f106f306f106ff06f206f206ff06000700070107f2060107fc06f206f3060207ff06f306f8060207ff0602070307ff06030700070207f8060407f806050704070207040705070007030706070707020705070807020707070307020708070907080707070a0703070807060703070a07070705070b070c0707070b07090707070c070d070b0705070c070b070d0706070e0700070e07010700070a070f0706070f070e0706071007080709071107080710070a07080711070d070507f8060f0712070e070e07120713070e0713070107010713071407bc060107140712070f07150715070f07160716070f070a071707150716070a0717071607110717070a07180715071707fc060107bc06bc061907fc06fc0619071a071b07fc061a071407ba06bc0614071c07ba0613071c07140713071d071c071d07b6061c071c07b606ba0618071e07150715071e07b3061207b3061d071507b30612071d07b306b106b106b6061d0712071d071307fb06fc061b071b07f606fb061e07b406b3061907bb061f07bb0656061f071f07560620075606bb065c0620075606210721075606220722072307210721072307240725072407230722072607230723072607250725072607270728072507270729072407250726072a07270727072a072b0757062a0726075706260722072207560657062c0727072b07280727072c072c072d07280728072d072e072f072e072d0730072e072f07300731072e0732072e07310728072e073207320725072807330725073207290725073307320734073307310734073207340731073507350731073607360731073007300737073607370738073607390736073807370739073807350736073907370730073a0730073b073a073b0737073a072f073b0730073c0737073b073c07390737073d073e073f073e0740073f073d073f07400741073d074007420741074007430741074207400743074207410744073d0745073d07440746074507440747073e073d0747073d074507480741074307480749074107410749074a074a07440741074b0744074a07460744074b074a0749074b074b0749074c074c074d074b074b074d07460746074d074e074f074e074d0750074f074d0750074d074c0751074507460746074e07510751074e0752074e075307520753074e074f0752075307540755075407530753074f07550755074f07560748065507560757074f0750074f0757075607560757074a0656074a0648065807540755075907550748065a0755075907580755075a0759076a065a07590748064e064e066a0659074e064f066a065b075c075d075b075d075e075c075e075d075f075b075e0760075b075f075f07610760076207600761075f075e07630764075f0763075e076407630765075c075b0765075b07660766075b07670767075b0760076807670760076807600762076907670768076a0767076907660767076a0769076b076a076c075f0764076c0761075f076d0764075e076d075e075c0762076e07680768076e076f0768076f0769076e0770076f0771076f0770076b0771077207a6067107700773077207710773077107a60669076f077407740771076b0774076f07710774076b076907750770076e07760770077507a606700776077607a406a6067707720773077307b40677077307a606a706a706b4067307780779077a077a0779077b077c077a077b077d077a077c077c077b077d0779077e077b077d077b077f0780077b077e077e07790780077f077b078007800779078107820778077a0782077a077d07830779077807790783078107810783078407850783077807860778078207870778078607850778078707870788078507890785078807c606890788078a07c60688078a07880787078b078507890783078b0784078b078307850784078b078c078b078d078c0789078d078b078907cc068d07c7068907c606c706cc068907c506c6068a078e07d806ad06ad06d806d306e006d8068e07d306ae06ad068e07ad06ac068f0747069007900747064606570647068f078f072a07570686056f056a056f05860582056f05820565059107d704d1049107d104d20492074e054d05920750054e0580058b0579057f0579058e05930743074007930740073e075906b706580659065a06b706bc06bb0619070e050105fc049407950796079707950794079807970794079707990795079a07950799079b079a0799079c079a079b079c079d079a079a079d079e0795079f0796079f0795079a0796079f07a0079f07a107a0079a07a2079f07a207a1079f079e07a2079a07a207a307a1079e07a407a207a407a307a207a407a507a307a60797079807a707a6079807a807a607a707a807a907a607a707aa07a807ab07a907a807aa07ab07a807ac07a907ab07ab07ad07ac07ad07ab07aa07ae07ad07aa07ae07aa07af07b007ad07ae07b107ad07b007b007b207b107b207b007b307b307b007ae07b307ae07b407b407ae07af07af07aa07b507b507aa07a707b607b207b307b607b307b707b707b307b407b807b207b607b207b807b907b107b207b907b907ba07b107ba07ad07b107ad07ba07bb07ac07ad07bb07bc07ac07bb07bd07b807b607bd07b607be07be07b607b707bf07b807bd07b807bf07c007b907b807c007b907c007c107c107ba07b907ba07c107c207bb07ba07c207c307bb07c207bc07bb07c307c407bc07c307bd07c507bf07c607bd07be07c507bd07c607c107c007c707c007c807c707c007bf07c807c107c707c907c207c107c907ca07c207c907c307c207ca07cb07c307ca07c407c307cb07cc07c407cb07bf07cd07c807bf07c507cd07c807cd07ce07cf07c807ce07ca07c907d007d007c907d107c907c707d107d207ca07d007cb07d207cc07cb07ca07d207cc07d207d307d007d107d407d007d407d207d407d107d507d107c707d507d507c707d607d607c807cf07c707c807d607d207d407d707d207d707d307d307d707d807d907d707d407d407d507d907da07d807d707da07d707d907db07d607cf07d607dc07d507d907d507dc07d307d807dd07de07d307dd07dd07d807df07e007df07d807e007d807da07de07dd07e107e107dd07e207dd07df07e207e207df07e307e107e407de07de07e407e507de07e507cc07cc07e507e607e607c407cc07e607e707c407e807e707e607e607e507e807e807e907e707e807e507ea07e507e407ea07ea07e407eb07ec07eb07e407e407e107ec07ec07e107ed07e107e207ed07ed07e207ee07e207e307ee07ee07e307ef07f007ef07e307e307f107f007f207e907e807e807ea07f207f207ea07f307ea07eb07f307f307eb07f407f507f407eb07f507eb07ec07e907f607e707e707f607bc07e907f707f607f607ac07bc07f607f807ac07f707f807f607f907f807f707f707fa07f907f807a907ac07fb07a907f807fb07f807f907fc07fb07f907f907fd07fc07fa07fd07f907fa07fe07fd07ff07fb07fc07ff070008fb070008a907fb0799070008ff0701089907ff07ff0702080108fc070208ff07fc0703080208fd070308fc07fd0704080308fe070408fd07fe07050804080608fe07fa0707080608fa0706080808fe0708080508fe07090806080708e9070908070809080a0806080a08080806080a080b0808080c0808080b08050808080c08f2070908e907f2070d0809080d080a0809080d080e080a080e080b080a080708f707e9070708fa07f7070f080e080d080d08f4070f08f40710080f0811080f0810080e080f08110812081108100813080e0811080b080e08130814080b0813080c080b081408f3070d08f207f307f4070d0812081008150815081008160816081008f40717081208150815081608180818081608f5071608f407f50719081508180817081508190818081a081908f507ec0718081808ec071b081b081a081808ec07ed071b081b08ed071c081b081c081a081a081c081d08ed07ee071c081c08ee071e081c081e081d081d081e081f08ee07ef071e081e08ef0720081e0820081f081f0820082108220821082008200823082208ef07230820081d081f08240824081f0825081f082108250825082108260827081d08240824082808270828082908270829081a0827081a081d08270819081a0829082a0819082908170819082a082a082b0817082c082b082a082b08120817082a082d082c082c082d082e082a082f082d0829082f082a082f0829082808300828082408280830083108280831082f083108300832082f08310833082f0833082d082d08330834082d0834082e082e0834083508350836082e0837082e0836082c082e08370838082c0837082b082c08380839083808370837083a08390836083a0837083b0839083a083c083b083a083d083a0836083d08360835083c083a083d0834083e08350835083e083d083d083e083f083d083f083c0833084008340840083e0834083108410833084108400833083c083f084208420843083c0843083b083c0844083808390844084508380845082b083808460844083908460839083b0847084508440847081108450848084708440848084408460813081108470849081308470849084708480845081108120812082b0845083e0840084a084a0840084b08400841084b084c084a084b084b0841084d084b084d084c084c084d084e084f084a084c084f0850084a083f084a08500851084f084c084c084e08510851084e085208530852084e084e08540853084d0854084e0852085508510854085608530853085608570857085808530858085208530858085908520859085508520859085a085508560854085b085b0854085c0854084d085c085c084d0841083f085008420856085d08570857085d085e0856085f085d085b085f0856085b0860085f085d0861085e085d085f0861085e086108620861085f0863085f0864086308600864085f086008650864086508660864086708640866086308640867086808630867086108630868086108690862086808690861086a085e08620862086b086a0869086b0862086c086508600832086c0860086c082608650830086c083208300825086c08250826086c0824082508300826086d08650826086e086d0865086d086f086f086608650821086e0826086b0870086a086a08700871087008720871087308710872087208740873087508710873087608750873087308770876087408770873087808750876086e0821082208750878087908790878087a087a085e0879086a087508790879085e086a08710875086a0857085e087a087a08580857087a087b08580878087b087a0878087c087b0876087c08780876087d087c0877087d0876087b08590858087b087e0859087c087e087b087c087f087e087d087f087c087e085a0859087e0880085a087f0880087e08800881085a085a08810882085a0882085508550882088308840855088308840883088508860884088508850883088708830882088708870888088508890885088808860885088908870882088a088a088b0887088b08880887088b088c0888088d0888088c08890888088d0882088e088a0881088e0882088e088f088a088f088b088a0890088c088b088b088f08900890088f0891088f08920891088d089308890889089308940889089408860895089408930886089408500842085008940842089408950895084308420896088f088e08960892088f08860850084f084f088408860884084f085108510855088408a60700089707000899079707a9070008a6079b079907010832085c0831085c08410831085b085c083208320860085b089708980872089708720870089908980897089808740872089a089b08a5079c089b089a089d089c089a089e089b089c089c089f089e089f089c089d089a08a507a407a0089a08a4079d089a08a008a1089d08a0089f089d08a2089f08a208a3089e089f08a3089e08a308a408a2089d08a508a5089d08a108a608a508a108a408a308a708a408a708a808a308a908a708a908aa08a708a808a708aa08a808aa08ab08ac08aa08a908ad08a808ab08ad08ab08ae08af08a808ad08af08a408a808b008a408af08ab08aa08b108ac08b108aa08ab08b108b208ae08ab08b208b308b108ac08b208b408ae08b508b308ac08b608b308b508ac08b708b508a908b708ac08b808b508b708b808b708b908b908ba08b808bb08b508b808bb08b608b508bc08b608bb08bb08bd08bc08b808be08bb08be08bd08bb08ba08be08b808be08bf08bd08bf08c008bd08bd08c008bc08bc08c008c108bc08c108b608b608c108c208c208c308b608ba08c408be08c408bf08be08c508bf08c408c608c508c408c608c408ba08c708c608ba08c708ba08b908c808c208c108c108c908c808c008c908c108ca08c908c008ca08c008bf08cb08ca08bf08cb08bf08c508cc08cb08c508c508cd08cc08ce08ca08cb08cf08ce08cb08cf08cb08cc08d008cf08cc08cc08d108d008cd08d108cc08d208d008d108d308d208d108d108d408d308cd08d408d108cd08d508d408ce08d608ca08d608c908ca08d708cf08d008d708d808cf08d808ce08cf08d908d708d008d908d008d208da08d908d208d808db08ce08db08d608ce08dc08d808d708dd08dc08d708dd08d708d908de08dd08d908de08d908da08dc08df08d808df08db08d808d508e008d408d508e108e008d408e008e208d408e208d308e008e308e208e408e108d508e408e508e108c708e508e408c708a208e508b908a208c708a208a508e508e508a508e608e508e608e108e108e608e708e608e808e708e908e108e708e008e108e908e908e308e008e708ea08e908e808ea08e708e808eb08ea08e908ec08e308ea08ec08e908ea08ed08ec08eb08ed08ea08e608a508a608a608e808e608a608ee08e808ee08eb08e808ef08ee08a608ef08f008ee08f108ee08f008eb08ee08f108f208eb08f108ed08eb08f208f308ed08f208a608a108ef08ef08a108f408f408f508ef08f508f008ef08a108a008f408f408a0089e079e07f608f408f608f508f408ed08f708ec08f708ed08f308ec08f708f808f908f808f708fa08f708f308f908f708fa08fb08f908fa08fc08f808f908fd08fc08f908fd08f908fb08fc08fe08f808e308f808fe08ff08e308fe080009ff08fe080009fe08fc08fc0801090009020900090109010903090209ec08f808e308e208e308ff08d308e208ff08d308ff0804090409ff0805090509000902090509ff0800090609050902090409050906090609d20804090409d208d3080209070906090309070902090809070903090909080903090909030901090a0909090109da08d208060906090b09da0807090b09060907090c090b090c09070908090b090c090d0908090e090c090f090c090e090d090c090f090f0910090d0911090d0910090b090d091109100912091109de080b091109da080b09de0811091309de081209130911091209140913090e0915090f09150916090f09160910090f091609170910091709120910091709180912091809140912091309dd08de0813091909dd0814091909130914091a0919091909dc08dd0819091b09dc081a091b0919091c09180917091d091c0917091d09170916091c091e0918091f0918091e09140918091f091f091a091409200916091509160920091d091d09200921092209200915092309210920092309200922092409230922092509230924092609250924092409270926092509280923092809210923092809290921092a09210929091d0921092a092a091c091d092a092b091c092b091e091c092c092a09290929092d092c092e09260927092f092509260930092f092609300926092e09310930092e092e09320931093309270924093309340927093509270934092e0927093509350932092e09360935093409360934093709370934093809380934093309380939093709370939093a0938093b09390933093b093809330922093b093c093a0939093d0939093b093c0939093d093d093e093c093b0915093d09220915093b093d0915090e090e093e093d093e090e0908093f093e0908093f090809090940093f09090941093e093f093e0941093c093c094109420942093a093c09400909090a090a0943094009fd0843090a09fd08440943090a09fc08fd080a090109fc0843094509400940094509460946093f0940093f09460941094109460947094109470942094609480947094509480946094309490945094409490943094a0945094909480945094a09420947094b09470948094b094b0948094c0948094a094c094c094a094d094d094e094c094f094c094e094b094c094f093a094b094f093a094f09370937094f0950094f094e09500950094e095109520951094e0952094e094d0953095109520942094b093a09370950093609360950095409500951095409540951095509510953095509550953095609360954095709570954095809540955095809580955095909550956095909590956095a095a095b0959095c0959095b09580959095c095d0958095c09570958095d09320957095d095e095b095a095709350936093509570932095d095c095f095d095f0932095f095c0960095c095b09600932095f09610960095b0962095b095e09620962095e096309640962096309650961095f0966095f09600960096209660965095f096609660962096709670962096409320961093109310961096809690968096109690961096509310968096a096a0968096b096c096b0968096c09680969096a093009310930096a096d096d096a096e096a096b096e096e096b096f0970096f096b0970096b096c096e096f09710971096f09720973096e0971096d096e097309740972096f0974096f097009710972097509750972097609770971097509730971097709780976097209780972097409750979097709750976097909770979097a097a097b0977097c0977097b0973097c096d09730977097c097d097c097b097e097d097b097e097b097a09790976097f0980097f09760980097609780981097c097d0981092f097c096d097c092f0925092f09810981092809250981097d09280928097d098209830982097d0983097d097e092d098209830982092909280982092d0929096d092f09300984097f098009c3088509b308b608c308b308b3088509b108c3088609850987098609c308c30888098709890985098609b20885098909b208b1088509c2088809c308c2088a0988098b098a09c2088b09c208c8088909b408b208e4088c09c608d5088c09e4088c09c508c608e408c608c7088c09cd08c5088c09d508cd08e707bc07c407cc07d307de073e084a083f082308ef07f007df07f107e307f107df07e0078d09d607db078d09dc07d607140813084908b908b708a308b708a908a308a308a208b9088e099e08b0088e099b089e08b0089e08a408240922093309a008a4079e079d07f6089e071b09df08dc088f092b092a098f092a092c09fb084409fd0890099109920990099309910993099409910993099509940995099609940995099709960998099309900998099909930992099a0990099a099b09900990099b0998099a099c099b099d099b099c099d099c099e099d099e099f099d099f09a009a109a0099f09a109a209a0099d09a009a209a109a309a209a109a409a309a109a509a409a609a409a509a609a709a409a809a409a709a809a909a409a809aa09a909a809ab09aa09ac09aa09ab09ac09ab09ad09a809ad09ab09ac09ad09ae09af09ae09ad09af09ad09b009a809b009ad09af09b109ae09ac09ae09b109af09b209b109af09b309b209af09b409b309b509b309b409b509b609b309b709b309b609b709b809b309b709b909b809b709ba09b909bb09b909ba09bb09ba09bc09b709bc09ba09bb09bc09bd09bb09bd09be09bb09be09bf09c009bf09be09c009be09c109c009c109c209c009c209c309c009c409bf09bb09bf09c409c009c509c409c609c409c509c609c709c409c609c809c709c609c909c809c609ca09c909c609cb09ca09c609cc09cb09c609c509cc09c009cc09c509c009c309cc09cd09c909ca09cd09c809c909cd09ca09ce09cd09cf09c809d009c809cf09d009cf09d109cd09d109cf09d009d109d209d009d209d309d009d309d409d009d409d509d009d509d609d009d609c809d709d509d409d709d409d309d709d809d509d709b109d809d709d909b109da09b109d909da09d909db09d709db09d909da09db09dc09da09dc09dd09da09dd09de09da09df09b109da09e009df09da09de09e009d709e109db09d709d309e109e209d609d509e209d509e309e209e309b909e209b909e409e209e409c409e209c409c709e209c709c809e209c809d609bb09c409e409bb09e409b909e509b909e309e509e309d509e509d509d809e509b809b909e509b309b809e509b209b309e509b109b209e509d809b109ac09b109df09ac09df09e009ac09e009e609ac09e609aa09e709e609e009e709aa09e609e709e009e809e709e809e909e709e909ea09e709eb09aa09e709ec09eb09e709ea09ec09ed09ea09e909ed09ec09ea09ed09e909ee09ed09ef09ec09f009ec09ef09f009f109ec09f009a209f109f009f209a2099d09a209f209f309f109a209f309ec09f109f309eb09ec09f309aa09eb09f309a209a309f309a309a409f309a409a909f309a909aa09f009f409f2099d09f209f409f009f509f409f009f609f509f009ef09f609ed09f609ef099d09f4099b09f709ee09e909f709e909f809f709f809f909f709f909fa09fb09f809e909fb09f909f809fb09e909e809fb09e809e009fb09e009fc09fd09fc09e009fd09e009de09fd09de09dd09fd09dd09fe09fd09fe09ff09fd09ff09000a010a000aff09010aff09020a010a020a030a010a030a040a050a040a030a050a030a060a050a060a070a050a070a080a090a080a070a090a070a0a0a090a0a0a0b0a090a0b0a0c0a090a0d0a080a050a080a0d0a090a0e0a0d0a090a0f0a0e0a090a0c0a0f0a050a100a040a010a040a100a050a110a100a050a0d0a110a120a0e0a0f0a120a0d0a0e0a120a0f0a130a120a140a0d0a120a150a140a120a160a150a120a170a160a120a130a170a180a0d0a140a180a110a0d0a180a100a110a180a140a150a180a190a100a180a1a0a190a180a1b0a1a0a180a150a1b0a1c0a100a190a1c0a190a1a0a1c0a1d0a100a1c0a1e0a1d0a1c0a1f0a1e0a1c0a200a1f0a1c0a210a200a1c0a1a0a210a220a200a210a220a210a1a0a220a230a200a220a240a230a220a250a240a220a260a250a220a270a260a220a1a0a270a280a240a250a280a250a260a280a290a240a280a2a0a290a280a2b0a2a0a280a2c0a2b0a280a2d0a2c0a280a260a2d0a2e0a260a270a2e0a270a1a0a2e0a1a0a1b0a2e0a2f0a260a2e0a300a2f0a2e0a310a300a2e0a150a310a2e0a1b0a150a320a260a2f0a320a2d0a260a320a2c0a2d0a320a2f0a300a320a330a2c0a320a340a330a320a350a340a320a300a350a360a310a150a360a300a310a360a150a160a360a370a300a360a380a370a360a390a380a360a170a390a360a160a170a3a0a300a370a3a0a350a300a3a0a340a350a3a0a370a380a3a0a3b0a340a3a0a3c0a3b0a3a0a3d0a3c0a3a0a380a3d0a3e0a390a170a3e0a380a390a3e0a170a3f0a400a3f0a170a400a170a130a400a410a3f0a3e0a3f0a410a400a420a410a400a430a420a400a440a430a400a0f0a440a400a130a0f0a450a410a420a450a420a430a450a460a410a450a470a460a450a480a470a450a490a480a450a4a0a490a450a430a4a0a4b0a440a0f0a4b0a430a440a4b0a0f0a0c0a4b0a4c0a430a4b0a4d0a4c0a4b0a4e0a4d0a4b0a0b0a4e0a4b0a0c0a0b0a4f0a430a4c0a4f0a4a0a430a4f0a490a4a0a4f0a4c0a4d0a4f0a500a490a4f0a510a500a4f0a520a510a4f0a4d0a520a530a4e0a0b0a530a4d0a4e0a530a0b0a540a530a550a4d0a530a560a550a530a570a560a530a580a570a530a540a580a590a4d0a550a590a520a4d0a590a510a520a590a550a560a590a5a0a510a590a5b0a5a0a590a5c0a5b0a590a560a5c0a5d0a570a580a5d0a560a570a5d0a580a5e0a5d0a5f0a560a5d0a600a5f0a5d0a610a600a620a600a610a620a630a600a640a600a630a640a630a650a620a650a630a640a650a660a640a660a670a640a670a680a640a680a690a640a690a6a0a640a6a0a600a620a6b0a650a620a6c0a6b0a620a6d0a6c0a620a6e0a6d0a620a610a6e0a5d0a6e0a610a5d0a5e0a6e0a6f0a6a0a690a6f0a690a700a6f0a700a5b0a6f0a5b0a5c0a6f0a5c0a560a6f0a560a5f0a6f0a600a6a0a6f0a5f0a600a710a690a680a710a680a670a710a670a720a710a720a730a710a730a740a710a740a750a710a750a760a710a760a690a770a740a730a770a750a740a770a730a780a770a790a750a770a7a0a790a770a7b0a7a0a770a7c0a7b0a770a780a7c0a7d0a790a7a0a7d0a750a790a7d0a7a0a7e0a7d0a7e0a7f0a7d0a7f0a800a810a800a7f0a810a7f0a820a810a820a830a810a830a840a810a850a800a7d0a800a850a810a860a850a810a870a860a810a840a870a7d0a850a880a7d0a880a750a890a860a870a890a850a860a890a870a8a0a890a8b0a850a890a5b0a8b0a890a5a0a5b0a890a510a5a0a890a8a0a510a8c0a850a8b0a8c0a880a850a8c0a750a880a8c0a8b0a5b0a8c0a760a750a8c0a690a760a8c0a700a690a8c0a5b0a700a8d0a510a8a0a8d0a8a0a870a8d0a500a510a8d0a490a500a8d0a8e0a490a8d0a8f0a8e0a8d0a900a8f0a8d0a870a900a910a490a8e0a910a8e0a8f0a910a480a490a910a470a480a910a920a470a910a930a920a910a940a930a910a8f0a940a950a900a870a950a8f0a900a950a870a840a950a960a8f0a950a970a960a950a980a970a950a830a980a950a840a830a990a8f0a960a990a940a8f0a990a930a940a990a960a970a990a9a0a930a990a9b0a9a0a990a9c0a9b0a990a970a9c0a9d0a9b0a9c0a9d0a9c0a970a9d0a9e0a9b0a9d0a9f0a9e0a9d0aa00a9f0a9d0aa10aa00a9d0aa20aa10a9d0a970aa20aa30a9f0aa00aa30aa00aa10aa30aa40a9f0aa30aa50aa40aa30aa60aa50aa30aa70aa60aa30aa80aa70aa30aa10aa80aa90aa10aa20aa90aa20a970aa90a970a980aa90aaa0aa10aa90aab0aaa0aa90aac0aab0aad0aab0aac0aad0aae0aab0aaf0aab0aae0aaf0aae0ab00aad0ab00aae0aaf0ab00ab10aaf0ab10ab20aaf0ab20ab30aaf0ab30ab40aaf0ab40ab50aaf0ab50aab0ab60ab20ab10ab60ab10ab00ab60ab70ab20ab60ab80ab70ab60ab90ab80aba0ab80ab90aba0ab90abb0ab60abb0ab90aba0abb0abc0abd0abc0abb0abd0abb0abe0abd0abe0a7a0abd0a7a0a7b0abd0abf0abc0aba0abc0abf0abd0ac00abf0abd0a7c0ac00abd0a7b0a7c0aba0ac10ab80aba0ac20ac10aba0ac30ac20aba0abf0ac30ac40abe0abb0ac40a7a0abe0ac40abb0ac50ab60ac50abb0ab60ab00ac50ac40ac50ab00ac40ab00ac60aad0ac60ab00aad0a7f0ac60ac40ac60a7f0aad0a820a7f0aad0a830a820aad0aac0a830ac40a7f0a7e0ac40a7e0a7a0aa90a830aac0aa90a980a830ac70ac20ac30ac70ac30abf0ac70abf0ac80ac70ac80ac90ac70ac90aca0acb0aca0ac90acb0acc0aca0ac70aca0acc0acb0acd0acc0acb0ace0acd0acb0acf0ace0acb0ad00acf0acb0ad10ad00acb0ac90ad10ad20acf0ad00ad20ace0acf0ad20ad00ad30ad40ad30ad00ad40ad50ad30ad20ad30ad50ad40ad60ad50ad40ad70ad60ad40ad80ad70ad40ad90ad80ad40ada0ad90ad40ad00ada0adb0ada0ad00adb0ad90ada0adb0ad00adc0adb0adc0add0adb0add0ade0adf0ade0add0adf0add0ae00adf0ae00ae10adf0ae10ae20adf0ae30ade0adb0ade0ae30adf0ae40ae30adf0ae50ae40adf0ae20ae50ae60ae20ae10ae60ae50ae20ae60ae10ae70ae60ae70ae80ae60ae80ae90aea0ae90ae80aea0ae80aeb0aea0aeb0aec0aea0aec0aed0aea0aee0ae90ae60ae90aee0aea0aef0aee0aea0af00aef0aea0aed0af00af10aef0af00af10aee0aef0af10af00af20af10af20af30af10af30af40af10af50aee0af10af60af50af10af40af60af70af20af00af70af30af20af70af00af80af70af80af90af70af90afa0af70afa0afb0af70afb0afc0af70afc0af30afd0af50af60afd0aee0af50afd0af60afe0afd0afe0aff0afd0aff0a000bfd0a000be50afd0ae50a010bfd0a010bee0ae60aee0a010be60a010be50a020bfc0afb0a020bfb0a030b040b030bfb0a040bfb0a050b040b060b030b020b030b060b040b070b060b040b080b070b040b090b080b0a0b080b090b0a0b090b0b0b040b0b0b090b040b050b0b0b0a0b0b0b0c0b0a0b0c0b0d0b0a0b0d0b0e0b0a0b0f0b080b0a0b100b0f0b0a0b0e0b100b110b0e0b0d0b110b100b0e0b110b0d0b120b110b120b130b110b130b140b110b150b100b110b160b150b110b140b160b170b0c0b0b0b170b0d0b0c0b170b0b0b180b170b180b190b170b190b1a0b1b0b1a0b190b1b0b1c0b1a0b170b1a0b1c0b1b0b1d0b1c0b1b0b1e0b1d0b1b0b1f0b1e0b1b0b200b1f0b1b0b210b200b1b0b190b210b220b210b190b220b200b210b220b190b230b220b230bf90a220bf90a240b220b250b200b220b260b250b220b240b260b270bf90a230b270b230b190b270bfa0af90a270bfb0afa0a270b050bfb0a270b0b0b050b270b180b0b0b270b190b180b280b240bf90a280b260b240b280bf90af80a280bf80af00a280bf00aed0a280bed0aec0a280bec0a290b280b290b260b2a0b290bec0a2a0b260b290b2a0bec0a2b0b2c0b2b0bec0a2c0bca092b0b2a0b2b0bca092c0bce09ca092c0b2d0bce09cd09ce092d0bcd092d0b2e0bcd092e0bd1092c0b2f0b2d0b2c0b300b2f0b2c0b310b300b2c0bec0a310b320b2f0b300b320b2d0b2f0b320b300b330b340b330b300b340b300b350b340b350b360b340b360b370b340b370b380b340b380b390b340b3a0b330b340b390b3a0b320b330b3a0b320b3a0b3b0b320b3b0b3c0b320b3c0b3d0b320b3d0b2d0b3e0b2d0b3d0b3e0b3d0b3c0b3e0b2e0b2d0b3e0bd1092e0b3e0b3f0bd1093e0b400b3f0b3e0b410b400b3e0b3c0b410b420bd1093f0b420b3f0b400b420bd209d109420bd309d209420b430bd309420b440b430b420b450b440b420b400b450b460bd309430b460b430b440b460be109d309460bdb09e109460b470bdb09480bdb09470b480bdc09db09480bdd09dc09480b490bdd09480b4a0b490b480b4b0b4a0b480b4c0b4b0b480b470b4c0b460b4c0b470b4d0bdd09490b4d0b490b4a0b4d0bfe09dd094d0bff09fe094d0b4e0bff094f0bff094e0b4f0b4e0b500b4d0b500b4e0b4f0b500b510b4f0b510b520b4f0b520b530b4f0b020aff094f0b030a020a4f0b530b030a4d0b540b500b4d0b4a0b540b550b030a530b550b530b520b550b060a030a550b070a060a550b560b070a570b070a560b570b560b580b550b580b560b570b580b590b570b590b5a0b570b5a0b5b0b570b0a0a070a570b0b0a0a0a570b5b0b0b0a550b5c0b580b550b520b5c0b5d0b0b0a5b0b5d0b5b0b5a0b5d0b540a0b0a5d0b580a540a5d0b5e0b580a5f0b580a5e0b5f0b5e0b600b5d0b600b5e0b5f0b600b610b5f0b610b620b5f0b620b630b5f0b5e0a580a5f0b6e0a5e0a5f0b630b6e0a640b630b620b640b6e0a630b640b620b650b640b650b660b640b660b670b640b6d0a6e0a640b6c0a6d0a640b670b6c0a680b6c0a670b680b670b660b680b690b6c0a6a0b6c0a690b6a0b690b360b680b360b690b6a0b360b6b0b6a0b6b0b6c0b6a0b6c0b6d0b6e0b6d0b6c0b6e0b6c0b6f0b6e0b6f0b700b6e0b700b710b720b710b700b720b700b730b740b730b700b740b700b750b740b750be80a740be80ae70a740b760b730b720b730b760b740b770b760b780b760b770b780b770be10a740be10a770b740be70ae10a780be10ae00a780b790b760b780b7a0b790b780b7b0b7a0b780bdd0a7b0b780be00add0a7c0b7a0b7b0b7c0b7b0bdd0a7c0b7d0b7a0b7c0bc90a7d0b7c0bd10ac90a7c0bd00ad10a7c0bdc0ad00a7c0bdd0adc0a7e0b7a0b7d0b7e0b7d0bc90a7e0b7f0b7a0b7e0b7c0a7f0b7e0bc00a7c0a7e0bbf0ac00a7e0bc80abf0a7e0bc90ac80a800b7f0b7c0a800b7a0b7f0b800b7c0a780a800b780a730a800b730a810b800b810b760b800b760b790b800b790b7a0b720b810b730a720b760b810b720b730a720a720b720a670a720b670a710b6e0b710b670a6e0b670a660a6e0b660a650a6e0b650a6d0b6a0b6d0b650a6a0b650a6b0a6a0b6b0a6c0a820b830b840b820b850b830b850b860b830b850b870b860b880b850b820b880b890b850b840b9709820b840b960997098a0b870b850b890b8a0b850b8a0b8b0b870b8c0b8b0b8a0b8c0b8a0b8d0b8c0b8d0b8e0b8c0b8e0b8f0b8c0b8f0b900b8c0b900b910b920b8e0b8d0b920b8d0b8a0b920b930b8e0b920b940b930b920b950b940b920b880b950b960b8f0b8e0b960b900b8f0b960b8e0b970b960b970b240a960b240a290a960b980b900b960b2a0a980b960b290a2a0a990b930b940b990b8e0b930b990b970b8e0b990b240a970b990b940b9a0b9b0b9a0b940b9b0b940b9c0b9b0b9c0bf9099b0bf9099d0bfb099d0bf909fb091e0a9d0b9b0b9d0b1e0afb09fc091e0afd091e0afc09fd09000a1e0a010a1e0a000a010a1d0a1e0a010a100a1d0a9b0b1e0a1f0a9b0b200a9a0b9b0b1f0a200a990b9a0b200a990b200a230a9e0bf9099c0b9e0bfa09f9099e0b9c0b940b9e0b940b950b9e0b9f0bfa09f709fa099f0bf7099f0ba00bf709a00ba10bf709a10bee09ed09ee09a10bed09a10ba20bed09a20bf6099e0ba30b9f0b9e0b880ba30b9e0b950b880ba10ba00b9709a10b97099509a40ba10b9509a50ba40b9509a50b950993099909a50b9309a00ba60b97099709a60ba70b9709a70b820b820ba70b880b920ba80b880b920b8a0ba80ba90baa0bab0ba90bac0baa0bab0baa0bad0bab0bad0bae0bac0ba90baf0bac0baf0bb00bb10bb00baf0bb10bb20bb00bb30bb20bb10bb30bb40bb20bb50bb40bb30bb50bb60bb40bb70bb10baf0bb70baf0bb80bb60bb50bb90bb60bb90bba0bba0bb90bbb0bba0bbb0bbc0bbd0bbc0bbb0bbd0bbb0b9a09bb0bbe0b9a09bb0bbf0bbe0b9209bd0b9a09c00bb50bb30bc00bb30bc10bb50bc20bb90bb50bc30bc20bc30bb50bc00bb90bc20bc40b9a09be0b9c09bb0bc50bbf0bb90bc50bbb0bb90bc40bc50bc60bc00bc70bc60bc70bc80bc60bc80bc90bc60bc90bca0bc60bca0bcb0bc60bcb0bcc0bc60bcd0bc00bc60bcc0bcd0bce0bcd0bcc0bce0bcc0bcb0bce0bcf0bcd0bce0bc40bcf0bce0bd00bc40bce0bd10bd00bce0bd20bd10bce0bcb0bd20bd30bd20bcb0bd30bd10bd20bd30bcb0bd40bd30bd50bd10bd30bd60bd50bd30bd70bd60bd80bd60bd70bd80bd70bd90bd30bd90bd70bd30bd40bd90bd80bd90bda0bdb0bda0bd90bdb0bd90bdc0bdb0bdd0bda0bd80bda0bdd0bdb0bde0bdd0bdf0bdd0bde0bdf0bde0be00bdb0be00bde0bdf0be00be10bdf0be20bdd0be30bdd0be20be30be20be40bdf0be40be20be30be40be50be60be50be40be60be40be70be60be80be50be30be50be80be60be90be80be60bea0be90be60beb0bea0bec0bea0beb0bec0beb0bed0be60bed0beb0be60be70bed0bec0bed0bee0bef0bee0bed0bef0bf00bee0bec0bee0bf00bef0bf10bf00bf20bf00bf10bf20bf30bf00bf20bf40bf30bf20bf50bf40bf20bf60bf50bf20bf70bf60bf20bf80bf70bf20bf10bf80bef0bf80bf10bf90bf30bf40bf90bf00bf30bf90bf40bfa0bf90bfa0bfb0bf90bfb0bfc0bf90bfd0bf00bf90bfe0bfd0bf90bfc0bfe0bff0bf60bf70bff0bf70bf80bff0b000cf60bff0b010c000cff0b020c010cff0b030c020cff0b040c030cff0bf80b040c050c040cf80b050c030c040c050cf80b060c050c060c070c050c070c080c050c090c030c050c0a0c090c050c080c0a0c0b0c080c070c0b0c0a0c080c0b0c070c0c0c0b0c0d0c0a0c0b0c0e0c0d0c0b0c0f0c0e0c100c0e0c0f0c100c0f0c110c0b0c110c0f0c0b0c0c0c110c100c110c120c100c120c130c100c130c140c100c140c150c100c150c160c100c160c0e0c170c0c0c070c170c110c0c0c170c070c180cef0b180c070cef0b070c060cef0b060cf80bef0bed0b180c170c180ced0b170c190c110cdf0b110c190cdf0b190ce40b170ce40b190cdf0be10b110c170ce70be40b170ced0be70b1a0c110ce10b1a0ce10be00b1a0ce00b1b0c1a0c1b0c1c0c1a0c1c0c1d0c1a0c1d0c130c1a0c130c120c1a0c120c110cdb0b1b0ce00bdb0b1c0c1b0cdb0bdc0b1c0c1e0c1d0c1c0c1e0c130c1d0c1e0c1c0c1f0c1e0c1f0cc90b1e0cc90b200c1e0c200c210c1e0c210c220c1e0c220c130c230c200cc90b230c210c200c230cc90bc80b230cc80bc70b230cc70b240c230c240c250c230c250c260c230c260c210c270c220c210c270c210c280c270c280c290c270c290c2a0c270c2a0c2b0c270c2b0c2c0c2d0c2c0c2b0c2d0c2b0c2e0c2f0c2e0c2b0c2f0c2b0c300c310c300c2b0c310c320c300c2f0c300c320c310c330c320c340c320c330c340c330c350c310c350c330c340c350c360c340c360c370c340c370c380c390c380c370c390c370c3a0c390c3a0c3b0c390c3b0c3c0c390c3c0c3d0c390c3d0c3e0c3f0c3e0c3d0c3f0c3d0c400c3f0c400c410c3f0c410c420c3f0c430c3e0c390c430c380c390c3e0c430c340c380c430c3f0c440c430c3f0c450c440c3f0c420c450c460c440c450c460c430c440c460c450c470c460c480c430c460c320c480c460c490c320c460c4a0c490c460c470c4a0c340c430c480c340c480c320c4b0c400c3d0c4b0c410c400c4b0c3d0c4c0c4d0c4c0c3d0c4d0c3d0c3c0c4d0c3c0c3b0c4d0c3b0c4e0c4d0c4f0c4c0c4b0c4c0c4f0c4d0c500c4f0c4d0c510c500c4d0c4e0c510c520c500c510c520c4f0c500c520c510c530c520c540c4f0c520c550c540c520c560c550c520c570c560c520c530c570c4b0c4f0c580c590c4f0c540c590c580c4f0c590c540c550c590c5a0c580c4b0c580c5a0c4b0c5a0c5b0c4b0c5b0c410c590c5c0c5a0c590c5d0c5c0c590c5e0c5d0c590c550c5e0c5f0c410c5b0c5f0c5b0c5a0c5f0c600c410c5f0c610c600c5f0c620c610c5f0c630c620c5f0c640c630c5f0c5a0c640c650c5a0c5c0c650c640c5a0c650c630c640c650c5c0c5d0c650c660c630c650c670c660c650c680c670c650c5d0c680c690c610c620c690c620c630c690c6a0c610c690c6b0c6a0c690c6c0c6b0c6d0c6b0c6c0c6d0c6c0c6e0c690c6e0c6c0c6d0c6e0c6f0c700c6f0c6e0c700c6e0c710c700c710c720c700c720c730c700c740c6f0c6d0c6f0c740c700c750c740c700c760c750c700c730c760c6d0c770c6b0c6d0c780c770c6d0c790c780c6d0c740c790c7a0c710c6e0c7a0c720c710c7a0c6e0c7b0c690c7b0c6e0c690c630c7b0c7a0c7b0c630c7a0c630c660c7a0c7c0c720c7a0c670c7c0c7a0c660c670c7d0c760c730c7d0c730c720c7d0c7e0c760c7d0c7f0c7e0c7d0c800c7f0c7d0c810c800c7d0c820c810c7d0c720c820c830c7f0c800c830c800c810c830c840c7f0c830c850c840c830c860c850c830c870c860c830c880c870c830c810c880c890c880c810c890c870c880c890c810c8a0c890c8a0c8b0c890c8b0c8c0c8d0c8c0c8b0c8d0c8b0c8e0c8d0c8e0c8f0c8d0c8f0c900c8d0c900c910c8d0c910c920c8d0c930c8c0c8d0c920c930c890c8c0c930c890c930c940c890c940c870c950c8f0c8e0c950c8e0c8b0c950c960c8f0c950c5d0c960c950c680c5d0c950c670c680c950c970c670c950c8b0c970c980c970c8b0c980c670c970c980c8b0c8a0c980c7c0c670c980c720c7c0c980c820c720c980c810c820c980c8a0c810c990c930c920c990c920c910c990c910c9a0c990c9a0c9b0c990c9b0c9c0c9d0c9c0c9b0c9d0c9b0c9e0c9d0c9e0c9f0c9d0c9f0ca00c9d0ca10c9c0c990c9c0ca10c9d0ca20ca10c9d0ca30ca20c9d0ca00ca30ca40ca20ca30ca40ca10ca20ca40ca30ca50ca40ca60ca10ca40ca70ca60ca40ca80ca70ca90ca70ca80ca90caa0ca70cab0ca70caa0cab0caa0cac0ca90cac0caa0cab0cac0cad0cab0cad0c850cab0c850c860cab0c860c870cab0c870cae0cab0cae0ca70ca90caf0cac0ca90cc20aaf0ca90cb00cc20aa90cb10cb00ca90ca80cb10ca40cb10ca80ca40ca50cb10cb20cae0c870cb20c870c940cb20c940c930cb20c930cb30c990cb30c930c990ca10cb30cb20cb30ca10cb20ca10ca60cb20ca70cae0cb20ca60ca70cb40caf0cc20ab40cc20ab50cc70ab50cc20ac70acc0ab50cb40cb50ccc0ab40ccc0ab60cb70cb60ccc0ab70ccc0acd0ab70cb80cb60cb40cb60cb80cb70cb90cb80cb70cba0cb90cb70cbb0cba0cb70cce0abb0cb70ccd0ace0abc0cbb0cce0abc0cba0cbb0cbc0cce0abd0cd20abd0cce0ad20abe0cbd0cbc0cbd0cbe0cd20abf0cbe0cd20ad50abf0cc00cbf0cd50ac00cbe0cbf0cc00cd50ac10cc20cc10cd50ac20cc30cc10cc00cc10cc30cc20cc40cc30cc50cc30cc40cc50cc40cc60cc20cc60cc40cc50cc60cc70cc50cc70cc80cc50cc80cc90cc50cc90cca0cc50cca0ccb0cc50ccb0cc30cc00ccb0cca0cc00cc30ccb0cc20ccc0cc60cc20cd70acc0cc20cd60ad70ac20cd50ad60ac00cca0ccd0cc00ccd0cbe0cce0cc70cc60cce0cc80cc70cce0cc60ccf0cce0ccf0cd00cce0cd00cd10cce0cd20cc80cce0cd30cd20cce0cd10cd30cd40cd00ccf0cd40ccc0cd70ad40cc60ccc0cd40ccf0cc60cd40cd50cd00cd40cd60cd50cd40cd70cd60cd40cd70ad70cd80cd70cd70ad80cd60cd70cd80cd70ad80ad80cd80ad90ad80cd90ad90cda0cd90cd90ada0cd90adb0cda0cdb0ce30ada0ce30adc0cda0cdc0cdd0cda0cdd0cde0cda0cdf0cd90cda0cde0cdf0cd80cd90cdf0cdb0ae30adb0cdb0adb0cd90ae00cdc0ce30ae00cdd0cdc0ce00ce30ae40ae00ce10cdd0ce20cdd0ce10ce20ce30cdd0ce20ce40ce30ce20ce50ce40ce20ce60ce50ce20ce70ce60ce20cff0ae70ce20ce10cff0ae00cff0ae10ce00c000bff0ae00ce50a000be00ce40ae50ae80ce30ce40ce80cdf0cde0ce80ce40ce90ce80cdd0ce30ce80cde0cdd0ce80ce90cea0ce80cea0ceb0ce80ceb0cdf0cec0ce70cff0aec0ce60ce70cec0cff0afe0aec0cfe0af60aec0cf60aed0cee0ced0cf60aee0cf60af40aee0cf40af30aee0cf30aef0cee0cef0cf00cee0cf00cf10cee0cf20ced0cee0cf10cf20cec0ced0cf20c020bef0cf30a020bf00cef0c020bf30afc0a020bf30cf00c020b060bf30cec0cf20cf40cec0cf40ce60cf50cf40cf20cf50ce60cf40cf50cf20cf60cf50cf60cf70cf50cf70cf80cf50cf80cf90cf50cf90cfa0cf50cfa0ce60cfb0cf70cf60cfb0cf10cf00cfb0cf20cf10cfb0cf60cf20cfb0cfc0cf70cfb0cfd0cfc0cfb0cfe0cfd0cfb0cf00cfe0cff0cf30c060bff0cf00cf30cff0cfe0cf00cff0cfd0cfe0cff0c060b000dff0c000d010dff0c010d020dff0c020dfd0c030df80cf70c030df90cf80c030df70c040d030d040d050d030d050d060d070d060d050d070d050d080d070d080d090d070d090d0a0d070d0a0d0b0d070d0b0d0c0d0d0d0c0d0b0d0d0d0e0d0c0d070d0e0d060d070d0c0d0e0d030d060d0e0d0d0d0f0d0e0d0d0d100d0f0d0d0d110d100d0d0d120d110d0d0d130d120d0d0d0b0d130d140d0f0d100d140d0e0d0f0d140d100d150d140d150d160d140d160d170d140d170df90c140df90c180d140d180d0e0d190d110d120d190d100d110d190d120d1a0d190d1b0d100d190d1c0d1b0d190d1d0d1c0d1e0d1c0d1d0d1e0d1d0d1f0d190d1f0d1d0d190d1a0d1f0d1e0d1f0d200d1e0d200d210d1e0d210d220d1e0d220d230d1e0d230d240d1e0d240d1c0d250d240d230d250d1c0d240d250d230d260d250d260d270d250d270d280d250d290d1c0d250d2a0d290d250d280d2a0d2b0d200d1f0d2b0d210d200d2b0d1f0d2c0d2b0d2c0d2d0d2b0d2e0d210d2b0d2f0d2e0d2b0d300d2f0d2b0d310d300d320d260d230d320d270d260d320d230d330d320d330d340d320d340d350d360d350d340d360d340d370d360d370d380d360d380d390d360d390d160b360d160b3a0d360d3b0d350d360d3a0d3b0d320d350d3b0d320d3b0d3c0d320d3c0d270d3d0d340d330d3d0d330d230d3d0d230d220d3d0d220d210d3d0d210d3e0d3d0d3e0d340d3f0d390d380d3f0d160b390d3f0d380d400d410d400d380d410d380d420d410d430d400d3f0d400d430d410d440d430d450d430d440d450d440d460d410d460d440d410d420d460d450d460d470d450d470d480d450d480d490d450d490d4a0d450d4a0d4b0d450d4b0d430d4c0d490d480d4c0d4a0d490d4c0d480d4d0d4e0d4d0d480d4e0d480d4f0d4e0d500d4d0d4c0d4d0d500d4e0d510d500d4e0d520d510d4e0d530d520d4e0d540d530d4e0d4f0d540d4c0d550d4a0d4c0d560d550d4c0d570d560d4c0d500d570d580d570d500d580d560d570d580d500d590d580d590d5a0d580d5a0d5b0d580d5b0d5c0d580d5c0d5d0d580d5d0d560d5e0d5b0d5a0d5e0d5c0d5b0d5e0d5a0d5f0d600d5f0d5a0d600d5a0d610d600d620d5f0d5e0d5f0d620d600d630d620d600d640d630d600d650d640d600d610d660d5e0d670d5c0d5e0d680d670d5e0d690d680d5e0d620d690d6a0d690d620d6a0d680d690d6a0d620d6b0d6a0d6b0d090d6a0d090d080d6a0d6c0d680d6a0d050d6c0d6a0d080d050d6d0d6c0d050d6d0d680d6c0d6d0d050d040d6d0d6e0d680d6d0dfd0c6e0d6d0dfc0cfd0c6d0df70cfc0c6d0d040df70c6f0d6e0dfd0c6f0d680d6e0d6f0d670d680d6f0d5c0d670d6f0d700d5c0d710d5c0d700d710d700d010d6f0d010d700d710d010d720d710d5d0d5c0d710d560d5d0d710d730d560d710d740d730d710d720d740d6f0d020d010d6f0dfd0c020d750d730d740d750d560d730d750d740d760d770d760d740d770d780d760d750d760d780d770d790d780d770d100b790d770d0f0b100b770d080b0f0b770d7a0d080b770d740d7a0d750d780d7b0d7c0d7b0d780d7c0d780d7d0d7c0d4a0d7b0d750d7b0d4a0d7c0d4b0d4a0d7c0d430d4b0d7c0d7e0d430d7c0d7f0d7e0d7c0d7d0d7f0d3f0d430d7e0d3f0d7e0d7f0d3f0d7f0d800d3f0d800d160b810d790d100b810d7f0d7d0d810d800d7f0d810d160b800d810d100b150b810d150b160b810d780d790d810d7d0d780d750d4a0d550d750d550d560d820d160b140b820d140b130b820d130b830d840d830d130b840d130b850d860d850d130b860d130b870d860d870d880d860d880d890d860d890d8a0d860d8a0d8b0d8c0d8b0d8a0d8c0d8a0d8d0d8c0d8d0d8e0d8c0d8e0d8f0d8c0d8f0d900d8c0d900d910d920d910d900d920d900d930d920d930d940d920d940d950d920d950d960d920d960d970d920d980d910d920d970d980d8c0d980d8b0d8c0d910d980d990d940d930d990d930d900d990d9a0d940d990d9b0d9a0d990d9c0d9b0d990d9d0d9c0d990d9e0d9d0d990d900d9e0d9f0d900d8f0d9f0d9d0d9e0d9f0d9e0d900d9f0da00d9d0d9f0da10da00d9f0da20da10da30da10da20da30da40da10da30da50da40da30da60da50da70da50da60da70da60da80da30da80da60da70da80da90da70daa0da50da70dab0daa0da70dac0dab0da70dad0dac0da70da90dad0dae0dab0dac0dae0dac0dad0dae0daf0dab0dae0db00daf0dae0db10db00db20db00db10db20db30db00db20db40db30db20db50db40db60db40db50db60db70db40db60db80db70db60db90db80db60dba0db90db60dbb0dba0dbc0dba0dbb0dbc0dbb0dbd0db60dbd0dbb0db60db50dbd0db20dbd0db50dbc0dbd0dbe0dbc0dbf0dba0dbc0dc00dbf0dbc0dc10dc00dc20dc00dc10dc20dc10dc30dbc0dc30dc10dbc0dbe0dc30dc20dc30dc40dc50dc40dc30dc50dc30dc60dc50dc70dc40dc20dc40dc70dc50dc80dc70dc50dc90dc80dc50dca0dc90dc50dcb0dca0dc50dc60dcb0dcc0dca0dcb0dcc0dc90dca0dcc0dcb0dcd0dcc0dcd0dce0dcc0dce0dcf0dcc0dd00dc90dcc0dd10dd00dcc0dcf0dd10dd20dd00dd10dd20dc90dd00dd20dc80dc90dd20dc70dc80dd20dd10dd30dd20dd30dd40dd20dd40dd50dd20dd50dc70dd60dd30dd10dd60dd40dd30dd60dd10dd70dd60dd70dd80dd60dd80dd90dda0dd90dd80dda0dd80ddb0dda0ddb0ddc0dda0ddc0ddd0dda0ddd0dde0dda0dde0ddf0dda0de00dd90dda0ddf0de00dd60dd90de00dd60de00de10dd60de10dd40de20dd50dd40de20dd40de30de20de30de40de20de40de50de20de50de60de20de60de70dc20de70de60dc20de60de80dc20dc70de70de20de70dc70dc20de80dc00de20dc70dd50de90de80de60de90dc00de80de90de60dea0de90dea0deb0de90deb0dec0ded0dec0deb0ded0dee0dec0de90dec0dee0ded0def0dee0ded0df00def0ded0df10df00ded0deb0df10df20df10deb0df20df00df10df20deb0df30df20df40df00df20df50df40df20df30df50df60def0df00df60dee0def0df60df00df70df80df70df00df80df00df90dfa0df90df00dfa0df00dfb0dfc0dfb0df00dfc0df00dfd0dfc0dfd0dfe0dfc0dfe0dff0dfc0d000efb0dfc0dff0d000efa0dfb0d000efa0d000e010efa0d020ef90dfa0d010e020ef80df90d020ef80d020e030ef80d040ef70df80d030e040ef60df70d040ef60d040e050ef60d050eee0d060efe0dfd0d060efd0df00d060ef00df40d060ef40df50d060ef50d070e060e070efe0d080e050e040e080eee0d050e080e040e090e080e090eba0d080eba0dbf0d080ebf0dc00d080ec00d0a0e080e0a0eee0de90d0a0ec00de90dee0d0a0e0b0e070ef50d0b0ef50d0c0e0d0e0c0ef50d0d0ef50df30d0d0ee40d0c0e0b0e0c0ee40d0d0ee50de40d0d0ee60de50d0d0eea0de60d0d0eeb0dea0d0d0ef30deb0d0b0ee40d0e0e0b0e0e0e0f0e0b0e0f0e100e0b0e100efe0d0b0efe0d070e110e0e0ee40d110e0f0e0e0e110ee40de30d110ee30dd40d110ed40de10d110e120e0f0e110ee00d120e110ee10de00d130e100e0f0e130efe0d100e130e0f0e140e150e140e0f0e150e160e140e130e140e160e150e170e160e180e160e170e180e170e190e150e190e170e180e190e1a0e1b0e1a0e190e1b0e1c0e1a0e180e1a0e1c0e1b0e1d0e1c0e1b0e1e0e1d0e1b0e1f0e1e0e200e1e0e1f0e200e210e1e0e200e220e210e200e230e220e240e220e230e240e230e250e200e250e230e240e250e260e270e260e250e270e280e260e240e260e280e270e290e280e270e2a0e290e270e2b0e2a0e2c0e2a0e2b0e2c0e2b0e2d0e270e2d0e2b0e2c0e2d0e2e0e2c0e2e0e2f0e2c0e2f0e300e2c0e310e2a0e2c0e320e310e2c0e300e320e330e300e2f0e330e320e300e330e2f0e340e330e340e350e330e350e360e330e370e320e330e380e370e330e360e380e390e290e2a0e390e2a0e3a0e390e3a0e3b0e390e3b0e3c0e390e3c0e3d0e390e3d0e3e0e390e280e290e390e3e0e280e3f0e280e3e0e3f0e3e0e3d0e3f0e400e280e3f0e410e400e3f0e420e410e3f0e430e420e3f0e440e430e3f0e3d0e440e240e400e410e240e280e400e240e410e450e240e450e220e460e3a0e2a0e460e2a0e310e460e310e320e460e320e470e480e470e320e480e320e370e480e370e490e480e4a0e470e460e470e4a0e480e4b0e4a0e4c0e4a0e4b0e4c0e4b0e380e480e380e4b0e4c0e380e4d0e4e0e4d0e380e4e0e380e360e4e0e4f0e4d0e4c0e4d0e4f0e4e0e500e4f0e510e4f0e500e510e520e4f0e510e530e520e510e540e530e550e530e540e550e540e560e510e560e540e550e560e570e550e570e580e550e580e590e550e5a0e530e5b0e530e5a0e5b0e5a0e5c0e550e5c0e5a0e550e590e5c0e5b0e5c0e5d0e5b0e5e0e530e5b0e5f0e5e0e5b0e600e5f0e5b0e610e600e5b0e5d0e610e620e580e570e620e570e560e620e630e580e620e640e630e620e650e640e660e640e650e660e650e670e620e670e650e660e670e680e660e690e640e660e6a0e690e660e6b0e6a0e660e6c0e6b0e660e680e6c0e620e6d0e670e620e560e6d0e6e0e680e670e6e0e6c0e680e6e0e670e6f0e6e0e6f0e700e6e0e700e710e6e0e720e6c0e6e0e730e720e6e0e710e730e740e6d0e560e740e670e6d0e740e6f0e670e740e700e6f0e740e560e750e740e750e760e740e760e770e740e770e700e510e750e560e510e760e750e510e500e760e780e6b0e6c0e780e6c0e790e780e790e7a0e780e7a0e7b0e780e6a0e6b0e780e7c0e6a0e780e7d0e7c0e780e7b0e7d0e7e0e7b0e7a0e7e0e7d0e7b0e7e0e7a0e7f0e7e0e7f0e800e7e0e800e810e820e810e800e820e800e830e820e840e810e7e0e810e840e820e850e840e820e860e850e820e870e860e820e880e870e820e830e880e7e0e840e890e7e0e890e7d0e8a0e800e7f0e8a0e8b0e800e8a0e8c0e8b0e8a0e8d0e8c0e8e0e8c0e8d0e8e0e8f0e8c0e900e8c0e8f0e900e8f0e910e8e0e910e8f0e900e910e920e900e920e930e900e930e940e900e940e950e900e950e960e900e960e8c0e8e0e970e910e8e0e980e970e8e0e990e980e9a0e980e990e9a0e990e9b0e8e0e9b0e990e8e0e8d0e9b0e9a0e9b0e9c0e9a0e9d0e980e9a0e9e0e9d0e9a0e9f0e9e0e9a0e730e9f0e9a0e9c0e730ea00e9d0e9e0ea00e980e9d0ea00e9e0ea10ea20ea10e9e0ea20e9e0ea30ea20ea30ea40ea20ea40ea50ea20ea50ea60ea20ea60ea70ea20ea80ea10ea20ea70ea80ea00ea10ea80ea90ea70ea60ea90ea80ea70ea90ea60eaa0ea90eaa0eab0ea90eab0eac0ea90ead0ea80ea90eae0ead0ea90eac0eae0eaf0ea60ea50eaf0ea50ea40eaf0eb00ea60eb10ea60eb00eb10eb00e2f0eaf0e2f0eb00eb10e2f0e2e0eb10e2e0e2d0eb10e2d0eb20eb10eb20eb30eb10eb30eb40eb10eb40ea60eb50eb20e2d0eb50eb30eb20eb50e2d0eb60e270eb60e2d0e270e250eb60eb50eb60e250eb50e250eb70eb50eb70eb80eb50eb80eb90eb50eb90eb30e200eb70e250e200eb80eb70e200e1f0eb80eba0eb40eb30eba0ea60eb40eba0eb30ebb0eba0ebb0ebc0eba0ebc0ebd0eba0eaa0ea60eba0eab0eaa0eba0ebd0eab0e1b0eb80e1f0e1b0ebe0eb80e1b0e190ebe0ebf0ebe0e190ebf0eb80ebe0ebf0eb90eb80ebf0ebc0ebb0ebf0e190ec00ebf0ec00ebc0ebf0eb30eb90ebf0ebb0eb30e150ec00e190e150ebc0ec00e150ec10ebc0e150e0f0ec10ec20ebc0ec10ec20ebd0ebc0ec20eab0ebd0ec20ec10e0f0ec20eac0eab0ec20eae0eac0ec20ec30eae0ec20e0f0ec30ec40ec30e0f0ec40eae0ec30ec40e0f0ec50ec40ec60eae0ec40ede0dc60ec40ec50ede0dc70ec60ede0dc70eae0ec60ec70ede0dc80ec90ec80ede0dc90e1e0bc80ec70ec80e1e0bc90eca0e1e0bc90ecb0eca0ec90ecc0ecb0ec90edc0dcc0ec90edd0ddc0dc90ede0ddd0dcd0ecc0edc0dcd0ecb0ecc0ecd0edc0dce0ecf0ece0edc0dcf0edc0ddb0dcf0edb0dd80dcf0ed80dd70dcf0ed70dd10dcf0ed10dcf0dcf0ece0dce0ecf0ecf0dce0dcd0ece0ece0dcd0ed00ecb0ecd0ed10ed00ecd0ed20ed10ecd0ece0dd20ed30ed20ece0dd30ed10ed20ed30ece0dd40ed50ed40ece0dd50ead0dd40ed30ed40ead0dd50ed60ead0dae0dad0dd60eae0dd60ed70ed50ed70ed60eae0dd70eb10db20db10dd70eb20dd70ed80ed90ed80ed70ed90ed70eda0ed50eda0ed70ed90ebd0dd80eb20dd80ebd0dd90ebe0dbd0dd90ec30dbe0dd90ec60dc30dd90ecb0dc60dd90eda0ecb0dd50ecb0dda0ed50ecd0dcb0dd50ece0dcd0dd30ead0da90dd30ea90da80dd30ea80ddb0ed30edb0ed10edc0edb0ea80ddc0ed10edb0edc0ea80ddd0ea30ddd0ea80da30d8e0ddd0edc0edd0e8e0da30da20d8e0d9f0d8e0da20d9f0d8f0d8e0ddc0e8e0d8d0ddc0ede0ed10edc0e8a0dde0edc0e8d0d8a0ddf0ede0e8a0ddf0ed10ede0edf0e8a0d890ddf0ed00ed10edf0ecb0ed00edf0ee00ecb0ee10ecb0ee00ee10ee00e880ddf0e880de00edf0e890d880de10e880de20ee30ee20e880de30e880d870de30e1c0be20ee10ee20e1c0be30ee40e1c0b170b1c0be40e170be40e0d0be30e0d0be40ee30e120b0d0be30e130b120be30e870d130be10e1c0b1d0be10eca0ecb0ee10e1e0bca0ee10e1d0b1e0bc70e1e0be50ec70ee50ee60ec70ee60ee70ee80ee70ee60ee80ee60ee90ee80eae0ee70ec70ee70eae0ee80ead0eae0ee80ea80ead0ee80eea0ea80ea00ea80eea0ea00eea0eeb0ee80eeb0eea0ee80ee90eeb0ea00eeb0eec0ea00eec0e980eed0e980eec0eed0eec0eeb0eed0eee0e980eef0e980eee0eef0eee0ebc09ed0ebc09ee0eef0ebc09f00eb709f00ebc09b709f10ef00eef0ef00ef10eb709b609f10eb509f10eb609b509f20ef10eb509f30ef20eb509f40ef30eb509f50ef40eb509b409f50eaf09f50eb409af09b009f50eef0ef10ef60eef0ef60e910eef0e910e970ea809f50eb009a809a709f50ea609f50ea709a609f40ef50ea609f30ef40ea609f70ef30ea609f80ef70ea609a509f80ea109f80ea509a109f90ef80ea1099f09f90efa0ef70ef80efa0ef30ef70efa0efb0ef30efa0e930efb0efa0efc0e930efd0e930efc0efd0e940e930efd0e950e940efd0efe0e950eff0e950efe0eff0efe0e000ffd0e000ffe0eff0e000f010f020f010f000f020f000f030f020f030f040f020f040f050f020f050f060f020f060f070f020f080f010f020f070f080fff0e010f080fff0e090f950eff0e880e090fff0e0a0f880eff0e080f0a0f0b0f070f060f0b0f080f070f0b0f0a0f080f0b0f880e0a0f0b0f060f0c0f0b0f0c0f860e0b0f860e870e0b0f870e880e0d0f030f000f0d0f040f030f0d0f000f0e0ffd0e0e0f000ffd0e0f0f0e0f0d0f0e0f0f0ffd0efc0e0f0f0d0f0f0f100f110f100f0f0f110f0f0f120f110f130f100f0d0f100f130f110f140f130f110f150f140f110f160f150f110ff80e160f110f120ff80e0d0f130f170f0d0f170f040ffa0e0f0ffc0efa0e120f0f0ffa0ef80e120f180f140f150f180f130f140f180f150f190f180f190fd60b180fd60b1a0f180f1a0f1b0f180f1b0f1c0f180f1c0f130f1d0f1c0f1b0f1d0f130f1c0f1d0f170f130f1d0f040f170f1d0f1b0f1e0f1f0f1e0f1b0f1f0f1b0f200f1f0f200f210f1f0f210f220f230f220f210f230f240f220f1f0f220f240f230f250f240f230f260f250f230f270f260f230f280f270f230f290f280f230f210f290f2a0f260f270f2a0f270f280f2a0f2b0f260f2a0f2c0f2b0f2a0f2d0f2c0f2e0f2c0f2d0f2e0f2f0f2c0f2e0f300f2f0f2e0f310f300f2e0f320f310f2e0f330f320f2e0f340f330f2e0f2d0f340f2a0f340f2d0f350f330f340f350f320f330f350f340f360f350f360f370f350f370f380f350f390f320f3a0f320f390f3a0f390f3b0f350f3b0f390f350f380f3b0f3a0f3b0f3c0f3a0f3c0f3d0f3a0f3d0f3e0f3a0f3f0f320f3a0f400f3f0f3a0f3e0f400f410f3c0f3b0f410f3d0f3c0f410f3b0f420f410f420f430f410f430f440f410f440f450f410f450f460f410f460f3d0f470f3e0f3d0f470f400f3e0f470f3d0f480f490f480f3d0f490f3d0f4a0f490f4a0f4b0f490f4b0f4c0f490f4d0f480f470f480f4d0f490f4e0f4d0f4f0f4d0f4e0f4f0f500f4d0f4f0f510f500f4f0f520f510f4f0f530f520f4f0f540f530f4f0f550f540f4f0f4e0f550f490f550f4e0f490f4c0f550f560f500f510f560f4d0f500f560f510f570f560f570f580f560f580f590f560f590f5a0f560f5a0f5b0f560f5b0f4d0f5c0f540f550f5c0f530f540f5c0f550f5d0f5c0f5d0f5e0f5c0f5e0f5f0f5c0f5f0f600f5c0f600f610f5c0f610f530f620f610f600f620f530f610f620f600f630f620f630f640f620f640f650f620f650f660f620f660f670f620f670f530f680f630f600f680f640f630f680f600f690f680f6a0f640f680f430e6a0f680f420e430e680f410e420e680f690f410e6b0f600f5f0f6b0f410e690f6b0f5f0f5e0f6b0f5e0f6c0f6b0f690f600f6b0f450e410e6b0f220e450e6b0f6c0f220e6d0f6c0f5e0f6d0f220e6c0f6d0f5e0f6e0f6f0f6e0f5e0f6f0f700f6e0f6d0f6e0f700f6f0f710f700f6f0f4b0f710f6f0f4c0f4b0f6f0f550f4c0f6f0f5d0f550f6f0f5e0f5d0f6d0f700f720f6d0f720f1e0e6d0f1e0e210e6d0f210e220e730f720f700f730f1e0e720f730f700f740f730f740f750f730f750f760f730f760f1c0e730f1c0e1d0e730f1d0e1e0e770f750f740f770f710f4b0f770f700f710f770f740f700f770f780f750f770f790f780f770f7a0f790f7b0f790f7a0f7b0f7c0f790f7b0f450f7c0f7b0f460f450f7b0f3d0f460f7b0f4a0f3d0f7b0f4b0f4a0f7b0f7a0f4b0f770f4b0f7a0f7d0f760f750f7d0f1c0e760f7d0f750f7e0f7d0f7e0f7f0f7d0f7f0f800f810f800f7f0f810f7f0f820f810f830f800f7d0f800f830f810f840f830f850f830f840f850f840f860f810f860f840f850f860f870f850f870f880f850f880f890f850f890f160e850f160e8a0f850f8a0f830f180e830f8a0f180e8a0f160e180e8b0f830f180e1c0e8b0f8c0f870f860f8c0f880f870f8c0f860f8d0f8c0f8d0fb80d8c0fb80db90d8c0fb90dba0d8c0fba0d8e0f8c0f8e0f880f8f0f890f880f8f0f160e890f8f0f880f900f8f0f910f160e130e160e910f130e910f000e8f0f000e910f130e000eff0d130eff0dfe0d8f0f010e000e8f0f020e010e8f0f900f020e920f8e0fba0d920f020e900f920fba0d090e920f880f8e0f920f900f880f920f030e020e920f040e030e920f090e040e930f940f950f930f960f940f930f970f960f930f980f970f930f990f980f930f9a0f990f930f9b0f9a0f930f950f9b0f9c0f9a0f9b0f9c0f990f9a0f9c0f9b0f9d0f9e0f9d0f9b0f9e0f9f0f9d0f9c0f9d0f9f0f9e0fa00f9f0f9e0fa10fa00f9e0fa20fa10fa30fa10fa20fa30fa40fa10fa30fa50fa40fa30fa60fa50fa30fa70fa60fa30fa80fa70fa30fa90fa80fa30fa20fa90f9e0fa90fa20f9e0faa0fa90f9e0f9b0faa0fab0fa50fa60fab0fa60fa70fab0fac0fa50fab0fad0fac0fab0fae0fad0fab0faf0fae0fab0fb00faf0fab0fa70fb00fb10fa80fa90fb10fa70fa80fb10fa90fb20fb10fb30fa70fb10fb40fb30fb10fb50fb40fb10fb60fb50fb10fb20fb60fb70fa90faa0fb70fb20fa90fb70fb60fb20fb70faa0f9b0fb70f9b0f950fb70fb80fb60fb70f940fb80fb70f950f940fb90faf0fb00fb90fb30fb40fb90fa70fb30fb90fb00fa70fb90fba0faf0fb90fbb0fba0fb90fbc0fbb0fb90fb40fbc0fbd0fba0fbb0fbd0fbb0fbe0fbd0faf0fba0fbd0fae0faf0fbd0fad0fae0fbd0fbf0fad0fbd0fc00fbf0fbd0fbe0fc00fc10fbf0fc00fc10fad0fbf0fc10fc00fc20fc10fc30fad0fc40fad0fc30fc40fc30fc50fc10fc50fc30fc40fc50fc60fc40fc60fc70fc40fc70fc80fc40fac0fad0fc40fa50fac0fc40fc80fa50fc90fc80fc70fc90fa50fc80fc90fc70fca0fc90fca0fcb0fc90fcb0fcc0fc90fa40fa50fc90fa10fa40fc90fcc0fa10fcd0fcc0fcb0fcd0fa10fcc0fcd0fcb0fce0fcd0fce0fcf0fcd0fcf0fd00fcd0fa00fa10fcd0f9f0fa00fcd0fd00f9f0fd10f9f0fd00fd10fd00fcf0fd10fd20f9f0f9c0f9f0fd20f9c0fd20fd30fd10fd30fd20f9c0fd30fd40fd50fd40fd30fd50fd30fd60fd50fd60fd70fd50fd70fd80fd50f990fd40f9c0fd40f990fd50fd90f990fd50fda0fd90fd50fd80fda0fdb0fd90fda0fdb0f990fd90fdb0fda0fdc0fdd0fdc0fda0fdd0fde0fdc0fdb0fdc0fde0fdd0fdf0fde0fdd0fe00fdf0fdd0fe10fe00fdd0fe20fe10fdd0fe30fe20fdd0fda0fe30fdb0f980f990fdb0f970f980fdb0fe40f970fdb0fde0fe40fe50fda0fd80fe50fe30fda0fe50fe20fe30fe50fe60fe20fe70fe20fe60fe70fe60fe80fe50fe80fe60fe70fe80fe90fe70fe90fea0fe70fea0feb0fe70fec0fe20fe70fed0fec0fe70feb0fed0fee0fed0feb0fee0feb0fea0fee0fef0fed0ff00fed0fef0ff00fef0ff10fee0ff10fef0ff00ff10ff20ff00ff20ff30ff00ff30ff40ff00ff40ff50ff00ff50ff60ff00ff60fed0ff70ff30ff20ff70ff20ff10ff70ff80ff30ff70ff90ff80ff70ffa0ff90ff70ffb0ffa0ff70ffc0ffb0ff70ff10ffc0ffd0ffa0ffb0ffd0ff90ffa0ffd0ffb0ffe0ffd0ffe0fff0ffd0fff0f0010fd0f00100110fd0f01100210fd0f0210f90f0310fb0ffc0f0310fe0ffb0f0310ff0ffe0f0310fc0ff10f0310f10f0410ee0f0410f10fee0f05100410031004100510ee0f06100510ee0fea0f061003100710ff0f03100510071008100110001008100010ff0f08100910011008100a10091008100b100a1008100c100b1008100d100c100810ff0f0d100e100610ea0f0e10051006100e10ea0f0f1010100f10ea0f101011100f100e100f1011101010121011101010131012101010141013101010e80f14101010e90fe80f1010ea0fe90f15101410e80f1510131014101510e80f1610e50f1610e80fe50fd70f161015101610d70fe50fd80fd70f1510d70f171018101710d70f18101910171015101710191018101a10191018101b101a1018101c101b101810d30f1c101810d60fd30f1810d70fd60f151019101d1015101d101310d10f1c10d30fd10f1b101c10d10f1e101b10d10fcf0f1e101f101d1019101f1013101d101f10191020101f10201021101f10211022101f10231013102410131023102410231025101f10251023101f102210251024102510261027102610251027102510281027102910261024102610291027102a1029102b1029102a102b102a100c1027100c102a102b100c100d102b100d10ff0f2b10ff0f07102b10071005102b1005102c102b102c1029100e102c1005100e1029102c100e102d102910241029102d100e1011102d1027102e100c102f100c102e102f102e1030102f10301031102f10311032102f103210331034103310321034103210351034103510361034103610371038103710361038103610391038103a103710341037103a1038103b103a103c103a103b103c103d103a103e103a103d103e103d103f103c103f103d103e103f1040103e1041103a1034103a1041103e100a10411034100a103310341041100a103e1009100a103e10011009103e10401001103c1042103f103c10431042103c10441043103c10451044103c103b104510381045103b10381046104510471045104610471046104810381048104610471048104910471049104a1047104a104b1047104c10451047104d104c1047104b104d103810391048104e10421043104e1043104f104e104f1050104e105010511052105110501052105010531052105310541052105410c20fc10fc20f5410c10f54105510c10f5510c50f5210c20fc00f5210c00f56105210571051105210561057104e10511057104e10571058104e1058103f104e103f1042105910531050105910541053105910551054105910c50f5510591050105a1059105b10c50f5c10c50f5b105c105b105d1059105d105b1059105a105d105c105d105e105c105e105f105c105f106010611060105f1061105f106210611062106310611063106410651064106310651063106610651066106710651067106810691068106710691067106a106910cf0f681065106810cf0f69101e10cf0f69101b101e1069106b101b106c101b106b106c106b106d1069106d106b1069106a106d106c106d106e106c106e1021106c10211020106c10201019106c1019101a106c101a101b106f106e106d106f1021106e106f106d1070106f10711021106f10721071106f10731072106f10741073106f10701074107510731074107510721073107510741076107510761048107510481039107510771072107810721077107810771036107510361077107510391036107810361035107810351032107810321031107810311030107810301079107810791072107a10761074107a10481076107a1074107b107a10491048107a104a1049107a107c104a107d104a107c107d107c107e107a107e107c107a107b107e107d107e107f107d107f105f107d105f105e107d105e105d107d105d1080107d1080104a10811080105d1081104a10801081105d105a1081105a10501081105010821083108210501083104d108210811082104d1083104c104d10831045104c1083104410451083104310441083104f104310831050104f1081104d104b1081104b104a108410ed0ff60f8410ec0fed0f8410e20fec0f8410e10fe20f8410e00fe10f84108510e00f8410f50f85108410f60ff50f86108510f50f8610e00f85108610f50f871086108710600b8610600b88105d0b8810600b5d0b5a0b8810861088105a0b86105a0b891086108910e00f8a108710f50f8a10600b87108a10f50ff40f8a10f40ff30f8a10f30f8b108a10610b600b8a10620b610b8a108b10620b8c10e00f89108c1089105a0b8c10df0fe00f8c10de0fdf0f8c108d10de0f8e10de0f8d108e108d10580b8c10580b8d108e10580b5c0b8e105c0b520b8e10520b8f108e10e40fde0f8e10970fe40f8e108f10970f8c10590b580b8c105a0b590b9010970f8f1090108f10520b9010960f970f9010940f960f90109110940f9210940f911092109110500b9010500b91109210500b540b9210540b4a0b92104a0b9310941093104a0b94104a0b4b0b94104b0b4c0b94104c0b95109410b60f931092109310b60f9410b50fb60f9410b40fb50f94109510b40f9210b80f940f9210b60fb80f961095104c0b9610b40f951096104c0b9710460b97104c0b460b440b971096109710440b9610440b981099109810440b9910440b450b9910450b400b9910400b9a109b109a10400b9b10400b410b9b10410b3c0b9b103c0b9c109b10c00f9a1099109a10c00f9b105610c00f9b10571056109b109c1057109910bb0f98109910be0fbb0f9910c00fbe0f96109810bb0f9610bb0fbc0f9610bc0fb40f9d109c103c0b9d1057109c109d103c0b3b0b9d103b0b3a0b9d103a0b9e109f109e103a0b9f103a0b390b9f10390b380b9f10380ba010a110a010380ba110380ba210680ba210380b680b380b370b680b370b360b680b660ba210a110a210660ba110660ba310a1100110a0109f10a0100110a11002100110a110f90f0210a110a310f90fa410f90fa310a410a310660ba410f80ff90fa410f30ff80fa4108b10f30fa410620b8b10a410650b620ba410660b650b9f10011040109f1040103f109f103f109e109d109e103f109d103f1058109d10581057102f100a100b102f1033100a102f100b100c10271030102e10271028103010a51030102810a51028102510a51025102210a51022102110a51021107110a51071107210a51072107910a5107910301024101110121024102d1011102410121013106510cf0fce0f6510ce0fcb0f6510cb0f641061106410cb0f6110cb0fca0f6110ca0fc70f6110c70f60105c106010c70f5c10c70fc60f5c10c60fc50fa6106d106a10a61070106d10a61074107010a610a7107410a6106310a710a61066106310a61067106610a6106a106710a810a7106310a8107410a710a81063106210a8107b107410a8107e107b10a8107f107e10a8105f107f10a81062105f103e0aa910380a3e0aaa10a9103e0aab10aa103e0a410aab10ac10380aa910ac10a910aa10ac103d0a380aac103c0a3d0aac10ad103c0aac10ae10ad10ac10af10ae10ac10aa10af10b010ab10410ab010aa10ab10b010410a460ab010b110aa10b010b210b110b010b310b210b010470ab310b010460a470ab410aa10b110b410af10aa10b410ae10af10b410b110b210b410b510ae10b410b610b510b410b710b610b410b210b710b810b310470ab810b210b310b810470a920ab810b910b210b810ba10b910b810bb10ba10b810930abb10b810920a930abc10b210b910bc10b710b210bc10b610b710bc10b910ba10bc10bd10b610bc10be10bd10bc10bf10be10bc10ba10bf10c010bb10930ac010ba10bb10c010930a9a0ac010c110ba10c0109f0ac110c0109e0a9f0ac0109b0a9e0ac0109a0a9b0ac210ba10c110c210bf10ba10c210be10bf10c210c1109f0ac210c310be10c210a50ac310c210a40aa50ac2109f0aa40ac410a10aaa0ac410a80aa10ac410a70aa80ac410c510a70ac410b40ac510c410b50ab40ac410ab0ab50ac410aa0aab0aaf0e340e2f0eaf0e350e340eaf0ec610350eaf0ea40ec610c710350ec610c710c610a40ec710c810350ec710760ec810c710770e760ec710700e770ec710c910700ec710a40ec910ca10c910a40eca10700ec910ca10a40ea30eca10710e700eca10730e710eca109f0e730eca109e0e9f0eca10a30e9e0e4e0ec810760e4e0e350ec8104e0e760e500e4e0e360e350ecb10730e9c0ecb109c0e9b0ecb109b0ecc10cb10cc107a0ecb107a0e790ecb10720e730ecb106c0e720ecb10790e6c0e8a0ecc109b0e8a0e7a0ecc108a0e9b0e8d0e8a0e7f0e7a0ecd10ce10cf10cd10d010ce10cd105f0ed010cd105e0e5f0ecd10530e5e0ecd10520e530ecd104f0e520ecd10cf104f0e4c0ecf10ce104c0e4f0ecf104c0ece10d1104c0ed1104a0ed210d110ce10d210ce10d310d4104a0ed110d210d310d510d210d510d610d710d510d310d710d0105f0ed710d810d510d710d910d810d710da10d910d7105f0eda10d710d310ce10d710ce10d010db10d910da10db10da105f0edb10dc10d910db10dd10dc10db10de10dd10db10610ede10db10600e610edb105f0e600edf10de10610edf10dd10de10df10610ee010e110e010610ee110610e5d0ee1105d0e5c0ee1105c0ee210e110e310e010df10e010e310e110e410e310e110e510e410e110e210e510e610e2105c0ee610e510e210e6105c0e590ee610590e580ee610580ee710e610e810e510e610e910e810e610e710e910ea10e710580eea10e910e710ea10580e630eea10eb10e910ea10ec10eb10ea10ed10ec10ee10ec10ed10ee10ef10ec10ee10f010ef10ee10f110f010ee106a0ef110ee10690e6a0eee10640e690eee10ed10640eea10640eed10ea10630e640ef210ef10f010f210ec10ef10f210f010f310f210f310300ff210300ff410f210f410f510f210f510f610f210f610ec10f710f610f510f710ec10f610f710f510f810f710f810f910f710f910fa10f710fa10e910f710e910eb10f710eb10ec10fb10fa10f910fb10e910fa10fb10f910fc10fb10fc10fd10fb10fd10fe10fb10e810e910fb10e510e810fb10fe10e510ff10fe10fd10ff10e510fe10ff10fd100011ff1000110111ff1001110211ff10e410e510ff10e310e410ff100211e3100311fd10fc100311fc10f9100311f910041105110411f91005115a0f0411031104115a0f051106115a0f470f5a0f0611470f0611400f0511400f0611470f5b0f5a0f470f4d0f5b0f05110711400f0811400f071108113f0f400f0811320f3f0f0811310f320f0811300f310f0811f410300f0811f510f41008110711f5100511f51007110511f810f5100511f910f81003115a0f590f0311590f580f0311580f091103110911fd100a110911580f0a11fd1009110a11580f0b110a110b110c110a110c110d110a110d1101110a11011100110a110011fd100e110b11580f0e110c110b110e110f110c110e11510f0f110e11570f510f0e111011570f11110c110f1111110f11510f111112110c111111660f12111111670f660f1111530f670f1111520f530f1111510f520f13111211660f13110c1112111311660f141115111411660f1511660f650f1511161114111311141116111511171116111511181117111511191118111511640f19111511650f640f131116111a111b111911640f1b11181119111b11640f6a0f1b111c1118111b111d111c111b111e111d111f111d111e111f111e11430e1b11430e1e111b116a0f430e1f11430e440e1f11440e3d0e1f113d0e2011211120113d0e21113d0e3c0e21113c0e3b0e21113b0e22112111231120111f1120112311211124112311211125112411211122112511261125112211261122113b0e26112711251126113b0e2811460e28113b0e460e4a0e2811261128114a0e460e3b0e3a0e26114a0e29112a1129114a0e2a112b1129112c1129112d111f1123112e111f112e111d11ef0e970e980eed0ebd09bc09ed0ebe09bd09ed0e2f11be09ed0eeb0e2f1130112f11eb0e3011be092f113011eb0ee90e3011c109be093011c209c10930113111c2093011e60e31113011e90ee60e32113111e60e3211c20931113211e60ee50e32113311c2093411c20933113411c309c2093411cc09c30934113511cc092a0bcc0935112a0b3511260b3411260b35112a0bcb09cc092a0bca09cb093411250b260b3411200b250b34113311200b3211200b331132111f0b200b32111e0b1f0b3211e50e1e0b3611160d371136113811160d3611e40c38113611e90ce40c3611ea0ce90c36113911ea0c36112a0d3911361137112a0d3a113711160d3a112a0d37113a11160d150d3a11150d100d3a11100d1b0d3a11290d2a0d3a111c0d290d3a111b0d1c0d3b113811e40c3b11160d38113b11e40ce50c3b11e50ce60c3b11e60cfa0c3b11fa0cf90c3b11f90c170d3b11170d160d3c1139112a0d3c112a0d280d3c11280d270d3c11270d3c0d3c113c0d3b0d3c113b0d3d113c113d11ea0c3c11ea0c39113e113d113b0d3e11ea0c3d113e113b0d3f113e113f1140113e11401141113e11eb0cea0c3e11df0ceb0c3e114111df0c4211df0c411142114111401142114311df0cd80cdf0c4311d80c4311d60c4211d60c431142114411d60c4511d60c441145114411960d4211960d44114511960d950d4511d50cd60c4511d00cd50c45114611d00c4511940d46114511950d940d42114711960d42114011471148114611940d4811d00c46114811940d9a0d4811d10cd00c4811d30cd10c48114911d30c48119b0d491148119a0d9b0d840d47114011840d960d4711840d4011830d840d970d960d840d980d970d840d850d980d860d980d850d860d8b0d980d820d830d4011820d40113f11820d3f113b0d820d3b0d3a0d820d3a0d160b4a1149119b0d4a119b0d4b114c114b119b0d4c114d114b114a114b114d114c114e114d114f114d114e114f114e1150114c1150114e114f11501151114f11511152114f11521153114f11531154114f11541155114f1155114d1156115111501156115211511156115011571156115811521156115911581156115a11591156115b115a11561157115b115c11571150115c115b1157115c1150115d114c115d1150114c119d0d5d115c115d119d0d4c119c0d9d0d4c119b0d9c0d5c115e115b115f115b115e115f115e11a10d5c11a10d5e115f11a10da40d5f1160115b115f11611160115f11621161116311611162116311641161116311651164116311661165116311ab0d66116311aa0dab0d6311a50daa0d63116211a50d5f11a50d62115f11a40da50d67116611ab0d6711651166116711ab0daf0d67116811651167116911681167116a1169116b1169116a116b116a11b00d6711b00d6a116711af0db00d6b11b00db30d6b116c1169116d1169116c116d116e1169116d116f116e116d1170116f1171116f1170117111701172116d1172117011711172117311711174116f1171117511741171117611751171117711761171117311771178117411751178116f117411781175117911781179117a1178117a117b1178117b117c1178117c117d1178117d116f117e11761177117e11751176117e11791175117e117a1179117e1177117f117e117f1180117e11801181117e1181117a1182118111801182117a11811182118011831182118311841182118411851186118511841186118411871186118711881186118811891186118a118511821185118a1186118b118a1186118c118b11861189118c1182118a118d1182118d117a118e1180117f118e117f1177118e1177118f1190118f117711901191118f118e118f1191119011921191119011931192119011941193119011721194119011731172119011771173118e11911195118e11951196118e11961197118e1197118011981192119311981191119211981193119911981199119a1198119a119b119c119b119a119c119a119d119c119e119b1198119b119e119c119f119e119c11a0119f119c119d11a011a1119e119f11a1119f11a011a111a2119e11a111a311a211a111a411a311a111a011a411a5119d119a11a511a0119d11a5119a11a611a511a611a711a511a711a811a511a811a011a911a811a711a911a011a811a911a711aa11a911aa11ab11a911ab11ac11a911ac11a011ad11ac11ab11ad11a011ac11ad11ab11ae11ad11ae11af11ad11af11b011b111b011af11b111af11b211b111b211b311b111b311b411b111a011b011b111b411a011ad11b011a011b511b411b311b511a011b411b511b311b611b511b611a311b511a311a411b511a411a011b711b611b311b711a311b611b711b311b811b711b811b911b711b911ba11b711ba119611b7119611bb11b711bb11a311bc11a311bb11bc11bb119611bc11a211a311bc119e11a211bc11bd119e1198119e11bd119811bd119111bc119111bd11bc1195119111bc1196119511be11ba11b911be119611ba11be11b911bf11be11bf118411be1184118311be1183118011be1180119711be1197119611c0118411bf11c011bf11b911c011b911c111c211c111b911c211b911c311c411c311b911c411b911c511c611c511b911c611b911c711c611c7117f0fc6117f0f7e0fc611790fc511c411c511790fc611780f790fc611750f780fc6117e0f750fc811c711b911c8117f0fc711c811b911b811c811c9117f0fc811af11c911c811b211af11c811b311b211c811b811b311ca11c911af11ca117f0fc911ca11af11ae11ca11ae11ab11ca11ab11cb11ca11cb11cc11ca11cc11820f810f820fcc11810fcc11cd11810fcd11860fce11cd11cc11ce11860fcd11ce11cc11cf11ce11cf11d011ce11d011d111d211d111d011d211d011d311d411d311d011d411d511d311d211d311d511d411d611d511d4117211d611d41194117211d41193119411d411d7119311d411d011d711d211d511d811d211d811b40dd211b40db70dd211b80dd111d211b70db80d6d11d61172116d11d511d6116d116c11d5116b11d5116c116b11d811d5116b11b40dd8116b11b30db40dd9119311d711d91199119311d9119a119911d911a6119a11d911a711a611d911da11a711d911d011da11d911d711d011db11da11d011db11a711da11db11d011cf11db11aa11a711db11ab11aa11db11cb11ab11db11cc11cb11db11cf11cc11dc11dd11de11df11de11dd11df11dd11e011df11e011e111e211e111e011e211e011e311e211e311e411e211e411e511e211e511e611e211e611e111e711e611e511e711e111e611e711e511e811e711e811e911e711e911ea11e711ea11e111eb11e111ea11eb11ea11ec11eb11ed11e111ee11e111ed11ee11ef11e111f011e111ef11f011f111e111f211e111f111f211f311e111f411e111f311f411f511e111f611e111f511f611f511f711f411f711f511f611f711f811f611f811f911f611f911fa11f611fa11e111fb11e111fa11fb11fa11fc11fb11fd11e111df11e111fd11030d0e0d180d030d180df90cfe11060b070bfe11000d060bfe11010d000dfe11720d010dfe11740d720dfe117a0d740dfe11080b7a0dfe11070b080bff11210d0012ff113e0d210dff11340d3e0dff11370d340dff11380d370dff11420d380dff11460d420dff110012460d01120012210d0112460d00120112210d2e0d01122e0d2f0d01122f0d021201120212031201120312041201120412460d0512041203120512460d041205120312061205120612540d0512540d4f0d0512470d460d0512480d470d05124f0d480d071202122f0d0712031202120712081203120912031208120912061203120912540d06120a122f0d300d0a12300d2d0d0a122d0d0b120c122d0d2c0d0c122c0d1f0d0c121f0d1a0d0c121a0d120d0c12120d0d120e120d12120d0e120f120d120c120d120f120e1210120f120e12111210120e12121211120e120b0d12120e12130d0b0d0e12120d130d0c1213122d0d0c120f121312141211121212141212120b0d1412151211121412161215121412171216121412090d171214120a0d090d14120b0d0a0d18121712090d1812161217121812090d6b0d18126b0d620d1812620d630d1812191216121812640d19121812630d640d1a121b12640d1c1213120f121c120f121d121e121d120f121e120f1210121e12101211121c122d0d13121c120b121f122012640d650d20122112640d2212660d610d22122312660d2212520d23122212510d520d2212500d510d2212590d500d22125a0d590d2212610d5a0d2412290c251224122612290c241227122612241228122712241225122912241229122a122b12271228122b122c1227122b122d122c122b122e122d122f122d122e122f1230122d122f12311230122f12321231123312261227123312290c2612331227123412331234123512331235123612310c36123512310c35123712310c3712350c310c2b0c3612331236122b0c3812371235123812350c371238123512391238123a12350c38123b123a1238123c123b1238123d123c12381239123d123e123c123d123e123b123c123e123d123f123e1240123b123e12411240123e12421241123e12431242123e123f1243124412350c3a1244123a123b124412360c350c4412370c360c44124512370c44124612451244124712461244123b12471248123b124012481247123b1248124612471248124012411248124912461248124a12491248124b124a12481241124b124c12370c45124c12451246124c123a0c370c4c123b0c3a0c4c124d123b0c4c124e124d124c124f124e124c1246124f1250124612491250124f12461250124e124f12501249124a12501251124e1250125212511250125312521250124a12531254123b0c4d1254124d124e1254124e0c3b0c5412510c4e0c54125512510c54125612551254125712561254124e12571258124e125112581257124e1258125612571258125112521258125912561258125a12591258125b125a12581252125b125c12510c55125c12551256125c12530c510c5c12570c530c5c125d12570c5c125e125d125c125f125e125c1256125f1260125612591260125f12561260125e125f12601259125a12601261125e1260126212611260126312621260125a1263126412570c5d1264125d125e1264126512570c6612570c6512661265126712641267126512661267126812661268126912661269126a126b126a1269126b1269126c126b126c128f0c6b128f0c960c6b12960c5d0c6b125d0c5e0c6b12550c6a126b125e0c550c66126a12550c6612550c560c6612560c570c6d128f0c6c126d126c1269126d12900c8f0c6d12910c900c6d126e12910c6d126f126e126d1270126f126d126912701271127012691271126f127012711269126812711272126f1271127312721271127412731271126712741271126812671275127212731275126f127212751273127612751277126f1275127812771275127912781275127a127912751276127a127b1279127a127b12781279127b127a127c127b127d1278127b127e127d127b127f127e127b1280127f127b127c12801281127712781281126f12771281126e126f128112910c6e1281129a0c910c81129b0c9a0c811282129b0c811278128212831278127d1283128212781283129b0c821283127d127e1283129e0c9b0c83129f0c9e0c831284129f0c83127e128412851280127c1285127c127a1285127a128612871286127a1287127a12761287127612731287127312741287127412671287126712881264128812671264128912881287128912861287128812891285128612891264128a12891264125e128a128b128a125e128b1289128a128b125e1261128b128c1289128b128d128c128b128e128d128b1262128e128b1261126212851289128c1285128c128d1285128d128f1285128f1280129012910ef60e9012920e910e9012930e920e9012fb0e930e9012f30efb0e9012f20ef30e9012f10ef20e9012f60ef10e9112800e8b0e9112830e800e9112880e830e9112090f880e9112950e090f9112960e950e91128c0e960e91128b0e8c0e9010510b500b9010520b510b92126c0b931292126f0b6c0b9212700b6f0b9212750b700b9212e80a750b9212eb0ae80a9212ec0aeb0a92129312ec0a941293126c0b9412ec0a931294126c0b6b0b94126b0b360b9412360b350b9412310bec0a9412300b310b9412350b300b95129612971295129812961295129912981295129a12991295129b129a1295129c129b1295129d129c12951297129d129e1299129a129e129a129b129e129f129912a01299129f12a0129f12a1129e12a1129f12a012a112a212a012a3129912a012a412a312a012a512a412a612a412a512a612a512a712a012a712a512a012a212a712a612a712a812a612a912a412a612aa12a912a612ab12aa12a612ac12ab12a612a812ac12ad12ab12ac12ad12aa12ab12ad12ac12ae12ad12af12aa12ad12b012af12ad12b112b012ad12b212b112ad12ae12b212b312a412a912b312a912aa12b312b412a412b312b512b412b312b612b512b312b712b612b312b812b712b312aa12b812b912b412b512b912a412b412b912b512ba12b912ba129612b91296129812b91298129912b9129912a312b912a312a412bb12b712b812bb12b812aa12bb12aa12af12bb12bc12b712bb12bd12bc12bb12be12bd12bb12b012be12bb12af12b012bf12bd12be12bf12be12b012bf12c012bd12bf12c112c012bf12c212c112bf12b212c212bf12b112b212bf12b012b112c312c112c212c312c212b212c312c412c112c312c512c412c312c612c512c312c712c612c312c812c712c312b212c812c912c812b212c912c712c812c912b212ae12c912ae12ac12c912ac12ca12c912ca12cb12c912cb12cc12c912cc12c712cd12ca12ac12cd12cb12ca12cd12ac12a812cd12a812a712cd12a712ce12cd12ce12cf12cd12cf12d012cd12d012cb12d112ce12a712d112cf12ce12d112a712a212d112a212a112d112a112d212d112d212d312d112d312d412d112d412cf12d512d212a112d512d312d212d512a112d6129e12d612a1129e12d712d612d512d612d7129e12d812d712d912d712d812d912d8129b129e129b12d812d9129b12da12d912da12db12d912db12dc12d912dc12dd12d912dd12de12d912de12d712df12db12da12df12da129b12df12e012db12e112db12e012e112e012e212df12e212e012e112e212e312e112e412db12e112e512e412e112e612e512e112e712e612e112e312e712df12e812e212df129d12e812df129c129d12df129b129c12e912dd12dc12e912e412e512e912db12e412e912dc12db12e912e512ea12eb12ea12e512eb12e512ec12eb12ec12ed12eb12ed12ee12eb12ee12ef12eb12ef12f012eb12f112ea12eb12f012f112e912ea12f112f212ee12ed12f212ef12ee12f212ed12f312f412f312ed12f412ed12f512f412f512f612f412f612f712f412f812f312f212f312f812f412f912f812f412fa12f912f412f712fa12fb12f912fa12fb12f812f912fb12fa12fc12fb12fd12f812fb12fe12fd12fb12ff12fe12fb120013ff12fb12fc1200130113ff1200130113fe12ff1201130013021301130213031301130313041301130513fe120113061305130113041306130713f812fd120713051306130713fe1205130713fd12fe1207130813f812f212f8120813f21208130913071309130813f21209130a13f2120a13ef1207130b130913071306130b130c13041303130c13061304130c1303130d130c130e1306130c130f130e130c1310130f130c13111310130c130d1311131213ef120a1312130a13091312131313ef121413ef1213131413131315131213151313131413151316131413f012ef121413f112f01214131713f1121413181317131413161318131913171318131913f1121713191318131a1319131a131b1319131b131c131d131c131b131d131b131e131d13dd121c1319131c13dd121d13de12dd121d13d712de121d131f13d7121d1320131f131d131e1320131913dd12211319132113f112e9122113dd12e912f1122113d5121f132013d512d7121f13d51220132213d5122213d31223131b131a1323131a131813231318132413251324131813251318131613251316131513251315132613121326131513121327132613251326132713121328132713121309132813291328130913291327132813291309130b1329132a13271329130f132a1329130e130f13291306130e1329130b1306132b132a130f132b1327132a132b130f132c132d132c130f132d130f1310132d13101311132d1311132e132f132e1311132f1311133013311330131113311311130d1331130d1303133113031332133113321333133113331334133113351330133113341335132f133013351336133513341336133413331336133713351336133813371336133913381336133a13391336133b133a13361333133b133c13371338133c13351337133c1338133d133e133d1338133e1338133f133e133f1340133e13401341133e13411342133e13421343133e1344133d133e13431344133c133d1344133c13441345133c13451346133c13461347133c13471335132f13351347132f13471346132f13461348132f13481349132f1349132e132d132e1349132d1349134a132d134a134b132d134b132c132b132c134b132b134b134c132b134c134d132b134d134e132b134e13271325134e134d13251327134e1325134d132413231324134d1323134d134f1323134f135013231350135113231351131b1352131b13511352135113501352131e131b13521320131e135213531320135213541353135213551354135213501355135613531354135613201353135613541357135613571358135613581359135613221320135613d312221356135913d3125a13d31259135a13591358135a13d412d3125a13cf12d4125a135b13cf125a135c135b135a135d135c135a1358135d135e13cf125b135e135b135c135e13d012cf125e13cb12d0125e135f13cb125e1360135f135e13611360135e135c1361136213cb125f1362135f1360136213cc12cb126213c712cc1262136313c7126213641363136213651364136213601365136613631364136613c71263136613641367136613671368136613681369136a13691368136a1368136b136a136b136c136a136c136d136a136d13c1126a13c112c4126a13c51269136a13c412c51266136913c5126e136c136b136e136b1368136e136f136c136e1333136f136e133b1333136e133a133b136e1370133a136e136813701371137013681371133a137013711368137213711372134013711340133f13711339133a1371133813391371133f133813731340137213731372136813731368136713731341134013731342134113731374134213751342137413751374136413731364137413731367136413751364136513751376134213751377137613751378137713751360137813751365136013791376137713791342137613791377137a1379137a137b1379137b137c137d137c137b137d1344137c1379137c1344137d13451344137d13461345137d137e1346137f1346137e137f137e1380137d1380137e137f13801381137f1381134b137f134b134a137f13481346137f13491348137f134a1349137d13821380137d137b138213831382137b1383138013821383137b13841383138413541383135413551383138513801383135013851383135513501386135413841386135713541386135813571386135d13581386135c135d13861387135c1386137b138713861384137b1388135c138713881387137b13881361135c1388136013611388137813601388137713781388137a13771388137b137a1389138513501389138013851389138113801389134b13811389134c134b1389134d134c1389134f134d13891350134f138a13ed12ec128a13f512ed128a13f612f5128a138b13f6128a13e7128b138a13e612e7128a13e512e6128a13ec12e5128c138b13e7128c13f6128b138c13e7128d138c138d138e138c138e138f1390138f138e1390138e139113921391138e1392138e1393139213410c911390139113410c9213420c410c9213450c420c92139413450c9213951394139213931395139613941395139613450c94139613951397139613971398139613981399139a13991398139a1398139b139a134a0c9913961399134a0c9a139c134a0c2f0c4a0c9c132f0c490c4a0c2f0c320c490c2f0c9c139d139a139d139c132f0c9d132e0c2d0c2e0c9d132d0c9d139e132d0c9e13150c2d0c150c140c2d0c140c130c2d0c130c2c0c9a139f139d139a13a0139f139a139b13a013a113150c9e13a1139f13a013a1139d139f13a1139e139d13a113a213150ca313150ca213a313a213a413a113a413a213a313a413a513a313a513a613a313a613a713a313a7130e0ca3130e0c160ca313160c150ca113a813a413a113a013a813a913a713a613a9130e0ca713a913a613aa13a913aa13ab13a913ab13ac13ad13ac13ab13ad13ab13ae13ad13ae13af13ad13af13b013b113b013af13b113af13b213b113b213b313b113b313b413b513b413b313b513b313b613b513b613b713b513b713b813b913b813b713b913b713ba13b913ba13bb13b913bb13bc13b913bd13b813b513b813bd13b913be13bd13b913bf13be13b913bc13bf13b513010cb413b113b413010cb513c013010cb513bd13c013c113c013bd13c113010cc013c113bd13c213c113c213c313c113c313c413c113c413f60bc113f60b000cc113000c010cc513bc13bb13c513bf13bc13c513bb13c613c513c613c713c513c713c813c913c813c713c913c713ca13c913780cc813c513c813780cc913770c780cc9136b0c770cc913cb136b0ccc136b0ccb13cc13cb13cd13c913cd13cb13c913ca13cd13cc13cd13ce13cc136a0c6b0ccc13610c6a0ccc13cf13610ccc13d013cf13cc13ce13d0139013cf13d0139013610ccf139013d0138f139013600c610c9013410c600c8c138f13d0138c13d013d1138c13d113f612d213ce13cd13d213d013ce13d213d113d013d213f612d113d213cd13d313d213d313fa12d213fa12f712d213f712f612d413fa12d313d413d313cd13d413cd13ca13d413ca13c713d413c713d513d613d513c713d613c713c613d6130013d513d413d5130013d61302130013d61303130213d613d7130313d613bb13d713d613c613bb13d4130013fc12d413fc12fa12d8130313d713d813d713bb13d81332130313d81333133213d813d9133313d813b713d913d813ba13b713d813bb13ba13da133313d913da13d913b713da136f133313da136c136f13da13db136c13dc136c13db13dc13db13b313da13b313db13dc13b313b213dc136d136c13dc13c1126d13dc13dd13c112dc13af13dd13dc13b213af13de13dd13af13de13c112dd13de13af13ae13de13c012c112de13bd12c012de13df13bd12de13ab13df13de13ae13ab13e013df13ab13e013bd12df13e013ab13aa13e013bc12bd12e013b712bc12e013e113b712e213b712e113e213e113a613e013a613e113e013aa13a613e213a613a513e213b612b712e213b512b612e213e313b512e213a413e313e213a513a413e413e313a413e413b512e313e413a413a813e413ba12b512e4139612ba12e413e5139612e413a013e513e413a813a013e613e513a013e6139612e513e613a0139b13e6139b139813e6139813e713e813e7139813e81398139713e8139d12e713e613e7139d12e813e8129d12e813e212e812e813e913e212e8139513e913e81397139513ea13e9139513ea13e212e913ea1395139313ea1393138e13ea138e138d13ea138d13e712ea13e712e312ea13e312e212e6139d129712e613971296126613c612c7126613c512c612791343134213791344134313eb13c313ec13eb13ed13c313eb13ee13ed13eb13ef13ee13eb13f013ef13eb13f113f013eb13f213f113eb13ec13f213f313ef13f013f313ee13ef13f313f013f413f313f413f513f313f513f613f313f613f713f313f713f813f313f813ee13f913f813f713f913ee13f813f913f713fa13f913fa13fb13f913fb13fc13f913fd13ee13f913fe13fd13f913fc13fe13ff13f513f413ff13f413f013ff130014f513ff1301140014ff1302140114ff1303140214ff1304140314ff13f013041405140414f0130514031404140514f013f11305140614031407140314061407140614081405140814061407140814091407140a14031407140b140a1407140c140b1407140d140c14071409140d1405140e1408140514f2130e140514f113f2130f140b140c140f140c140d140f1410140b1411140b1410141114101412140f1412141014111412141314111413141414111414141514111415141614111416141714111417140b140f14181412140f14ba0c18140f141914ba0c0f140d1419141a141814ba0c1a14121418141a14ba0c1b141a141b141c141a141c141d141a141e1412141a141f141e141a141d141f1420141d141c1420141f141d1420141c14211420142114221420142214231424142314221424142214251424142514ca0c2414ca0cc90c2414261423142014231426142414271426142414c80c27142414c90cc80c201428141f142014261428142914ca0c25142914221421142914251422142914cd0cca0c2914be0ccd0c29142a14be0cbc0cbe0c2a14bc0c2a141c1429141c142a14bc0c1c141b14bc0c1b14ba0c291421141c142b142714c80c2b14261427142b14c80cd20c2b14d20cd30c2b14d30c2c142b142c142d142b142d142e142b142e1426142f1426142e142f142e142d142f14281426142f141f1428142f1430141f142f14311430142f14321431142f142d14321433143014311433141f143014331431143414331434141414331414141314331413141214331412141e1433141e141f14351432142d1435143114321435142d143614351436144d1135144d1155113514551154113514541137143514371431143814141434143814371454113814311437143814341431143814391414143a14141439143a1439143b1438143b1439143a143b143c143a143d1414143e1414143d143e143d143f143a143f143d143e143f1440143e14401441143e14411442144314421441144314161442143e1442141614431444141614431401144414431445140114431446144514431447144614431441144714481444140114481416144414481401140214481402140314481403140a1448140a140b1448140b141714481417141614491445144614491401144514491446144a1449144a144b1449144b144c144d144c144b144d144b144e144d144e144f144d144f1450144d14f5134c1449144c14f5134d14f613f5134d14f713f6134d145014f713511450144f145114f713501451144f1452145114521453145114531454145514541453145514fb13541451145414fb1355145614fb13551457145614551458145714591457145814591458145a1455145a14581459145a145b1459145b145c1459145c145d1459145d145e1459145e145f1459145f14571460145d145c1460145e145d1460145c146114601461146214601462146314601463146414601464146514601465145e1466145f145e14661457145f1466145e1467146614671468146614681469146a14691468146a1468146b146a146c146914661469146c146a146d146c146e146c146d146e146d146f146a146f146d146e146f1470146e14701471146e14711472146e147214fe136e14fe1373146e1473146c146a1474146f146a14751474146a146b14751476147314fe1376146c1473147614fe13fc13761477146c1466146c1477146614771457147614571477147614561457147614fb1356147614fc13fb137814721471147814fe1372147814711479147a14791471147a1471147b147a147b14f40b7a14f40bf50b7a14f50bf60b7a14f60bc4137a14c31379147a14c413c31378147914c3137814c313ed137814ed13ee137814ee13fd137814fd13fe137c14f40b7b147c147b1471147c14711470147c1470146f147c146f147d147c147d14fb0b7c14fb0bfa0b7c14fa0bf40b7e147d146f147e14fb0b7d147e146f1474147e14741475147e1475147f1480147f14751480147514811482148114751482147514831482148811811480148114881182148911881182148c118911821484148c1182148514841482148314851486148c118414861484148514861487148c1188148c118714881487147c1186147c11871488147c117b1188147b117a1188147a118d1188148b118c1188148a118b1188148d118a11861489147c118a147c1189148a1489148b1486148b1489148a148b148c148a148c1461118a14611164118a14641165118a1465118d148a148d147c118e148d1465118e147c118d148e14651168118e147d117c118e146f117d118e146e116f118e1469116e118e14681169118f148c148b148f1461118c148f148b1490148f14901459118f1459115a118f145a115b118f145b1160118f1460116111911459119014911492145911931459119214931458115911931452115811931494145211931464149414931495146414931496149514931492149614911496149214971494146414971452119414971464149814971453115211971454115311971499145411381454119914381499143b1497143b149914971498143b149a14981464149a143b1498149a14641463149a143c143b149a149b143c143a143c149b143a149b149c149d149c149b149d149b149e149f149e149b149f149b14a014a114a0149b14a1149b14a2149a14a2149b14a114a21462149a146214a2149a1463146214a1146214a314a114a414a0149f14a014a414a114a514a414a114a614a514a114a314a6149f14a414a7149f14a8149e149d149e14a8149f14a914a814aa14a814a914aa14ab14a8149d14a814ab14aa14ac14ab14aa14ad14ac14aa14ae14ad14aa14af14ae14b014ae14af14b014af14b114aa14b114af14aa14a914b114b014b114b214b014b314ae14b014b414b314b014b514b414b014b614b514b014b214b614b714b314b414b714ae14b314b714b414b814b714b814b914b714b914ba14bb14ba14b914bb14b914bc14bb14bc14bd14bb14bd14be14bb14be14bf14bb14bf14c014bb14c114ba14bb14c014c114b714ba14c114c214be14bd14c214bf14be14c214bd14c314c214c414bf14c214c514c414c214c614c514c214c714c614c214c314c714c814c014bf14c814c114c014c814bf14c914c814c914ca14c814ca14cb14c814cc14c114c814cd14cc14c814cb14cd14ce14c614c714ce14c514c614ce14c714cf14ce14d014c514ce14d114d014ce14d214d114ce14d314d214ce14cf14d314d414d214d314d414d114d214d414d314d514d614d514d314d614d714d514d414d514d714d614d814d714d614d914d814d614da14d914d614db14da14d614dc14db14d614d314dc14d414d714dd14de14dd14d714de14df14dd14d414dd14df14de14e014df14de14e114e014de14e214e114de14e314e214de14e414e314de14d714e414e514e214e314e514e114e214e514e314e614e714e614e314e714e814e614e514e614e814e714e914e814e714ea14e914e714eb14ea14e714ec14eb14e714ed14ec14e714e314ed14e514e814ee14ef14ee14e814ef14f014ee14e514ee14f014ef14f114f014ef14f214f114ef14f314f214ef14f414f314ef14f514f414ef14e814f514f614f114f214f614f014f114f614f214f714f614f714f814f614f814f914f614f914fa14f614fa14fb14f614fb14f014fc14f314f414fc14f214f314fc14f414fd14fc14fd14a614fc14a614fe14fc14fe14f214ff14f214fe14ff14f714f214ff14f814f714ff14fe14a614ff140015f814ff1462140015ff14a3146214ff14a614a3140115fb14fa140115f014fb1401150215f014e514f0140215e5140215e1140115e114021501150315e1140415e11403150415031505150115051503150415051506150415061507150415071508150415e014e1140415df14e01404150815df140915df14081509150815071509150a15df14d414df140a15d4140a15d1140915d1140a1509150b15d1140c15d1140b150c150b150d1509150d150b150c150d150e150f150e150d150f1510150e150c150e1510150f1511151015121510151115121511154b140f154b14111512154b144a1412154a14461412154614131512151315ca141215ca1414151215141510150f154e144b140f154f144e140f1515154f140f150d151515161515150d1516154f14151516150d151715161517150715161507151815161552144f1416155314521416151815531419151415ca141915ca14c9141915c914bf141915bf14c41419151015141519151a1510151915c5141a151915c414c5140c151a15c5140c1510151a150c15c514d0140c15d014d114091507151715091517150d151b15531418151b151c155314551453141c1555141c155a141b155a141c151b151d155a141e155a141d151e151d1505151b1505151d151e1505151f151e151f15fa141e15fa1420151e155b145a141e155c145b141e1520155c1401151f1505150115fa141f1521155c14201521152015fa14211561145c142115621461142115001562142115f81400152115f914f8142115fa14f9141b15061505151b15071506151b1518150715ec0bf00bfd0bec0bfd0bfe0bec0bfe0b2215ec0b2215ea0b23152215fe0b2315ea0b22152315fe0b241523152415370f2315370f360f2315360f340f2315340f251523152515ea0b26152515340f2615ea0b25152615340f27152a0f2715340f2a0f280f271526152715280f2615280f28152615e90bea0b2615e80be90b26152815e80b2915370f241529152a15370f2b15370f2a152b152a152c1529152c152a152b152c152d152b15380f370f2b153b0f380f2b15420f3b0f2b15430f420f2b152d15430f29152e152c152915fb0b2e152915fc0bfb0b2915fe0bfc0b29152415fe0b80142d152c158014430f2d1580142c157f1480142f15430fc211430f2f15c211c311430fc411430fc311c411440f430fc411450f440fc4117c0f450fc411790f7c0fc2112f158811801488112f15c2118811c111c011c1118811c01188118711c011871184117e147f142c157e142c152e157e142e15fb0be30b3015dd0be30b31153015e30b32153115e30be80b3215d80b30153115d80bdd0b3015d80b31153315d80b3315d60b3415331531153415d60b331534153115351534151a0fd60b34151b0f1a0f3415200f1b0f3415210f200f34153515210f36153215e80b3615311532153615351531153615210f35153615e80b281536152815280f3615280f290f3615290f210f3715d60b190f3715d50bd60b3715d10bd50b37153815d10b3915d10b38153915d00bd10b3915c40bd00b39153a15c40b3915bf0b3a1539153b15bf0b3c15bf0b3b153c153b153d1539153d153b15391538153d1537153d1538153c153d153e153c153e159f093c159f099e093c153f15bf0b3c159c093f153c159e099c0940153e153d1540159f093e1540153d154115371541153d153715150f411540154115150f3715190f150f4015150f160f4015160ff80e4015f80ef90e4015f90e9f094215431544154215451543154215461545154215471546154215860e47154215850e860e4215840e850e42154415840e4815840e44154815441543154815890e840e48157d0e890e481549157d0e4a157d0e49154a1549154b1548154b1549154a154b154c154a157c0e7d0e4a156a0e7c0e4a15f1106a0e4a15f010f1104a154c15f01048154d154b15481543154d154e154c154b154e15f0104c154e154b154f154e15f310f0104e15300ff3104e152f0f300f4e152c0f2f0f4e154f152c0f50154d15431550154b154d1550154f154b1550152c0f4f1550154315511550152b0f2c0f5015260f2b0f50155115260f5215511543155215260f51155215431545155215250f260f5215240f250f52155315240f5415240f531554155315461552154615531552154515461554154615551554155515561554155615571558155715561558155615591558155915060f5815060f050f58155a155715541557155a1558155b155a155815040f5b155815050f040f54155a155c1554155c15240f5d15551546155d15561555155d15591556155d15060f59155d15461547155d154715860e5d15860e0c0f5d150c0f060f1f0f5c155a151f0f5a151e0f1f0f240f5c151d0f5a155b151d0f1e0f5a151d0f5b15040f86145e158b14861485145e1591145e15851491148b145e15911485145f1560155f158514601585148314601583147514601575146b1460156b146814601568146115621561156814621596146115601596145f1560156115961491145f15961462159514961462156414951462156514641462155e146514621567145e14621568146714911490148b145114fa13f7135114fb13fa135c11a00da10d5c119d0da00d3e14151414143e14161415144914001401144914f51300147d0f830f8b0f7d0f8b0f1c0ece118d0f860fce11b80d8d0fce11d111b80dca11820f7f0f6315cd14641563156515cd146315ac14651563156615ac1463153f146615631540143f1463154114401463156415411467156515ac146715cd1465156715ac14ad146715ad14ae146715ae146815b7146815ae14b714c114681567156815c1146715c114cc146715cc14cd1469156415cd146915411464156915cd14cb146915cb14ca146915ca1413156915131546146915461447146915471441149d143f149c149d1466153f149d14ac1466159d14ab14ac143a149c143f146a156b156c156d156e156b156d15b6146e156d15b514b6146d15b414b5146d156f15b4146d1570156f1571156f1570157115b4146f157115701572157115721573157115731574157515741573157515731576157515b914741571157415b9147515bc14b9147515bd14bc1475157715bd147515781577157515761578157115b914b8147115b814b4147915771578157915bd147715791578157a157915c314bd147915c714c31479157b15c71479157c157b1579157a157c157d157b157c157d15c7147b157d157c157e157d157e15db147d15db14dc147d15dc14d3147d15d314cf147d15cf14c7147f157a1578157f157c157a157f15781580157f1581157c1582157c15811582157e157c158215db147e158315801578158315781576158315761573158315731584158515841573158515731572158515721570158615db1487158615da14db148615d914da1486158815d9148915d9148a158915d814d9148915d714d8148915e414d7148915e314e4148915ed14e3148915ec14ed1489158a15ec148b158a15d9148b15ec148a158b158c1588158b158d15ec148e15ec148d158e15eb14ec148e15ea14eb148e158f15ea149015ea148f1590159115ea149215ea1491159215e914ea149215e814e9149215f514e8149215f414f51492159315f4149215941593159215911594159015941591159515931594159515f414931595159415961595159715f4149815f414971598159715b6149515b61497159815b61499159a159915b6149a15b614b2149a15a414991598159915a4149a15a714a4149a15b114a7149a15b214b1149f14a714b1149f14b114a9149815fd14f4149815a614fd149815a514a6149815a414a51495156e15b61495156b156e159b156b1596159b15961594159b1594159c1590159c1594159d159e159f15a015a115a215a3150814a415a31509140814a3150d140914a315a5150d14a315a615a515a315a715a615a315a815a715a315a415a815a915a515a615a9150d14a515a915a615aa15a91519140d14a915ba0c1914a915b90cba0ca915b80cb90ca915aa15b80cab15a4150814ab15a815a415ab1508140e14ab150e14f213ab15f213ac15ab15ad15a815ab15ae15ad15ab15ac15ae15af15aa15a615af15b80caa15af15a615b015af15b115b80cb40cb80cb115b40cb115ac0caf15ac0cb115b40cac0caf0caf15ad0cac0caf15850cad0caf15b015850cb215850cb015b215b015a615b215a615a715b215a715a815b215a815b315b215840c850cb2157f0c840cb215b3157f0cb415b315a815b4157f0cb315b415a815ad15b415ad15ae15b415ae15b515b4157e0c7f0cb415760c7e0cb415b515760cb615760cb515b615b515ae15b615750c760cb615740c750cb615b715740cb615b815b715b615b915b815b615ae15b915ba15740cb715ba15b715b815ba15790c740cba15780c790cba15bb15780cba15bf13bb15ba15bc15bf13ba15b815bc15c513780cbb15c513bb15bf13bd15b815b915bd15be15b815bd15c313be15bd15ec13c313bd15f213ec13bd15ac15f213bd15ae15ac15bd15b915ae15bf15bf13bc15bf15be15c313bf15be13bf13bf15bd13be13bf15c213bd13bf15c313c213bf15b815be15bf15bc15b815b113010c020cb113020c030cb113030cb013ad13b013030cad13030c090cad13090c0a0cad130a0cac13a913ac130a0ca9130a0c0d0ca9130d0c0e0c96134a0c470c9613470c450c4a114d1136144a1136142d144a112d142c144a112c14d30c4a11d30c4911da13b613b313da13b713b613c015c115c215c315c415c1151311c5150c11c6150c11c515c615c515c715c815c915c515ca150d110c11cb1501110d11cb15cc150111cb15cd15cc15cb15ce15cd15cf15cc15cd15cf150111cc15cf15cd15d015cf1502110111cf15e3100211cf15d115e310cf15d215d115cf15d015d215df10d115d215df10e310d115df10d215d315df10d315dd10d415d515d615d715d615d815d915da15db15d915dc15dd15de15df15e0150a12e1152f0de215e315e415e215e515e315e615e415e315e615e315e715e815e715e315e815e315e915ea15e915e315ea15e315eb15ea15eb15ec15ed15e315e515ed15ee15e315ef15e315ee15ef15f015e315f115e315f015f115f215e315f315e315f215f315f415e315f515e315f415f515f615e315f515f715f615f815f615f715f815f915eb15f815fa15f915f815f715fa15f815fb15f615f815eb15fb15fc15fd15fe15ff15e00ddf0dff15120ee00dff150f0e120eff15c50e0f0eff15de0dc50eff15df0dde0d270c130c220c270c2c0c130c0016d90bd40b0016dc0bd90b00161c0cdc0b00161f0c1c0c0016c90b1f0c0016ca0bc90b0016cb0bca0b0016d40bcb0b33122b0c2a0c33122a0c290c0116290c280c01162512290c0116291225120116021629120116250c02160116260c250c0116210c260c0116280c210c0316b10b250c0316b30bb10b250cb10bb70bc10bb30b0316990b230a240a04163512341204163912351204163d123912041605163d1204162d12051604162c122d12041627122c1204163412271206163d120516061605162d1206163f123d12061643123f1206160716431206163112071606163012311206162d12301224120816281224122a1208162b12281208162b12081609162b1209160a162b120a162e122f122e120a162f120a160b162f120b160c162f120c1632120916ab0b0a160916a90bab0b0816a90b0916a90b08160d16a90b0d16af0b0a16ab0b0e160e16ae0b0c160e16ab0bae0baf0b0d16b80b8c0b0f168b0b8c0b910b0f168b0b0f16870b10161116121611161316121614161116101615161116141616161416101616161516141616161716151616161816171616161916181619161a16181618161a16171617161a161b1617161b16151615161b161c161c16111615161c161d1611161d16131611161b161e161c161e161d161c161a161f161b161f161e161b161d162016131616162116191621162216191622161a161916161623162116161624162316161625162416251626162416241626162316231626162716231628162116281622162116271628162316281629162216221629161a161a1629162a1627162b16281628162b162c162c16291628162c162d16291629162d162a162b162e162c162e162d162c1627162f162b1626162f16271630162f16261630162616251625163116301631163216301632162f163016321633162f162f1633162b162b163316341634162e162b162a162d1635162d16361635162e1637162d16371636162d163716381636163616381639163a16381637163a1637162e162e163b163a1634163b162e163b163c163a163c1638163a1634163d163b1633163d1634163e163d1633163e163316321632163f163e163d1640163b1640163c163b1641163f163216411642163f16421643163f163f1643163e163e164316441644163d163e16441645163d16451640163d164616421641164716421646164816471646164616411648164816411631164916481631164116321631164a16481649164b1648164a1616164a16491616164b164a1616164916251649163116251616164c164b164c164d164b164d1648164b164d16471648164e1647164d164e164d164c1616164f164c16161650164f16161610165016101651165016501651164f164f16511652164c1652164e164f1652164c16121651161016121613165116511613165316511653165216521653165416521654164e164e165416551654165616551657165616541654165816571653165816541653162016581613162016531620165916581658165a16571657165a16561659165a16581656165a165b165a165c165b1659165d165a165a165d165e165e165c165a1659165f165d1656165b16601656166016551660165b1661165516601647165b16621661165c1662165b1660166116421660164216471642166116631661166416631662166416611663164316421663166416431643166416651666165f165916661667165f16661659162016681666162016681620161d161d166916681669166a1668166a16671666166a16661668166a166b1667166c166a1669166c166b166a166c166d166b166e166c1669161e166e1669161e1669161d166f166d166c166f166c166e166e1636166f166f1639166d16361639166f16351636166e161f1635166e161f166e161e162a1635161f162a161f161a16441665167016701645164416431665164416711672167316721674167316751672167116761672167516761675167716751671167716771671167816791677167816761677167a167a16771679167b167a16791676167a167c167c167a167b1676167c167d167c167b167d167d167b167e1676167d167f167d167e167f167f167e16801676167f1681167f16801681167616811682167616821683167616831684167616841685167616851686168116801687168816811687168216811688168216881683168316881689168a1683168916841683168a168b1684168a16851684168b1685168b16861686168b168c1689168d168a168a168d168e168a168e168b1689168f168d1688168f168916881687168f168b168e1690168f168716911692168b1690168c168b1692168e168d16931693168d16941695168e16931690168e1695169016951692169216951696168d16971694168f16911697168f1697168d16971691169816911699169816961695169a169a1695169b169c1696169a1695169d169b16931694169d1693169d1695169d1694169e1694169f169e1697169f169416971698169f169f169816a01698169916a016a0169916a1169916a216a116a216a316a116a116a316a416a116a416a016a016a416a516a016a5169f169f16a516a6169f16a6169e169e16a616a716a8169e16a7169d169e16a816a9169d16a8169b16a9169a169b169d16a9169a16a916aa169c16aa16ab16a216ac16a316a316ac16ad16ae16ac16a216af16ac16ae16ae16b016af16af16b116ac16ac16b116b216ac16b216ad16ad16b216b316af16b416b116b016b416af167b16b416b016b5167b16b016b516b016ae16b116b616b216b216b616b316b316b616b716b516ae16b816b816ae1699168016b516b81691168016b816b81699169116b616b916b716ba16b916b616ba16b616b116b716b916bb16b116bc16ba16b416bc16b1167916bc16b4167916b4167b16bd16b916ba16ba16be16bd16bc16be16ba167816be16bc167816bc167916be16bf16bd16bd16c016b916b916c016bb16bf16c016bd16bf16c116c016bb16c016c216c016c116c216c216c116c316c116c416c316c316c416c516c416ab16c516c616c416c116c616c116bf16bf16c716c6167116be1678167116c816be16c816bf16be16c816c716bf16c8167416c7169c16ab16c416c416c9169c16c91696169c16ca169616c916ca16c916cb16c716cb16c616cb16c916cc16c616cb16cc16cc16c916c416cc16c416c616cb16cd16ca16cd169216ca1692169616ca16c716ce16cb16ce16cd16cb167416ce16c7167416cf16ce16ce16d016cd16cf16d016ce16d0168c16cd168c169216cd167616d016cf1676168616d01686168c16d0167616cf16d116d116cf1674167616d1167216d1167416721673167416c8167316c8167116551647164e168716801691167e16b51680167e167b16b5169a16aa169c16ae16a2169916d216d316d416d416d516d216d616d316d216d716d316d616d616d816d716d216d816d616d216d916d816d516d916d216d916da16d816d816da16d716d716da16db16db16dc16d716dc16d316d716dd16db16da16de16dc16db16df16de16db16df16db16dd16dc16de16e016e016de16e116e116e216e016e316dc16e016e016e416e316e216e416e016e516e116de16e516de16df16e216e616e416e716e216e116e716e816e216e816e616e216e916e716e116e916e116e516e816ea16e616eb16e816e716eb16ec16e816ec16ea16e816ed16eb16e716ed16e716e916ee16ec16eb16ef16ee16eb16ef16eb16ed16f016ef16ed16ed16f116f016ec16ee16f216f216ee16f316f416ec16f216ea16ec16f416f516ea16f416f416f616f516ee16f716f316f716ee16ef16f316f716f816f916f716ef16f916ef16f016f316fa16f216f216fa16fb16f316fc16fa16f816fc16f316f816fd16fc16fd16f716f916f716fd16f816fb16fe16f216ff16f216fe16ff16f616f416f416f216ff16f6160017f516f51600170117001702170117f5160117031703170117041701170517041702170517011702170617051707170517061705170817041704170817031703170817091708170a170917e41609170a17e61603170917e6160917e4160b170a170817e4160a17e316e3160a170c170a170b170c170c17d316e3160c170b170d170d17d4160c17d416d3160c170b170e170d170f170d170e170e1710170f17101711170f17d316dc16e3161217d4160d1712170d170f170f17d51612171217d516d4161117d5160f17131711171017131714171117d91611171417d5161117d916131710171517151714171317151710171617171716171017171710170e17181717170e17151716171917191716171a171b1715171917141715171b1714171b17d9161c171a1716171c17161717171d171c1717171d17171718171e171d171817181708171e17d9161b171f171f17da16d916da161f17dd16dd161f1720171f17211720171b17191721171b1721171f1721171917221719171a17221722171a172317221724172117211724172017231725172217251724172217201724172617271720172617dd16201727172817241725172917281725172917251723172a172917231723172b172a17dd162717df16df1627172c1727172d172c172c172d172e172e172d172f17e5162c172e17df162c17e5162f1730172e17e9162e173017e5162e17e916e9163017ed16ed163017311727172617321732172d17271731173017f1163117f116ed16f11630173317331730172f172b1734172a172a173417351734172b17361737173417361738173417371734173817351735173817391739173a1735173b1735173a1737173c17381738173c173d1738173d1739173e173d173c1739173d173f1740173f173d1740173d173e173f174117391741173a173917371706173c1742173c1706173e173c17421743173e17421742174417431745173f174017401746174517471745174617471741173f173f174517471740173e17481748174617401748173e17491749173e174a174a173e174317421706170217021744174217441702170017071706173717371736170717071736171d1736171c171d1736172b171c172b171a171c171a172b17231707171d171e171e17051707171e17081705170b170817181718170e170b174b174c174d174d174e174b174f174c174b1750174f174b174b174e17501750174e175117521751174e174e175317521753175417521755174f1750175617551750175017571756175117571750175117581757175917571758175a17591758175b17551756175c175b17561756175d175c175d175717591757175d1756175e175b175c175f175e175c175c1760175f175d1760175c175d1761176017591761175d175b175e17621762175e17631764175b17621755175b1764176517551764175e176617631766175e175f17631766176717681766175f175f1769176817601769175f176a176817691760176b17691761176b17601769176c176a176b176c176917671766176d176d1766176e176e17661768176f176e1768176f1768176a174f175517651770174f1765176517711770177217701771177117731772174c174f17701774174c17701774177017721772177517741774177517761772177717751773177717721778174c17741774177617781779174c177817781776177a17531778177a177917781753174d174c17791779174e174d17791753174e177b177317711771177c177b177b177c177d177e177d177c177c1764177e1764177f177e177f1780177e1780177d177e17801781177d177d1782177b17811782177d1732177b178217651764177c1762177f176417621763177f177f176317831763178417831784178517831785177f17831767178417631767176d17841784176d1786178717851784178417861787178717861788178617891788176d17891786176d178a1789176e178a176d178b178a176e178b176e176f177c17711765178c177f1785178d177f178c178e177f178d178d178f178e178e178f1780178e1780177f178f178117801777173217901732172617901791177717901726179117901773173217771773177b1732179217771791179317771792179217941793179517931794179417961795179117971792179717941792179617981795179617991798179a1798179917951798179b179c179b1798179c1798179a179b179d1795179d17931795179d17751793179e179b179c179a1799179f179f179917a017a117a0179917a117991796179f17a017a217a217a017a317a417a317a017a417a017a117a117a517a417a617a317a417a417a517a617a617a717a317a817a317a717a217a317a817a617a517a917aa17a717a617a617ab17aa17a917ab17a617ac17ab17a917a917a517ac17ac17a517ad17a517ae17ad17aa17af17a717aa17ab17af17a717af17b017af17ab17b117af17b217b017b317b017b217b417a717b017a817a717b417b017b517b417b317b517b017b617ab17ac17ab17b617b117b117b617b717b817b117b717b817b217af17af17b117b817b517b917b417b417b917ba176c17ba17b917b417ba17a817a817ba17bb176b17bb17ba176b17ba176c17a817bb17a217a217bb17bc176117bc17bb176117bb176b17a217bc179f179f17bc175a17bc1759175a175917bc1761179f175a179a179a175a17bd1754179a17bd179c179a1754179c1754179e179e175417be179e17be179b179b17be17bf175317bf17be17be1754175317bf179d179b17bf1776179d17761775179d177a17bf1753177a177617bf175417bd1752175217bd17c017bd175817c017c01751175217c017581751175a175817bd17751777179317a117c117c217c317c217c117c1179717c3179617c117a117c217a517a117c417a517c217c417c217c317c517c417c317c317c617c5179717c617c317c1179617941794179717c117c717a517c417c817c717c417c817c417c517ae17c717c817c717ae17a517c61797179117241791172617911724172817c91728172917ca17c9172917ca1729172a173517ca172a17cb17ca1735173b17ca17cb17cb1735173b17cc17ca173b17cc17c917ca17cd17ce17cf17ce17d017cf17d117ce17cd17d117d217ce17d217d017ce17d217d317d017d417d117cd17d517d217d117d517d617d217d617d317d217d717d517d117d717d117d417d017d817cf17cf17d817d917cf17d917cd17cd17d917da17d017db17d817d317db17d017dc17cd17da17d417cd17dc17dd17d617d517de17dd17d517de17d517d717df17dd17de17db17d317e017e017d317e117e117e217e017d317e317e117d617e417e317dd17e417d617dd17e517e417df17e517dd17e617e117e317e717e317e417e617e317e717e817e417e517e717e417e817e917e617e717ea17e717e817e917e717ea17eb17e517df17df17de17eb17eb17de17ec17ea17ed17e917e917ed17ee17ee17ef17e917ef17e617e917ef17f017e617f017e217e117f017e117e617f117e217f017f117f017ef17ef17f217f117f317ed17ea17ea17f417f317e817f417ea17e817f517f417f617f517eb17eb17ec17f617f617ec17f717f817f217ef17f817ef17ee17f817ee17f917f917fa17f817f917ee17fb17ee17fc17fb17ed17fc17ee17fd17fc17ed17fd17ed17f317fe17fd17f317f317ff17fe17f417ff17f317f4170018ff170018f517f617f5170018f41701180018f617f617f71701180118f7170218fc170318fb17fb17031804180518fb170418f917fb1705180618f917051807180318fc170718fc17fd1703180818041804180818091804180918051808180a180918051809180b1809180c180b180a180c1809180d1805180b18061805180d180b180e180d180c180e180b180f1806180d180d1810180f180e1810180d1811180818031811180318071807181218111812181318111813180818111814180818131815180a180818151808181418161806180f181618171806181718f91706181718fa17f917fa171718161810180e18181818180e181918181819181a181a1819181b181c181b18191819180c181c181a181b181d181d181b181e181e181b181f181f181b1820181c181f18201820181b181c181f1821181e181e1821181d181d182118221821182318221824181f181c18241825181f18251821181f181c180a1824180c180a181c180e180c1819182618251824182418151826180a18151824181518271826182618271825182518271828182518281821182118281829182918231821182a182318291828182a1829182b1823182a182c182b182a182d182b182c182e182d182c182f182a18281830182a182f18281830182f182c182a18301827183018281831182c1830182e182c183118141830182718311830181418141827181518141813183118311813183218311832182e182e18321833181218331832183218131812182e183318341834182d182e183418331835183618351833183618331812183718361812183718121807180718fd1737183718fd1738183818fd17fe173818fe1739183918fe173a183a183b183918fe173c183a183c183b183a1838183d18371837183d183e183e18361837183e183f1836183d183f183e183f18351836183c1840183b183b1840184118011841184018ff1740183c18ff173c18fe17421841180118011802184218421802184318021844184318021845184418451846184418431844184718461847184418481846184518f71748184518f717451802184818d4174618ec174818f717ec17d7174818d717d41748184918471846184618dc174918d417dc174618de17d717ec1700184018ff174018001801180317ea16f516ea160317e616d617e317d317f217e217f117f517e517eb17e517f517e8174a184b184c184a184d184b184a184e184d184a184f184e1850184e184f18501851184e1850185218511850185318521854185218531854185518521856184c184b1856184b1857185618571858185618581859185a18591858185a1858185b185a185b185c185a185c185d185e185d185c185e185c185f186018611862186018631861186018621864186018641865186618611863186618671861186618681867186618691868186a18681869186a186b1868186a186c186b186a186d186c186e186c186d186e186f186c18701865186418701864187118721873187418721875187318721874187618721876187718781877187618781876187918781879187a1878187a187b187c187b187a187c187a187d187e18731875187e187f1873187e1880187f187e1881188018821880188118821883188018821884188318821885188418861884188518861887188418881889188a1888188b18891888188c188b1888188d188c188e188a1889188e1889188f188e188f1890188e189018911892189118901892189018931892189318941892189418951896189518941896189418971898188c188d18981899188c18 - m_VertexData: - serializedVersion: 3 - m_VertexCount: 6298 - m_Channels: - - stream: 0 - offset: 0 - format: 0 - dimension: 3 - - stream: 0 - offset: 12 - format: 0 - dimension: 3 - - stream: 0 - offset: 24 - format: 0 - dimension: 4 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 1 - offset: 0 - format: 0 - dimension: 2 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 0 - offset: 0 - format: 0 - dimension: 0 - - stream: 2 - offset: 0 - format: 0 - dimension: 4 - - stream: 2 - offset: 16 - format: 10 - dimension: 4 - m_DataSize: 503840 - _typelessdata: d026073d81b13e3d22c1d23fde010b3e91f0373f71a02e3fc0517d3f8b9607be6e516bbd000080bf4d14613d33fca73ce292d53f0314043fe7f43c3f6997de3e234c5b3f4aa2e3be200586be000080bf1b7f823d583b0a3d5b22d33f7e5b5e3e7f861d3f16fd413fe59c783f5ac45bbeea05d5bd000080bf2fdffa3c2577183d73f6d43f0e768f3e45415e3f09b3d13ea7bb753fb71f7fbe14a703be000080bf000000007190503d6a86d23f00000000707e4c3fde011a3f0000803f7d7b50b8da698a38000080bfb22c583da5f78d3c04e8d73fafee1b3f7f77473f927a173e3e60483f837f0fbf6f798abe000080bf09769c3d963fdfbb93e3d63fd61d063f56082b3fd543073fe0fe593fd5d9d9be4cd59cbe000080bfc826b93d45d7053cdcb9d43f15034a3e4b201b3fef48453f2a1a7a3f79473fbed461d3bd000080bf890c8b3d4f025b3de158d13ff1ea4a3e27ca183fd50a473f99dc793f4fad45be54f8cdbd000080bf4664183dd05f883d9befd03f5522423d2b5a243f9ce6433feb7c7f3f200a80bdf56019bc000080bf08c9c23dddd22abd8b54da3f24cffc3eb3f7083f317e2f3f74645e3f7b79adbe88fab8be000080bf00000000c289883d1c60d03f00000000a35a343fa5ae353f0000803f720b95b885f49338000080bfadc3913d70b1a2bbd094d93f2813573ff2bd063fd811063e47b3063fbe7c3bbfb645ddbe000080bf365c243d7b83af3d4f90ce3fa842533da57e3e3f63822a3ff5827f3f522b7abd5b5814bc000080bf00000000876dab3d740cce3f00000000d94e433f6c80253f0000803f8fb3a8b88215c738000080bfd6592d3d4c96d33d719dcb3f31c20c3d0afb533f09420f3f79c37f3f56c72fbd50cf0c3b000080bf925b933d00e0983d21eace3f88926d3ecccb2c3fde4d333f3f59783fe7515abe1951edbd000080bf1023c43d7594033d245ad23f5b835e3e44f4193fe6d2443f37af783f355657be566ae1bd000080bf69a9fc3d996bd1bc4d18d73ff6cd8b3ef0430b3fe21c4b3f6c08763ffa2243beafe54cbe000080bffabaac3d38e033bd912cdc3fadf8573f1f26a93ebdb2d83e7fab083f469919bf268718bf000080bf466418bdd05f883d9befd03f552242bd2b5a243f9ce6433f987d7f3f174e7f3d9ffc1b3c000080bfd02607bd81b13e3d22c1d23fde010bbe91f0373f71a02e3f5f527d3fe673073e62e56b3d000080bf1b7f82bd583b0a3d5b22d33f7e5b5ebe7f861d3f16fd413f9a9e783fc08f5b3e415fd53d000080bf4d1461bd33fca73ce292d53f031404bfe7f43c3f6997de3e234c5b3f1492e33ea820863e000080bf42afff3d4be9193c29b1d33f05ba1f3e09fc1d3f8370453f757b7c3fb1b30fbe598ab2bd000080bf1007c93da305683df699cf3f8c0d9b3ea5f9223fdd8f353f6d8e723f9e0d90becfab1bbe000080bf01ca9f3dd6fdc33de7cfcb3fab735d3e3a53423fa4301d3f4b94793f389a4ebea066c0bd000080bf0116d93d7efca53d3d49cc3ff746b53edf182f3fad48233ff3d06d3f7b01acbe32251fbe000080bf268efc3d683f123d5470d03f5e86883e13a72f3f0b452d3fd669763fa39e66beea851abe000080bfd105253ec344833b09dfd33fcc32d53dda63163f87724d3fc49b7e3ff77e74bd29baaebd000080bff69b293e506df0bc2d0dd63f97d9203e0592cd3e37fc663f4e817c3f8546e0bd33dffbbd000080bf7c28313e52d68fbde17bd73f11ae943e6062263e4069713fab59733f8cf525be969387be000080bf1f65043e5a0e743da901cd3fcae6c03e90da2f3f4e161f3f4f1f6c3f6d28aebe7b983bbe000080bfc2c11e3e6bd3d83c3fc8d03f603a323ea51a453f172a1d3fcd117c3f18b402be22def3bd000080bfae2a0b3ef88b99bd103ada3f9d46e03e8882543e9aea5f3f8104653fd40349becf89cdbe000080bfc0b3dd3d9695a6bd8c2bdc3ffe76f03e2983fd3dd0c65f3f27965b3f8fc098bebd54d6be000080bff641b63de3c6adbd35a1dd3ff8db183f1e43e4bd905c4b3fbe07363f130ac5beeda516bf000080bfd9f5ab3d40a2e93d6039c83ff3b2543ee698513fe307093f570e7a3f5bd44fbe1e7f8cbd000080bfc903f13d4166c73d32c9c83f1fa7ca3ed0023c3f24240d3f34fa693f1a37bfbe537822be000080bf9fe3133efd84933debe5c93f5e77e73ea8cc363ffed7083faba6633fdea6d0bea0ae54be000080bff5c1323da0fef33d4114c83fab02bebc5ff3633f6cb7e83ed4e97f3f75c47a3cdc44ac3c000080bff2d0173ee6cc363d1efdcd3f3edab03e8cc0423fdbab0c3f8d2f703f07e395be61e73cbe000080bf2b72283e2634493dca17cc3fb8919e3e29744a3f7823073f124b733f9fcd75be9cb54abe000080bf0cec213ed9f19f3d3cc9c63f01540e3fa68e3c3fce3ac53e7ec4543fac80ffbe5e417bbe000080bf50c7033e5d92e33d0918c53f7e8fed3eee22473f3dffd83e265d623f4afcdebe5abb2cbe000080bfc64eb83d990c073e981fc43f793a543ebcb4673f5016be3e5f707a3f9a1a46be278798bd000080bf9a79323d49a2073ed9ebc33f13e373bd9cd26f3fea81b03ed9897f3f9a295a3d40abe23c000080bf000000008a1c023ebaa1c33f000000006013703f8bc2b13e0000803fdc5a63b843871939000080bf8446303d5eb8133efa7bbf3f90a353bdf499783fdf9b6e3ed4a77f3f7fff513d29edfe3b000080bfc0ecbe3d0f0f113e2595bf3f5be2653e8ee2733f1ce2513e4c64793fca6f5bbe7f5f91bd000080bf87e1c33d4ab7153eef71ba3f69158a3e897e763f628248bcfa5c753f4e0e8abe44abbebd000080bf60af103e5a9cf13d97eac03f74b8103f78234a3f205c743e1518533fc88508bf7b5d41be000080bfd1b3193eaf9bf23d79b6bb3f90a4363f813e323f2352a1bdf66b2d3fe0cf36bffdb134be000080bfcdb72e3e73de9f3d2d5dc33ffef8393fc5d62a3fd702283ef2bb2e3f1b442cbfd4fd91be000080bf8b54383ee02f663d965ec93f3047ed3ebd92503f4e6ab23e5776613fcf97c2befeb890be000080bf87343a3ec0b1e73cf25acf3f5d63543e5707553f0faa033fa7e9793f999a11be758d27be000080bf573e4b3e0e4a183c6b80d23f651a633ee3b9303fda4b303f399e793f4d7c1bbed9b025be000080bf10ee4e3eb2d6103d7288cc3f10d7cd3e45eb593f99aeac3ef586683f2d0ba6be1c4587be000080bf6848453e0f00553d0635c63fcf36333fcf3c363ff1a3663db7c52f3f403c26bf0b67a7be000080bf9dbd333e01a4963db4e1be3fa67a5c3f9599003f1e629dbd7b16f53e274a5abfd83c56be000080bf5e99373d965b1a3eca8dba3f08086e3b44a57e3f8b42d23dbff17f3f5a1bc5ba5164aabc000080bf0000000063420c3e7360bf3f00000000e124783f0ebb7b3e0000803f50ae20b83d641e39000080bf000000009246153e62ddba3f00000000f1107b3f3c12483e0000803fcdd4edb7ae391539000080bf5471c33d2a52113e36adb63f3c92b83ed6626e3f53625dbd174c6d3fa26bbabee689b9bd000080bf20ed3f3d1b621c3e162fb63f1e42c63d88607d3f0ef2d63de9ba7e3f4221c0bdcd8d07bd000080bf00000000e82a1d3e8621b63f00000000be817b3fd4023f3e0000803fd46bd3b7ca300b39000080bfdb16153e1f2fe43d280cb83f00073e3f983e253f092b38be3729223f727443bf9fd200be000080bf7e6f333e3445803daa75ba3fbeac5c3f999b003fc3418abd0a1efa3e61e05bbf70831dbe000080bfb7d4113e2020df3d5fd3b33f453a383f30c4303fb4a195bdb0ac2e3f090639bff101e1bd000080bf0d8ac63de0f70f3e928ab23fb08ae53eb0d4643fba0b983a51fe633f02a5e4bea341b0bd000080bf5419463d4b21203e64f1b13f0e4a323eef3a7a3fa482f43d49067c3f0f1a2ebece0033bd000080bf450dc63dbccc103e454bae3f9197fb3e17ef5e3f74025c3cca835e3f788ffabe92e490bd000080bfe481483df035243e56bcad3fb3fa6d3ef2f0773f60b2b63de2f0783f3a0d6bbe4ad028bd000080bfd6b14a3dcdaf263eef55a93f09fa853eb5bb763fa563513d020c773f935385be3089f7bc000080bf20ed3fbd1b621c3e162fb63f1e42c6bd88607d3f0ef2d63d7bba7e3f1011c03dd6b8083d000080bff8d6573e6c09f93abfbbbd3fa04c773f702d823ec0013fbd765a7b3e2b7575bfae4e12be000080bfff1f373ec498743db2b8b53fd1a65a3fb8e5043f74c101bd6cad023f7f3059bf3d900fbe000080bfbcc90f3ebc06dd3d7861af3f43093a3f15372f3f19a470bd88d02d3f41873abfe976b8bd000080bfa25dc53d7a6e113ebadba93f0b22063f54075a3f1b82333cbdd3593fcfd605bfbb5353bd000080bfc47b4e3ddc0f283e8480a43f86b58d3eb7f4753fb8c0933cadfa753fc58c8dbe3f1d93bc000080bffc72c63dece3113ea71aa53f8a7f0b3f5fa4563f5f820f3cc496563ff9610bbf43fdf7bc000080bf522e0d3ea9abdb3d66bdaa3f36543e3f08ce2a3f86023bbd2f032a3f259f3ebf417189bd000080bf882c523dcfd8273e33399f3ff95d903e4493753f830189bc1199753f1d6f90beaae9c4bb000080bfc734333e7995753d9fd3b03f34975e3fa647f83e8872c0bd01b2f23e33675fbf083df0bd000080bf8047543eee56163beeaeb73f72a0763f92f27a3e37c2debd1d9b6a3e929176bf8d3710be000080bf839e5d3e36e996bdd09dbc3f7d2b7c3f088a0cbe2273d5bd88cd16bec8067cbfdb84c3bd000080bfc66b5e3e5e4a9dbd1b2ec03fe27b7f3f234368bdf582e9bcaf5b72bded657ebf7a03c2bd000080bf08034f3e2e1e0ebe29b0c03f31733d3f6a5e11bf1687b8be5c311cbf86d34abfe53593bb000080bf71c1593ed8460cbed84cc23f35a2253de78c56bfe0450bbf06dd57bf0237a4be2ce2dc3e000080bfc0cf483ec8952abe80eec73ff0efd93e11f464bf85fa0cbead7c63bf2d3be2be0bc8fb3d000080bf0ada343e790231bebaabc53f7b8ed43eb01a63bf807a4ebeb15967bf09f3dabe1a42aa3c000080bfc441623e2ded24be1e89cb3f271d803e48d475bf1b12fd3dc3bc71bf73ff5abe3116803e000080bf8c9f163e5e413abe7ebec33fcc5ab13ec6596dbf6b4212be1cf76ebf5a28b6be8ac33a3d000080bf4c56353ee08b2fbeee29cd3f94c1af3e26586bbfbf09453e354870bfaac3afbe57a10c3d000080bf2d9d1f3e03d038beb252cb3fb60d893e02c174bf0bb3f43d971676bf74fe8bbeb8650cbd000080bfcf2e4f3e95d31ebe1cd1cf3f0e8ea83ec13c5dbf5ecec23e4f8571bfa48d91bebbb02e3e000080bf501f713e358102be0a18d33f072fe33e045217bf42702c3ffa5e65bffaa69dbe93d8a33e000080bfc0950c3e844630bed976d03fe442443e80b16abfc46ab33eb44278bf06696dbe36f19bbd000080bf3204003e7e1841be3bc6c93fd2a9493e474c7abf53a1943d59f97abf75db49be463d973b000080bfa2afe03db8e438beecd5cf3f2b23393ef0fd6cbfc60aaa3ea7117abfc35555beab7e48bd000080bf3507c83d663026bec8d2d53fe623eb3d5f8756bf2890083fb75379bf37874dbe8d6ed8bd000080bf7c7f433ef5a517beccadd23fa6eac23e94ea3cbfeea50e3fbfa669bf9c13cbbe9947c93d000080bfc688243e29cc2bbec9b0d03f933c7c3e19b264bf686fc03ecf5876bf29108bbe023574bc000080bf9dec163ef43315be09a5d53f5832a93e72902abf66222b3f31f16cbf0a20bcbe230bbb3d000080bfcc7e5d3e8c4fe1bd9fe9d53f75bace3e26fababe87bc563f261f62bf42f0c9beafc5813e000080bfae9c5d3ef3748ebd7bc0d63f07dea83e6b22553dd54e713f852b58bff742dcbe536fa33e000080bf94c2fc3d2e541ebe70ecd53f74a9873e09ac43bf9a7d163f220b72bf2cbda6be9f90323b000080bfa41ab63dbb9c02be2807db3f909a5f3ecfd71fbf32fe3f3f5d4a73bf1d0d9fbe0f19943c000080bf5e6bef3dda0afabdba11da3ff329b93ea4faf2be31704d3f8e2b65bf9a9dd5bee574203e000080bf1e157f3d1c8429be164fd53f2223f4bde85059bfcad3033fbb6b7bbfc02aca3c79263fbe000080bfccef943da16442be1d1fcf3f74428bbc96ff74bf3f3a943ebde87ebf098e24bc5abdbbbd000080bf838aaa3dce5448bed464c83f6071883d7ab07ebf77a19b3d65657fbfc89d8abd2efd3bbc000080bff641b63de3c6adbd35a1dd3ff8db183f1e43e4bd905c4b3f72cf36bf0c6406bf9b1ced3e000080bfdec87c3d846fdabd9c3dde3f78b4663e31f326bf8b4d393f443973bf258b9fbeb255753c000080bf9d4b313ec4d00abee960d53ff356c83eec3503bfe2aa433f562f62bfd111e2bee4f91f3e000080bff9c2343e7a3dd8bdd331d73fed32b03e587a91bec617653f48b95ebfc2e6e8be4eb4423e000080bf7c28313e52d68fbde17bd73f11ae943e6062263e4069713f212d54bf7a51e6be0c5caa3e000080bfae2a0b3ef88b99bd103ada3f9d46e03e8882543e9aea5f3f8a5939bf1894fdbe02d0f53e000080bfea77113e86c8e9bdaf07d93fa9eada3e5baebabea3c2533f6cef59bf5fbdf0be425f6e3e000080bfc0b3dd3d9695a6bd8c2bdc3ffe76f03e2983fd3dd0c65f3f58063dbfc8b2f9be2e7bee3e000080bf9a5f0d3d9ce03bbea8a6ce3f4c428cbedef96abf7a06933e050875bfd2996c3e33bf32be000080bfe276283d209748bec4b0c73fa84238beaaaf7abfbe12bf3daca07bbfba7a333e5ac665bd000080bf3755f73cd8fa22beab5ed43fb42593be66c853bfc826f73e02a672bfe349313ed30389be000080bf000000006aaa17be411ed43f0000000079b761bfbe8ff13e23f27cbf16cf94bd4a0c0bbe000080bf1dea773de27608bec88fda3f5a728ebd0b1344bf81a0233fdbe67abf943589bdd56b3fbe000080bfac3c013d8ffb06be68b0d93f176908bed53954bf320b0b3f607977bf1c0b47bc3ae382be000080bf26b3fa3cc44ae5bd2597dd3faf83d33c05d756bfed0d0b3f962477bf75dc25be024451be000080bf000000003eec05be9835d93f000000005d3b63bf8acfeb3e450d77bf6b34f7bd21366ebe000080bf000000009082e7bd0417dd3f000000002c505fbf6656fa3e7e2c75bfc80f10be8d8280be000080bf0000000048c92bbe12a2ce3f00000000487f72bf4216a43ec3af7fbfcee081bc0af13fbd000080bf00000000585339beeeeac73f0000000094f57dbfd709013e03fd7fbf14a89d3aa5241b3c000080bf3fe6433d703a49becf4dc13f6e4103bea3047cbf5a12f6bdb3d77dbfcad2ff3d6bbb0c3d000080bf560ecd3dca3e48be340fc23f272a323e14f37abf2212c0bd24927bbf0a4637be9428433d000080bf0000000052763abe8b1dc13f000000001ba37fbf57025abd1cb97fbfb13222bb47313e3d000080bf9771f33d46783bbe8c86bc3f8cc18f3eaa4870bf60424dbe0a8373bf289499bedace933d000080bf70675f3d686440beda42bc3ff9e111bd8f6779bf5b0b64bebffb7ebf8b6d863c6936b33d000080bfb751fd3d33e32dbe7a08b73f72a9963e578667bf96359ebe3edf6fbf5f62acbe8cb7be3d000080bf00000000134839be4741bc3f0000000027727ebfc851e1bd4dec7ebfd42a25bca484ba3d000080bf80996f3d307f35bee608b73fd582e83c744f74bf1a4298bea27b7dbf4a768abd49cdfa3d000080bfcb50f53dde441dbe5edfb13fac29903e80325ebf7076d1be5aa96dbfd95bb5be4e83e63d000080bf00000000f5a933be172eb73f0000000008b277bf165a81be95c47dbf765a08bd208d023e000080bf89ce723da01f26bece18b23f8f213c3d6d306cbf0c16c4be28a77bbf6e22e1bde474163e000080bf6270ed3d41110bbe920aad3f8f25a33e14ca5bbffba9cdbed8f169bf0115c8bef6f1e13d000080bfae7f373e469f0fbe2486b73f6856343f3edc27bfe6198bbecee92dbf5bd73bbf30971a3c000080bfb1353b3e83de1bbe060fbd3f70782a3faac836bf487b5dbe3d8a3abfc2452fbf3d36893c000080bf20db323e719000be9241b23f1651323fbe781dbf541fbdbe4d0d29bf0a3d40bf5e54ac3b000080bf13052a3eb027dabd742aad3f4aff313fc5aa17bfd953d0be446725bfed6143bfcaa0eb3b000080bfc081593ebd8d8dbdccb6b73fd303773fc6c236be1c4345be71b34bbea0c379bf4465bdbd000080bff7574f3e93e479bd9580b23f084d6f3f659239bef5719cbebd335ebec2e678bfb991b2bd000080bf19b4403e90304cbd1041ad3f4077703f788a3ebef28d93be7a2a5dbefa3579bf00779abd000080bf594c4c3e8c6ebd3bcd3bb23f6475753fdb72533ed3aa47be6b3a3c3e3c7d79bfcd4103be000080bffa65403e48df243cb2deac3f6d21783f414a1f3ed03243be9e000f3ee7567cbfbb1cc1bd000080bf77f53a3ee889673c10caa73f6f617c3f2a121b3ec1e192bd2c8b163ea5b27cbf10d381bd000080bfa2ba393eed9f27bd644ca83f316b763f058361be23c221be63d46bbe7ecf78bf922246bd000080bf2be9213e5950b8bd5361a83f8df7393f0c5b1fbfdf1a95be4b7325bf484b43bfad7a973c000080bfed7d2a3e8dd47b3d04e5a63ff722663ff25adf3e3f0221bdf533de3ec93566bf6fdf5fbd000080bfd4f4293e59707f3d25eca13f6c16653f593ae43eca82b73c3679e43e050165bf1b34d2bc000080bf25cb393eb9e08c3cbbd4a23f5ac17c3f2e0a213e6c02af3c14b4213e5aa57cbf989107bd000080bf1204383e6d7a10bde181a33f4935783f50bb78be0604fcbc847579be623978bfd858b3bc000080bf02f01f3e4ac8a7bd90d9a33f998a403f37e025bf1473f6bd408326bf205c42bfc3f4b93c000080bfa664393ebda607bd21b09e3fe6dc763fa64586be22a2153d7f4486be820977bfc3b5a7bb000080bfd2403c3efe2c963ce8d89d3f0c277c3fee61223eb2318c3d5b7a233edab37cbfb7a22abc000080bfd26f3f3e0feb8d3cc2f1983f043d7d3f98f10a3ebe22623d4c2c0b3ee59f7dbfbb869fb9000080bfc6a42f3ecea8793d59c3973f924b603ff6eff53e3102253ddae5f53e728560bfed02483c000080bfc84a2c3e87337f3dfed49c3f0d76623f3a5ced3ea0634e3dd1b0ed3ed0bd62bfe38ca4ba000080bfee27333eeb3f6b3d49a1923fca9e5f3f0c0ff73e6491833d9056f73e6a2360bffcf7fe3b000080bfdf60e83dcc6afabd4288a83f72b6bd3eeefe60bffcd199bec9a867bfd738d4bef8a6c53d000080bfecfae53d94f9e7bd7d23a43f882ac93ef25a67bf32122ebec37768bf4126d2be0476aa3d000080bf4da51f3ed7c1a1bd9a409f3fba58403f64ee28bf71fe813b01e028bf233c40bf4eedfd3c000080bf4ddc3a3efddc10bd59dc993f6183753fffcd8ebeb5024b3d63268fbeadc875bf7e99e83b000080bfc5b53a3e3f7e2fbd06c4943f515d743ff29190be7972c33dbbc191bee16375bf8a99393c000080bfdc4a1f3ef63daabdd0809a3f0e6d413f994c24bf175a063e617626bf745242bfc72f013d000080bf1e87e13d1de6ebbd09de9a3ff4e6c33e61db63bfaeb37d3ed2296cbf13fac3beeb194b3d000080bf9ab31e3ecfc3c9bdb9fd943f5441443fa9201abff18b643ebf8220bf3ae046bfb3b06d3d000080bf0c233d3e980e5dbd8ca38e3f497c713f638195be95a1213e8d7399be732274bff57cdc3c000080bfb9416d3d1ac708beb8eca83f60b29c3da93774bf297694be27f17abf082d00be6bd51c3e000080bf72e26b3d037700be4c8da43f0bd2b53d0da579bfa9ba4fbeddc87bbf1ab1f1bd88280c3e000080bf6bd86f3d48c715be395ead3f49026f3db40a6dbf1e0abfbe9eca7abf5f0100be9fc6203e000080bff1d4e33dd009e1bd97a39f3f115bc53eaa376cbf31dc7f380c916bbf39cfc4beb6f9973d000080bfc480653d0d2efdbdde009b3fa9418c3d897278bf78ba6c3ed8a37ebf34f346bd92e0b93d000080bfe7be5c3dc21510be1d72953f3282c2bcb66d6cbf1bf7c33e74d37fbff10a063d2a088b3c000080bf00000000024908befe65953f00000000aa2d75bf284a933eafcf7ebf80d7e23cedccbc3d000080bf0000000007f307be9e34a93f00000000b48976bf02ea89be470c7cbf101e41bd379c2c3e000080bf00000000ac1a14bef59fad3f000000004c6f6ebf9962babe4a097cbfbcaf82bd882e273e000080bf2d1f493d8ca924be3c2d8f3f8d62ddbd970e75bf685d893ebefc7dbfc5cdf73d06f4023d000080bfff25693d0c58f2bdfdf69f3fbb72ac3db2f77ebf14c3fdbc3cf57cbfb623b3bda16b013e000080bf0000000031d100be6dd1a43f00000000505f7bbf94d241bea2a47cbf7748fabc6c4c223e000080bff7e51c3e1c61f1bd871a8f3f8972403f16aa1fbfc75a5b3eeb2826bfaad841bf10c6953d000080bf77d4d83d4f5c0ebe692e953f2b1eab3edc945ebf6f42ba3e86f46fbf95aab1be512c023d000080bfde8ed03dce741fbec6578f3fb93ea83eb16b67bf310e8c3eeaa471bfaefaa5be8333803d000080bf000000008c74ffbd300f9b3f00000000dac87cbfc2c9213edb627ebf611a913c12b7e23d000080bf0000000022c1f4bd4225a03f00000000def07fbfe801b0bce1bd7dbf4a9d3abbbaae073e000080bf00000000334e13be29248f3f00000000fb0f7abf8c435b3e752a7fbf287d8d3cf45ca13d000080bf000000005c4424be0e52b23f00000000209c6cbf6277c3beb2a27cbff3af7cbd08f0183e000080bf000000005f2fcd3d7737cb3f00000000a19a593f95d9063f0000803fb9f2a0b8eadb0139000080bf00000000d914e83df0aac73f000000007510693f39d2d33e0000803f227080b89b510d39000080bff5c132bda0fef33d4114c83fab02be3c5ff3633f6cb7e83e13ea7f3f3e237dbce6f2a9bc000080bfd6592dbd4c96d33d719dcb3f31c20cbd0afb533f09420f3ffcc37f3f54152f3da3a1f8ba000080bf9a7932bd49a2073ed9ebc33f13e3733d9cd26f3fea81b03e018a7f3f0ba05abd7128e0bc000080bf844630bd5eb8133efa7bbf3f90a3533df499783fdf9b6e3ebba77f3f5e4d52bd30c6f4bb000080bf365c24bd7b83af3d4f90ce3fa84253bda57e3e3f63822a3f89837f3fd774793dad8a173c000080bf925b93bd00e0983d21eace3f88926dbecccb2c3fde4d333fc05a783f35165a3e26c8ed3d000080bf01ca9fbdd6fdc33de7cfcb3fab735dbe3a53423fa4301d3f6d95793f90644e3e7ceec03d000080bfd9f5abbd40a2e93d6039c83ff3b254bee698513fe307093f7b0f7a3f84a54f3eef118d3d000080bfc64eb8bd560c073e981fc43f793a54bebcb4673f5016be3e79707a3f51f6453e8638993d000080bfc0ecbebd0f0f113e2595bf3f5be265be8ee2733f1ce2513ec163793f145c5b3ef711923d000080bf87e1c3bd4ab7153eef71ba3f69158abe897e763f628248bcf85a753fba0d8a3e6057bf3d000080bf890c8bbd4f025b3de158d13ff1ea4abe27ca183fd50a473f60de793fa36f453ea15ace3d000080bf1007c9bd9604683df699cf3f8c0d9bbea5f9223fdd8f353fda90723fa2eb8f3ef3ec1b3e000080bf0116d9bd7efca53d3d49cc3ff746b5bedf182f3fad48233f59d36d3fb1e4ab3e48681f3e000080bfc903f1bd4166c73d32c9c83f1fa7cabed0023c3f24240d3f6cfc693fe61abf3ed6c9223e000080bf50c703be5d92e33d0918c53f7e8fedbeee22473f3dffd83e7c5e623f8ee5de3eaa142d3e000080bf60af10be5a9cf13d97eac03f74b810bf78234a3f205c743e8217533fe67d083f66c0413e000080bfd0b319beae9bf23d78b6bb3f90a436bf7f3e323f2252a1bdcb662d3fc7cd363f1d23353e000080bf1023c4bd7594033d245ad23fd88a5ebe03f4193f92d2443f6bb1783ffc05573eae00e23d000080bfc826b9bd45d7053cdcb9d43f15034abe4b201b3fef48453f511c7a3f48f53e3e82e7d33d000080bf69a9fcbd996bd1bc4d18d73ff6cd8bbef0430b3fe21c4b3fd909763f2db4423e9e334d3e000080bf42afffbd4be9193c29b1d33f05ba1fbe09fc1d3f8370453feb7c7c3f1e600f3e7512b33d000080bff69b29be506df0bc2d0dd63f97d920be0592cd3e37fc663fca827c3f756bdf3dbe42fc3d000080bf7c2831be52d68fbde17bd73f11ae94be6062263e4069713f5f5d733fea71253e35a1873e000080bf08c9c2bdddd22abd8b54da3f24cffcbeb3f7083f317e2f3fe3655e3f1040ad3e6a29b93e000080bfae9c5dbef3748ebd7bc0d63f07dea8be6b22553dd54e713f026d6b3f7325793eccdf9d3e000080bf268efcbd683f123d5470d03f5e8688be13a72f3f0b452d3f116b763fb158663ec0ce1a3e000080bf1f6504be5a0e743da901cd3fcae6c0be90da2f3f4e161f3f89216c3ff706ae3edce73b3e000080bfd10525bec344833b09dfd33fcc32d5bdda63163f87724d3fb49b7e3f0a2b733d8336af3d000080bf9fe313befd84933debe5c93f5e77e7bea8cc363ffed7083f97a8633f6487d03e3209553e000080bf0cec21bed9f19f3d3cc9c63f01540ebfa68e3c3fce3ac53ed3c4543f7a65ff3e4eab7b3e000080bfcdb72ebe73de9f3d2d5dc33ffef839bfc5d62a3fd702283e14b92e3fa8382c3f8e41923e000080bf9dbd33be01a4963db4e1be3fa67a5cbf9599003f1e629dbd3009f53e91445a3f99d4563e000080bfc2c11ebe6bd3d83c3fc8d03f603a32bea51a453f172a1d3f6c117c3f126f023e698af43d000080bfae2a0bbef88b99bd103ada3f9d46e0be8882543e9aea5f3f7e07653f1382483e339ccd3e000080bfc0b3ddbd9695a6bd852bdc3ffe76f0be2983fd3dd0c65f3feb9c5b3f3483983eb164d63e000080bff641b6bde3c6adbd35a1dd3ff8db18bf1e43e4bd905c4b3fb515363f1cc5c43e96ab163f000080bf573e4bbe0e4a183c6b80d23f651a63bee3b9303fda4b303f039e793f0f2c1b3e0301263e000080bf645e57be8fe0c6bc77f1d43f1c5c77be96e3db3eb6c35e3f3d62773f08c0403ef290333e000080bf87343abec0b1e73cf25acf3f5d6354be5707553f0faa033ffde7793f3862113effe5273e000080bf2b7228be2634493dca17cc3fb8919ebe29744a3f7823073f3e4a733f818f753eba104b3e000080bff2d017bee6cc363d1efdcd3f3edab0be8cc0423fdbab0c3f2130703f0dc2953e26443d3e000080bf8b5438bed42e663d965ec93f3047edbebd92503f4e6ab23e3e73613f2c7cc23e62f1903e000080bfcded4ebea6d5103d7288cc3f10d7cdbe45eb593f99aeac3e6f83683f0bf2a53e227c873e000080bf684845be0f00553d0635c63fcf3633bfcf3c363ff1a3663d1abe2f3fde31263f31b0a73e000080bf592e5bbe21ac063d5e10c93f06aa1bbf99264b3f94c1bbbc59173d3fac7a133f9a39b33e000080bfe8d94cbeae691e3d852bc23f873b60bfa243ea3e84c21cbe527ad73e0435613f76a1623e000080bf53575ebe471e883cac38c53f8d1436bfe195073f44a3ecbe755fe33e7f25593f7ec4933e000080bf76c366bed9437b3c5b9acf3ff127d3beb6054b3f2f88e53ea73f673f629e953e1ccba03e000080bf4f5a80be1e13a9bcb98dd23fa22d0ebf9702e43e0fca333f8e9b533f1ab7c63eb4acd03e000080bff6678fbefab8b6bce276ce3f367547bfb8bfe93e8aefdb3e893c203f3d77073f14a9123f000080bfe90b81be25e699bd8f04d43f324a1dbfbaa180bdc856493ff3152e3f2d38ed3ea578113f000080bfd4637bbe43ff843c211ecb3f425e0abf7651563fac32ab3d97d0423fed5fe33ebf24f23e000080bf8f6c96be4182e2bcf810ca3fba725dbfeb1aed3e86aa453ed96bed3ecc50173fadf5283f000080bf0a6d91be57d2aabda407d03f7baf50bf50c206be6a66103f84aad13eddc90e3f41d1383f000080bf1efe7abeb1f9383c0e7ec63f3f96acbef748623f36f2a5be38643b3f01d5ec3e120e003f000080bf83215bbebf8eb8bcc04ac23f25d065bf2ae32d3ec627d0bee901223ed4457c3f82067f3d000080bfa05398bed82cb7bd086fcb3f5a296abf14ea15bec6dec03ed5837f3ec754073f3eb44f3f000080bf580364be48dce3bc683ec33fa0d2abbda41bdf3ec76965bfc1e3823edced603f407ece3e000080bff8d657be6c09f93abfbbbd3fa04c77bf702d823ec0013fbdaa4a7b3efd6e753f400f133e000080bfc66b5ebe5e4a9dbd1b2ec03fe27b7fbf234368bdf582e9bc437772bda55e7e3f0a5ac43d000080bf839e5dbe36e996bdd09dbc3f7d2b7cbf088a0cbe2273d5bda9e316befdff7b3fbd6ec53d000080bf804754beee56163beeaeb73f72a076bf92f27a3e37c2debd58836a3ed68c763f78df103e000080bf800f5ebe1458a0bd7021c13fd0619bbe9b798b3ec1be69bf8c28cf3d5749763faebe813e000080bf71c159bed8460cbed84cc23f35a225bde78c56bfe0450bbfe21658bf90d7a33e8846dcbe000080bf08034fbe2e1e0ebe29b0c03f31733dbf6a5e11bf1687b8bed8461cbf82c24a3f6cacb63b000080bfc0cf48bec8952abe80eec73f29f3d9be52f364bf0ffa0cbe6d8863bffe33e23e4185f9bd000080bfb1353bbe83de1bbe060fbd3f70782abfaac836bf487b5dbe1d943abfb03c2f3fb3ab81bc000080bfc08159bebd8d8dbdccb6b73fd30377bfc6c236be1c4345be3fd54bbe53bd793f91e6be3d000080bf594c4cbe8c6ebd3bcd3bb23f647575bfdb72533ed3aa47be891c3c3e397a793f02c8033e000080bf0ada34be790231bebaabc53f7b8ed4beb01a63bf807a4ebee36067bf09dbda3ea9cea1bc000080bf4c5635bee08b2fbeee29cd3f94c1afbe26586bbfbf09453ed94570bf95ddaf3e6d7f08bd000080bf8c9f16be5e413abe7ebec33fcc5ab1bec6596dbf6b4212bee0fc6ebfb519b63e55eb36bd000080bf560ecdbdca3e48be340fc23f272a32be14f37abf2212c0bd86957bbf0c34373eb3d33fbd000080bf838aaabdce5448bed464c83f607188bd7ab07ebf77a19b3d7a647fbff1bd8a3dd858493c000080bf320400be7e1841be3bc6c93fd2a949be474c7abf53a1943dbef87abf70ec493e71a573bb000080bfe27628bd209748bec4b0c73f844a383e4eaf7abf7712bf3d599e7bbffe6d33be9aeb683d000080bf2d9d1fbe03d038beb252cb3fb60d89be02c174bf0bb3f43d2e1276bf980c8c3ef38c103d000080bfa2afe0bdb8e438beecd5cf3f2b2339bef0fd6cbfc60aaa3e420b7abf0b9c553e07c64b3d000080bfc0950cbe844630bed976d03fe44244be80b16abfc46ab33e443978bf08ba6d3e55c29d3d000080bfccef94bda16442be1d1fcf3f74428b3c96ff74bf3f3a943e2be47ebf5131283c073cbd3d000080bf9a5f0dbd9ce03bbea8a6ce3f4c428c3edef96abf7a06933e550375bf98596cbe987a333e000080bf0000000048c92bbe12a2ce3f00000000487f72bf4216a43e28ad7fbfa9f6833c1306433d000080bfc68824be29cc2bbec9b0d03f933c7cbe19b264bf686fc03e1c5276bf95398b3e4cce803c000080bf7c7f43bef5a517beccadd23fa6eac2be94ea3cbfeea50e3fec9d69bf4a54cb3eb6c0c7bd000080bfcf2e4fbe95d31ebe14d1cf3f0e8ea8bec13c5dbf5ecec23ede8771bf60c4913ef4c02dbe000080bfcc7e5dbe8c4fe1bd9fe9d53f75bacebe26fababe87bc563f8b1162bf5950ca3ec18e81be000080bf9dec16bef43315be09a5d53f5832a9be72902abf66222b3fede76cbf0061bc3e87e3b9bd000080bf9d4b31bec4d00abee960d53ff356c8beec3503bfe2aa433f442162bf3162e23e47711fbe000080bff9c234be7a3dd8bdca31d73fed32b0be587a91bec617653f56a65ebf3d41e93eb55d42be000080bfea7711be86c8e9bdaf07d93fa9eadabe5baebabea3c2533f9ddf59bfd510f13e02f56dbe000080bfae2a0bbef88b99bd103ada3f9d46e0be8882543e9aea5f3f793e39bfbae9fd3e38c9f5be000080bf7c2831be52d68fbde17bd73f11ae94be6062263e4069713f161354bf08b1e63e795caabe000080bf94c2fcbd2e541ebe70ecd53f74a987be09ac43bf9a7d163f680172bf35f6a63ec81909bb000080bf3507c8bd663026bec8d2d53fe623ebbd5f8756bf2890083fe04879bf77f74d3ee4e1d93d000080bf5e6befbdda0afabdba11da3ff329b9bea4faf2be31704d3fdc1e65bf0ae9d53ec80420be000080bfa41ab6bdbb9c02be2807db3f909a5fbecfd71fbf32fe3f3f0b3f73bf26569f3ebde28fbc000080bfc0b3ddbd9695a6bd852bdc3ffe76f0be2983fd3dd0c65f3f62ed3cbfd40bfa3ef96ceebe000080bf1e157fbd1c8429be164fd53f2223f43de85059bfcad3033f6b647bbf5cddc6bce7cd3f3e000080bff641b6bde3c6adbd35a1dd3ff8db18bf1e43e4bd905c4b3f44bd36bffa8d063f83f5ecbe000080bfdec87cbd846fdabd9c3dde3f78b466be31f326bf8b4d393f2c2f73bfbacb9f3e98466dbc000080bf1dea77bde27608bec88fda3f5a728e3d0b1344bf81a0233f04de7abf5f288a3d75f93f3e000080bf3755f7bcd8fa22beab5ed43fb425933e66c853bfc826f73e679f72bfbae330be7f53893e000080bfac3c01bd8ffb06be68b0d93f1769083ed53954bf320b0b3f257077bf4af04c3cae26833e000080bf26b3fabcc44ae5bd2597dd3faf83d3bc05d756bfed0d0b3f6c1a77bfb42d263e79c3513e000080bf000000003eec05be9835d93f000000005d3b63bf8acfeb3ed30277bffbc1f73d8abe6e3e000080bf000000009082e7bd0417dd3f000000002c505fbf6656fa3ebb2175bfc255103efac0803e000080bf000000006aaa17be411ed43f0000000079b761bfbe8ff13e82ea7cbf6c87953d8ab80b3e000080bf00000000585339beeeeac73f0000000094f57dbfd709013e7bfd7fbfc3ee90bae69e0ebc000080bf3fe643bd703a49becf4dc13f6e41033ea3047cbf5a12f6bd9bd87dbfc80100be9eab09bd000080bf0000000052763abe8b1dc13f000000001ba37fbf57025abd35bb7fbf77c81f3b695c3bbd000080bf70675fbd686440beda42bc3ff9e1113d8f6779bf5b0b64be75ff7ebf14b687bcd9d3b1bd000080bf9771f3bd46783bbe8c86bc3f55c18fbe4d4870bfee494dbea88973bf9982993e353692bd000080bfb751fdbd33e32dbe7a08b73f72a996be578667bf96359ebed7e76fbf5f4aac3e165dbdbd000080bf80996fbd307f35bee608b73fd582e8bc744f74bf1a4298be7a817dbfc4128a3d6f89f9bd000080bf00000000134839be4741bc3f0000000027727ebfc851e1bd30f07ebf2f00243c5a33b9bd000080bfcb50f5bdde441dbe5edfb13fac2990be80325ebf7076d1bedab26dbf8540b53e1a67e5bd000080bf00000000f5a933be172eb73f0000000008b277bf165a81beedc97dbfb1b7073d48f101be000080bf89ce72bda01f26bece18b23f8f213cbd6d306cbf0c16c4be07ae7bbfd9afe03d93e715be000080bf6270edbd41110bbe920aad3f8f25a3be14ca5bbffba9cdbe5afa69bf85fec73eb9fbe0bd000080bfae7f37be469f0fbe2486b73f685634bf3edc27bfe6198bbe8ff42dbf06ce3b3faffc0dbc000080bf20db32be719000be9241b23f165132bfbe781dbf541fbdbe281929bfdf32403f52af98bb000080bf13052abeb027dabd742aad3f4aff31bfc5aa17bfd953d0be867125bf8359433f87bcdcbb000080bf2be921be5950b8bd5361a83f8df739bf0c5b1fbfdf1a95be3b7925bfd446433fb16f94bc000080bff7574fbe93e479bd9580b23f084d6fbf659239bef5719cbeda605ebed1e0783fecc1b33d000080bf19b440be90304cbd1041ad3f407770bf788a3ebef28d93be094c5dbec831793f66679b3d000080bfa2ba39beed9f27bd644ca83f316b76bf058361be23c221bebee16bbe8ccd783f9493473d000080bf120438be6d7a10bde181a33f493578bf50bb78be0604fcbc227779bee838783fe566b53c000080bf25cb39beb9e08c3cbbd4a23f5ac17cbf2e0a213e6c02af3c0ab5213ecea47c3ff083083d000080bf77f53abee889673c10caa73f6f617cbf2a121b3ec1e192bd7884163e8fb17c3fd378823d000080bffa6540be48df243cb2deac3f6d2178bf414a1f3ed03243be2bea0e3e1b557c3f36f5c13d000080bf02f01fbe4ac8a7bd90d9a33f998a40bf37e025bf1473f6bd558526bfeb5a423f4884b7bc000080bfdf60e8bdcc6afabd4288a83f72b6bdbeeefe60bffcd199bea6ae67bf9a2bd43e2ad2c4bd000080bfecfae5bd94f9e7bd7d23a43f882ac9bef25a67bf32122ebeff7a68bfd220d23e99c6a9bd000080bfb9416dbd1ac708beb8eca83f60b29cbda93774bf297694be44f67abf6c0e003e516b1cbe000080bf72e26bbd037700be4c8da43f0bd2b5bd0da579bfa9ba4fbe88cc7bbf1b8ef13d00ce0bbe000080bf0000000007f307be9e34a93f00000000b48976bf02ea89be0c117cbf51aa403dc2342cbe000080bf00000000ac1a14bef59fad3f000000004c6f6ebf9962babea60e7cbfdb57823d1abe26be000080bf6bd86fbd48c715be395ead3f49026fbdb40a6dbf1e0abfbeddd07abfdda5ff3d784f20be000080bfa66439bebda607bd21b09e3fe6dc76bfa64586be22a2153db84386be8d09773f7e0aad3b000080bf4da51fbed7c1a1bd9a409f3fba5840bf64ee28bf71fe813b40e028bf7e3c403fa02ffcbc000080bff1d4e3bdd009e1bd97a39f3f115bc5beaa376cbf31dc7f3830926bbf2dd0c43edf7497bd000080bfff2569bd0c58f2bdfdf69f3fbb72acbdb2f77ebf14c3fdbca7f77cbfb420b33df32001be000080bf4ddc3abefddc10bd59dc993f618375bfffcd8ebeb5024b3dc2258fbed2c8753fa326e5bb000080bfdc4a1fbef63daabdd0809a3f0e6d41bf994c24bf175a063ed97526bf2f53423f82c500bd000080bfd26f3fbe0feb8d3cc2f1983f043d7dbf98f10a3ebe22623d6b2c0b3ee39f7d3f341ca439000080bf1e87e1bd1de6ebbd09de9a3ff4e6c3be61db63bfaeb37d3e5b296cbf9afec33e388c4abd000080bfc48065bd0d2efdbdde009b3fa9418cbd897278bf78ba6c3efda47ebf8b2b473d0b6db9bd000080bfc5b53abe3f7e2fbd06c4943f515d74bff29190be7972c33dd0c191bedd63753f33b739bc000080bf74d441be069a4f3cd2e5933f1c597ebf5872c23dfa227e3d44e0c33d43d17e3f9225093c000080bf30f844be7c698a3b9c738e3fc7957dbfb991833d7fe3f73d6cb5843d41767f3f31872d3a000080bf9ab31ebe54c4c9bdb9fd943f544144bfa9201abff18b643e8b8220bf80e0463fc7996dbd000080bf0c233dbe980e5dbd8ca38e3f497c71bf638195be95a1213ef67499be1822743f8f18ddbc000080bfd2403cbefe2c963ce8d89d3f0c277cbfee61223eb2318c3d7a7c233eadb37c3fd5a42c3c000080bfc6a42fbecea8793d59c3973f924b60bff6eff53e3102253d99e5f53e7885603f7fc948bc000080bfee2733beeb3f6b3d49a1923fca9e5fbf0c0ff73e6491833d7c55f73ea123603fd0b901bc000080bfe92b38be92d26c3d05538d3f8f3561bfc4b7eb3e0f74f33dc672ed3e17ce623f111e643a000080bff6cc12be21afc73dd107913f1e442ebf4a863b3f5704af3bca663b3f21362e3f8d0203bd000080bf7b6b10be76dfd13d5265963f8a4039bf7880303fb7c100bd64ae303f4522393fea22d7bc000080bfa79116be416cc93de3a98b3fc1e616bfaaeb4c3fd453de3db2714d3f927b183f00130dbd000080bfc84a2cbe87337f3dfed49c3f0d7662bf3a5ced3ea0634e3d26b1ed3eb7bd623fe51bac3a000080bfd9210ebe6446d83d84b79b3f993e3fbf4d2e2a3f56e99fb9922c2a3f613c3f3f75a617bc000080bfd4f429be59707f3d25eca13f6c1665bf593ae43eca82b73c5d79e43eba00653fa04ed33c000080bf7a390cbec1aada3dfbf0a03f8eea41bf3c1e273fa380003ca320273fb5e1413f9916723c000080bfed7d2abe8dd47b3d04e5a63ff72266bff25adf3e3f0221bd1f32de3e4835663f40d6603d000080bf2bbc0bbe224adb3d5af1a53ffa9341bfbb79273f34017cbc9f3a273fba8a413f7a54293d000080bf274e2ebecdcd773d5ad6ab3fb8bd63bfb38fe43e3a93c5bd7ff0e03e2ee8643f62c1b03d000080bf522e0dbea9abdb3d66bdaa3f36543ebf08ce2a3f86023bbdfc012a3fd89e3e3f3dea893d000080bffc72c6bdece3113ea71aa53f8a7f0bbf5fa4563f5f820f3c9596563fc3610b3f4d15f93c000080bfe0d7c8bdf27d113e61ff9f3fe9650dbfea66553f9102bdbbf763553fe1670d3f65c30d3c000080bfd67ecbbd06c50f3e5c959a3faac70cbf8570553f62c24abda0c5553f42cf0c3ff1624cbc000080bfc101cdbd36ca0a3ebff4943f73d608bfd841563f6fb4f0bd8227583fffed083ffc22ffbc000080bfdf19cdbd957e023e5a458f3f0c58f8be940b5e3fe823e4bd3dd25f3f7e9df73e0b2029bd000080bfa25dc5bd7a6e113ebadba93f0b2206bf54075a3f1b82333c3ad3593f52d6053f612a543d000080bfc47b4ebddc0f283e8480a43f86b58dbeb7f4753fb8c0933c9bfa753f808c8d3e61df933c000080bf882c52bdcfd8273e33399f3ff95d90be4493753f830189bc0d99753f296f903e75b1c53b000080bfbaa254bdf110263efe99993f75f191be68a4743fbf1198bd9c58753fd123923e73d8b7bb000080bf6f9c54bdc05b203ee7b2933f1c2693be6787713f5a1229be3e14753f0aa4933e77c698bc000080bfb9ec50bd11ad153e31c38d3f6ea58abe6f3c713f176a49bec85b763fdb498a3e4817fdbc000080bf01a34bbd7a110d3e62ed873f26f37ebefac26e3f9ca985be68c7773f2f427f3ea82f05bd000080bfd6b14abdcdaf263eef55a93f09fa85beb5bb763fa563513dd90b773f6552853e59d1f83c000080bf0000000082022f3e6248a43f0000000044f57f3fe440943c0000803fa3206bb5fbf84a38000080bf000000005ad92e3eb4e99e3f00000000abf27f3f4b42a5bc0000803f2b808b34d30d5837000080bf00000000942e2d3eec2f993f000000005e377f3fe021a0bd0000803f229109b67d40dbb7000080bf000000000a82273efa26933f00000000cc137c3fc29232be0000803f58ea61b703749fb8000080bf0000000077491c3e9f1c8d3f00000000bbff793f4a6b5cbe0000803f7583edb796b106b9000080bf00000000d63d123e1b2d873f000000003457793ffc0a68be0000803f51bf2fb836d93cb9000080bfb9ec503d11ad153e31c38d3f6ea58a3e6f3c713f176a49be565b763f1c518abea4d7fa3c000080bf6f9c543dc05b203ee7b2933f1c26933e6787713f5a1229bee813753fbea793be3e61973c000080bfbaa2543df110263efe99993f75f1913e68a4743fbf1198bd8958753f7c2492bec28eb53b000080bfe0d7c83df27d113e61ff9f3fe9650d3fea66553f9102bdbb0264553fe2670dbf93c00cbc000080bf00000000bc572d3e6f2da93f000000003b7f7f3fe551803d0000803f5fbe94b6ce149438000080bfd67ecb3d06c50f3e5c959a3faac70c3f8570553f62c24abd96c5553f5fcf0cbfa6d04b3c000080bf7a390c3ec1aada3dfbf0a03f8eea413f3c1e273fa380003ca820273fcce141bf7bb370bc000080bfc101cd3d36ca0a3ebff4943f73d6083fd841563f6fb4f0bd3927583fe5ee08bf782cfe3c000080bfdf19cd3d957e023e5a458f3f0c58f83e940b5e3fe823e4bdf7d15f3f02a1f7bee431283d000080bf7b6b103e76dfd13d5265963f8a40393f7880303fb7c100bd5cae303f822239bfca68d63c000080bfd9210e3e6446d83d84b79b3f993e3f3f4d2e2a3f56e99fb9932c2a3f623c3fbff1aa173c000080bf01a34b3d7a110d3e62ed873f26f37e3efac26e3f9ca985be9bc6773f135a7fbe0bce033d000080bf2bbc0b3e224adb3d5af1a53ffa93413fbb79273f34017cbc0d3b273ff58a41bf65a328bd000080bf274e2e3ecdcd773d5ad6ab3fb8bd633fb38fe43e3a93c5bdd6f5e03eebe864bfbb17b0bd000080bff6cc123e21afc73dd107913f1e442e3f4a863b3f5704af3b25673b3f5e362ebf592f023d000080bfb50ece3d6a4efe3d7ba4893fd476c83e4649693fdfa902beb27e6b3fd32ac8be18cafa3c000080bfa791163e416cc93de3a98b3fc1e6163faaeb4c3fd453de3d51734d3f657a18bfe2fb0b3d000080bfe92b383e92d26c3d05538d3f8f35613fc4b7eb3e0f74f33d1875ed3e79cd62bf3c0288ba000080bf74d4413e069a4f3cd2e5933f1c597e3f5872c23dfa227e3db3e2c33d30d17ebf07650abc000080bf30f8443e7c698a3b9c738e3fc7957d3fb991833d7fe3f73daebc843d30767fbf9f5f4bba000080bf645e573e8fe0c6bc80f1d43f435b773ee6e6db3ef5c25e3f965f773fa32c41bea25633be000080bf4f5a803e1e13a9bcb98dd23fa22d0e3f9702e43e0fca333f9e98533ffbeac6be2a87d0be000080bfae9c5d3ef3748ebd7bc0d63f07dea83e6b22553dd54e713fde656b3f15a779be38d79dbe000080bfe90b813e25e699bd8f04d43f324a1d3fbaa180bdc856493fb2072e3f2277edbe067011bf000080bff6678f3efab8b6bce276ce3f3675473fb8bfe93e8aefdb3ea53d203f678e07bf769212bf000080bf0a6d913e57d2aabda407d03f7baf503f50c206be6a66103f3f8fd13e21e50ebfe9c338bf000080bf8f6c963e4182e2bcf810ca3fba725d3feb1aed3e86aa453ea377ed3e1d6517bf55df28bf000080bfa053983ed82cb7bd086fcb3f5a296a3f14ea15bec6dec03e955f7f3e9c6c07bf80a74fbf000080bf76c3663ed9437b3c5b9acf3ff127d33eb6054b3f2f88e53e0d43673f33bd95bedb9aa0be000080bfd4637b3e43ff843c211ecb3f425e0a3f7651563fac32ab3d2edc423f8b74e3be12ecf1be000080bf1efe7a3eb1f9383c0e7ec63fbc99ac3e6048623fc8f1a5beba813b3f95d0ecbecec9ffbe000080bf9d2e5b3e21ac063d5e10c93f06aa1b3f99264b3f94c1bbbc81213d3f838113bf31f8b2be000080bf53575e3e471e883cac38c53f8d14363fe195073f44a3ecbe6d90e33e7b2559bf1b7993be000080bfe8d94c3eae691e3d852bc23f873b603fa243ea3e84c21cbece8fd73ee63a61bfe8f161be000080bf83215b3ebf8eb8bcc04ac23f25d0653f2ae32d3ec627d0be7056223e5f457cbfe0187cbd000080bf5803643e48dce3bc683ec33f6ad1ab3d0e1adf3e2e6a65bfeb51833e03e360bf9067cebe000080bf800f5e3e1458a0bd7021c13f3e5e9b3eee798b3e4cbf69bf1820d03dc64876bf36aa81be000080bf8a8f6f3e06d621be6c5ec73fa0d911bec0627dbf08febb3be7af6bbf71d6093e369ebb3e000080bf7d47853eee830cbeb4ddce3f2360103f88de2ebf7a97ed3efac551bfc656c9bef582d53e000080bfd3508b3e98a713beb2a6ca3fb357053f8b8c43bf821ac33e819952bf32f6a8becb09ed3e000080bf0a6d913e57d2aabda407d03f7baf503f50c206be6a66103f666705bf127d17bf4b731d3f000080bfa053983ed82cb7bd086fcb3f5a296a3f14ea15bec6dec03e5a7cbbbef0d231bfc3831e3f000080bfe90b813e25e699bd8f04d43f324a1d3fbaa180bdc856493f462b37bf6bcaedbea299053f000080bf66a47e3e0f9cb3bd10aeba3fef3034bf4f5a073eebaa32bfca41fbbd19f5713fd8ff9a3e000080bfb36c663e89d90bbe88fdbe3f035745bf62bbdebea43feebe819bdfbe6e88643faa7de3bd000080bf378e683e91d2acbdc765be3f871d55bf44f2063e4ec409bfc6fc15bd5bc2743f6ae0943e000080bfbfb67e3e49490fbeada6bb3f299f1ebff470f9be1c8b1dbf21060abf0e80553fb767f0bd000080bf527c7c3e946829be936ec33f8232a0bebc1973bffa42973cb57e5ebf8a8c8e3e944dd1be000080bf71c1593ed8460cbed84cc23f35a2253de78c56bfe0450bbf79f9e3be24d3f13e11bd42bf000080bf800f5e3e1458a0bd7021c13f3e5e9b3eee798b3e4cbf69bf2dc7ffbd041c763fe0337b3e000080bf8a8f6f3e06d621be6c5ec73fa0d911bec0627dbf08febb3b54e45bbf0d3cf73d36c8febe000080bfd3508b3e98a713beb2a6ca3fb357053f8b8c43bf821ac33e6a4540bfa14b1fbfca0462be000080bfc28a8b3eb1e02ebe8eccbf3ff02a48beabfb79bff8f2b9bd618f61bfb0b15c3ea48ad7be000080bf7f2e923ef2eb17be4469c73f5957f03ea7403ebf781ff43e99c442bfc94e1dbf5cc155be000080bfa053983ed82cb7bd086fcb3f5a296a3f14ea15bec6dec03ef3a480be58a16fbfec387c3e000080bf2a8f9e3ee4a11fbec008c43fcc5dc73ea89f3fbf3567093fbb2945bfdd8e15bf111383be000080bfaed79c3ead89c5bd795ac83f69a64c3f9cf905bebf1b163fb83da7be3aee69bf403a773e000080bf8f6c963e4182e2bcf810ca3fba725d3feb1aed3e86aa453e7baa7a3e66b439bf8db0243f000080bf6ac0a83e0dfdd3bddbddc53f34b0273f1ce2b0bd7e2a403ff146babef22068bfe3435a3e000080bfc18ca93e725022bea340c13fc03be83e20d741bff5a7f03e5c8341bf13321bbfb0137dbe000080bf6c3d9b3e38832fbe77f7bc3fd8111bbef11c7cbf08d2adbd9abe62bfa178313e837edcbe000080bf0f9aa53e9c6932be10e6ba3fe8518fbd5b637ebf9432b3bd5e2265bf4769cf3de85cdebe000080bfdd0c8f3ec44112becb9cb83f16600abf00b604bf98a229bf059615bf69484c3f3d2f17be000080bf98dd9b3e90f514bee082b63f583d00bf701b0bbfc9732cbfdcd319bfe94d473f618239be000080bf3753993e87a802bdf8fcc63f6846513f8c2f083f7c0a623efce08e3eee7b33bf53fb273f000080bf0b42a93e5a9b16be1b49b43f425803bf4e4c07bff9242dbf583218bf2c83493f760b28be000080bf698f973ec441c2bd5569b53f41ed0dbfa961ab3de2f953bf18df86be35176d3f41398a3e000080bf69388d3ee7a7b8bdce8bb73fac2e20bf0744fb3d593545bf1c1f48be5f706e3f4b399d3e000080bff8a4b33ee6ca20beaf40be3f2612073f038b3dbf6237d53e330039bf381e26bfddd173be000080bf9869b33ea20de0bde580c33f644a373f9e52c5bd4d02313f08aca7bef2c96bbf04d2573e000080bfecc0a13ebb7f2cbd5321c43f18f0393fa0af0f3f4626cb3e5aca5b3e4ccc3bbf5912253f000080bfe3df873edb89923adaafc33f59c2483ed3ae713f88bd87bed793273f20379a3d3e91403f000080bf1efe7a3eb1f9383c0e7ec63fbc99ac3e6048623fc8f1a5bed07b0f3f4f99b43d1fce523f000080bf2c49be3e728a1ebec768bb3f7833e23eeb2c3dbffe37023f60cc38bfaa2521bff73393be000080bf085bbc3e1212e9bd81b1c03f50f03c3fd3f90fbe0ff2283fc84ba5becbb26ebf914b263e000080bfef1dad3eca5356bda393c13f92702d3f2c5a0f3fa12bf43e8d6e403e1e3642bfc6b21f3f000080bf3c2e923ea1bc0fbcb9aac03fbf0a4e3e1b63753fab9a4ebe00f8183f9e8c303da2f94c3f000080bf0822833ebe831fbdf949bd3f49a402bfa090163fd89e20bfc37ae33eed124e3fda52c93e000080bfdf03743e90be09bd92e6bf3f9ea91cbf69ad093f877314bf25b7cf3e9fc5573f1105b53e000080bf5803643e48dce3bc683ec33f6ad1ab3d0e1adf3e2e6a65bf64e18a3edbf95a3fb0f3e13e000080bf66a47e3e0f9cb3bd10aeba3fef3034bf4f5a073eebaa32bf30a9f13d9b9a7d3fc8858c3d000080bf378e683e91d2acbdc765be3f871d55bf44f2063e4ec409bf8cda7f3d58c87c3f1fa9143e000080bf800f5e3e1458a0bd7021c13f3e5e9b3eee798b3e4cbf69bf6681e23d2814713f98aba23e000080bfa320b83e70b679bd0e30bf3fe3e0273f561a063f642c0b3f32a5063e1dd149bf24dc193f000080bfa9849f3e4cfea7bce23dbd3f976b613eed13763fa9fa29be71d30e3f47447e3cbe6a543f000080bfe8a2913ead152dbde718ba3fe2d6dabe2872253f14d621bf4ad1f23eb16f413f5054e73e000080bff06bac3ecfa3e2bc96eaba3f0fc37a3eed06783f758116bd536cfb3ee9e7babde8c75d3f000080bf69388d3ee7a7b8bdce8bb73fac2e20bf0744fb3d593545bf079c143e4c167d3f5217223d000080bfbaf8c33e734b8bbdd498bc3fe2b4143feb04fd3e3595253f24f0753d188751bfb747123f000080bf486fc83e33faf1bd116dbd3f5d98243fdcda42bebbec3d3fefa9babe1d8b6dbf37a89f3d000080bfde8fd33e7ff8f9bd033ebb3fb20ff53e945b76be3a2b583f6d9bcebe09176abf723d02bd000080bf698f973ec441c2bd5569b53f41ed0dbfa961ab3de2f953bfff472a3efe6a7c3feb893fbc000080bfdba39f3e4d3232bd2e55b73f880aabbe9848323f609822bf007e003f3ca9333fa969013f000080bfef1eb83e555011bde4bbb83f47d2953ed705743f6c629bbd31f1e93ed6b58ebdb003633f000080bfd009d13eb6d88dbd9d82ba3f6217dc3e25a40b3fde30383f8f59c43c9fb14dbf0047183f000080bf4293a43eb2bccbbd9bacb33f329fefbedb82cd3d0bc560bfa6746d3e6600793fb3d54bbc000080bf90f2c33ed9b23cbdccb5b63f9e9a793eac96753f9fc911be0c93e43e255e9e3cff04653f000080bf331ab93e5d3379bdf164b33fd2991ebef2b3203f674a43bfdca4f43ef133393f1122ff3e000080bf228bac3e14b449bd4f76b53fb3e24ebe299c2e3f42ec33bf44e5fc3e6fcd303f873b073f000080bfc1cab13e07edd5bd51d4b13f85d108bfd269283e5a3c54bf35ca5f3e7473793fd1b5563d000080bff52ac23ea70399bdc7f1b13fcc4a6cbeed751e3f613040bf00bad53e928a423f721bff3e000080bff2b4cc3ea12e52bda419b53f78ea143ef1f9743f04a280be370ff33e7f071f3e67c75d3f000080bfb01ddc3e321d7abdb799b23f2fb3b3bd3acc793f733b4dbe7629ee3e90485f3eafa25b3f000080bff451de3eb2a692bda54fb93f8896bc3eec790f3f83e43d3f2404493d0ff84ebfd423163f000080bf5bcdea3e376e91bd8b6eb73fd7fed43e28ce233f316a253f1bc52c3eb4a540bfeaf6223f000080bfec10df3e3672fdbdcce4b93f26caca3ea2a191be68805f3f7e49d4beb75c67bfc3c8d9bd000080bf9928ea3e6ce9f1bd0cccb83f1b4c043f719b5ebe5bfb533f2eb7adbecaa570bf1e840fbd000080bf60ccf63ee8f888bd6b0db53f5cdfd93ebb66323f3cca133f614e783e19d233bf4a4f2b3f000080bf7f2eea3e59a65fbd1d94b03f1ca3e3bdb1157d3f48c3cfbd49bcf83e7189123eb4bd5c3f000080bf16fcf63e33e06cbdc808ae3f8900e2bb49ee793f1b8a5dbe948e053fde99403eab06553f000080bfbe4cd43e69aaa7bd5307af3ff44ac6bebf14393f2c7612bf326fd73e4ad5303fe28a163f000080bf5551bc3e0ef3e5bd471daf3f38921cbf002b503ec2bc43bf12f93b3ed8fc793f9d01e73d000080bf4d6ae03e7d40a0bdb4e3ac3f7cbecabe3176353fd46f15bf1d8ad73e4181343fbd14123f000080bf560cef3e5af0a2bdfeb5aa3f4d9aa9be60cc2f3f35a625bf7692d33eecdb383f9b070e3f000080bf71ffe13ec8ce1bbed68eb63f14e7b83e087539bf7a50163f683928bf70fb24bfbf2cc8be000080bf4e7ad73eef1b1fbebe89b73f44baab3e8b203bbf1024183fdcd62dbfb9f51fbfd044c5be000080bf145af63e5af6e4bddfc4b63f609a183fa793f5bd203d4b3ff0e38fbef11775bf6103883d000080bfca50013fffcd8bbd5b95b23f2078023fe0bc323f13b6003fb8478b3ee4652fbfadfa2c3f000080bf323c023f8d2782bdf836ab3febfc453b1e93753fda9d90be5b4a0d3fe58d6f3ee0e74c3f000080bf9692fd3efcc5acbd425da83fcffd9dbee6f7283ff6572fbf4512d43e54d03d3f2b24073f000080bfb570f93e06b800bebc40a53fac36bebea862443e368d68bfbffe803e3b69763f7128cd3d000080bfe083d73e9b3934be98c0b13fc8513a3e898879bf74a1043e4b9556bf3ff663beabe3febe000080bfe411cc3e93ff39be1071b33fc0058abbb6037fbfd252b33d48ea60bf25301cbdc2c0f3be000080bf31cdcc3e62a32cbe0c73ac3f31e40bbf8a8e21bf35f20cbfdac630bf4424363f404a05be000080bf5c76d83ed7342fbec748aa3f2457cdbeb32231bf51ae19bf8c814abf3092173fa4a81dbe000080bf446cf03ed6e419bee7c2b43f3ebec43edb7129bfd7c3243fa34d23bf86be31bf6a96aabe000080bfccb4013f89cfddbdbef9b33fea4f2c3f4c018cbd11843c3fb6d26bbea43077bf9386f73d000080bf7310083fa4de93bd9b8faf3f4ebc173f9c902b3f6bb7e43e5e26903e412a31bf73282a3f000080bf608f093f9eb791bd8578a83fd383253c54c1733f2b5e9cbe76c00b3fca53803eadaa4c3f000080bf9c69063f5dfab7bdb01fa63f6db6a3be70ec223fbeb233bf8841d83e1f47423f77c6fd3e000080bf7214043f6765fbbd9414a43f497ab6be255a2d3ef43a6bbf9e65753eb094773f0f8bae3d000080bff06dca3e758e21be83dfb83f8fc2a53efe0c3fbf5ce2143f56ac3abf00a716bf97ceb2be000080bf9606be3ead2f32befb06b63fd9f90cbe56557dbf3b622c3d280b64bffa4cd73df057e2be000080bfab5ab23e163031be0456b83f34213cbd28787fbfb8a138bdb21f64bf1e2e7b3d9635e6be000080bf1d04b53e01881bbe6d53b23fe19e1cbf7cc807bfc43a16bfd68b11bf5f874f3f52560fbe000080bf4293a43eb2bccbbd9bacb33f329fefbedb82cd3d0bc560bfa1cb93beecf26b3fbcb6843e000080bff2d3c03e6e3024bede91af3ff4fb29bf966709bf8f4505bff33c13bf1cc04f3f3c29d3bd000080bfc1cab13e07edd5bd51d4b13f85d108bfd269283e5a3c54bfdf413dbe2a356f3f26e99b3e000080bf5551bc3e0ef3e5bd471daf3f38921cbf002b503ec2bc43bfd91e19be88576b3f7f62ba3e000080bf2062cb3eb475f0bdad35ac3f479a12bf1b22873e19b146bfbbb441be09f0603f0672e03e000080bf64b2d83e42edf7bddfdea93f7377ffbecc05853ed8a653bf88348fbeeecb5a3f45f0df3e000080bf5645e83ecc2600be368fa73f1793efbe3d93793ecd7859bf19f5d7bef478483f79fce93e000080bfbf0ae83ef6612dbea4dea73f14ba99be663430bf550e29bf969b57bfeb2c043f84f11ebe000080bf89b4e53ebdc533bec1e1af3faee3f93db42b7abf8bc2313ed22454bfd24749beee2806bf000080bfb130f43edcd731be931aae3fed52313e1b5e79bf68f2143eb73f52bf87b765bec04906bf000080bf166dfe3ef46b1bbe90a2b23feb73e33ed2901fbfddbe243f66751bbf70d43cbf8f2797be000080bf5b9a073ff54ad9bdccd2b03fdf43373ff50103bccebb323f64412dbecadc78bf553f263e000080bf32e3053f65a519be1669b03f58cc0b3f768012bf9a9e1c3f880f0bbf35404cbf98dc85be000080bf2aac003f2a132ebe4413ac3f96a5813e0ab176bf49c2ae3dd70e58bff3bc86be4f4defbe000080bfbf9ef73ef0522abece52a63f6093f6bd5b023cbf28fe2abfc93b63bfc709c33e478784be000080bfb570f93e06b800bebc40a53fac36bebea862443e368d68bf0d350fbfcb113c3fb18bc43e000080bf34a00e3f6abd9fbdd3c0ab3fa4e61c3ff0cc2f3f661fc83ea255a33e29e82abf82362c3f000080bf514b0f3fdae5dbbdefe5ac3f0acb3e3f5702913dbbb8293fddf932bd66ad7cbffd3d1e3e000080bf91f00d3f3f7015bef4c3ac3fc348243f7d8a14bf2162003f615af7bebe4e50bf8e81a5be000080bfea5d083fbe1c26be1d21a93f105a9d3e429373bf18c184bc2cc85fbfdf138dbe37c3ccbe000080bfc39d033f091722beb2f1a43fc4c22cbd688035bf6c3634bf1b4371bf963b863e759054be000080bf7214043f6765fbbd9414a43f497ab6be255a2d3ef43a6bbf608624bf8a5f2b3f6dc6be3e000080bf3066133f6c04a2bd3641a83fd507e83e73d74f3f1e73bc3ee1e9d93e6f530fbfabfe353f000080bf06d80f3f24289ebde0b9a53fd22225be1060713f884295beadf3f63ed87faa3efb6a4f3f000080bf34860d3fc0d0c3bdf5bea33f5c08f7bea472153ff52a27bf5247a83edfcb4f3fce33f73e000080bf08e6143f6746bfbd4f1ea03f89e431bfd603003fe34b04bf8932493decfd3f3fa8de283f000080bf906c163f68eba0bd6045a23fa0b6ebbe68305c3f69f260be8d6bb63e48b5cf3e8a7a573f000080bf6397143f3e41e2bdd0289f3f60a839bf2d52983d403a2fbf6ee951be31fd6c3f97b4a23e000080bf1f2f0c3fd909efbdf08aa23fd7cf04bf64222e3efb7a56bf06f0503e66f0793f1b16933d000080bff390153f8524d3bd971aa93f50a83f3ffe011e3ef70d253fe3fbca3d19d77cbf1764f83d000080bff774193f17d497bd1761a43f70810a3e688a653f4bdad73e96cd073fc68dd9be89c73b3f000080bf7a91153fd61a0abea567a83fd252353f340610bf594fda3e2593ebbecb7553bfbdb1a6be000080bf20611c3fac3cc1bd8509a53fa8ea2b3f2db3463ed610373f562b303e62c47abf627cd53d000080bf309b1c3f7fa6febd656ea43f138e2c3f90d300bfa06f0a3f8f23b2be50af5cbf4cb0bcbe000080bf7e1d103f528018bed47ea53fa60d8b3ef96075bf2252b1bdff8c65bfc59960be23dfc4be000080bf12680c3f18f012beb30aa33fdcd25ebe29962bbf4ea235bf4c0173bf2806a13e3ae2c3bb000080bfd5ae153ff9660bbe25769f3fb16bdcbefd5c33bf71aa11bf9f104dbf404c163f8b52efbd000080bf1f2f0c3fd909efbdf08aa23fd7cf04bf64222e3efb7a56bfd4cc1abf61a91e3f690f003f000080bf6397143f3e41e2bdd0289f3f60a839bf2d52983d403a2fbf26d3c6bef4d8463f75dffd3e000080bff81b193fea3e10bea2b2a13f9aca683ee07478bfa9a1a33d141246bfd2596bbede2217bf000080bf2a90213f4ad40bbedee49d3f335e973e6c1f6dbf605b6f3e6f8d19bf53a8bdbe239035bf000080bf309d1e3f033f0abed42b9b3fa72703bf8afe48bf422ab2bed06522bfe67d1e3f5902edbe000080bffe7b1c3fa720dfbd5e9e9a3f703945bf0afb28beb3a61dbfe9c9a4be6f396f3f1fe41b3e000080bf2fde233f8c66e5bd2523a13f4f48333f64d6b3be12161f3ff3d433bea6b76dbffa64a7be000080bf6743223f6c239ebd74efa13f78680f3f93dbcf3e2dd9383f41bea13e521669bf529e883e000080bfb5c01e3f34d67ebdac6fa03f6c9919be47a6633f4a3edd3e159a0b3f218f94be0052493f000080bfe0bd1b3f488892bd1c0b9e3f5a3757bf2658083fea82c8bd560d3d3e495ae73e366e5f3f000080bfcf4d1b3fd463bbbd6f659b3f041960bfd5b2da3d3867f1be1d8c6dbe6e4c433fde7d1a3f000080bffe7b1c3fa720dfbd5e9e9a3f703945bf0afb28beb3a61dbfdf96edbec8b84e3f8770ba3e000080bf2062cb3eb475f0bdad35ac3f479a12bf1b22873e19b146bf12454b3ef095763fc06e393e000080bf64b2d83e42edf7bddfdea93f7377ffbecc05853ed8a653bf7840643e96db753f5e4a2b3e000080bf5645e83ecc2600be368fa73f1793efbe3d93793ecd7859bf7e9f7a3ec698753feacd0f3e000080bf00000000e21b2a3e949aad3f000000005d287e3f7342f53d0000803fa44049b7d48dd038000080bfe48148bdf035243e56bcad3fb3fa6dbef2f0773f60b2b63da4f0783f71086b3e4196293d000080bf000000007c67243ecad2b13f00000000c58c7b3f161a3e3e0000803f900ccdb70daa0739000080bf541946bd4b21203e64f1b13f0e4a32beef3a7a3fa482f43dec057c3f08122e3e3aff333d000080bf0d8ac6bde0f70f3e928ab23fb08ae5beb0d4643fba0b983af6fc633f98a3e43e50cfb03d000080bf5471c3bd2a52113e36adb63f3c92b8bed6626e3f53625dbdf1496d3f596cba3e7d2dba3d000080bfda1615be1e2fe43d270cb83fff063ebf973e253f072b38be4823223fff74433f8a3c013e000080bf5e9937bd965b1a3eca8dba3f08086ebb44a57e3f8b42d23d57f17f3f0e07c13a3adcac3c000080bf7e6f33be3445803daa75ba3fbeac5cbf999b003fc3418abd1515fa3e14dd5b3fd6051e3e000080bfff1f37bec498743db2b8b53fd1a65abfb8e5043f74c101bd4eaa023f412d593ffe0b103e000080bfb7d411be2020df3d5fd3b33f453a38bf30c4303fb4a195bdbba92e3f5d05393f1eb8e13d000080bfbcc90fbebc06dd3d7861af3f43093abf15372f3f19a470bd6ece2d3fbd863a3fa616b93d000080bfc73433be7995753d9fd3b03f34975ebfa647f83e8872c0bda6aaf23ead655f3f7a0ef13d000080bf450dc6bdbccc103e454bae3f9197fbbe17ef5e3f74025c3cdb825e3fe78dfa3e986b913d000080bf00000000bde0133d50c8d63f00000000eee17b3fe9ea363e0000803f66482fb7855e7138000080bf000000009013263d91ced43f0000000012cc6a3fc205cc3e0000803fe0fedcb797547e38000080bf0950d33cfe08033d0c38d73f62728d3efaa1703f3c234d3e5fbf753f7e0085be25edd6bd000080bf2fdffabc2577183d73f6d43f0e768fbe45415e3f09b3d13e92bb753f73117f3e19c5033e000080bf0950d3bcfe08033d0c38d73f5c718dbe34a2703fc1214d3e69bf753f95fe843e09fdd63d000080bfb22c58bda5f78d3c04e8d73f7fee1bbf4277473f8582173e5a5f483f657c0f3f758b8a3e000080bfadc391bd70b1a2bbd094d93f281357bff2bd063fd811063e1ab0063f53723b3fb970dd3e000080bf09769cbd963fdfbb93e3d63fd61d06bf56082b3fd543073f6fff593f6db7d93eea019d3e000080bffabaacbd38e033bd912cdc3fadf857bf1f26a93ebdb2d83ebbad083fb27c193fe9a1183f000080bfae9c5dbef3748ebd7bc0d63f07dea8be6b22553dd54e713f6a1258bf0eaedc3eab63a3be000080bf501f71be358102be0a18d33f072fe3be045217bf42702c3fd85d65bfa7019e3e8287a3be000080bfe90b81be25e699bd8f04d43f324a1dbfbaa180bdc856493f241737bf4a35ee3ea28505bf000080bf7d4785beee830cbeb4ddce3f236010bf88de2ebf7a97ed3e6acc51bf65a4c93e5720d5be000080bfc44162be2ded24be1e89cb3f271d80be48d475bf1b12fd3d6fcb71bfc0305b3e14247fbe000080bf8a8f6fbe06d621be6c5ec73fa0d9113ec0627dbf08febb3b17ca6bbff5e309bee817bbbe000080bfd3508bbe98a713beb2a6ca3fb35705bf8b8c43bf821ac33eefa952bf4b46a93e2596ecbe000080bf0a6d91be57d2aabda407d03f7baf50bf50c206be6a66103fa95605bfa4b1173fd74e1dbf000080bfa05398bed82cb7bd086fcb3f5a296abf14ea15bec6dec03e7a63bbbe1406323fb0511ebf000080bf66a47ebe899bb3bd10aeba3fef30343f4f5a073eebaa32bff49019bea8c76ebf3fe2a7be000080bfb36c66be89d90bbe88fdbe3f0357453f62bbdebea43feebe6ed6e8be322963bf32119c3d000080bfbfb67ebe49490fbeada6bb3f299f1e3ff470f9be1c8b1dbf1ff70fbf609052bfebf3ad3d000080bfdd0c8fbec44112becb9cb83fa3600a3f8fb404bf45a329bff3e61bbf84d548bf5f7eef3d000080bf378e68be91d2acbdc765be3f871d553f44f2063e4ec409bf4abc5ebd367a72bf7ad3a1be000080bf71c159bed8460cbed84cc23f35a225bde78c56bfe0450bbfb0a7f8be2030ebbe2a653e3f000080bf800f5ebe1458a0bd7021c13fd0619bbe9b798b3ec1be69bf964a03be8f1276bf02067abe000080bf527c7cbe946829be936ec33f8232a03ebc1973bffa42973c62a162bf7bae91be7459bc3e000080bfc28a8bbeb1e02ebe8eccbf3ff02a483eabfb79bff8f2b9bdcc0966bf3b985cbe77b9c33e000080bf8a8f6fbe06d621be6c5ec73fa0d9113ec0627dbf08febb3bb03561bf7ad0fdbd2d08eb3e000080bf6c3d9bbef5822fbe77f7bc3fd8111b3ef11c7cbf08d2adbdbd4167bf28e330be3701c93e000080bf0f9aa5be9c6932be10e6ba3fe8518f3d5b637ebf9432b3bd32e469bf7edfcabd5ddec93e000080bfc18ca9be725022bea340c13ffb3ee8be6ed641bf18a7f03eae7746bfa76a183f59fe573e000080bf2a8f9ebee4a11fbec808c43f5d5ac7be41a03fbfa367093fa5684abf1b0f123f2574633e000080bf7f2e92bef2eb17be4469c73f5957f0bea7403ebf781ff43e989747bf93321a3fca5d2f3e000080bfd3508bbe98a713beb2a6ca3fb35705bf8b8c43bf821ac33e699044bfbb421d3f3f3b3a3e000080bf6ac0a8be0dfdd3bddbddc53f0baf27bf07e3b0bd7d2b403f4a01c9be8742633f783176be000080bfaed79cbead89c5bd795ac83f69a64cbf9cf905bebf1b163f5d0bb2be048b653fe84c8cbe000080bfa05398bed82cb7bd086fcb3f5a296abf14ea15bec6dec03e513d87be54096c3f3beb90be000080bff8a4b3bee6ca20bea740be3f261207bf038b3dbf6237d53eeea23dbf6716243fc6e24d3e000080bf9869b3bea20de0bde580c33f644a37bf9e52c5bd4d02313ffa43b5be425b673f5a7176be000080bf2c49bebe728a1ebec768bb3f7833e2beeb2c3dbffe37023f163d3ebff87c1e3ff206823e000080bf085bbcbe1212e9bd81b1c03f50f03cbfd3f90fbe0ff2283fa2e5b1be0fe86a3f05b645be000080bf266fc8be33faf1bd096dbd3f5d9824bfdcda42bebbec3d3f980ec9bedcdd693f9a18d9bd000080bfa320b8be70b679bd0e30bf3fe3e027bf561a063f642c0b3f261acf3db849463f24d61fbf000080bfef1dadbeca5356bda393c13f92702dbf2c5a0f3fa12bf43ef252223e8e8a3e3ffd1426bf000080bfecc0a1bebb7f2cbd5321c43f18f039bfa0af0f3f4626cb3e174e3e3ec652373f473c2cbf000080bf375399be93a902bdf8fcc63f684651bf8c2f083f7c0a623ec81f833ee8d42d3f1b2030bf000080bf8f6c96be4182e2bcf810ca3fba725dbfeb1aed3e86aa453e43f2653e6990333fa82b2dbf000080bfe3df87bedb89923adaafc33f59c248bed3ae713f88bd87be425c1d3ff317bdbd6d8948bf000080bf3c2e92bea1bc0fbcc1aac03f4c124ebeba62753f5a9a4ebe85ab0e3f16e66abd1f0d54bf000080bf1efe7abeb1f9383c0e7ec63f3f96acbef748623f36f2a5be0c1d043ff867eabd484f59bf000080bfa9849fbe4cfea7bce23dbd3f976b61beed13763fa9fa29be6d1c043fd3d7f2bc71255bbf000080bff06bacbecfa3e2bc96eaba3f0fc37abeed06783f758116bd35a2e53e1705a33d17e663bf000080bfe8a291bead152dbde718ba3fe2d6da3e2872253f14d621bf0aa8e23e476242bf8e31f4be000080bf082283bebe831fbdf949bd3f49a4023fa090163fd89e20bf37bfd43e44b14ebf5077d6be000080bfdf0374be90be09bd92e6bf3f50aa1c3f08ae093f387214bf1713c13ee5c857bf1e81c4be000080bf580364be48dce3bc683ec33fa0d2abbda41bdf3ec76965bfe3367e3e2ea05cbf3b76e2be000080bfbaf8c3be734b8bbdd498bc3fe2b414bfeb04fd3e3595253f23f3d43ca3334e3f2a9117bf000080bfde8fd3be7ff8f9bd033ebb3fba12f5bead5a76be6f2a583fea2fdfbe8962663fc668183c000080bff06dcabe758e21be83dfb83f8fc2a5befe0c3fbf5ce2143fdcea40bfe137133fab0aa33e000080bf66a47ebe899bb3bd10aeba3fef30343f4f5a073eebaa32bf4385bd3dd9c07dbf7655c1bd000080bf378e68be91d2acbdc765be3f871d553f44f2063e4ec409bf0c232c3d19c87bbf5d0e34be000080bf800f5ebe1458a0bd7021c13fd0619bbe9b798b3ec1be69bf601bd33ddf7871bf9ca0a1be000080bf69388dbee7a7b8bdce8bb73fac2e203f0744fb3d593545bf0c9af03d77b97dbf97b07fbd000080bf698f97bec441c2bd5569b53fe2eb0d3f6362ab3dc8fa53bffd410c3eff937dbfd7ad09bc000080bfdba39fbe4d3232bd2e55b73f880aab3e9848323f609822bf72f0ef3eec1635bf307607bf000080bf4293a4beb2bccbbd9bacb33f329fef3edb82cd3d0bc560bf84774d3e57ca7abfd023a4bb000080bfd009d1beb6d88dbd9d82ba3f6217dcbe25a40b3fde30383f24b988bcb1bc4a3f1e411cbf000080bfef1eb8be555011bde4bbb83f47d295bed705743f6c629bbd8f33d43e8af9603d968d68bf000080bf228bacbe14b449bd4f76b53fb3e24e3e299c2e3f42ec33bf5798ea3ee13733bf16350cbf000080bf331ab9be5d3379bdf164b33fd2991e3ef2b3203f674a43bf65dee13ead1f3cbf45e003bf000080bfc1cab1be07edd5bd51d4b13f85d1083fd269283e5a3c54bf6645403e0dbf7abf4e0c96bd000080bfca10dfbeb071fdbdcce4b93f26cacabea2a191be68805f3f9e65e5be4cca633f076db13d000080bf4e7ad7beef1b1fbebe89b73f7bb9abbeb01f3bbf5525183f6c3834bf851a1d3fe307b73e000080bfe411ccbe93ff39be1071b33fc0058a3bb6037fbfd252b33dc8fd65bfee0f0e3d3227e03e000080bf90f2c3bed9b23cbdccb5b63f9e9a79beac96753f9fc911bebb68d03e644203bd25b069bf000080bff451debeb2a692bda54fb93f8896bcbeec790f3f83e43d3fbffecf3beea24c3f2ccf19bf000080bfe083d7be9b3934be98c0b13fc8513abe898879bf74a1043ef3ba5bbfcf07633e64ecec3e000080bf71ffe1bec8ce1bbed68eb63f14e7b8be087539bf7a50163f09f02ebf5b50223f1455b93e000080bf9928eabe6ce9f1bd14ccb83f3c4b04bffb995ebefefb533faea4bebefd926d3f375a383c000080bf5bcdeabe376e91bd8b6eb73fd7fed4be28ce233f316a253f43c3023e699f3e3f8eb827bf000080bff2b4ccbea12e52bda419b53f78ea14bef1f9743f04a280be11e9df3ec09429bed64862bf000080bff52ac2bea70399bdc7f1b13fcc4a6c3eed751e3f613040bf7c8dc33ee56a44bfc7e403bf000080bf60ccf6bee8f888bd6b0db53f5cdfd9bebb66323f3cca133f50ea4d3e4ddf313ff1c430bf000080bf446cf0bed6e419bee7c2b43f3ebec4bedb7129bfd7c3243f485b2abf038a2e3fb1929b3e000080bf145af6be5af6e4bddfc4b63f609a18bfa793f5bd203d4b3fc849a0be0cfb713f3106bdbd000080bfca5001bfffcd8bbd6495b23f207802bfe0bc323f13b6003f533f6e3e79a72c3f846233bf000080bfccb401bf89cfddbdc6f9b33fea4f2cbf4c018cbd11843c3f5bf284bea944743f5d5518be000080bfb01ddcbe321d7abdbf99b23f2fb3b33d3acc793f733b4dbe7b17db3e52db5fbef98160bf000080bfbe4cd4be69aaa7bd5307af3ff44ac63ebf14393f2c7612bfcb52c53e61d030bff6a51cbf000080bf7f2eeabe59a65fbd1d94b03f1ca3e33db1157d3f48c3cfbdcfe0e43e7d4910be672362bf000080bf4d6ae0be7d40a0bdb4e3ac3f7cbeca3e3176353fd46f15bff8bcc53ed48e34bfea2e18bf000080bf16fcf6be33e06cbdc808ae3f8900e23b49ee793f1b8a5dbe9257f73ecc4e45beb2a65abf000080bf560cefbe5af0a2bd07b6aa3f4d9aa93e60cc2f3f35a625bf54e8c03e259a39bf879813bf000080bf5645e8becc2600be3f8fa73f1793ef3e3d93793ecd7859bfb65d523ed80277bf099a27be000080bf5551bcbe0ef3e5bd471daf3f38921c3f002b503ec2bc43bf70a1183ec88d7abf316010be000080bf2062cbbeb475f0bdad35ac3f5f99123f4621873ee7b146bf08e1243e61eb76bf513456be000080bf64b2d8be42edf7bddfdea93f7377ff3ecc05853ed8a653bf65b23d3e02c476bf2eb343be000080bf166dfebef46b1bbe90a2b23feb73e3bed2901fbfddbe243f26c222bf46b5393f6e07873e000080bf89b4e5bebdc533bec1e1af3faee3f9bdb42b7abf8bc2313e5da559bfedca453e8dc4fa3e000080bfb130f4bedcd731be931aae3fed5231be1b5e79bf68f2143eedde57bf5a4b643e486dfa3e000080bfbf0ae8bef6612dbeaddea73f14ba993e663430bf550e29bf77315cbf9842fdbe0bf8fe3d000080bf5c76d8bed7342fbec748aa3f2457cd3eb32231bf51ae19bf78734fbfc0d512bf9537f53d000080bfbf9ef7bef0522abece52a63f6093f63d5b023cbf28fe2abf25c467bf37ebb6be4c236b3e000080bf5645e8becc2600be3f8fa73f1793ef3e3d93793ecd7859bf37afe7be907442bf3e32efbe000080bf64b2d8be42edf7bddfdea93f7377ff3ecc05853ed8a653bf70239fbe2c3e56bf3db1e6be000080bfb570f9be06b800bec440a53fac36be3ea862443e368d68bf79ec16bf350635bfece1c7be000080bf621404bf6765fbbd9414a43fd57db63ea8592d3e4a3a6bbfaa832bbf819f23bf595ac1be000080bf31cdccbe62a32cbe0c73ac3f31e40b3f8a8e21bf35f20cbf2f1b36bfcf5b32bfec92bd3d000080bf2062cbbeb475f0bdad35ac3f5f99123f4621873ee7b146bf16b660be72e45cbf901fe9be000080bff2d3c0be6e3024bede91af3fdafa293f4a6809bf3c4605bfe3f517bfb83f4dbf85698e3d000080bf9606bebead2f32befb06b63fd9f90c3e56557dbf3b622c3d3bc368bfb112e0bd92a6cd3e000080bf1d04b5be01881bbe6553b23fe19e1c3f7cc807bfc43a16bf3a1417bf57d04cbfe8e5dc3d000080bfab5ab2be163031be0456b83f34213c3d28787fbfb8a138bdaf1469bfe85677bda17ad13e000080bf5551bcbe0ef3e5bd471daf3f38921c3f002b503ec2bc43bfab6936be57fe67bfdb51c4be000080bfea41a9be5a9b16be1b49b43f9457033f9a4b07bf0a262dbffa781ebfdf0f46bfe5350a3e000080bf4293a4beb2bccbbd9bacb33f329fef3edb82cd3d0bc560bf229aa4bebdf767bf2bc38cbe000080bfc1cab1be07edd5bd51d4b13f85d1083fd269283e5a3c54bf5cb75dbe33e86bbf4410a5be000080bf698f97bec441c2bd5569b53fe2eb0d3f6362ab3dc8fa53bf85b496bec43169bf2e0894be000080bf98dd9bbe90f514bee082b63f583d003f701b0bbfc9732cbfb43720bff4d943bf675c1b3e000080bf69388dbee7a7b8bdce8bb73fac2e203f0744fb3d593545bfca4567bed2b06abf5eaea8be000080bf77d4d8bd4f5c0ebe692e953f2b1eabbedc945ebf6f42ba3e3af46fbfabacb13e060002bd000080bfde8ed0bdce741fbec6578f3fb93ea8beb16b67bf310e8c3ee1a471bf54fba53e932a80bd000080bfe7be5cbdc21510be1d72953f3282c23cb66d6cbf1bf7c33ea8d37fbf2adf05bd7f348abc000080bff7e51cbe1c61f1bd871a8f3f897240bf16aa1fbfc75a5b3e192926bf5dd8413f15d295bd000080bf00000000024908befe65953f00000000aa2d75bf284a933ea5d07ebf637ce2bc1481bcbd000080bf000000008c74ffbd300f9b3f00000000dac87cbfc2c9213ed0647ebf7bc290bcbc2de2bd000080bf0000000022c1f4bd4225a03f00000000def07fbfe801b0bc51c07dbffa383a3bca6507be000080bf2d1f49bd8ca924be3c2d8f3f8d62dd3d970e75bf685d893ef8fc7dbf2bc6f7bd57bc02bd000080bf0000000031d100be6dd1a43f00000000505f7bbf94d241be4ca87cbf75c0f93c39f421be000080bf00000000334e13be29248f3f00000000fb0f7abf8c435b3e892a7fbf1e768dbcf154a1bd000080bfb50ecebd6a4efe3d7ba4893fd476c8be4649693fdfa902be217f6b3fa225c83e1c46fdbc000080bf731008bfa4de93bda38faf3f4ebc17bf9c902b3f6bb7e43e02897a3eb3a12d3f4b6231bf000080bf5b9a07bff54ad9bdccd2b03fe34437bfaf0203bcc4ba323f13a349be232f763fdd7a43be000080bf323c02bf8d2782bd0037ab3febfc45bb1e93753fda9d90be5c99033f019176be7cc152bf000080bf9692fdbefcc5acbd4a5da83fcffd9d3ee6f7283ff6572fbffe0cc23e4eea3ebf14430cbf000080bf23a00ebf6abd9fbddbc0ab3fdde71cbf1bcc2f3f731ec83efa17903e04e6263f114034bf000080bf514b0fbfdae5dbbdefe5ac3f0acb3ebf5702913dbbb8293f2e159cbd6a917a3fbcc542be000080bf608f09bf9eb791bd8578a83fd38325bc54c1733f2b5e9cbe445c013f737384be4ec052bf000080bf9c6906bf5dfab7bdb01fa63f6db6a33e70ec223fbeb233bfc7adc53e649943bf195104bf000080bf621404bf6765fbbd9414a43fd57db63ea8592d3e4a3a6bbfb52b493e599c79bf63d4d3bd000080bf34860dbfc0d0c3bdf5bea33f5c08f73ea472153ff52a27bf171c943eb2544fbfdba202bf000080bf06d80fbf24289ebde0b9a53fd222253e1060713f884295bea22ee23e428daabe523f55bf000080bf08e614bf6746bfbd4f1ea03f89e4313fd603003fe34b04bf9960a93cd1733bbfc8442ebf000080bf306613bf6c04a2bd3641a83fd507e8be73d74f3f1e73bc3e0ffdc33e9cd50c3f2fff3dbf000080bff39015bf8524d3bd971aa93f50a83fbffe011e3ef70d253f8135863dcb287c3f3d7923be000080bf906c16bf68eba0bd6045a23fa0b6eb3e68305c3f69f260be054aa83e5441cabe5d9c5bbf000080bff77419bf17d497bd1761a43f70810abe688a653f4bdad73e04bcfc3ec41ddc3e1f8841bf000080bfe0bd1bbf488892bd130b9e3f5a37573f2658083fea82c8bd5fa52e3e7d30ddbe5bb662bf000080bfb5c01ebf34d67ebdac6fa03f6c99193e47a6633f4a3edd3e11d2043f1c3d9a3e77cf4cbf000080bfb570f9be06b800bec440a53fac36be3ea862443e368d68bf66ad583e385d78bf863ff2bd000080bf1f2f0cbfd909efbdf08aa23fd7cf043f64222e3efb7a56bf5dfd1c3e028e7bbf7c0bd6bd000080bf639714bf3e41e2bdd0289f3f60a8393f2d52983d403a2fbf8a3d73bee6f467bf9b44b3be000080bfcf4d1bbfd463bbbd6f659b3f0419603fd5b2da3d3867f1bec7af7dbe29083dbf439020bf000080bf20611cbfac3cc1bd8509a53fa8ea2bbf2db3463ed610373fd447133e081b7b3f583d06be000080bf7a9115bfd61a0abea567a83fd25235bf340610bf594fda3ec3caf7be5fa4533f34e1923e000080bf91f00dbf3f7015bef4c3ac3fc34824bf7d8a14bf2162003ffc5703bf25934f3f2030903e000080bf674322bf6c239ebd74efa13f78680fbf93dbcf3e2dd9383fd72f943e0ea4693f17c293be000080bf309b1cbf7fa6febd656ea43f138e2cbf90d300bfa06f0a3f4413bfbeab1e5d3fa55fad3e000080bf7e1d10bf528018bed47ea53f020a8bbe7c6175bf8152b1bd8c3269bf2167683e7566b03e000080bfea5d08bfbe1c26be2521a93f105a9dbe429373bf18c184bc6ab063bf39f28f3ea689b83e000080bf2fde23bf8c66e5bd2523a13f4f4833bf64d6b3be12161f3fbede4cbe15a86e3f01599a3e000080bf2a9021bf4ad40bbedee49d3f335e97be6c1f6dbf605b6f3e4f0821bf4bedbe3e179e2e3f000080bf32e305bf65a519be2069b03f58cc0bbf768012bf9a9e1c3f8c7c12bf73c7493f47f6673e000080bf2aac00bf2a132ebe4413ac3f96a581be0ab176bf49c2ae3d0f305dbf47a7873eb831db3e000080bfc39d03bf091722beb2f1a43fc4c22c3d688035bf6c3634bf4bad74bf3b846fbeff96363e000080bf12680cbf18f012beb30aa33fdcd25e3e29962bbf4ea235bfd95575bf4dac91be9aedcdbc000080bf1f2f0cbfd909efbdf08aa23fd7cf043f64222e3efb7a56bfd8fd20bf168416bfa43d02bf000080bfd5ae15bff9660bbe25769f3fb16bdc3efd5c33bf71aa11bfa12252bf9aea10bf369f9b3d000080bf639714bf3e41e2bdd0289f3f60a8393f2d52983d403a2fbf9d7ed2be9e2c40bfbf6404bf000080bffe7b1cbfa720dfbd5e9e9a3f7039453f0afb28beb3a61dbf4729b1befa646bbfe9f33ebe000080bf309d1ebf033f0abed42b9b3fa727033f8afe48bf422ab2be63132abf7a7d1ebfb164d63e000080bff81b19bfea3e10bea2b2a13f9aca68bee07478bfa9a1a33d13b24cbf51746e3ef2b50d3f000080bf000000005c4424be0e52b23f00000000209c6cbf6277c3be59a87cbfb9dc7b3d307018be000080bffe7b1cbfa720dfbd5e9e9a3f7039453f0afb28beb3a61dbf6dcaf5be762849bf73aec7be000080bf037caf3ea5bfb73d703ef53c57302b3fb392453e8dd2373f2060ee3ef2935cbf3ee84ebe000080bffbcbae3e9d9fe23deb1ed93cb328453fe5418b3ef9b3133f69d7f93e497155bf464284be000080bff833ac3e982fcf3daa0f243de9c6df3e122b693ed3c05e3fd595163f3ae14dbf0219aebd000080bfe3fdb03e1475c63d96b0b63c67f84b3fdffa713ea4610e3f76b9f63e16c74dbf3496b2be000080bf02b8b13e6c3ff93d471e883c1a9c303fcee71a3f7a76cb3ef0a7313fbf8435bfc71500be000080bf5918b23e9ed2a13d89d3093dba0aab3e4212153eb6656e3f72691a3f54cf4abf2381bdbd000080bf85cfae3eaa9a003e0ccc8a3c1f66a83ee294633f0422a33eb2f6703fddfcabbe21eb0cbd000080bf1284ab3ec98ff83d6c5ed53c70123b3fb805863e1766213f7981ec3e019f5ebf258832be000080bffe5fad3eb14f003e321f903c0c753c3f5746113f06d7bc3ea4ab273f7d123cbf042c35be000080bf0988b13e5beff73d0f7ee23b22980f3f4f321b3f1a5410bfbfc3193f834444bfd04168be000080bf01e0a83eb8afe33df92f103dbd57e93e039a803e809b5a3feab4123fd11e51bfb64c86bd000080bfff1faf3ea3af103e4777903c0144633f1144ed3d1618e43e11c15c3e3eb275bf335438be000080bf0cb0af3eca6f113ea73c3a3c68e1733fed72513e415b66be54104b3e1a967abf32b74dbd000080bf0280ab3e9c4f1d3eb7cfaa3c79a1083f06003b3f452ada3e69f7443f6fe820bf9b14e93d000080bff9bba73ee8880c3e25ea053d78ee153fbdf6a43e25673e3fefe10c3fafed54bfbf9395bd000080bf2827a23e8849183e2732f33c9a57dd3e2757c43e55ed503fa544233f781545bfa6d9c33c000080bfff77a43e7affff3d96cf323d7b9ea43e86bb663e9f716b3f2fc41d3f6d8649bf0efdb8bc000080bff59d9f3e83f90b3ee333193de8d9833e252e963e75b16b3fffa32d3f9dc53bbfc90f343d000080bf2639983e60b1163e313f373dbda4733db78fd33e18a0683f8205363fb30e28bf7802813e000080bf03d0903e917fe63d060f533d0c22183d2b5e9c3e5a95733f3d7b3c3f22f426bfe6eb383e000080bfaf3f913ee128193e3be2103d248199bc10d2a03e0aff723fce564a3f16a713bfe46a533e000080bf19ad9b3e0dfa223eb7990a3d09e35a3efccae03efc665f3f88db2e3f05b134bf274f403e000080bfd732a13e9ab2333ef279c53c3c83da3ec6163e3ff827043fbdea4a3f25fb14bf56223a3e000080bf0f28ab3e9a5f1d3e193d373c2907d83e146d503f0c3bccbec7be603f1d19f4bedc2836bd000080bf4e64ae3e79570d3e6536c83b7dba2c3fe472b6bdba903bbf34f01d3e2d2974bffe18843e000080bf05c2a63eb94f1e3e0c1ea63caab23e3e45b56c3f5d16aa3ebd09753f59f27cbe2b951a3e000080bffc6fa53e982f1f3eda1fa83c5fc7493fe827ed3e7077cf3ee3290b3f092a55bf3139d8bd000080bfbe6aa53e64eb293e7025bb3c57e5553f670e9c3eb30fea3e87ed9d3e26e172bf70e98c3d000080bfafd2a53e46eb283edec7513c42f0693f419d803ea061a3bec80cbe3e79dd55bfa389cf3e000080bf0630a53e982f1f3e7bbf513c0cc8303fcdcaef3ea2190dbfbc0b093f61e857bfde283cbd000080bf0aa2a63ea9bf1e3ea1bf503cb053e53d10106d3f208fb8be8d9e7b3ff25c20be4fa0c6bd000080bf6b63a43ea7af173eaf7ac03bc05190be7112c63eb8c460bf0ecd6a3f60ca23be60d8babe000080bf0e30a33ec0cf183e5c3e123c8101283c69fb633e948f79bf7e0f183f131e49bf555431be000080bfffcfa93ecbd7153eab798e3b17ea2f3ee441a73eb4ec6dbfbfc33f3f52f227bf70afbcbd000080bf4e42a13e514e343e1b472c3cb30eda3e764e4a3fbc92e1bed09e673f1f63bfbea906513e000080bffd9fa33ed7a3203ef17edc3b851c1f3f4313c1bd361747bf6b4bfd3ee5f538bf1246f73e000080bf02469f3e5a642b3e1d3e693bc201093ef18d8f3e325573bf4bab773fc3b07abe6e00833d000080bf3f8c983e8122363ee7fb293c22f2acbe6fa8453fa8cd09bffcd8613fe705eb3eafa5d63d000080bfa9a5993e1e50363ee63eb93ca85b78be3a19623ff386cd3e0155623f78e1fc3c7db9ee3e000080bf82c7973ecea72e3e103e143cc6dab8be0dfa843e744965bf766c653f2374b93eeb2f83be000080bf027e953ea31f2d3ec53b403c8d82333dba225e3ee8a679bff49d753f8aa2863e9619d03d000080bfff3f963ee6af303e5abb6d3c10d1973d0f286e3f87edb7bee8b57e3fa1c336bd6fd5b73d000080bf1134963eb94f2e3ea65eb73cf0b1853d55815e3fb1fbfa3e9a7e343fc68ec6bed5fd173f000080bf3f01943ee738273e5d89003d8b32213ef6f2b23eef716c3f2c233a3fc6842cbf323c063e000080bf0a10953e96af3b3e7d047e3c06df543feec1043fdada4bbe624d0b3fed3c30bf4187f53e000080bf0070943ea86f393e1d1ec23cf35d4e3fef35c83e2866e33e8890c73e3f656abf0b1cca3d000080bf0fee8e3ebf7f433e211ff43cc742393eaac6363f8c282d3fb0ec2a3fc91918bf80a9e53e000080bff86b8a3eae9f2e3e868f083dda11d8bdd0f9b63e4b906d3f74dd3e3f37ce16bf5f8d9f3e000080bf008c873eb9371f3e1ccf273db2d2ffbdb7119e3eae62713f63d1513f03e400bfabfe8b3e000080bf0f60813ec45f333e251fbb3c9b7a3fbf1f87ea3e57eff53e2bee063f7a5df5bc426b593f000080bf1780863ea5db423e0611a93c41bcffbe3df7433f61afcf3ec652193fbff207bdc0d44c3f000080bf1f307f3e9fe72f3e923e2d3c2e4963bf1ed6933e8772b7be56be4bbe1e22ec3e0f5d5d3f000080bf08007e3eb37b223e5c1fd63c2e9355bf4bce9d3e830fea3ed20ef73e0025e73b9837603f000080bffe7f7c3ed00f233e9b3d503c83ab60bfa01a283eac97e6be45fdbcbe2a6bbc3e9f795a3f000080bf63b8823e8d9b1a3e153c053c20fb74be07e37dbd140f78bf5f0c52bf8fe80b3fa6a42b3e000080bfe603823eaf0bff3d431b403d703a51be46d2b73ed222693fe3ae4d3f2f9df0be7427bb3e000080bff777763e997f043ea4fefa3c2afe56bff48dbb3e1722cd3eadbbd23e824d53bdc7ef683f000080bf0a6c7e3ed2fc013ed47fd63ba04247bef6610b3e50ad78bfcfc455bfca42fe3e908b723e000080bfee77783ee6afb03dc827843d3e52a8be9f4ebc3e10af5e3f01ab493f706ecdbe7f4bef3e000080bf05178b3e2ee7f23d334f2e3d286254bdc441b03e5dfc6f3f74204a3f5e860fbfe68a7f3e000080bff5838a3ede8f9b3de4878a3de422e83d7eaacd3ec1a2683f8b0e4b3fe15e16bfc290243e000080bfb668993eeee8df3df9812b3d56b2253e2a6b5a3e83a7763f8c63353f836634bfd195173d000080bff88a963ec39f813d7847863d6dbfdc3e4586913e68395b3f6ba1243fac3443bfb0c690bd000080bf01fa9d3e7a17cf3d9ecf403d059a4a3e956a703e93a2733ff58c2a3f9a903ebf5ae2383d000080bf04c9a33e863fc33d3c6f233d3e4aaa3ecde10f3e1ebb6e3fd3d6163f32944dbf5d94b6bd000080bf014ca13e357f4c3dd28e5b3d20b4183f0ea2a33dd8724c3fa835e93ed25c5abf367e82be000080bf1380a73eb1bfac3df44f303dcceaa73ea4d3d53df65b703f0f0c153f0b164ebf752ae9bd000080bffca7ab3e986f9d3d3bdf0f3dd24f183fda8323bc76be4d3fdd4ddb3e509857bf73b4a7be000080bf69c77d3e2d96223de9d4b53d2723e7bd3568173f03654c3fa8324d3f5561d7be628ed93e000080bf94bd653e71cb473d3b1a873dc55623bf1e34f23ea4881b3fe33c253f752ed0bdb5ca413f000080bf83689d3e001f3c3c7b16843d092f403ff0a3f23dab60263f1d5fc73e53c35fbf7bb694be000080bf7c26ab3ef48a273d6e6a203d50bc273f24528ebda292403f9c98af3e35205cbf989ec1be000080bf029cae3ee97f793d868f083db40d143f81c3e6bc62b8503f98c1db3e91e256bf03bbaabe000080bf11acb23e86ff743d711ece3cca085f3f942a4bbed3e2e53eb97bc83d1f7a53bf53130ebf000080bfa9d8b03e47050e3df67ccd3ca627703ffae982be953b6f3ef3d195bd5d3b4ebfeb8216bf000080bfde38a93e0c7382bbd7f80c3d0b67663f87bec3beb45a563ecc3357bedf264dbf115e0fbf000080bf174aae3e211e093d9b8d953b1de0053f960360be4ae552bf99a137bf599122bfd7cb92be000080bfa31fb53e4b74963d745fce3ccb76623f7c6a56bea552d53e6d6d623ddf1157bf08220abf000080bf4eb5b63e0472a93d81cea43c1da1673f2582ad3de0aad53e61e7853e2e4b62bfa770c6be000080bf11c8b53ee21f963d213c5a3cac28693f19e6b4be7aca5abe3e2ed3be433641bf139902bf000080bf1a50b73ec633a83d919d373c79d2763ff3d13abeff5145be4f9381bef5be59bfbe02ecbe000080bf8865b33ef696b23da81abd3c7866273f37d7db3e4e781f3f110c333f443428bf480590be000080bf4183b53e855fca3d027f783c3aae153fd7f23f3f49969e3ef5514f3fb45504bf20038ebe000080bfb5fab23e452dcd3d7ee2803cd269233ebfc66c3f14aeb03e98f5733f787c59bd74c698be000080bf0778b23edf4fcd3df73d6a3c77c9623f6f97e53eaa63f3bd374dc73e3a9f5bbf37b8abbe000080bf9208b53ec1e4c63d6c09f93b2810f13eea56293f9d7015bfa363053fbe103ebff493d7be000080bf2c9cb43ecfbae63daed7743c6ed56a3f3153ec3dd41ac33e63ae3e3e516578bfd0241ebe000080bffcdfb13e758fcc3d643d353cab9a183f4414033fbb521ebf7ebd923ec0ef5abfbe15ddbe000080bf27bcb43ea22ae63d9ab0fd3bd37f633f75d2833ddc73e8be1627473d2d6c7fbf27933dbd000080bff547b03eeb6fc93d3e3f0c3c23400b3f5a4214bd569d56bf536801becbbf7dbfad9020bd000080bf02a0b23e5a0fdf3dbf7cb23bfa9ef13ed43267bea02c5abf3c4f91bd7d2679bfdaca5f3e000080bffab3af3e8ae7ec3d2ffc603b7b52c33dd5d10a3e77757cbf5765033f4c045bbf11348bbd000080bf7c9bae3ea6ba003ebc96103c6fa10a3e614a623f6b26e5be00f3603fe3b2a1bed245b7be000080bf06bcac3ec4aff83d917bba3b896180be98eada3eb2565ebf9fef4c3f4e64d3becb66debe000080bffc6fad3ea0a7013e8bfe503c9ef0673feaf1a63e9b298abe7c3f4c3e372a64bf6383d0be000080bf1100ac3eb14f003e973c1e3c8a401b3f8b43d83d54bf49bff782afbb71967dbf49230cbe000080bffd83b03eecc1c43dc4d0ea3b0c7244bebbd2f93e58fe59bf95b7333f01c109bf0cd8eebe000080bfae65b23ee082cc3dd90a1a3ccae223bd8d25633fa13febbeef403d3fbbee90beeb6b1cbf000080bf78edb23e842bc03db27f9e3b93826c3ce16abc3ea5016ebfe683a63ed98761bfa4f4afbe000080bf0b0bb63efc51b43d31b5a53bb39f103f3e00cbbb783a53bf0e5522beb56e7bbf5530cfbd000080bf242bb73e25e6b93d8d9c053c92cb613fd6e2323e7c13e0bebaf064bba8216dbfc4e9c0be000080bff4a5b73ecdb1bc3db058433ce8a2773f7bdd803e0043f9bc2fda5c3eac4b61bfd69ad8be000080bf0a10b53e6150a63df437a13b196bf03e2da372becaba59bf628523bf269641bfb06311be000080bf0090b33ee1979a3d187ac43bcd637a3eaad6aabea21169bf715257bf9a470abf8bdbe4bc000080bf12f8b33ec05b803d863d6d3c223e703f3cda83be02bc6bbe0378b0bea6fd3dbf522713bf000080bf00adb13e9f5b883dee79fe3bc2d5ca3e345101be02d268bfb99d40bfdec21cbfde8b78be000080bf0de3a63ec4ed50bb0ea2353cde830e3fdb36dcbe6df035bf55894ebfafb4f7be1aa8adbe000080bf56d59b3e33e117bdf8fb453d8715513f6d8811bf7163ca3d6b3feabecf0c3ebf5a97fabe000080bf999c9a3e5b971abdd0647f3cafd3143f8a9ee5bef5cb2dbfead944bf685913bf0e768ebe000080bf9ab0953e44fc03bd6538be3d68a35f3f1a520cbeac17ef3e1ee01e3b585375bf034d92be000080bf32218e3e817792bd13f4573d82df543f56b00dbf23e3403d7d82febebc7f47bfbb5ec3be000080bf62d78e3e45668ebd1c28703cd861193f69c6c8be29b232bff8702fbf90b333bf7a8b46be000080bf0aa18b3ed02792bdddb5c43d3d25543ff72d02bfb5736f3e1054e0be666f59bf97b196be000080bf13b67f3eff95f5bdaef5453dc95d1b3f52324bbfbea1263d1a1740bf24cf16bf478b99be000080bf07b3813e1ea9debd7f30703caae6153f4db600bfe4c822bfc37f49bf5c4e0abf6d6398be000080bfa110613e922107be64cb323d05729fbdfb387fbf4000e83aa3a872bf1878963d6dbb9ebe000080bf97e57b3eb77bd9bde198c53dc8761a3f75b141bf48fe803ec3b538bfd00a27bf41276dbe000080bfb088713ea241cabdca4b0e3e1e97253faff540bf50a4ed3df32f38bf9a5127bfed8370be000080bf64425c3e704be4bdfd4c0d3e84819fbda2187fbfd661003da69c76bf1377893d140485be000080bf20b8823e93539bbd622d0e3eab035a3f6374ffbeae82243e7dabe7becabf5abf45a582be000080bf30a0873ef7ae41bd920e0f3ee45e703f6ce255bd261eae3edce6c5bbc6a27dbfdfb40abe000080bf25eb603e5d35efbdbf9dc43d9bf294bd054279bf8e435d3e203a77bfcaaa6f3c32ad84be000080bfb22c483ef88cc4bde2210c3e6a7653bfa7dd0fbf57e230bdbf920abf2ef44f3f924d5ebe000080bfb875473ee6ebd2bdd3a2be3d346f57bf0d1c07bf9ce3eb3df2d708bff767483fa70fa3be000080bfd926453eaad7edbdc827243dddd24abf2d101bbf538296bd568a12bffa91473f062282be000080bf8181403e202a8dbd626d0c3e741a7ebf364233bd6122e8bd10e581bcfdb7783f6bf171be000080bf2107453eaab891bdbb09be3d99967ebfeb31b4bdccc2693d8918cebda52b743fdef490be000080bf29b13b3e8a77a0bd56802f3d672f7fbf4a83b7bc1fb29cbd65f827bcf1dd7c3f925e1fbe000080bf098b6a3ec976febd6e171a3cc759083e734036bf698430bf5da169bfd2a53b3e151bbbbe000080bf72364d3e5113ddbd12bd0c3c810108bf070eb5be361645bf2370ecbeb2fa613f0fbeb1bd000080bf06f7433edc0f98bd0b966a3ca45a36bf7e33f53d890a31bf683d943d5d1c7e3f0141c73d000080bf9b59833e42afbfbc6422153e2bb93b3f5f1e0d3f79c7cb3ecfb5173f1d1e4ebf77cbbe3c000080bf08e9893e3a3defbb2251e83dab251a3fb6f6f43ec69f233ffe2a213f8ce046bf7f993dbc000080bf5517703ee19b26bc9f1c153e6123d53de957713f993aa23e63ec5b3f9aa37bbe31e3e53e000080bfc37d743e9301a03b3066eb3d726294bd4155483f9c4c1e3f36ad513f033c9dbe151ff83e000080bf5645583eb91c2f3b1425c13dd86539bf8569183fd925b23e7841133fed1d793ec0ee473f000080bf0cc3573e9deb7bbc4e290f3e8b2707bf6408553fdcb92d3e30053f3f85dcb73e59830f3f000080bf8a58443e67981abd2f870d3e4ada6ebfc4f1b73e35c2a4bc7c3b5f3e7cdd1b3f3d43433f000080bf42438f3eb9fedd3c04c8b03d885ff73eb416bf3edbc04a3fb9682a3fac833ebf5bdb62bd000080bf450e413e9e2809bdacabc23d8c4378bf7efb733e4003573d98bc223e0c45e83e267c603f000080bf2107453eaab891bdbb09be3d99967ebfeb31b4bdccc2693da20149bb647f113fc9a1523f000080bf8181403e202a8dbd626d0c3e741a7ebf364233bd6122e8bdf3d1e7bd77102c3fdf523b3f000080bf29b13b3e8a77a0bd56802f3d672f7fbf4a83b7bc1fb29cbd0d9da2bd07fbba3e25736d3f000080bfb6f4483e817908bd501b553d43816ebf055e903e2fa36abec40df0bdee34ba3eff926c3f000080bf1421553e11e24a3c711e4e3d6fc278bfedb1453e3f410bbe091362bdf49cbf3ec4f96c3f000080bf53915a3ef8c5653d4dbe193d98d87bbfe179353e7602e53c37639e3dc87b8e3ecb16753f000080bfaf07633e5169443dc095ec3b220e19bf41c34ebdd7cc4cbf73df3fbfd637c73ee01b093f000080bf1add613ecfbdc73de291f83c01c86abfabc5bf3e40b10b3ee43a413e9412da3d2ceb793f000080bf9e25683e546ec23df354873b245e18bfc27a3b3ed84e48bf372532bfab31bd3edea41d3f000080bf6f2e6e3eb22c183d8fe3073c04228cbdc82a2fbe1e9e7bbfd0c06ebf91beb83eb2630b3b000080bfeca3733e0fd5043efdda7a3c2dbf67bf229e9d3e1cea95be682667be4ffd703e8201723f000080bfc2bf783e0437b23d616bb63b2223523d560283bc4fa17fbf340166bfea25df3eada959bd000080bfc0268b3eefe1923ce2b11f3c18e35dbdf49901befa8f7dbf7b7b6abff676cd3e35079bba000080bf87156e3e9599d23b151a883c3143e0bd64b3e0bdd5e77cbfc86f68bf74bdd43e7c355f3d000080bf64e6623ebc07e83b9ece953c1a401abf2102053ccf4c4cbf12ef34bf0606eb3ecccd093f000080bf7d3c543ebe3019bda7eb893c6b4615bff2137e3e320946bf76f31dbf19e8f73e53d11e3f000080bf06f7433edc0f98bd0b966a3ca45a36bf7e33f53d890a31bff18810bf7fa6f93e8e7b2a3f000080bf705c663ed1ad17bd6e136e3c02c283bd5a02a33de1a77ebfe3175ebfa2eff93e77e7c23d000080bf6aa25f3ef9846cbd1135513c1e4378bdf012e93defdc7dbfd1325cbf6406ff3e96bde03d000080bfc1ac883e74f04cbde3a85c3cb501db3c20015f3c81e27fbf86095fbff72cfb3e012b88bc000080bff8fb953e0b5fdfbcedf56e3c0804afbb320185bdb6747fbf80b467bf1d64d93ea0afbabc000080bf62d78e3e45668ebd1c28703cd861193f69c6c8be29b232bf9c9c2abf1d9d743e44cc34bf000080bff9bb873e36e4ff3d183f0d3c40a26d3ecaff103c440079bf1f5456bfe4c8023fc6c847be000080bf6c5c873edf8c9a3d8733bf3b02210d3d3604673c92d27fbfe46a63bf9cc4ea3eb1eac5bc000080bf7cb88c3e4b5bfc3d06bc4c3cb715803e69220e3d63b377bfe31655bf8da5043fa75849be000080bf0ff2923e6cb3f13dbc3f5e3c1a22c23d8642343d1e997ebfb8035dbfaa43003fcd3c76bd000080bff758923e33e2823dadfbc73bdb02db3c5062013ddcc77fbfd4cb64bf63a0e53ed0801fbc000080bf31409a3e526ce53dc8bd793c9000e2bbe0c1753d60887fbfd4905dbf41cfff3ec481133d000080bf03089f3e512fd83d473c593c51e101bdda01493d0c907fbfcfed5dbf98d3fd3ea09b543d000080bff8dd9c3ec45c023e81246c3c423a42be373a4fbeb1f475bfaafd57bf47b8083fd97d5d3d000080bf0e82963eb090093e564a4f3cfe72d9bd8a8a45be66b779bf110f58bf9743093f5a3968bc000080bf8acd8f3ea038103e11c5643c0823d23d96ca23bec6557bbfc0c552bf794b0a3f7d3c32be000080bfaca8893ed8d5143e8a92103cde191f3e465a44beca1478bfdf8950bf19b2073f772471be000080bf82559d3e1970563dd2c3d03b5e41a93c5201bf3c30e07fbf2b6866bff21adf3e21460abc000080bf0adca23e8ae7cc3db43e653c3fa2093d3063553df2817fbf683461bff573f33e61349dbb000080bf0f0aa23e08e4f23df9113f3c345e8ebe956369beb4e16ebfa3ce55bf6e88093f98f4f03d000080bf4606a93eca92b93d863f433cd461d2bd8022ee3d60e67cbfc9ed5fbf93b3ec3e83dc143e000080bf2366a63ecd59df3da1da603c512353be044346bee48b75bf24be5bbf87a2013fcd8ea83d000080bf2f52a83ece1b273df88bd93bd7f2acbd28838e3cf40b7fbf37ed67bfe271d43ef41bac3d000080bf32e5ab3eb491ab3d70bd263ce90236be56ca113ee94579bfad655cbffcdfe93ec251653e000080bfd15daa3ee0d7c83d7825493c8032dbbe85a2e9bd8e8065bf233a4bbf8182053f9e1fa03e000080bf0e82ae3e20209f3d863c023c529101bef0f1c83d76b27cbfa40d65bf5d32d63ee406203e000080bf1e17ad3ea933b73d0057323cd922b8be956216bdafaf6ebfcfc752bfc619f73eace0983e000080bf174aae3e211e093d9b8d953b1de0053f960360be4ae552bfb40543bfc58ba03e9c1d11bf000080bf48369f3e5358a9ba6684373c5343eabcc552ecbd3c2f7ebfdf916cbfee72c33eb66691bc000080bf12f8ab3ee82fd43d637ac23bcfeae0beb0625abed2665fbf682f52bfbca6fa3ef35a963e000080bf016eae3e11e4c03d467efd3bc101afbe70e2efbd71b46ebf43cb56bf424bf83ea7927c3e000080bffab3af3e8ae7ec3d2ffc603b7b52c33dd5d10a3e77757cbfdca765bfddd3e13e0d04d6bc000080bf09f9a83eb08fee3d5ebd0a3cfa4d97be939241be13bb6fbff3064fbf0b44123f6f390f3e000080bf06bcac3ec4aff83d917bba3b896180be98eada3eb2565ebf285647bf6050e33ec301e33e000080bf1100ac3eb14f003e973c1e3c8a401b3f8b43d83d54bf49bf9b631abfbbfe343f981cbdbe000080bf4e64ae3e79570d3e6536c83b7dba2c3fe472b6bdba903bbf839e14bfe5860c3f23f319bf000080bf02a0b23e5a0fdf3dbf7cb23bfa9ef13ed43267bea02c5abf81a831bfa446003fd75b04bf000080bff547b03eeb6fc93d3e3f0c3c23400b3f5a4214bd569d56bf98632dbf2223123f6e9fedbe000080bffd83b03eecc1c43dc4d0ea3b0c7244bebbd2f93e58fe59bf6a3c55bf037dc13ef6f2ce3e000080bfffcfa93ecbd7153eab798e3b17ea2f3ee441a73eb4ec6dbfb5045bbfe866043f5fbdc13c000080bf0ff0a43edd97033ec878943b289a26be83023dbe412178bf4f1158bf4feb083fcb1c233d000080bf35279f3e4c330d3e3e3f0c3cb28b5dbe4cab4bbefdb174bfa18d51bffb0e123f0751883d000080bf78edb23e842bc03db27f9e3b93826c3ce16abc3ea5016ebfeb7368bf29cfc93e3753113e000080bff6b3b03e04c8b03dd97a863b05decabed1d1c2bd47c869bf169d58bf2e0fd93ec45ba53e000080bf0a10b53e6150a63df437a13b196bf03e2da372becaba59bf8d4a4dbf96bc933eeceb05bf000080bf0090b33ee1979a3d187ac43bcd637a3eaad6aabea21169bf900766bfa5c18c3e3726afbe000080bf73bbaf3e1ccfa73d5516053c5ad7e0bee4d2c5bd60a964bff4c451bf58c7e63ec34eb53e000080bf081c993ea417153e957cec3b730a3ebede4a5cbe387375bf601852bf7e0f123f3b9efc3c000080bf083a923e9bad1c3e033f2a3c39017a3cc13132be56107cbfa1f247bfa4dd1c3f4394f6bd000080bf02469f3e5a642b3e1d3e693bc201093ef18d8f3e325573bfb50c4ebf8a1e173f282a793d000080bffd9fa33ed7a3203ef17edc3b851c1f3f4313c1bd361747bf57551dbf73920e3fbd050fbf000080bf0e30a33ec0cf183e5c3e123c8101283c69fb633e948f79bfeff746bf0c7b1d3ffa7d073e000080bf6b63a43ea7af173eaf7ac03bc05190be7112c63eb8c460bf7ab23ebf841dfa3ea5a5e83e000080bf0b0bb63efc51b43d31b5a53bb39f103f3e00cbbb783a53bf841b39bfdfbdf43ef950ffbe000080bf00adb13e9f5b883dee79fe3bc2d5ca3e345101be02d268bf8df651bf4e10cb3e6d1ed3be000080bf82c7973ecea72e3e103e143cc6dab8be0dfa843e744965bf149431bfcb2e113fc75de33e000080bf027e953ea31f2d3ec53b403c8d82333dba225e3ee8a679bf20163cbf201f2b3f8fe6ec3d000080bfbf29943ed196333ea33b083c1162223f37c3f53d748243bf87bc23bf8ee8223fa0cadcbe000080bf0a498e3e9e9a3b3e707b823b9c9e913e302bb13e1de264bfd76349bf8f041e3f9b043abc000080bf185c8b3eb18b223ef6798c3be449313e2a0258be734876bfca8e49bfeca40e3fe91987be000080bf08cc833ebaf52a3e9df6143ba199bebede0010bd056e6dbf35b124bfb0e43a3f74146c3e000080bfd429873eb1893c3e6afa6c3b01e46bbe40ebc33ed60b65bf5ffd273eccea6b3f7e2bb43e000080bf6abf853e0802443e3baa1a3c4c40ecbed3694e3f6c7bbdbe713d903e5b5a073f50f94c3f000080bff5678f3ec03f453e473c593c6bd6ab3e3831643f3dfa9bbe0b5b3a3f958324bd2f382f3f000080bf0a498e3e9e9a3b3e707b823b9c9e913e302bb13e1de264bf8bea5b3fd5e1a43e89bacb3e000080bfbf29943ed196333ea33b083c1162223f37c3f53d748243bf83673d3f78ebc2be9bff0d3f000080bf72364d3e5113ddbd12bd0c3c810108bf070eb5be361645bf916144bf9022163f931d853e000080bf514e643ed1e999bd529c233c8b81843c2cc2f93d330e7ebf74345dbf7a48003f648a423d000080bf098b6a3ec976febd6e171a3cc759083e734036bf698430bfbf545fbf37de7b3e0048d8be000080bf8b6d723e72dca9bdae0c2a3cd9b2fe3d8dc26c3dc8947dbf8dd659bf9209053f1bb19cbd000080bf904f803eabb099bd0249583ca381b63da8021a3c59f87ebff7c75abf57a9033f58a992bd000080bf07b3813e1ea9debd7f30703caae6153f4db600bfe4c822bf6e5c23bf3c9c4a3e747b3ebf000080bf999c9a3e5b971abdd0647f3cafd3143f8a9ee5bef5cb2dbfd00535bf2b7f093ee5b831bf000080bf0de3a63ec4ed50bb0ea2353cde830e3fdb36dcbe6df035bf24ec3cbf33070c3ec72b29bf000080bffbcbaebe9d9fe23deb1ed93cb32845bfe5418b3ef9b3133f2663f93e10b5553f2e67833e000080bf037cafbea5bfb73d703ef53c57302bbfb392453e8dd2373febdfed3ebdc75c3fc7c14d3e000080bff833acbe982fcf3daa0f243de9c6dfbe122b693ed3c05e3ff640163f8c254e3ff134ac3d000080bfe3fdb0be1475c63d96b0b63c67f84bbfdffa713ea4610e3ffd49f63e441a4e3fd4afb13e000080bf02b8b1be6c3ff93d471e883c1a9c30bfcee71a3f7a76cb3ef18e313f73b0353f09bcfc3d000080bf5918b2be9ed2a13d89d3093dba0aabbe4212153eb6656e3fee131a3f2a154b3f6334bc3d000080bf85cfaebeaa9a003e0ccc8a3c1f66a8bee294633f0422a33eaeec703f5e4dac3eba40053d000080bf1284abbec98ff83d6c5ed53c70123bbfb805863e1766213f46feeb3e7bd55e3f86fd303e000080bffe5fadbeb14f003e321f903c0c753cbf5746113f06d7bc3e2c8b273fae583c3fc778323e000080bf0988b1be5beff73d0f7ee23b22980fbf4f321b3f1a5410bfdd051a3fdf2b443fb9d0663e000080bf01e0a8beb8afe33df92f103dbd57e9be039a803e809b5a3f6869123f4458513f2283843d000080bfff1fafbea3af103e4777903c014463bf1144ed3d1618e43e73025c3e1bd0753f47b9363e000080bf0280abbe9c4f1d3eb7cfaa3c79a108bf06003b3f452ada3ed0cb443f7909213f9e8eecbd000080bff9bba7bee8880c3e25ea053d78ee15bfbdf6a43e25673e3f7f950c3f9827553f8ae9923d000080bfff77a4be7affff3d96cf323d7b9ea4be86bb663e9f716b3f50721d3facc7493f9969b33c000080bf0cb0afbeca6f113ea73c3a3c68e173bfed72513e415b66be488b4b3e67967a3fd498453d000080bf0f28abbe9a5f1d3e193d373c2907d8be146d503f0c3bccbefadb603f2cc3f33e50bf2e3d000080bffc6fadbea0a7013e8bfe503c9ef067bfeaf1a63e9b298abe37f64c3eb450643fa5adcf3e000080bf1100acbeb14f003e973c1e3c8a401bbf8b43d83d54bf49bf7fa472bb32a27d3ff8db0a3e000080bf7c9baebea6ba003ebc96103c6fa10abe614a623f6b26e5be8c2a613ffc5ea13e827eb63e000080bffab3afbe8ae7ec3d2ffc603b7b52c3bdd5d10a3e77757cbfa9d0033f48c55a3fc09b8a3d000080bf06bcacbec4aff83d917bba3b8961803e98eada3eb2565ebfc7284d3f21bbd23e8334de3e000080bf4e64aebe79570d3e6536c83b7dba2cbfe472b6bdba903bbf81a51f3e85fd733fbad784be000080bfffcfa9becbd7153eab798e3b17ea2fbee441a73eb4ec6dbf6d16403f359a273f673dbb3d000080bf05c2a6beb94f1e3e0c1ea63caab23ebe45b56c3f5d16aa3e61f3743fd4667d3e810b1cbe000080bf0aa2a6bea9bf1e3ea1bf503cb053e5bd10106d3f208fb8be2eab7b3fb4e51f3e481cc43d000080bf6b63a4bea7af173eaf7ac03bc051903e7112c63eb8c460bfe2ea6a3f9548223e8896ba3e000080bf2827a2be8849183e2732f33c9a57ddbe2757c43e55ed503f1afa223ffe50453f4448ccbc000080bff59d9fbe83f90b3ee333193de8d983be252e963e75b16b3f29592d3f2a083c3ff0b136bd000080bffc6fa5be982f1f3eda1fa83c5fc749bfe827ed3e7077cf3e900d0b3fbb47553fdb70d53d000080bf0630a5be982f1f3e7bbf513c05c730bf13ccef3e611a0dbf024d093fc8c4573f0647353d000080bfbe6aa5be64eb293e7025bb3c57e555bf670e9c3eb30fea3eef8d9d3ed8e9723fb1d28fbd000080bfafd2a5be46eb283edec7513c42f069bf419d803ea061a3be952cbe3e27ae553f312fd0be000080bf0e30a3bec0cf183e5c3e123c810128bc69fb633e948f79bfdc75183f76d4483fc80c313e000080bfd732a1be9ab2333ef279c53c3c83dabec6163e3ff827043fd7be4a3f7b1c153f54733bbe000080bf19ad9bbe0dfa223eb7990a3d09e35abefccae03efc665f3f3e842e3f59f6343f303041be000080bf4e42a1be514e343e1b472c3cb30edabe764e4a3fbc92e1be1c9f673f1af2be3e459d52be000080bf263998be60b1163e313f373dbda473bdb78fd33e18a0683f4db2353f8359283f665181be000080bf3f0194bee738273e5d89003d8b3221bef6f2b23eef716c3f8dde393f81c72c3ffccf06be000080bfaf3f91bee128193e3be2103d2481993c10d2a03e0aff723fe4164a3fadf5133fdecd53be000080bf008c87beb9371f3e1ccf273db2d2ff3db7119e3eae62713fd89e513fdb2c013ffa208cbe000080bf03d090be917fe63d060f533d0c2218bd2b5e9c3e5a95733fd5303c3f6740273f6f5939be000080bfb66899beeee8df3df9812b3d56b225be2a6b5a3e83a7763f4918353f8bb0343f4b6619bd000080bff5838abede8f9b3de4878a3de422e8bd7eaacd3ec1a2683f7dd54a3fc4a1163f7e2325be000080bf05178bbe2ee7f23d334f2e3d2862543dc441b03e5dfc6f3fbae1493f81d30f3f53ee7fbe000080bfe60382beaf0bff3d431b403d703a513e46d2b73ed222693f4b794d3f8637f13e404cbbbe000080bf08007ebeb37b223e5c1fd63c2e93553f4bce9d3e830fea3ea9ddf63ec55cbbbbc54560bf000080bfee7778bee6afb03dc827843d3e52a83e9f4ebc3e10af5e3f007c493fa005ce3ee467efbe000080bff77776be997f043ea4fefa3c2afe563ff48dbb3e1722cd3e9c7fd23ebb39583dd7f868bf000080bffe7f7cbed00f233e9b3d503c83ab603fa01a283eac97e6be6c3bbdbef3b0bbbe3c945abf000080bf1f307fbe9fe72f3e923e2d3c2e49633f1ed6933e8772b7bec0654cbebc78ebbe83805dbf000080bff88a96bec39f813d7847863d6dbfdcbe4586913e68395b3f805e243f0272433f42168f3d000080bf01fa9dbe7a17cf3d9ecf403d059a4abe956a703e93a2733fb93b2a3f18d73e3fcf063bbd000080bf04c9a3be863fc33d3c6f233d3e4aaabecde10f3e1ebb6e3f0185163f6dd44d3f7b5db53d000080bf014ca1be357f4c3dd28e5b3d20b418bf0ea2a33dd8724c3f5ca5e83e06955a3f3107823e000080bf1380a7beb1bfac3df44f303d4eeea7be19d3d53d5a5b703fefb2143fb35b4e3f2bfde73d000080bffca7abbe986f9d3d3bdf0f3dd24f18bfda8323bc76be4d3fb1b3da3e4dd5573fd443a73e000080bf69c77dbe2d96223de9d4b53d2723e73d3568173f03654c3f48fd4c3f3aded73ed0dbd9be000080bf94bd65be71cb473d3b1a873dc556233f1e34f23ea4881b3fec1a253f4e64d23d1bde41bf000080bfc37d74be9301a03b3066eb3d7262943d4155483f9c4c1e3fa481513fd58e9d3eb07df8be000080bf1add61becfbdc73de291f83c01c86a3fabc5bf3e40b10b3e56c8403ec1b9d7bdd9f879bf000080bf7c26abbef48a273d6e6a203d50bc27bf24528ebda292403f11ffae3ec8595c3f7e23c13e000080bf029caebee97f793d868f083db40d14bf81c3e6bc62b8503fdf19db3e0c24573f9048aa3e000080bf11acb2be86ff743d711ece3cca085fbf942a4bbed3e2e53e22bbc63d82b7533fa6c10d3f000080bfa9d8b0be47050e3df67ccd3ca62770bffae982be953b6f3ed60c97bd6f794e3fce28163f000080bfde38a9be0c7382bbd7f80c3d0b6766bf87bec3beb45a563ee6df57bea65a4d3fa5030f3f000080bf174aaebe211e093d9b8d953b1de005bf960360be4ae552bf976e37bf41e3223f955f923e000080bfa31fb5be4b74963d745fce3ccb7662bf7c6a56bea552d53e3a435f3d8248573ffad1093f000080bf11c8b5bee21f963d213c5a3cac2869bf19e6b4be7aca5abef032d3bef37b413fd72f023f000080bf1a50b7bec633a83d919d373c79d276bff3d13abeff5145be2f8081becdf9593f9d33eb3e000080bf4eb5b6be0472a93d81cea43c1da167bf2582ad3de0aad53ef38f853ed586623fe19ac53e000080bf8865b3bef696b23da81abd3c786627bf37d7db3e4e781f3f11e1323f4190283f302c8f3e000080bf4183b5be855fca3d027f783c3aae15bfd7f23f3f49969e3ebf574f3f6688043f8a238d3e000080bf242bb7be25e6b93d8d9c053c92cb61bfd6e2323e7c13e0bec9c023bbb34f6d3fc707c03e000080bff4a5b7becdb1bc3db058433ce8a277bf7bdd803e0043f9bcda1e5d3e847f613f0bb1d73e000080bf0a10b5be6150a63df437a13b196bf0be2da372becaba59bfda3b23bf94df413f766f103e000080bf0090b3bee1979a3d187ac43bcd637abeaad6aabea21169bf4d1057bf40b10a3f09ccdd3c000080bf12f8b3bec05b803d863d6d3c223e70bf3cda83be02bc6bbee871b0be134f3e3fcabf123f000080bf00adb1be9f5b883dee79fe3bc2d5cabe345101be02d268bf695740bfea2a1d3f8cd7773e000080bfb5fab2be452dcd3d7ee2803c466a23be67c76c3f80aab03e9616743f8f8d5c3d6be1973e000080bf0778b2bedf4fcd3df73d6a3c44cb62bf458fe53ebd73f3bd3ec5c73e22e15b3fc4d8a93e000080bf9208b5bec1e4c63d6c09f93b130ff1be2756293fe87115bfa6c5053f87023e3fcfd2d63e000080bf0b0bb6befc51b43d31b5a53bb39f10bf3e00cbbb783a53bfdb9320be9f887b3fa6c7cc3d000080bf2c9cb4becfbae63daed7743c6ed56abf3153ec3dd41ac33e35e03d3e4784783ffd0e1c3e000080bf27bcb4bea22ae63d9ab0fd3bd37f63bf75d2833ddc73e8bedf5d4b3dd56e7f3f9459353d000080bffcdfb1be758fcc3d643d353cab9a18bf4414033fbb521ebf3fdf933efffe5a3fb217dc3e000080bff547b0beeb6fc93d3e3f0c3c23400bbf5a4214bd569d56bf2dd7febd1fd37d3ff85a1b3d000080bfae65b2bee082cc3dd90a1a3cade1233df925633f073eebbee58e3d3f1d99903e40211c3f000080bffd83b0beecc1c43dc4d0ea3b0c72443ebbd2f93e58fe59bf8e1e343f9b59093ff18fee3e000080bf02a0b2be5a0fdf3dbf7cb23bfa9ef1bed43267bea02c5abf0d1e8dbdcd1f793fe3ec60be000080bf78edb2be842bc03db27f9e3b93826cbce16abc3ea5016ebf23aca73e1259613f02cbaf3e000080bf1e17adbea933b73d0057323cd922b83e956216bdafaf6ebf55de52bfe5bff6be97f598be000080bf12f8abbee82fd43d637ac23bcfeae03eb0625abed2665fbf7c4152bfc452fabeac8196be000080bfd15daabee0d7c83d7825493c8032db3e85a2e9bd8e8065bf7a524bbfcb5205bf0243a0be000080bf32e5abbeb491ab3d70bd263ce902363e56ca113ee94579bfa7835cbf6d71e9be514765be000080bf016eaebe11e4c03d467efd3b0e03af3e37e4efbd2fb46ebfe8e056bff2f1f7befcca7cbe000080bf73bbafbe1ccfa73d5516053c5ad7e03ee4d2c5bd60a964bf1cd851bff26ae6be986bb5be000080bf0e82aebe20209f3d863c023c5291013ef0f1c83d76b27cbf592665bf0ccad5bed3fe1fbe000080bf2f52a8bece1b273df88bd93bd7f2ac3d28838e3cf40b7fbfff0668bfac00d4be8825acbd000080bf174aaebe211e093d9b8d953b1de005bf960360be4ae552bffc2443bf55f49fbe5d1d113f000080bf4606a9beca92b93d863f433cd461d23d8022ee3d60e67cbfaf0860bf9d4fecbe2bd014be000080bf2366a6becd59df3da1da603c5123533e044346bee48b75bf17d35bbf067d01bf66efa8bd000080bf09f9a8beb08fee3d5ebd0a3cfa4d973e939241be13bb6fbfdc204fbf541b12bf027b0fbe000080bf82559dbe1970563dd2c3d03b5e41a9bc5201bf3c30e07fbfed8166bf5cb0debec5b70a3c000080bf0adca2be8ae7cc3db43e653c3fa209bd3063553df2817fbf344d61bf0818f3be54d29e3b000080bf0f0aa2be08e4f23df9113f3c345e8e3e956369beb4e16ebface455bfb06209bfe272f1bd000080bf0ff0a4bedd97033ec878943b289a263e83023dbe412178bfa62758bf3cc708bfaec623bd000080bf03089fbe512fd83d473c593c51e1013dda01493d0c907fbfd3095ebfd071fdbe6a8354bd000080bff8dd9cbec45c023e81246c3c423a423e373a4fbeb1f475bf3e1858bfc98c08bf62645ebd000080bf35279fbe4c330d3e3e3f0c3cb28b5d3e4cab4bbefdb174bf71a251bfcaef11bfa6aa88bd000080bfffcfa9becbd7153eab798e3b17ea2fbee441a73eb4ec6dbf83175bbf714804bf72f7bfbc000080bf4e64aebe79570d3e6536c83b7dba2cbfe472b6bdba903bbf47b714bfaf590cbf72041a3f000080bf1100acbeb14f003e973c1e3c8a401bbf8b43d83d54bf49bf5c901abf3ec234bfaf71bd3e000080bf06bcacbec4aff83d917bba3b8961803e98eada3eb2565ebf736c47bf4f13e3be91f0e2be000080bff75892be33e2823dadfbc73bdb02dbbc5062013ddcc77fbfe8e564bf4238e5bed016203c000080bf31409abe526ce53dc8bd793c9000e23be0c1753d60887fbf57ac5dbf3970ffbe1b5713bd000080bf0ff292be6cb3f13dbc3f5e3c1a22c2bd8642343d1e997ebf001f5dbf0a1400bf2188763d000080bf0e8296beb090093e564a4f3cfe72d93d8a8a45be66b779bf6d2b58bf381709bf2942653c000080bf081c99bea417153e957cec3b730a3e3ede4a5cbe387375bf2f3352bf26e811bfbe5efebc000080bf02469fbe5a642b3e1d3e693bc20109bef18d8f3e325573bf7c254ebf13fe16bf1e5978bd000080bf083a92be9bad1c3e033f2a3c39017abcc13132be56107cbf721248bf53b61cbf9f60f63d000080bf8acd8fbea038103e11c5643c0823d2bd96ca23bec6557bbf60e452bf1c1e0abfba2b323e000080bf185c8bbeb18b223ef6798c3be44931be2a0258be734876bff0b149bf2c750ebf9f11873e000080bf0a498ebe9e9a3b3e707b823b9c9e91be302bb13e1de264bfea8249bf72dc1dbfce5e403c000080bf08cc83bebaf52a3e9df6143ba199be3ede0010bd056e6dbff9de24bff5b53abf04656cbe000080bfaca889bed8d5143e8a92103cde191fbe465a44beca1478bfabac50bf9a7e07bf0612713e000080bff9bb87be36e4ff3d183f0d3c40a26dbecaff103c440079bfc07456bf2c9002bffbe9473e000080bf7cb88cbe4b5bfc3d06bc4c3cb71580be69220e3d63b377bf6b3655bf006f04bf1781493e000080bf6c5c87bedf8c9a3d8733bf3b02210dbd3604673c92d27fbfc98763bf5954eabeea23c63c000080bfc2bf78be0437b23d616bb63b222352bd560283bc4fa17fbfe81e66bf2babdebe5cb2593d000080bfc0268bbeefe1923ce2b11f3c18e35d3df49901befa8f7dbfaa946abfed03cdbeff92893a000080bf0a6c7ebed2fc013ed47fd63ba042473ef6610b3e50ad78bf9eec55bffebdfdbe3e8672be000080bf63b882be8d9b1a3e153c053c20fb743e07e37dbd140f78bf573052bfa1ae0bbffed62bbe000080bf6abf85be0802443e3baa1a3c4c40ec3ed3694e3f6c7bbdbec5898f3eff3d07bf892b4dbf000080bf178086bea5db423e0611a93c41bcff3e3df7433f61afcf3e2519193fb9a40b3d5bfd4cbf000080bf0fee8ebebf7f433e211ff43cc74239beaac6363f8c282d3f25a52a3f6b3e183f1b1de6be000080bf9e2568be546ec23df354873b245e183fc27a3b3ed84e48bf8c4b32bf9683bcbeabad1dbf000080bfeca373be0fd5043efdda7a3c2dbf673f229e9d3e1cea95be1eb367beae946fbe7a0f72bf000080bf6f2e6ebeb22c183d8fe3073c04228c3dc82a2fbe1e9e7bbf87d76ebfd448b8be703717bb000080bf87156ebe9599d23b151a883c3143e03d64b3e0bdd5e77cbf618868bf864fd4bec6c25fbd000080bfaf0763be5169443dc095ec3b220e193f41c34ebdd7cc4cbfe6f63fbfc39fc6be333209bf000080bff5678fbec03f453e473c593c6bd6abbe3831643f3dfa9bbe181f3a3fe8af213d7c7a2fbf000080bfd42987beb1893c3e6afa6c3b01e46b3e40ebc33ed60b65bf9cbb263e42f06bbf9659b4be000080bf0a498ebe9e9a3b3e707b823b9c9e91be302bb13e1de264bf5ec35b3fca83a5be4be0cbbe000080bfbf2994bed196333ea33b083c116222bf37c3f53d748243bf8d7e3d3f802ec23e96210ebf000080bf0a1095be96af3b3e7d047e3c06df54bfeec1043fdada4bbe53410b3f4c06303f1f3ff6be000080bf007094bea86f393e1d1ec23cad5e4ebfa336c83ee562e33e7136c73e966e6a3f87efccbd000080bf0f6081bec45f333e251fbb3c9b7a3f3f1f87ea3e57eff53eb0c5063f9c3f003d268159bf000080bff86b8abeae9f2e3e868f083dda11d83dd0f9b63e4b906d3fd6933e3f291f173ffaba9fbe000080bf113496beb94f2e3ea65eb73cf0b185bd55815e3fb1fbfa3e4e0a343f90f3c63ead6618bf000080bfff3f96bee6af303e5abb6d3c10d197bd0f286e3f87edb7be58aa7e3f88ef323d6bb7bcbd000080bfa9a599be1e50363ee63eb93ca85b783e3a19623ff386cd3eb02e623f1b47f7bc6f50efbe000080bf3f8c98be8122363ee7fb293c22f2ac3e6fa8453fa8cd09bfeab3613fec68ebbee597d9bd000080bf027e95bea31f2d3ec53b403c8d8233bdba225e3ee8a679bf6370753fc7d487beb119d1bd000080bf82c797becea72e3e103e143cc6dab83e0dfa843e744965bf4749653f6b67babe03cd823e000080bf02469fbe5a642b3e1d3e693bc20109bef18d8f3e325573bfedc9773f839c783eed5c84bd000080bffd9fa3bed7a3203ef17edc3b851c1fbf4313c1bd361747bf41bcfd3e30b6383fcb90f7be000080bffab3afbe8ae7ec3d2ffc603b7b52c3bdd5d10a3e77757cbf7bbb65bf1983e1be6ef2d63c000080bf02a0b2be5a0fdf3dbf7cb23bfa9ef1bed43267bea02c5abff3bc31bf352700bfd65e043f000080bff547b0beeb6fc93d3e3f0c3c23400bbf5a4214bd569d56bf577f2dbf27f511bf75bfed3e000080bffd83b0beecc1c43dc4d0ea3b0c72443ebbd2f93e58fe59bf405b55bf6f1fc1be3ccbcebe000080bf78edb2be842bc03db27f9e3b93826cbce16abc3ea5016ebfb98968bf5a77c9be590c11be000080bff6b3b0be04c8b03dd97a863b05deca3ed1d1c2bd47c869bf8cb158bfa6a7d8be4e78a5be000080bf0a10b5be6150a63df437a13b196bf0be2da372becaba59bf8a5b4dbf336793be68e9053f000080bf0b0bb6befc51b43d31b5a53bb39f10bf3e00cbbb783a53bfd12439bfb894f4be695dff3e000080bf0090b3bee1979a3d187ac43bcd637abeaad6aabea21169bf7e2066bf18468cbe5306af3e000080bf00adb1be9f5b883dee79fe3bc2d5cabe345101be02d268bfdf1352bff08ecabe0226d33e000080bf48369fbe5358a9ba6684373c5343ea3cc552ecbd3c2f7ebf11aa6cbf54fec2be9877903c000080bf0de3a6bec4ed50bb0ea2353cde830ebfdb36dcbe6df035bfb0093dbf58f20abe0919293f000080bff8fb95be0b5fdfbcedf56e3c0804af3b320185bdb6747fbfedcd67bffef7d8beaf3aba3c000080bf999c9abe5b971abdd0647f3cafd314bf8a9ee5bef5cb2dbfd72435bf6a6e08be6aa6313f000080bf62d78ebe45668ebd1c28703cd86119bf69c6c8be29b232bf22bc2abf69a073bed5c3343f000080bfc1ac88be74f04cbde3a85c3cb501dbbc20015f3c81e27fbf60255fbfd6c9fabe7158883c000080bf705c66bed1ad17bd6e136e3c02c2833d5a02a33de1a77ebfea365ebf2482f9be7ad4c2bd000080bf7d3c54bebe3019bda7eb893c6b46153ff2137e3e320946bff8191ebfb66df7beb8da1ebf000080bf06f743bedc0f98bd0b966a3ca45a363f7e33f53d890a31bf8da410bfd933f9be128e2abf000080bfb6f448be817908bd501b553d43816e3f055e903e2fa36abe3da2f0bd15d5b9be7ba36cbf000080bf142155be11e24a3c711e4e3d6fc2783fedb1453e3f410bbe0d1063bdfb1fbfbe0d126dbf000080bf6aa25fbef9846cbd1135513c1e43783df012e93defdc7dbf1d4f5cbf3aa6febe489fe0bd000080bf904f80beabb099bd0249583ca381b6bda8021a3c59f87ebfa5e45abf357903bf82c1923d000080bf07b381be1ea9debd7f30703caae615bf4db600bfe4c822bf7d7f23bf06b049be0b6d3e3f000080bf29b13bbe8a77a0bd56802f3d672f7f3f4a83b7bc1fb29cbd11a0a2bd8d98babe79866dbf000080bf450e41be9e2809bdacabc23d8c43783f7efb733e4003573d7d94223e09e8e7be009660bf000080bf564558beb91c2f3b1425c13dd865393f8569183fd925b23ed924133f933778beb61548bf000080bf8a5844be67981abd2f870d3e4ada6e3fc4f1b73e35c2a4bc70f95e3eb0b41bbf7e6843bf000080bf0cc357be9deb7bbc0b290f3e8b27073f6408553fdcb92d3e6be33e3f3396b7bebac60fbf000080bf551770bee19b26bc9f1c153e6123d5bde957713f993aa23e50c25b3f2def7b3e446fe6be000080bf08e989be3a3defbb2251e83dab251abfb6f6f43ec69f233f08fe203ff305473fd7022c3c000080bf9b5983be42afbfbc6422153e2bb93bbf5f1e0d3f79c7cb3ef595173fee324e3f03bcc9bc000080bf42438fbeb9fedd3c04c8b03d885ff7beb416bf3edbc04a3f63322a3f81b83e3fa03a5f3d000080bf83689dbe001f3c3c7b16843d092f40bff0a3f23dab60263f47f7c63e13f15f3fdb2d943e000080bf53915abef8c5653d4dbe193d98d87b3fe179353e7602e53c9bfd9d3dabe78dbe4b2d75bf000080bf210745beaab891bdbb09be3d99967e3feb31b4bdccc2693d6b1743bb395111bfabc152bf000080bf818140be202a8dbd626d0c3e741a7e3f364233bd6122e8bd84e8e7bd29e12bbfd87d3bbf000080bf9ab095be44fc03bd6538be3d68a35fbf1a520cbeac17ef3e268ad93a156d753fa6a0913e000080bf30a087bef7ae41bd920e0f3ee45e70bf6ce255bd261eae3ec89fd7bb97af7d3f4935093e000080bf20b882be93539bbd622d0e3eab035abf6374ffbeae82243e13e0e7be1dce5a3f78e7813e000080bf56d59bbe33e117bdf8fb453d871551bf6d8811bf7163ca3d298aeabe78323e3fe1def93e000080bf0de3a6bec4ed50bb0ea2353cde830ebfdb36dcbe6df035bf8b744ebf2454f83e0a27ad3e000080bf999c9abe5b971abdd0647f3cafd314bf8a9ee5bef5cb2dbf8ec044bf6e9a133fb6f48d3e000080bf32218ebe817792bd13f4573d82df54bf56b00dbf23e3403d61b8febeab9f473fa195c23e000080bf0aa18bbed02792bdddb5c43d3d2554bff72d02bfb5736f3e429ae0be997d593f99f6953e000080bfb08871bea241cabdca4b0e3e1e9725bfaff540bf50a4ed3d794a38bfbd58273f09ee6e3e000080bf97e57bbeb77bd9bde198c53dc8761abf75b141bf48fe803e47db38bf1906273f39876b3e000080bf13b67fbeff95f5bdaef5453dc95d1bbf52324bbfbea1263d863340bf8fdf163ff7bb983e000080bf64425cbe704be4bdfd4c0d3e84819f3da2187fbfd661003d8abf76bf08ae89bdb7fc833e000080bf25eb60be5d35efbdbf9dc43d9bf2943d054279bf8e435d3e5a5b77bf504877bc0bb1833e000080bfb22c48bef88cc4bde2210c3e6a76533fa7dd0fbf57e230bd27a70abf680850bfe0505c3e000080bfa11061be922107be64cb323d05729f3dfb387fbf4000e83a02cd72bf699096bde6da9d3e000080bf07b381be1ea9debd7f30703caae615bf4db600bfe4c822bf016d49bf668f0a3f06da973e000080bf62d78ebe45668ebd1c28703cd86119bf69c6c8be29b232bfe44c2fbf49e7333f649b453e000080bfb87547bee6ebd2bdd3a2be3d346f573f0d1c07bf9ce3eb3d49e208bfe39348bf3014a23e000080bf818140be202a8dbd626d0c3e741a7e3f364233bd6122e8bd5ecf83bc79d578bf3f06703e000080bfd92645beaad7edbdc827243dddd24a3f2d101bbf538296bd24a212bfe6a347bf1e48813e000080bf210745beaab891bdbb09be3d99967e3feb31b4bdccc2693d25fbcdbd294f74bf5007903e000080bf29b13bbe8a77a0bd56802f3d672f7f3f4a83b7bc1fb29cbd59032abcd1ed7cbf5ec71d3e000080bf06f743bedc0f98bd0b966a3ca45a363f7e33f53d890a31bf6023923d701a7ebf8268c9bd000080bf098b6abec976febd6e171a3cc75908be734036bf698430bf5eca69bf83853abe1496ba3e000080bf72364dbe5113ddbd12bd0c3c8101083f070eb5be361645bf5403edbe8cda61bfa2b1af3d000080bf6b63a4bea7af173eaf7ac03bc051903e7112c63eb8c460bf2cc93ebfcce2f9be589ae8be000080bf0e30a3bec0cf183e5c3e123c810128bc69fb633e948f79bf200e47bf5b601dbfa96407be000080bffd9fa3bed7a3203ef17edc3b851c1fbf4313c1bd361747bfa7611dbf8a7d0ebf0a0d0f3f000080bf82c797becea72e3e103e143cc6dab83e0dfa843e744965bfbdab31bf1c1111bfa25fe3be000080bf027e95bea31f2d3ec53b403c8d8233bdba225e3ee8a679bf1d343cbf96ff2abfa8a3ecbd000080bfbf2994bed196333ea33b083c116222bf37c3f53d748243bf85d023bf73c522bfdef6dc3e000080bf64e662bebc07e83b9ece953c1a401a3f2102053ccf4c4cbf840a35bf5082eabed9e109bf000080bf72364dbe5113ddbd12bd0c3c8101083f070eb5be361645bfae7044bfe70316bf9b4e85be000080bf514e64bed1e999bd529c233c8b8184bc2cc2f93d330e7ebffa4f5dbf8e1900bff62642bd000080bf098b6abec976febd6e171a3cc75908be734036bf698430bf506a5fbf81657bbe0412d83e000080bf8b6d72be72dca9bdae0c2a3cd9b2febd8dc26c3dc8947dbf30f459bf03d804bf02e69c3d000080bf33de463f360572bdabea893f8857693ffe62c63e36520d3e0fea963e6f6e59bfd631e03e000080bf174a463f0f436bbdf88a8a3f8eca5c3f60bad13eba31983e00fd623edb6e55bff677013f000080bf5a45473f836a83bdb4b0893f90727f3fd8e139bdaa61423d848077bdd5df6abfa14dc93e000080bf5d70463fcdaf66bd2768893ff9b1193f400e313fb792cdbed26b4c3f465cfbbe6f5ab23e000080bf8254463fe96293bd083a8a3f1be53f3fb99a26bfe643f73dc0ec23bfd0b32abf2132c33e000080bfb4c8463f9bcb8dbd1aa3893ffdcc573fd29904bf05c214be0aa6e4be860853bf761cb23e000080bf384a463f22388ebdc30c893ffc1be93e68920dbf17a132bfefd3dcbe6c9652bf2fb6bd3e000080bf1689453f86cb6abd8fab8b3f0335523f5c97e93e7a96af3eff21423e83e648bfb70f173f000080bfed63453f341497bd635e8b3fbc223e3f6ca424bfc3e23e3e54dc28bf9da027bfb3ecbc3e000080bf3a75453f5b9a5bbd5c218a3fb021af3e688e703f1afe73bb32b9323f78c180bebe9b2b3f000080bf543a443fca375bbdc32d8b3fd3a13f3e927c793faca2fc3d2d6c173fcc2359be2a26473f000080bfaa0f443f7ec46fbdd28e8d3f8a1c4a3f2887f83e654ec03e94b3363eb25d44bf22c41d3f000080bf04ff433f05329bbde82e8d3f591a3d3f04b423bfa4425a3e564c2cbfabb12ebf3308923e000080bfd0ef433fed2c9abdbec08a3f434102bd047d79bfb52a63be068075bfda5706bdce27903e000080bfea22453f047695bdd49b893fb4c2573dedf46bbf67c2c4bec8c461bfe5d464be8286d43e000080bfa46e433f558972bdbe4c8e3feb0a403fadefef3ea2dbee3e4f59f13daaf949bf2d601a3f000080bf9e5d423f81ea5fbd7e1c8d3f7263fd3d66257b3ff6c1183ea457103f82d845be528f4d3f000080bf8bc2463fef1e80bd05fa883f6af8263f7be3fa3dc3803fbfb449d53ef7e461bfdff45f3e000080bfaa30423f50e39ebd499f8c3ffe1183bd222c7bbf2cc33abe69e07bbf9ce4003daf30343e000080bf4759433f8fe29cbd3eec8d3fd2eb323fbb7326bf9d89983e32d436bf9a2728bf08aa773e000080bf3e453e3f0f7b81bd9032923f00a33a3f147c003fdf47ee3e6f64fd3d86ef43bf51af213f000080bf103e3c3f18e76fbd828d913fa411923d98aa7b3fb4d12c3e1a3d083fb6f138be82bf533f000080bfa6633e3f5abda3bdacc7913f9696313f6a2228bf2662973ecd3c36bfc40b30bfec0e123e000080bf88643c3f4510a7bd0c06913f036248bdc4767bbf194239beb6fc7ebf716a0d3dc4b3a73d000080bf43583d3f49d982bd1c25933f7d523c3f46f7f63e3e7ff33e7e99463e0f9b52bf91ce083f000080bfd2163b3ff08674bd567d923f30e34d3deaf57c3f6aaa143e3ab35b3f0acbefbdd2e2ff3e000080bfc1713d3ff8fea6bd5a9b923f990e2f3f8b6c2cbf28ae8f3ecd1439bfc5672dbf3b3a0b3e000080bfe04d373ffa2582bd247e973f2e3d483f72529d3d8b481e3f93a085be83575cbf5accdf3e000080bf7234373f375080bd3998953f3fb4523fa39d9d3e955ef4be69fa0d3fbe4f82be02d04a3f000080bf5857413f8fc3a0bd77698d3fd25180bd14b17bbf40ba2fbebe717dbf3eb0213d5b8e0a3e000080bf2d06373fb81dbabd1c27973f04535b3ffaca58be40cbf03e4d4398beb6a272bfd9b0eb3d000080bfa851343fae83c3bd4d4c993fa909463f725471bec896163f08ca82bee92977bfd66550bd000080bfba00343f27c286bda0ab993f5e57313fb44c793e4bc92d3fbb1aadbabadc70bf5e73ad3e000080bfcc422f3fac1b8fbd0a119c3f07ce1b3ffb55993e7a1a3c3f5162f03dec2773bf906f943e000080bff9f52b3f281036bd2b4b9a3fb1eac33ea9d2413fe48b073faea4a13eeb4f25bf11fa313f000080bf7c27323fcc25f5bd2784983f6c22223f310e12bfffd9053fd9dfdabe093552bf6f9fc1be000080bf71e42d3f6615f6bdcf9f9a3f7eac143f94f619bf52740c3f10e7dabed3814cbfe2a3d8be000080bfd2a92f3f5b07c7bdcf819b3f64aa323f390b6dbe5f802d3fc4a542beafe578bf739c0bbe000080bf60e4293f62a1f6bdc9e89c3f2870153f325a1cbfeaf5083f3dd7d3beb66b4abf7705e7be000080bf26c3253fc3a00cbebbd09a3f18da943e6da36cbfaef37c3ea3df1bbfb57ac1be5a8d32bf000080bfc74c2a3fbb640cbe2bdc983f781e903e0e7a6bbf75ea8b3ee46418bff510c8beb0bc33bf000080bf0d2d2e3f1e190bbec824973fba01923ec8006ebfb8b26e3e17f52ebf4b49bcbeb97021bf000080bf2a90213f4ad40bbedee49d3f335e973e6c1f6dbf605b6f3e4c831abfbfd5bdbe2bb334bf000080bf7fdb273f58e60dbeae2a973fdfd1f2bd194671bf5e05a0bec20c1abf4c1ca33e0c7e3bbf000080bfd26f233f7c9e0fbe76fb983fa78378be93d971bf50bb61be311016bf0ed2a53ee61c3ebf000080bf309d1e3f033f0abed42b9b3fa72703bf8afe48bf422ab2be8f4d0bbf98391c3f636413bf000080bfabce223f65c500bec0b2963fc46b12bf8ecacdbe440e37bf452a39becd7c693fbb6ebcbe000080bf6399263f8d5d02be2aa7953f857ac1beca4ed4bec8ea53bf737d6ebe7b6d683fd76bb2be000080bf38d9263f58a9e0bd207f953fa1edadbee381d83d22406fbf8b424d3ee19d7a3f6d261b3d000080bf14222c3f8e02e4bd07ea943f0aeb7abedb71a83dff4c77bfeaa0833d69de7e3f0a368c3d000080bfd2a6263fe42df7bd67479e3f72970a3fa2dd1dbf814f123f1818c9bee15849bf5c03f4be000080bf2fde233f8c66e5bd2523a13f4f48333f64d6b3be12161f3fd5ca45beb26b6ebfb6119ebe000080bf0822273fd768d9bd13809f3f9c3d353f47418abe7d0f273fd8ae15bef5c475bf8f6574be000080bfb70d2b3f118dcebd6bd89d3fb01c313f44cb5ebeae40303f79e719be0ddd79bf1c3021be000080bf68752a3ff59d9fbd304c9e3f326a253f2c83663e7cb03a3f1ad1253ec66479bfcd03213e000080bfbd36273f804ab5bd70d19f3f296b303fbbe217bd5243393f7bfd4a3dd5727ebffdf3c8bd000080bf6743223f6c239ebd74efa13f78680f3f93dbcf3e2dd9383f29768d3edccf69bf0e2b993e000080bf0d34273fc2a177bdc4059e3fd98ffc3e4278173f723c233f04d3b43e1b5e4ebfe118f33e000080bf64af233fa03329bdfe7f9c3ff462c53d5a59513f5642113f1f4be73e0e3e0bbfc208353f000080bfb5c01e3f34d67ebdac6fa03f6c9919be47a6633f4a3edd3e98c1053f8b7899be5b584c3f000080bfe0661d3fb7412dbdd1ea9a3ffb6b43bf8e8d173f5455843e6e1ab43e82df393d615b6f3f000080bfe0bd1b3f488892bd1c0b9e3f5a3757bf2658083fea82c8bde8dfaf3d44889e3ea26c723f000080bffbe51f3f392ba2bc5245973f7dae24bfe2e23e3fbcea313e5f1ab03ece30a13dee886f3f000080bf564a273f9f03cbbcf46c983f9efbf43ef070433f5a1fde3e8f59f23e13f023bf61d81a3f000080bf3a951c3f5c1b6abd9949983f63aa6dbf2909a83aee45bebe0946abbebf8cdd3ed850563f000080bf295c1f3fe8120ebd2b13963f86486cbfa3e10e3e09a2b7be534269beed960d3f30274d3f000080bfcf4d1b3fd463bbbd6f659b3f041960bfd5b2da3d3867f1be80aec6be6756da3efd29513f000080bf1cd1213f8b1b37bcc47a953f943e1cbf2e653e3f549e8b3ecbc6c53e0ef0acbc4d116c3f000080bf5663213fea3caabc685a943fd31a75bf9a22e23d998988be009f63be25529d3e4ee06c3f000080bfe57a273f742758bce737963f0f0bfd3e37b4373ffe3efb3e16e1ec3e0fec31bf78e50c3f000080bfca51283f4260e5ba9e06943fef591d3fd22d133fb7410a3ffc66b73ebb3d50bfafa0ea3e000080bf73bc223f22e266bbbbd1933f291611bfcefe3c3fca42bb3eb97bdb3ee73eebbd7968653f000080bfe5ec213fd0d300bc1a14933ff9ae78bf812a543efa32edbd3824aabdb226243ef1ca7b3f000080bf31d1283fbb977bbc9c51933ff389763f2aca89beff0336bc9af483be4ec46ebff133813e000080bff2d3283ff50fa2bc863d953f6de87e3fdec1bc3d25008fbb5e00b53d946870bf9808aa3e000080bf9c19293f2ba612bd5dc0973f8f7b4a3fb0861b3fc25295bdd137f43eb89c09bf1503323f000080bf62f8283fb0c619bdf5f6993f780ff93eca484a3f9ae2be3e0e65ae3e558010bf2c7d403f000080bfb2bc2b3feb5524bd446e983f183a043ef0d97d3f96ffd43b0553e73e2b7084bdf3c7633f000080bf6c922f3f3c851cbda5bb973f4ee1adbd4f107f3f0e021e3c87a2833e58b44d3ca95f773f000080bff5ba313f31ef31bdd7be983f7042b23e49f4273f5b6a2b3f9ce9883dc1d63abfe52a2e3f000080bfbaa1353f34f324bd8d9a973f9f4bdb3e8cac193fd3e82c3f23c6ebbdab8234bf501e333f000080bf130c333f8db715bdb9a6963f97c10bbebc267c3f41e2d83db245ac3d348bc2bd52ee7d3f000080bfac3b223f6669a7bbf112923f54a67cbfeb201b3d728120be3bdf1bbe0be8d03d67aa7b3f000080bfeaee223f9a0af13af303933f018618bf80b03a3f5a46ac3ee88bc83e37b4d0bd71186a3f000080bf2218233f842ee13aa627903fa56072bf0de2d23db3219cbef31186bec6e49b3e16736a3f000080bfbcc9233f2234023cd21c913f514e15bf108d463fb043773e399fc23eb9200bbb7ec86c3f000080bf20b2243f6f7e433c0bd28e3f9f3212bf7fc0f53e177b2abf880a57bcd4484e3f3290173f000080bf21e8243ff86e733cd7a48f3f8bb302bf9f0c5c3f8581b3bc1cc3e53efc82933e788f583f000080bf3465273fa9bd883cb7d08f3f4182ad3d92957d3ff2a2dc3d42b5093fb7c10bbea2f5543f000080bf8d62293f4356b73be3a7913f5a041a3faeea2d3f591bd73e63f18e3e85f02bbfeeae2f3f000080bfbbec273f1d015c3cc9ac8e3fe82a6d3ee61b1b3f69d642bfdb90243f06d8fb3e5253163f000080bffda42a3f944f0f3ced618f3f8c9e623fadc9913e1a52bcbe73dfeb3ecfd9dabe7d21473f000080bf558a293f4f90583c47ff8f3f6a32103f785f513f17d4f03de960f83ec894e2be6813413f000080bf5892283f31eb453ba54d933fff57053fcd5c363f9fd3f03ee89ed83e91aa31bf1c21153f000080bf475a2a3f74b600bbfb07913fcb6d7c3fa593f8bd6f43e93d590c25be67f85dbff259f13e000080bf7b30293f5f5c2abcf5a2923f5104763f8c227ebe20d2f93d455b89bece9671bfe926463e000080bf543a443fca375bbdc32d8b3fd3a13f3e927c793faca2fc3d4cc0793f1ac52dbedab80ebe000080bf7d40443f3b8b5ebdd87f893f46abcebef092393f47e60ebf08ea663fd0b7d53e82ade1bd000080bf2ee3423f61885cbde2938a3f73d60cbf579b433ffe7eacbed6a1503feb7bce3ee811d5be000080bf9e5d423f81ea5fbd7e1c8d3f7263fd3d66257b3ff6c1183ebc0a733f681696bd75649cbe000080bf3a75453f5b9a5bbd5c218a3fb021af3e688e703f1afe73bb8d16683f286ea8bee655873e000080bf5d70463fcdaf66bd2768893ff9b1193f400e313fb792cdbec675323fb98453beb1c22f3f000080bfea58453f53ec68bd622e893f9c429a3d80f21c3f315349bf67336b3f931a873e9660963e000080bf6938453f15747bbd1fd9883fe5da2dbe0694613e44e675bf4e6a503fd3a1143f711030bc000080bf0307443fc0048ebdd122893f28fe03bf2ac3c6be278b43bf15e9033fe85f123fa66e23bf000080bfb64c423f192091bd35288a3f76e139bfc843cfbeac480ebfdb48ab3e8c15ff3e68c74cbf000080bfd0ef433fed2c9abdbec08a3f434102bd047d79bfb52a63be89ae4c3e2f57583ef5ee74bf000080bf603a453f7c9c89bd10ec883f800477bd06547cbe16a077bf2aed283f3d9e373fbc3b65be000080bf384a463f22388ebdc30c893ffc1be93e68920dbf17a132bfb590273ff9393d3f768a22be000080bfaa30423f50e39ebd499f8c3ffe1183bd222c7bbf2cc33abe1199263d515d383eed997bbf000080bf8bc2463fef1e80bd05fa883f6af8263f7be3fa3dc3803fbff1b2253fd9e4d83e4b3b223f000080bfea22453f047695bdd49b893fb4c2573dedf46bbf67c2c4be78b9da3e26bebc3e485a53bf000080bfce58403faebc64bdaeb88c3f20c125bf6d61343fdea694be1caf383f1a4ae33eb20f08bf000080bff438403fd82996bd485a8c3fdacc42bf7e23ecbe62a7e9be64066c3efb3eee3e42c75abf000080bf687a413f884762bd9fe78d3fa4b2d23d16e17a3f0e722e3e49ba723f33ae37bdfb16a1be000080bf5857413f8fc3a0bd77698d3fd25180bd14b17bbf40ba2fbecce2693d402b2c3e91ee7bbf000080bfbbb63f3fc23597bdfacf8c3fb0e235bf90a3eebefaf706bfb7ad863eb2dc043f563450bf000080bfc70e3a3f45b79ebd419f903fce4a2ebf02f4f9be44c80bbffacea63e9d80ee3e919d52bf000080bf88643c3f4510a7bd0c06913f036248bdc4767bbf194239be208b313eaf1c2e3e3e5678bf000080bfa8373b3fc497a9bd20ef913fd6c2a7bcee4379bfca6368be6d9f953e7751583e06c76ebf000080bf50e4393fb69a75bd4eef903fd3fc22bff7502e3f2f4fb9be2dc9413fdbb6ec3ec26decbe000080bf103e3c3f18e76fbd828d913fa411923d98aa7b3fb4d12c3e778b7a3f38b814bdaaf44ebe000080bfb2d73f3f7f6866bd1d1f8d3fde501fbf40ab333f3a77b1be96e5423fe129e13e69f0f3be000080bfc87b393f7e18a1bd1e19913fc0ef1cbf9ec90cbfa23511bfda34c13ede98da3e016052bf000080bfd2163b3ff08674bd567d923f30e34d3deaf57c3f6aaa143eef297e3f1fd309bd9bf4eabd000080bf691d393f2e0479bdda73913ffee823bf0e31293fa86fc8be879c443f686e0f3fa1d69ebe000080bf20ba343fd193b2bd8d67943ffec1a9be8b61073ed9226fbf46dcf03e26a5613f1bf42cbd000080bff298353ffa49b5bd4469953f3825593f42c28cbc098407bfcf45e93eca86083f5776363f000080bfe09f363fa4c2b8bdf818923f355e0cbf1a55483f4cfe96be432c173e3718e03e930d633f000080bf6ebf383ff7e6b7bd98bd923ff8a12b3ec3027c3fa4e2593d67b9823eaf81c3bd4b4e763f000080bfdf17373fcea5b8bdfa7b913f08d01cbf6e143c3ff44995be2989f83dc062e73e453e623f000080bf9773393f6cd0b7bd0f0e923f3cba2a3e2a297b3f7732c93dfa559c3e5b9e15be23e3703f000080bf4c333d3fecdfb5bd21e48e3f2c82683e3ce0743fb4513b3ead1ff53ea0e18bbe5c98553f000080bf306b363f22e4dcbde832913f5e6443bf76d2c9be930d03bf9fd30bbf1020513fe7c83d3e000080bf35423b3fe86bb6bd03438e3fa86115bf2e5c453f79b182be7f68a63efe7e023fd5eb4b3f000080bf70b53a3fb2f3d6bdb6d88d3f40ee48bf4212c7bec206f7bea7670ebf0a00493ff05d8b3e000080bfa8a73b3fd09cb5bd1fd68d3f4afc1dbfc926433fcdb247be5bd7a73e94e3f23eeb26513f000080bf1e193b3f950ed6bdc06f8d3fa82b53bf5ad7c2beb807d6be860007bfc6cd483f1c31a73e000080bfa6613c3fc574e1bdc85d8e3fa38122be929276bf6c425ebe395875bfcffe4f3e8a734dbe000080bfc289383ff9d6e7bd3292913f9a2926be5bc277bff40145bec23857bf5a61733e381bf9be000080bfc7b9353f64ffdcbdc3b6913f339840bf159ab2bea0110fbfd849a8be3c166f3f88d80fbe000080bffd4b323f957ee2bdf208943f3423fdbecaa5893eac9c53bfa74c82bdf6ed6f3f0b8daf3e000080bf37fa343fed9df1bd1ac3943f4464633f51c2ecbc59baeabe7e88213d1cc77f3fd4e65b3c000080bf0728353fb70bedbd62f9913fce6253be41a36f3ff0d591be33e945bbb4bb943e8ff5743f000080bf77bd3c3f670cd3bda0888b3f3c704ebf192ec5be80c6e5bed24809bf10cd4b3f96958f3e000080bf11353d3faf07b3bd81ec8b3f4f0c20bfba5a3d3fc20b7fbe13ab913ed55d033f404d4f3f000080bfd8d43d3f77d9cfbd008b8a3f02de2ebf370ec1bede1f20bf9d8b05bf65ed593f987c673d000080bf382f3e3f6973dcbd2bf68b3f467219be98dd75bf887b70be8b9573bf2e8b513e2a3c6bbe000080bf404c3e3fb6bcb2bdb7ec8a3f2b3cfcbe3ec5453f601bcdbee8aa123eabaa063f8d9b563f000080bf49d93e3f13d7b1bd5c728c3fef11553e52e8773f32e10c3e5354d33e5a995bbeed9e623f000080bf81cd3d3f4a99b4bdf2238e3f6a52623e9cce753fd6f92e3e8ebc023f6fc386be3288513f000080bf09fd3c3fbaa3dfbd1aa38d3fb75131be6b9076bff4c952be5a3c79bfb9c24b3e1a74e5bd000080bf1af73e3f4ca5bfbdc3f0893fae22aebed44b7b3e9f6568bfe78239be6e1f6e3fad7ea33e000080bf2cd83e3f4452cbbdac1a8a3f66b6a1be978ab2be61e561bfccd1d3be5c37633fbe884fbe000080bf130f403f6459d0bde02d8a3f91fa903ea1b216bf68d541bfcfdafbbe69ad163f523d24bf000080bf01333f3fd95fb6bd1b628a3f4414febd20c1403fb27225bf1941d73cdd50273fa5a3413f000080bf5587403fc6dcb5bd66878a3f3a88fb3e35b73c3f1088edbeb034d83b698b073f592a593f000080bf562b3f3f2882d8bd18ee8a3f3e82b0bc2d2f6abfc486cebe78405bbf946f663e61dfedbe000080bf9ad13f3f98a1b1bd166a8b3f9676983e2162743ffefe9e3bde16863e7250b1bd9011763f000080bf2d98403f6b65c2bd5f0d8a3fb2f5073f3782c53db28057bf05db49be38f57a3fda9145bc000080bf802d3b3f5f0809bedbde8c3f0c60ff3e84a75cbfd682ba3d38414cbfa1ccfebefd2faebe000080bffcab3b3f7fa0fcbd18ce8d3f48816b3f09b3503e657aab3e8d8a893ecf2b73bf9dad23be000080bf39803a3f0b4209bede8f8d3f7107073f572a58bfe8f1bf3d8d1246bff2e205bf400fb7be000080bf0a9f393fe19a0bbeaddd8e3fba5ae33ec65265bf8bc19dbc8bca57bfdb1bd2be9f24b2be000080bf153c393f100709bebd348d3f74f2c2bede4462bfc7198bbedc1a60bfa4dce03eb4c64ebe000080bf7e003a3fb8c908be008b8c3f699994be248c62bfba75babe66ca61bf3540ca3e2a9483be000080bf22513c3f8f1bfebdeb1a8d3f703d723f674a243e04ca8f3eaca67f3ed1116abfd03fa3be000080bfb9363c3f672a04be21748c3fed02683f5306bcbe943a56be1312d7beb65b56bfa123b3be000080bf30bc3a3ff017f3bdb0738d3f0387d63e39c9673fb5e18b3df86b683f5370d6be1f978fbc000080bfd0643b3ff51108be38698c3f2ae0f03e977f50bfffe2adbe0dcf61bf30a3d8bedf2a54be000080bf9cc23a3f591707be57058c3fabb18c3d05ba20bf767a46bf641564bf5e429f3e2263a9be000080bf52653c3f97a8febdcba28c3fae54763f64aa633eafe120be827a0f3e103566bf6a2bd4be000080bfeee83b3f2106fabd4d4d8c3f82c2233f4ac4133ff7ef01bf5fb4bc3ebd504fbf51b3e9be000080bf2ee73a3f2cb8ffbd0c3c8f3f207c753f7ea2a33d515a8b3eb5cc013ef2a47abf4afe22be000080bf62853b3fadddf6bd95d38c3f0a2a073f5205593f67c34fbdbf8a553fe36407bf993620be000080bf8d9a3b3f1e6f02be6afb8b3f7403043fce418cbd70a25abf6c450fbf7d1c48bf5fec8cbe000080bfeb54393f04a904beae468c3f52e83abf3e523abe149e28bf8acfc4be8302683fc6f2333e000080bf1268383f151e04bee0d98c3fd84659bf4023ebbdb72504bf0e5c99be6ba9683f1ba8943e000080bf5b083a3f804704bef0f78b3f5eb7d8be74b222be955764bf4831c4befb6a6c3fca048e3c000080bf4f923a3f6c5cffbd46ee8b3fee5267be099ea33e04956bbf39a5e8bdadf86d3fe48db33e000080bf3c15383fa6d009be6a868e3f0ea3febe7e1653bfaf198abe5dfd53bfd63c0b3fde180bbe000080bfa2603a3f7b6af5bd5b7a8c3ff6e180be2b4f533fe55901bf27ca673dd6a3083fcaff573f000080bf8ca0393f6d1ff2bd6a138d3fc426bfbe30bb5c3f9442afbe7bf68b3e53e2e83e9afa583f000080bf2f4e383f7a50f0bd74cf8e3f5bfab0be0ce96b3f483235be903fd43e3866a33eed2b5a3f000080bf7ffb3a3f71e6f7bddf338c3f67e2d73d1f023f3fd44b28bf2b86c2bca1ac293f01993f3f000080bfeee83b3f2106fabd4d4d8c3f82c2233f4ac4133ff7ef01bfee0acb3d6ec6173f77964c3f000080bf8d9a3b3f1e6f02be6afb8b3f7403043fce418cbd70a25abf86b43d3dd1607f3f961c55bd000080bf62853b3fadddf6bd95d38c3f0a2a073f5205593f67c34fbd7a24e23d327b18bc626c7e3f000080bf30bc3a3ff017f3bdb0738d3f0387d63e39c9673fb5e18b3d9a36a53ee80b60be40be6b3f000080bf65e3393fa6e9f3bdf3038f3fdd17083fe656543f66922f3e5800a93e2554c7be72245c3f000080bff5f3363f1cd303be26718e3f7c1469bfebc270bd2e9ad1bef83d5cbeb3aa693f8fcfb13e000080bf006f393fe04c0cbe616c8f3f026cf43ea0d55fbff0a2b23d3cfa4ebf16b1f3be0933b1be000080bf7a8c3a3f74b3ffbd8ece8f3f4e806d3f3a14e33d5677b63e8740263e9ccb7abf765bf1bd000080bfee3d383f5ad6fdbdd637923f1402673f8153c53dc00fd73eb2fe1a3e54c37bbfc5f2cbbd000080bfbe36373f7e94f1bda8e7913fd2c3fd3e3aa9583f03cb473ea48d573fb9f705bfd530063e000080bf3467393f821cf4bd97ab8f3f50ad043f2288543f3c42523e8398533f82420cbf3816043e000080bf65e3393fa6e9f3bdf3038f3fdd17083fe656543f66922f3ec260533fcc780dbf5e02e83d000080bfddb3363f70280cbea3ea913ff4a1b93e625c66bfb45a783ef92f43bf1342dfbe7dc2f4be000080bfb210353fbb280abed97b913f0e9feebec4da56bfce5d8fbeb3ab4bbfc837093f3f9390be000080bfe695373ff7580abe342b8f3f72fbf3be05b956bfefe186bee8e857bfbf4e053ffc8707be000080bff5d7333fe0a203be9643913f14045abfd641a7bd4b8b04bfd2b996be084d643f2fe6af3e000080bfc496363f962304be1bda8e3fae0063bfbe12d5bdc99ee6be1a8595be74a2613f921dbe3e000080bf027e353f7809eebd4294913fa64eabbeb0b5683ff86b7ebe71e64e3e2048a73e725b6c3f000080bf6ceb373f446cf0bd50348f3fb26ab8be7845693f20ab4cbe74fcc83ee44faf3e9f865a3f000080bf3467393f821cf4bd97ab8f3f50ad043f2288543f3c42523e7edca23ea5ead1becad55a3f000080bfbe36373f7e94f1bda8e7913fd2c3fd3e3aa9583f03cb473e2967e43d5ad191be54bb733f000080bfb3cd353f003a0cbe2481923ff7b19f3ef4686dbfae8a533e556340bf1768bfbe54270bbf000080bf56ba373f50e0fdbd12da923f9d0a6c3fefe89f393c32c63eb900b43d2d5b79bf919655be000080bf2192313ff5a10bbe0668953fe8d18c3e30df6fbfeb8a5c3e5a9f3abf04d7b2be97b416bf000080bf0b28343f23f609be020d923f003ce7be913b50bf31b3bbbeffc43ebfcee1113f4a54b1be000080bf6a51333f4c6b03bed2a7913f30964abfb02126bdaf291cbf8ebb67be4b44723f50306c3e000080bf060f2f3f70d204beb91b943fd2b50dbfaded86be903e4abfadf4abbe684e703f4a569fbd000080bfb2b9363f50a6f1bdd882923fd9df053fe774553f881a353e9e4796bd139626bee7e37b3f000080bf31b32f3f93c909bec58e943fb695a2be5aa45fbffccdbcbe0ac037bf837ef33eba3002bf000080bfc5e62b3fc8950abefc00963f2ca2cfbdce726dbf312eb8be90fd27bf2312ab3eae332dbf000080bff5bc2b3fee5d03be10cb943f10e2a8be5916c0beb9c45dbfa91182bee2476b3ffa439abe000080bf9464353f5dc1f6bdd23a963fd59a3b3f12b407bf4c67da3e0ac4f9be25ac58bf40d85abe000080bf4ed43a3faed8bfbdb54f933f50fb563f40bfd23ec846b53ef04cc13e244e69bfaff8273e000080bf2ec9393f4549e8bd29ec923f45ee1d3fc84e42bf261b553eb4d237bf7dac26bfdade7bbe000080bf3a583b3f66ddbfbd4694923f02774f3f4f43e93eb996bc3eb26bd13ee3dd63bf93da4d3e000080bf07b23a3fc6f7e5bd1e33923f4b781f3fb1d03bbf0f028b3e0fb330bf13c62dbfe94f80be000080bf86913e3f9df7dfbd38be8e3f932a2a3fcfce39bfa752353e71d62ebfb4b82fbff6cd7fbe000080bfc289383ff9d6e7bd3292913f9a2926be5bc277bff40145be18606fbff3345a3ea70b91be000080bf66a3373f4dd6e8bdeb57923f4c7a23be90f373bff2f583be1eb57cbfaf871b3e0b524c3d000080bf9773393f6cd0b7bd0f0e923f3cba2a3e2a297b3f7732c93dc672673fd17a44be937fc33e000080bf68233f3fe9d2bfbd7e1c8f3f47b7593fc422b63ef86ac63ee417b93e0b2e6ebfe2a1783d000080bf80823f3f9431bebd5e708e3f8a36603f560ec93eaea58f3e1463ce3e15366abf6c89b53c000080bf37fa343fed9df1bd1ac3943f4464633f51c2ecbc59baeabeaad126b96d7f7fbffa38803d000080bfa6613c3fc574e1bdc85d8e3fa38122be929276bf6c425ebed9ff72bf345a563e0f8570be000080bf09fd3c3fbaa3dfbd1aa38d3fb75131be6b9076bff4c952be8cec71bf7daa623e4d8076be000080bf4c333d3fecdfb5bd21e48e3f2c82683e3ce0743fb4513b3e429b6e3f8a2989be4fc9793e000080bf81cd3d3f4a99b4bdf2238e3f6a52623e9cce753fd6f92e3e50406e3f292285bea6c6833e000080bf49d93e3f13d7b1bd5c728c3fef11553e52e8773f32e10c3ed28d753fea0f6bbe8b09293e000080bf1441403f86e6babdc4cc8c3f6f605c3f4feece3eba4d9e3ed5b1e33e969164bfae9391bd000080bffaee3e3f9b1cdebd53238e3f86fa333f8ace34bf7632aa3dbfad2bbf7e8332bfd98a81be000080bf9ad13f3f98a1b1bd166a8b3f9676983e2162743ffefe9e3b1f23743f2f3098bea0253fbd000080bf431a413f4fc9b9bd51bd8b3f23f95f3ffdf2d13ed0f1833e3aa9eb3e469a5ebf024e37be000080bf5587403fc6dcb5bd66878a3f3a88fb3e35b73c3f1088edbe4e60253f03682abf6d4bbfbe000080bfaf43413fef3abbbdcefe8a3f1213623f308be93ef7f2e0bd8a69d23e326f5dbf267093be000080bfde8d413f0b7cc5bd83be8a3f1663793f01629ebdc34259bef308f0bd49ea79bf96ae3abe000080bfa8a6403fbebed6bdef728b3f4b9a3a3f27322fbfb281953c47112ebf2f103abfb4b6c6bd000080bf42ec403f506dd0bd50c68a3f12cb403f48d211bfa68ea8bedd0f1cbf18d74abfb25bc1bc000080bf130f403f6459d0bde02d8a3f91fa903ea1b216bf68d541bf78a34cbfb2c114bffa7c1c3e000080bffbce3f3f187cdabd4d858c3f1bce323f131435bf9cc2de3d49082ebf410934bf740155be000080bf382f3e3f6973dcbd2bf68b3f467219be98dd75bf887b70be9ee476bf16f8463e5b8b37be000080bf562b3f3f2882d8bd18ee8a3f3e82b0bc2d2f6abfc486cebe83ed7fbf0286c23cc506ecb9000080bf2d98403f6b65c2bd5f0d8a3fb2f5073f3782c53db28057bf4705f2bd40b179bf44c43ebe000080bf09fa433f2657b1bcfbe68a3f2b5c0dbf63a3db3ede0237bf16cc513f143ff93db25a0fbf000080bf2044463f3cdba3bc21cb8a3fd4459a3e65c4443fba7510bfdc8b733f9c8390bef8fefc3d000080bfd446453f0476b5bc9d9f8a3f680231bed4990a3fd0a252bfd2af793fe5afb6bc30da60be000080bf9f90453f637fd9bce6588a3fbc1223bebfc2c63c18a87cbf86b1793f103f223e092c1dbe000080bf75e4443f6c080ebd96cf8a3fa1c598be9d2f13bf300843bf4cdd553f6e306a3e6de4ffbe000080bf19aa423fadf6b0bcc9908b3f821746bf91f3c93e93c4fdbe43e2163fdd89253e4fa04abf000080bf21e7453fb9a600bda48e8a3fe5c1853dd086ddbeec3066bf001b6c3fa988bd3ef79ae3bd000080bfe606473f205f02bd4ab48a3fc96b163fc606ecbefd3d2abf7fd5463f4f420d3f30869b3e000080bf321e453fe96594bcc45b8b3ff881b1bc218b773fa80982beace6623f59a7cabddf9ae7be000080bf60ea433fad518fbc2e1a8c3fe51146be7bde7a3f892143bd5acd2d3f4f02ca3d77413abf000080bfeeee413f266daabc8c5d8e3f81a3f7bdbff37b3ff889043e7283fb3e4bc6303e2e8f5abf000080bf4d49463f0abc13bde73a8b3fad12c83edd0256bfaf42c5bef459593fb462fa3eddc94cbe000080bfd062453f954521bd98f88b3f7876943e12b46fbf6bb34abe32ae403fb4a4b33e61a00ebf000080bf29d0433f715519bdf7768b3fc9dd00bf53ba27bf0b3610bf2015223fb4e7273e56a841bf000080bf9144433fb20f32bd5f078e3f9e1a373e8eb178bf439a1fbe80a3213fee6d703ecd323dbf000080bf425d403f2a6fc7bc26fb8d3f2a0551bf7f4be63ec856b9be35c0ed3e8e530e3e9fea5fbf000080bfa86f413f17b927bdf9bd8d3fab001bbfad401ebf315200bf72d7143f762db13d631a4fbf000080bf57e9463febc5d0bcd3858a3fa291113f3ffa473e46904cbf31734e3fc874723d5e9d163f000080bf57ec3f3fa857cabc965f8e3f6aca3bbfbb53073fcbb2dabe12c0123fb115133eb6834ebf000080bfd3f9403f36ac29bdb20f8e3f8a5c14bf76e610bf901816bf9be3263febbce03d921440bf000080bfa5f63a3fb475f0bcb647913faeaa28bf5850143feeaff5bebc242a3fb80f193e44693bbf000080bfde923c3f48f8debc5fee913f5780023c5cc77b3f8e02393e00fd2f3f46d8003e451a37bf000080bf7000413f124cb5bcca318f3f803295bdf2c97b3f9642293e18930f3f82b4353e0f064fbf000080bf0343423f55dc38bd5dc38e3f41ca103efea378bf3e1b44be26732f3ff34a713e9a6430bf000080bf062e3b3ffa09e7bc77bd923f33029ebc83067b3f02ea473e90483f3f2755133e2e1a26bf000080bf15c73d3fbe4c54bdc171913f6d31843d53ec78bf44ca65be86a2413f0305473ec9e41fbf000080bf09153c3fa08243bd25e9903f3c280bbf3e3809bfb05a25bf093c383fde88c93da5f32fbf000080bfb4033a3fe04af6bcc1ca913fbf121fbfad4e1b3f66dcfdbe3669393f6a3a503ef5aa28bf000080bf130c333f8db715bdb9a6963f97c10bbebc267c3f41e2d83d08ac783fc8bc1d3e6e2d39be000080bf35963c3f28275abd162f923f1ed2993d6db177bf7d0b77be81ec503f1c6f4b3ee2ec0abf000080bfaef1313f202621bdd670953fe26d0bbf6cb02f3f65cff6bec381563ffe6bf03e15708ebe000080bf6e4d2e3fd5773ebd8525963f7b76acbe45c81f3f907834bf5a25373fb00b283f6416753e000080bf581f3b3fac8f47bd0760913f1c1bfebea58305bf25ac31bf6069443f0184e23d05bb21bf000080bf7234373f375080bd3998953f3fb4523fa39d9d3e955ef4be6c12103f986aa8be7622423f000080bf6c922f3f3c851cbda5bb973f4ee1adbd4f107f3f0e021e3cc9894b3f90967d3d05751a3f000080bf7d5d2a3f63ec44bd7860963fc219823ef362d43e0dab5fbf5494123fb3dc293f118ef63e000080bfb2bc2b3feb5524bd446e983f183a043ef0d97d3f96ffd43b2c919e3e85b03ebd1d1f733f000080bfe1cf283f935486bde0f7953f2213c8bdcbff963bd1c57ebfcabff33ee1dc603f43c22ebd000080bf06b9273f40de2bbdab5b953fea230b3f3d5b6fbedc624ebf79ea1a3feb53463f2bc03b3e000080bf9c19293f2ba612bd5dc0973f8f7b4a3fb0861b3fc25295bde6c480be6be2dc3e97cb5d3f000080bf4c8d243f848488bd7cd2953fc1936fbe7b6222bed68f75bf800ce23e9a975c3f421280be000080bf22c71e3f1cb38cbdf8a6973fdd341fbf7dce8abe63133cbf039faa3e0ee2413f0ac30fbf000080bf0dfd233f2c7eb3bdc617973f0442c3be6b000e3c7ba46cbf5f42c73e5395683f81b01bbe000080bf21b01e3fb891b2bd0684983f745a3bbfabf904be41422bbf0cc06f3ec9be5f3f4d01dabe000080bfbb42273fe8bbdbbc38f3933ffa850c3f3ac820bffa330dbf3e383f3f632c2a3fa1185ebc000080bfcf4d1b3fd463bbbd6f659b3f041960bfd5b2da3d3867f1bea59aa23edbc25c3f5fe5c9be000080bf3a951c3f5c1b6abd9949983f63aa6dbf2909a83aee45bebec746863ed6f4353f021827bf000080bf295c1f3fe8120ebd2b13963f86486cbfa3e10e3e09a2b7beff06bf3e3b8b0d3f3fbb3ebf000080bfbc1f1f3f6d75d9bd0e9f983f191950bf4583d0bd39ce12bfaec6673de354773f30e480be000080bffe7b1c3fa720dfbd5e9e9a3f703945bf0afb28beb3a61dbffdc245bcb832783f6b927abe000080bfe068233f9087debdd447963fe43909bf65729b3df23c57bf8e92773e23d1773fe6b488bd000080bf12f81f3fc424fcbd5de1973f235045bf99bd8ebe8fa912bfa25510be8696733fdffb8bbe000080bfcf31203f498230bd4c35953f598a0dbf339bc1be32153ebfb351033f313a0c3f653229bf000080bfb01f223fbb45e0bc0b97933ff7def5becebae9be45be3fbfa54d273f4a45c43ef91327bf000080bf5663213fea3caabc685a943fd31a75bf9a22e23d998988bee4ab933e665fa93ef60666bf000080bfe5ec213fd0d300bc1a14933ff9ae78bf812a543efa32edbd64bfd73dad9179bde4187ebf000080bf77d6223f9e3e82bca853923f06a124bf79b004bfa65010bf1326273f0d365e3c7fde41bf000080bf8c9e273fda8ea9bc40a1923ffc1ecb3efdc248bf8f43f4be60b2423fd963123f15789dbe000080bf84d6273f155795bc8d44923fcc0aec3e621a4ebf3f16bfbebb5c3c3f5bf8143f805ab1be000080bfb22d233f4b5a71bc54e5913f9c6415bf251333bfc62fd3be29be1a3fcb4b0fbdbbbd4bbf000080bfac3b223f6669a7bbf112923f54a67cbfeb201b3d728120be1e8d183e7cae21be38e579bf000080bf2218233f842ee13aa627903fa56072bf0de2d23db3219cbedd789e3e2ca2003dd04b73bf000080bf751e293f180541bcc443903f15da073feae040bf0ac7c6be6ebd433f2e8a1f3f123c28be000080bf6b29243f986810bcf1b98f3fae2d01bf172420bff45318bf11ff1d3f08e0613ebc5941bf000080bf20b2243f6f7e433c0bd28e3f9f3212bf7fc0f53e177b2abf3f2c513f8c24d23e574bcfbe000080bf26aa273f9f22073b828e8e3f2302283eadb990beeaf071bfad72513f9e00133f5765f3bc000080bf130e253fa3e96c3bdaac8e3f599ef0beb65126be211c5ebfe892443f5eb0d13e8835fcbe000080bf5985293f6e15443a4f238f3f8c28213feb02babed4d22fbfff4a2a3fa372353fec6e703e000080bfbbec273f1d015c3cc9ac8e3fe82a6d3ee61b1b3f69d642bf2677383f8e67d63e857a0d3f000080bffda42a3f944f0f3ced618f3f8c9e623fadc9913e1a52bcbeef0c1e3d65393e3f1d092b3f000080bf475a2a3f74b600bbfb07913fcb6d7c3fa593f8bd6f43e93d79ffff3d01e97d3fb079cebc000080bf7b30293f5f5c2abcf5a2923f5104763f8c227ebe20d2f93d8bcf873edcb4733f5d901cbe000080bf31d1283fbb977bbc9c51933ff389763f2aca89beff0336bca964853e1ef2703f9b475cbe000080bff2d3283ff50fa2bc863d953f6de87e3fdec1bc3d25008fbb08a3babd76607d3f1221e13d000080bf2044463f3cdba3bc21cb8a3fd4459a3e65c4443fba7510bf3820523f8ba1bc3df150103f000080bf21b0463f6344a2bce4db8b3fde122d3fe8f42d3f71e2913e474c323e20e805bf7e95553f000080bf0803473ffd31adbc3d468b3f098a3a3fe1492b3fbba115bec953fd3e65cabbbed2ae493f000080bf14ae473f460bd0bc412a8b3fb0dd763f9b73733ec683eebd6abd773e21df1cbf5797403f000080bf2c82473f904c07bdebc68b3ff1c3693f1ff3b5be897b4c3e63b0c8be408921bfbe622b3f000080bf8d96473f8cf6f8bcf4358b3f693c713f75da7cbe715a67be6554a8bc846937bf5784323f000080bfe606473f205f02bd4ab48a3fc96b163fc606ecbefd3d2abfcbcf053e95ca41bf50e5233f000080bf7e8c453fd02b9ebc4e9a8c3fea8f0e3f8d283a3fcb7ecd3eb70cadbb03d1f5beac8f603f000080bf60ea433fad518fbc2e1a8c3fe51146be7bde7a3f892143bd96ea6e3e4eafbe3d74ca773f000080bfb092433ffe99c1bcbad88e3f7f40223f6d661d3fbc4bf03eff7f45bd0afd12bf653b513f000080bf2c81443f840f25bd069f8e3f583a563f5692d3bef3ddb73e48230cbf01591fbfbb320f3f000080bf321e453fe96594bcc45b8b3ff881b1bc218b773fa80982bec8370a3fd987663e54a14f3f000080bf4d49463f0abc13bde73a8b3fad12c83edd0256bfaf42c5beaa62efbe07720abf1701333f000080bfd062453f954521bd98f88b3f7876943e12b46fbf6bb34abeec003dbf2070b3bedb86133f000080bfac90463f683c11bdba858c3fcb025c3f764ac2be336eaf3e709602bf5f5717bff0ee1f3f000080bfeeee413f266daabc8c5d8e3f81a3f7bdbff37b3ff889043e46c9e43dc7b5edbd06a87c3f000080bf9144433fb20f32bd5f078e3f9e1a373e8eb178bf439a1fbe83515dbf384d6cbe1a99e43e000080bf57e9463febc5d0bcd3858a3fa291113f3ffa473e46904cbf9090483f5d6bd9be674fe83e000080bfc4b5423f01f6d1bc31b38f3fb690223f4b6a0a3f5d3e0d3f29e21abef6051dbfe671463f000080bf7000413f124cb5bcca318f3f803295bdf2c97b3f9642293e08f4473c53cc28be857a7c3f000080bfbc74433f2c642ebd145d8f3f1bf3443f094401bf265fc83e218923bfc9041abfc785f53e000080bf0343423f55dc38bd5dc38e3f41ca103efea378bf3e1b44be003e66bfd0d553bedd2dc53e000080bf87f93e3f3a924bbd473b923f88e63d3fdfe90dbf943ac13e757f2bbfe82f16bf51f7e83e000080bf15c73d3fbe4c54bdc171913f6d31843d53ec78bf44ca65be908d6abf006116bee7ddbe3e000080bfebfe3d3f787e51bd3ffe923fd366423ff3a708bfb976be3ece5526bf409517bf1a0ff43e000080bf5e2a3e3f76fa01bde28f923f5868253ff115063f0d1e0e3faa7c32be415c1bbfbf83463f000080bfde923c3f48f8debc5fee913f5780023c5cc77b3f8e02393ea4e7033da12d39bef1a47b3f000080bf302e3d3f231205bd7253933f56ca1c3f1de00c3f3648113f734319be8ecb1fbf9f4c443f000080bf35963c3f28275abd162f923f1ed2993d6db177bf7d0b77be06ea60bf1fef36be6ec9e23e000080bf062e3b3ffa09e7bc77bd923f33029ebc83067b3f02ea473e71b42e3d61f146be7be27a3f000080bf32392d3fcbbfb6bd0f0f953fbb9d98bedab2f43dd07072bf0011ba3ee37e6e3fe0b54e3b000080bf1ff5273f7826b4bd6f64963f503eb6be1a2a213e0cd16bbf6df0c83eee746b3f0521b43b000080bf6aa02d3fedf483bdd66e953f9192acbef042423e91136cbf2b49083fe4a4583f0bd6a7bc000080bf5b25343f7d6473bddf35943f15d3edbe4862af3de3a461bf3129393f7e691c3f4bc3a4be000080bfa8373b3fc497a9bd20ef913fd6c2a7bcee4379bfca6368be114878bf0b9612bdf4d8763e000080bff298353ffa49b5bd4469953f3825593f42c28cbc098407bfda96f13d86de77bf39bd613e000080bf6ebf383ff7e6b7bd98bd923ff8a12b3ec3027c3fa4e2593dfea87b3f870f2fbeb4b6873d000080bfb2b9363f50a6f1bdd882923fd9df053fe774553f881a353e770b5a3f75d300bf637815be000080bf33de46bf360572bda3ea893f955869bf275ec63ea8510d3ef2a0903e1469553fc300f3be000080bf5a4547bf836a83bdb4b0893f90727fbfd8e139bdaa61423d857c7bbdffab663f1ad0dbbe000080bf174a46bf0f436bbdf88a8a3f0fcb5cbfdbbad13e252e983eb07f4e3ed919513f08600abf000080bf5d7046bfcdaf66bd1f68893ff9b119bf400e313fb792cdbe64c14b3f1d8bef3ebfb7c4be000080bf825446bfe96293bd083a8a3f1be53fbfb99a26bfe643f73dd53722bfe221273f9a7dd4be000080bfb4c846bf9bcb8dbd1aa3893ffdcc57bfd29904bf05c214beda01dfbe68ce503f26f7c2be000080bf384a46bf22388ebdc30c893ffc1be9be68920dbf17a132bfcdfacdbe3db1533fb226c9be000080bf168945bf86cb6abd8fab8b3f033552bf5c97e93e7a96af3e45bf293e17fe433f08211fbf000080bfed6345bf341497bd635e8b3fbc223ebf6ca424bfc3e23e3e968427bf9058233f86c4cfbe000080bfea2245bf047695bdd49b893f49a257bd07f56bbf7dc2c4be7e095dbfb501713e6e75e4be000080bf3a7545bf5b9a5bbd53218a3fb021afbe688e703f1afe73bb86ba2b3f8733773e1b8433bf000080bf543a44bfca375bbdc32d8b3faaa93fbe337c793f4ca2fc3d28050f3fa4e8553e817a4dbf000080bfbb0f44bf7ec46fbdd28e8d3f8a1c4abf2887f83e654ec03eedb81c3e41933f3f003a25bf000080bf04ff43bf05329bbde82e8d3f591a3dbf04b423bfa4425a3ebbc12bbf21c72a3f09c7a5be000080bf9cc246bfef1e80bd05fa883f6af826bf7be3fa3dc3803fbf5964e23ed1f05c3f5c0d7abe000080bfd0ef43bfed2c9abdbec08a3f7b41023d707d79bf3b2363be5b5a72bf0a402b3dbe8aa3be000080bfaa3042bf50e39ebd499f8c3ffe11833d222c7bbf2cc33abe57f279bffd83c2bcd4065cbe000080bf9e5d42bf81ea5fbd7e1c8d3f7263fdbd66257b3ff6c1183e94d3073f230f453e5a5453bf000080bfa46e43bf558972bdbe4c8e3feb0a40bfadefef3ea2dbee3e9e17b83d936f453f0c5321bf000080bf475943bf8fe29cbd3eec8d3fd2eb32bfbb7326bf9d89983eb11337bfed13243f72ca8ebe000080bf695741bf8fc3a0bd77698d3fff51803d6ab17bbf5bb22fbebb137cbf4b9b06bd44612fbe000080bf88643cbf4510a7bd0c06913f0362483dc4767bbf194239bec5167ebf17b1e1bcb051f3bd000080bfa6633ebf5abda3bdacc7913f969631bf6a2228bf2662973e303c37bf79a62c3f929739be000080bf3e453ebf0f7b81bd9032923ff3a33abf567b003f7f46ee3e3281c43dfb873f3fa31228bf000080bf103e3cbf18e76fbd828d913fa41192bd98aa7b3fb4d12c3e5620fe3edc1a3a3ee85059bf000080bf687a41bf884762bd9fe78d3fa4b2d2bd16e17a3f0e722e3e5da7033faec74b3e608f55bf000080bf43583dbf49d982bd1c25933f7d523cbf46f7f63e3e7ff33ec4862c3eea704f3f04ae0fbf000080bfd2163bbff08674bd567d923f30e34dbdeaf57c3f6aaa143e3ee6563fe1e6f63d2ea707bf000080bfc1713dbff8fea6bd5a9b923f990e2fbf8b6c2cbf28ae8f3e8eef39bfe6432a3feeb331be000080bfa8373bbfc497a9bd20ef913fd6c2a73cee4379bfca6368be166676bf2eee2c3d6f3689be000080bf2d0637bfb81dbabd1c27973fa6525bbf7ed258bedacaf03efb1ba3beda316f3f547f23be000080bfe04d37bffa2582bd247e973f2e3d48bf72529d3d8b481e3f0e0992be9a8f563f140feebe000080bf723437bf375080bd3998953f97b352bfaa9e9d3e2e60f4bef2470d3f9d88703e2cd74cbf000080bf35963cbf28275abd162f923f1ed299bd6db177bf7d0b77be76bd5cbf0bf73c3eb97af1be000080bfa85134bfae83c3bd4d4c993fa90946bf725471bec896163fdbca8ebec1cc753fabbe923c000080bfba0034bf27c286bda0ab993f5e5731bfb44c793e4bc92d3f1374fcbca9316e3faaf2babe000080bfcc422fbfac1b8fbd0a119c3f07ce1bbffb55993e7a1a3c3ffb11ae3d1200723fbd39a1be000080bff5ba31bf31ef31bdd7be983f7042b2be49f4273f5b6a2b3f0a99d93cd48c383fb84931bf000080bff9f52bbf281036bd2b4b9a3fb1eac3bea9d2413fe48b073f74108f3ebe1e243f54fc36bf000080bf68752abff59d9fbd304c9e3f046925bf5c84663e72b13a3fc43e063e155b793f9af23cbe000080bfb70d2bbf118dcebd6bd89d3fb01c31bf44cb5ebeae40303fdc7636bed2b8793f454f043e000080bfd2a92fbf5b07c7bdcf819b3f64aa32bf390b6dbe5f802d3f0df05ebe4c59783f9b75db3d000080bf71e42dbf6615f6bdcf9f9a3f7eac14bf94f619bf52740c3f4d90e9be89724c3f7cfdc83e000080bf7c2732bfcc25f5bd2784983f6c2222bf310e12bfffd9053fa729e8be0233523f6982b13e000080bf60e429bf62a1f6bdc9e89c3f287015bf325a1cbfeaf5083ff66de2be43b14a3f4db9d73e000080bf946435bf5dc1f6bdd23a963fd59a3bbf12b407bf4c67da3e942d02bf50de573fe675323e000080bf4ed43abfaed8bfbdb54f933f50fb56bf40bfd23ec846b53e5143b83eb007693f3f9051be000080bf26c325bfc3a00cbebbd09a3f18da94be6da36cbfaef37c3e238223bff76ac23e98522b3f000080bfc74c2abfbb640cbe2bdc983f781e90be0e7a6bbf75ea8b3e45ac20bf4ba8c83e56342c3f000080bf0d2d2ebf1e190bbec824973fba0192bec8006ebfb8b26e3e072936bf4690bc3e792e193f000080bf2a9021bf4ad40bbedee49d3f335e97be6c1f6dbf605b6f3e7a9f22bf8e29bf3e81122d3f000080bf219231bff5a10bbefd67953fe8d18cbe30df6fbfeb8a5c3e046d41bfaac7b23e09e30d3f000080bf0d3427bfc2a177bdc4059e3fc68cfcbeda78173f163d233fd028a43e381a4e3f4f81ffbe000080bf75af23bfa03329bdfe7f9c3ff462c5bd5a59513f5642113f2784d43edc180d3f4e4d39bf000080bf674322bf6c239ebd74efa13f78680fbf93dbcf3e2dd9383fba8c793e20f3693fd544a6be000080bfb5c01ebf34d67ebdac6fa03f6c99193e47a6633f4a3edd3e70dcfa3ec421a03e184f50bf000080bfe0661dbfb7412dbdd1ea9a3ffb6b433f8e8d173f5455843e9da5a73e9a271fbcf7df71bf000080bfe0bd1bbf488892bd130b9e3f5a37573f2658083fea82c8bd7823783df7588bbefed875bf000080bfcf4d1bbfd463bbbd6f659b3f0419603fd5b2da3d3867f1be94d9cdbe99f2c2be702b55bf000080bffbe51fbf392ba2bc5245973f7dae243fe2e23e3fbcea313e5dcd9f3e1a5645bd07e672bf000080bf564a27bf9f03cbbcf46c983fc0fef4be3270433f821ede3e8b55e43e2d0b233f20fe20bf000080bf62f828bfb0c619bdf5f6993f0814f9be44474a3f16e3be3eae679e3e110c0e3f63b345bf000080bf3a951cbf5c1b6abd9049983f63aa6d3f2909a83aee45bebe18d5aebebc89c8be8cb95abf000080bf9c1929bf2ba612bd5dc0973f8f7b4abfb0861b3fc25295bd1ca3ec3e07dd033f39cb38bf000080bfb2bc2bbfeb5524bd446e983f183a04bef0d97d3f96ffd43b6832d43e2f71753d267968bf000080bf6c922fbf3c851cbda5bb973f4ee1ad3d4f107f3f0e021e3cd7875b3e436b10bca0097abf000080bfbd3627bf804ab5bd70d19f3f296b30bfbbe217bd5243393f2b20a33ce9517f3fbc7e8f3d000080bf2fde23bf8c66e5bd2523a13f4f4833bf64d6b3be12161f3fb86f66be714f6f3f42ae8c3e000080bf182227bfd768d9bd13809f3fa23c35bf08428abe6610273f9bd332be7c56763f82ba553e000080bfd2a626bfe42df7bd67479e3f72970abfa2dd1dbf814f123f776fd9beb487493fbcede43e000080bf295c1fbfe8120ebd2b13963f86486c3fa3e10e3e09a2b7be8ac775be731005bf38e451bf000080bf1cd121bf8b1b37bcc47a953f943e1c3f2e653e3f549e8b3e6e8ab73e0b38433d92ac6ebf000080bf566321bfea3caabc685a943fd31a753f9a22e23d998988bef3606bbe06bf88be66946fbf000080bfe5ec21bfd0d300bc1a14933f91ae783f4932543e9732edbdfa8ab8bd179c04be41cb7cbf000080bf73bc22bf5bd166bbbbd1933f2916113fcefe3c3fca42bb3ec8d4cd3eeb0a0f3e84a867bf000080bfca5128bf4260e5ba9e06943fef591dbfd22d133fb7410a3f0c45ab3ea45e4f3f9c94f6be000080bfe57a27bf742758bce737963f0f0bfdbe37b4373ffe3efb3e8bfbdf3e1d6e313fdfab12bf000080bf31d128bfbb977bbc9c51933ff38976bf2aca89beff0336bc44ad82bed6c96c3f3c3290be000080bf589228bf31eb453ba54d933fff5705bfcd5c363f9fd3f03e8466ca3ea18d303f3c511bbf000080bf7b3029bf5f5c2abcf5a2923f510476bf8c227ebe20d2f93d01578abe27c56f3fe37264be000080bf475a2abf74b600bbfb07913fcb6d7cbfa593f8bd6f43e93d25b426be8086583f9f0f02bf000080bff2d328bfdc0da2bc863d953f6de87ebfdec1bc3d25008fbb80f9b23d4f456d3fa4f4babe000080bf7c6229bf4356b73be3a7913f5a041abfaeea2d3f591bd73ee7b27d3ef8a2283f88dd35bf000080bffda42abf944f0f3ced618f3f8c9e62bfadc9913e1a52bcbe2849ea3e263dc83ed66c4cbf000080bfeaee22bf9a0af13af303933f0186183f80b03a3f5a46ac3e2623ba3e48c6033e64326cbf000080bf9b3b22bf6669a7bbf112923f54a67c3feb201b3d728120beea7c1dbedfa291bd5e4c7cbf000080bf221823bf842ee13aa627903fa560723f0de2d23db3219cbe82da89beb30f88be7bf96cbf000080bf558a29bf4f90583c50ff8f3fc23310bf8f5e513f0bd3f03d8cfde83e400ada3eda3248bf000080bf346527bfa9bd883cb7d08f3f4182adbd92957d3ff2a2dc3d0598fe3e16fc0a3e4d5f5bbf000080bfbcc923bf2234023cd21c913f514e153f108d463fb043773ec11fb13e4e42023d200e70bf000080bf21e824bff86e733cd7a48f3f8bb3023f9f0c5c3f8581b3bc0e94d23efd7388be0f265fbf000080bf20b224bf6f7e433c0bd28e3f9f32123f7fc0f53e177b2abf3db460bd318049bf0b471dbf000080bfbbec27bf1d015c3cc9ac8e3fe82a6dbee61b1b3f69d642bfac651b3f257705bf658a19bf000080bf7d4044bf3b8b5ebdd07f893f46abce3ef092393f47e60ebf92e3643faf46e2be76ba943d000080bf543a44bfca375bbdc32d8b3faaa93fbe337c793f4ca2fc3d10d77a3ffb86343ee664c03d000080bf2ee342bf61885cbdd9938a3f73d60c3f579b433ffe7eacbe4950523f3586d8be68cac33e000080bf9e5d42bf81ea5fbd7e1c8d3f7263fdbd66257b3ff6c1183edadf753f0310a53d7a78883e000080bf3a7545bf5b9a5bbd53218a3fb021afbe688e703f1afe73bb3049653f644fa63eae8d9bbe000080bf5d7046bfcdaf66bd1f68893ff9b119bf400e313fb792cdbe5fc72d3ff181333ebf8b36bf000080bffb5845bf53ec68bd622e893fe2419abdbaf31c3f3e5249bf5d14663fb48a99bea1c6a3be000080bf693845bf15747bbd1fd9883fe5da2d3e0694613e44e675bfa36f4a3fcab31cbfcf6a20ba000080bf030744bfc0048ebdc922893f28fe033f2ac3c6be278b43bfdbe8fa3e6a0019bf4f71223f000080bfb64c42bf192091bd35288a3f63e2393fa042cfbee0470ebf0bea9f3e07a306bf08864a3f000080bfd0ef43bfed2c9abdbec08a3f7b41023d707d79bf3b2363bee189263eaa0e5bbe6195763f000080bf603a45bf7c9c89bd10ec883f45e2763d43527cbe54a077bf677d223f610a3dbf1f20693e000080bf384a46bf22388ebdc30c893ffc1be9be68920dbf17a132bf2513223f3b8b40bf3e633b3e000080bf9cc246bfef1e80bd05fa883f6af826bf7be3fa3dc3803fbfbc7f213f7237ebbee51120bf000080bfea2245bf047695bdd49b893f49a257bd07f56bbf7dc2c4bee1abc73e491abfbe207f573f000080bfde5840bfaebc64bdaeb88c3f4dc2253f7e60343f1aa694be0eda3a3f607dedbec989003f000080bff43840bfd82996bd485a8c3fdacc423f7e23ecbe62a7e9bedf9e563eea59fbbe647a583f000080bfaa3042bf50e39ebd499f8c3ffe11833d222c7bbf2cc33abedda68d3b7cdd3abeeeb27b3f000080bf687a41bf884762bd9fe78d3fa4b2d2bd16e17a3f0e722e3e5aae753f951a583d91578d3e000080bfb2d73fbf7f6866bd1d1f8d3f02501f3f40ac333f4476b1beb665443f7cf9eabefb70e53e000080bf50e439bfb69a75bd4eef903fd3fc223ff7502e3f2f4fb9be13fb423f1ab5f6be00d5dd3e000080bfbbb63fbfc23597bdfacf8c3f6de3353f88a4eebe8ef606bfd6af753e12390bbf6add4d3f000080bf695741bf8fc3a0bd77698d3fff51803d6ab17bbf5bb22fbe5100b03c26a42ebe81307c3f000080bf103e3cbf18e76fbd828d913fa41192bd98aa7b3fb4d12c3e277a7c3fa20e353d8321233e000080bfd2163bbff08674bd567d923f30e34dbdeaf57c3f6aaa143e0e067f3f80a9203db89e9f3d000080bfc70e3abf45b79ebd419f903fce4a2e3f02f4f9be44c80bbfe54c9c3e7c1efabee541513f000080bf88643cbf4510a7bd0c06913f0362483dc4767bbf194239bead73103eada930bee68f793f000080bfa8373bbfc497a9bd20ef913fd6c2a73cee4379bfca6368bebb48823e10965bbe0369713f000080bfc87b39bf7e18a1bd2619913f6ef01c3f32c80cbf443611bfdae2b53e8c1ae6be5dd4513f000080bf691d39bf2e0479bdda73913ffee8233f0e31293fa86fc8bec046443f99c014bfa0c68b3e000080bff29835bffa49b5bd4469953f382559bf42c28cbc098407bfb178d83ecaba1fbf8e3f28bf000080bf20ba34bfd193b2bd8d67943ffec1a93e8b61073ed9226fbffeefdf3e701a66bf299ce53c000080bfe09f36bfa4c2b8bdf818923f355e0c3f1a55483f4cfe96bed359e73dc762d6beedab66bf000080bffd4b32bf957ee2bdf208943fdd24fd3eb1a6893e079c53bf4c37cabd956c6dbf8caeb8be000080bf5b2534bf7d6473bddf35943f3fd3ed3e2652af3d0ba561bf1460343fa57f23bf7a5a9e3e000080bf32392dbfcbbfb6bd0f0f953f279a983e6cb3f43d617172bf7a20a93e589971bf8a8577bc000080bf25222cbf8e02e4bd07ea943f0aeb7a3edb71a83dff4c77bf3e03d53ccc207fbfa844a0bd000080bf38d926bf58a9e0bd207f953fa1edad3ee381d83d22406fbf2a56283ea52b7cbf89a553bd000080bf723437bf375080bd3998953f97b352bfaa9e9d3e2e60f4be6dbb0f3f26d4a03e7afc43bf000080bf581f3bbfac8f47bd0760913f0c18fe3e2b8405bfd8ac31bff7e7403f3a8f0dbe3488243f000080bfaef131bf202621bdd670953fa56e0b3f59af2f3fbdd0f6bec112563f0af1f9be92d77f3e000080bf639926bf8d5d02be2aa7953f857ac13eca4ed4bec8ea53bf72578abebe9167bf04d8a83e000080bf06bd2bbfee5d03be10cb943f8edea83ed616c0be49c55dbf68a096bebcac69bf540d913e000080bf060f2fbf70d204beb91b943fd2b50d3faded86be903e4abfa3f9c0beadd86cbf2b62363d000080bfbcce22bf65c500bec0b2963fc46b123f8ecacdbe440e37bf07dd5abea4256abf64b2af3e000080bf072835bfb70bedbd5af9913fce62533e41a36f3ff0d591beac7412bd5c4091bebd4f75bf000080bf37fa34bfed9df1bd1ac3943f506463bf7383ecbc65baeabecf38e53cd7e37fbf841d0f3c000080bfc5e62bbfc8950abefc00963f9a92cf3dfd726dbf562eb8be94e82fbfba4ba7be3c1e263f000080bf20b32fbf93c909bec58e943fb695a23e5aa45fbffccdbcbe2f143ebfba21f1be68e2f33e000080bf7fdb27bf9be60dbeae2a973fdfd1f23d194671bf5e05a0beaea522bf97b7a0be4c9f343f000080bfd26f23bf7c9e0fbe76fb983fa783783e93d971bf50bb61be42581ebf09c8a6bef10d373f000080bf309d1ebf033f0abed42b9b3fa727033f8afe48bf422ab2be061a13bf71511dbf70600a3f000080bfb3cd35bf003a0cbe2481923ff7b19fbef4686dbfae8a533e4e0647bf668abf3e2f6f013f000080bf56ba37bf50e0fdbd12da923f9d0a6cbfefe89f393c32c63e2a4e8f3d01d17b3f27e0293e000080bfee3d38bf5ad6fdbdd637923f4c0167bfd652c53d1713d73e15f8073e414b7d3f8bc46e3d000080bf12f81fbfc424fcbd5de1973f2350453f99bd8ebe8fa912bf97262abeedbd74bf587b773e000080bfbc1f1fbf6d75d9bd0e9f983f1919503f4583d0bd39ce12bf9280073dcb9579bf0f44613e000080bffe7b1cbfa720dfbd5e9e9a3f7039453f0afb28beb3a61dbf907e1fbda2ee79bfc0025a3e000080bfcf4d1bbfd463bbbd6f659b3f0419603fd5b2da3d3867f1be768f9b3e9e5061bf78c1ba3e000080bf21b01ebfb891b2bdfd83983f745a3b3fabf904be41422bbfd574553ea45764bf4b68cd3e000080bfe06823bf9087debdd447963fe439093f65729b3df23c57bf3723573e01037abfdd863b3d000080bf22c71ebf1cb38cbdf8a6973fdd341f3f7dce8abe63133cbf62e89c3ed77147bf90020c3f000080bf3a951cbf5c1b6abd9049983f63aa6d3f2909a83aee45bebea1ae813eece33bbfac55213f000080bf295c1fbfe8120ebd2b13963f86486c3fa3e10e3e09a2b7bea349bd3e199014bf24c3393f000080bfcf3120bf498230bd4c35953f598a0d3f339bc1be32153ebfd7c0fb3ed44312bf1138283f000080bf06b927bf40de2bbdab5b953fec210bbf54536fbec8644ebf0db8123fe4184ebf6fa31cbe000080bf0dfd23bf2c7eb3bdc617973f0442c33e6b000e3c7ba46cbf6e62b53eb0cb6cbf5dc80c3e000080bf4c8d24bf848488bd7cd2953fc1936f3e7b6222bed68f75bf5d26cf3e359961bfe73b7a3e000080bf7d5d2abf63ec44bd7060963fc21982bef362d43e0dab5fbf839e0a3fa3ff2fbf6fc0f7be000080bfb2bc2bbfeb5524bd446e983f183a04bef0d97d3f96ffd43bd1f9863eaf7d263d89b976bf000080bf9c1929bf2ba612bd5dc0973f8f7b4abfb0861b3fc25295bd9cc791bec619f1bef9c055bf000080bf6c922fbf3c851cbda5bb973f4ee1ad3d4f107f3f0e021e3cd3c2433fcf7671bd134624bf000080bf7f4d2ebfd5773ebd8525963f0572ac3eefc91f3f267834bf1069313f5dd22bbfeabd86be000080bf130c33bf8db715bdb9a6963f4ec90b3e78267c3f07e2d83dc27e7a3f3d5e1abe5128103e000080bfe1cf28bf935486bde0f7953f2213c83dcbff963bd1c57ebfa803e13e5dbc65bf69af1f3d000080bf30f527bf7826b4bd6f64963f503eb63e1a2a213e0cd16bbf7e92b73e75eb6ebf8456abbc000080bf6aa02dbfedf483bdd66e953f148fac3e7043423e2d146cbf96de003f48315dbfad12cc3b000080bfb4033abfe04af6bcc1ca913f01121f3feb4f1b3f38dbfdbe53843b3fd08f66becc78243f000080bf062e3bbffa09e7bc77bd923f33029e3c83067b3f02ea473ec5b8443f58ce0ebe8ee11f3f000080bfa5f63abfb475f0bcb647913faeaa283f5850143feeaff5be74892c3f96582fbe9cf8373f000080bfde923cbf48f8debc5fee913f578002bc5cc77b3f8e02393e7d51363f5a53f8bd8b02313f000080bf57ec3fbfa857cabc965f8e3f2ccb3b3f4f52073fadb3dabea38d153f0f5b2dbe07344b3f000080bf09153cbfa08243bd25e9903f3c280b3f3e3809bfb05a25bf04e8343fa1e4fbbde65f323f000080bfd3f940bf36ac29bdb20f8e3f8a5c143f76e610bf901816bf12ac223f51e20bbe868d423f000080bf986f41bf17b927bdf9bd8d3fab001b3fad401ebf315200bf6746103f3bb6e4bd0788513f000080bf700041bf124cb5bcca318f3f8032953df2c97b3f9642293e91fa163fc05c34be4ac3493f000080bf315d40bf2a6fc7bc2ffb8d3f2a05513f7f4be63ec856b9bee4fdf23ebcc729be804c5d3f000080bf29d043bf715519bdff768b3fc9dd003f53ba27bf0b3610bfedf41c3f191241be0165443f000080bf914443bfb20f32bd5f078e3f9e1a37be8eb178bf439a1fbec1961a3f1c086fbebc1b433f000080bf034342bf55dc38bd5dc38e3f41ca10befea378bf3e1b44be770c293fa25772be2473363f000080bf15c73dbfbe4c54bdc171913f3f2184bd74ec78bf64ca65be6ffd3b3fa44a4bbec72b263f000080bfd06245bf954521bd98f88b3f787694be12b46fbf6bb34abedfbf3a3f0944b3bedb6b163f000080bf75e444bf6c080ebd96cf8a3fa1c5983e9d2f13bf300843bffe65513f04bb83be3db8033f000080bf4d4946bf0abc13bde73a8b3fad12c8bedd0256bfaf42c5be7291553f013fffbe043b713e000080bfe60647bf205f02bd4ab48a3f756a16bfe107ecbec93e2abf7c50443f775d14bf8f338dbe000080bf10e745bfb9a600bdac8e8a3fe5c185bdd086ddbeec3066bf00bd673f1149cfbea727043e000080bf9f9045bf637fd9bce6588a3fbc12233ebfc2c63c18a87cbfa2eb773f76c04abe29081b3e000080bf09fa43bf2657b1bcfbe68a3f2b5c0d3f63a3db3ede0237bf9915533fe0db1dbed25c0b3f000080bfd44645bf0476b5bc9d9f8a3fc60a313e42980a3f69a352bfa6e87a3f85d143bc38d64a3e000080bf204446bf3cdba3bc21cb8a3fd4459abe65c4443fba7510bf6103743f8980843ecf3720be000080bf19aa42bfadf6b0bcc9908b3f8217463f91f3c93e93c4fdbe7fca183fe38044be6f71473f000080bf321e45bfe96594bcc45b8b3f1643b13c2c8b773fae0982be3e2f673f2a83b83d9803d73e000080bf60ea43bfad518fbc2e1a8c3fe511463e7bde7a3f892143bd52c3343fd0b8d7bd3042333f000080bfeeee41bf266daabc8c5d8e3f81a3f73dbff37b3ff889043e614b053fb71132be7efa553f000080bf57e946bfebc5d0bcdb858a3fa29111bf3ffa473e46904cbfb5ce4c3f7de4c1bd6eaa17bf000080bffcab3bbf06a1fcbd18ce8d3f48816bbf09b3503e657aab3ebe91823ecbbc753f2b43ee3d000080bf802d3bbf5f0809bedbde8c3f0c60ffbe84a75cbfd682ba3d3cf54fbf0c64003f8962983e000080bf39803abf0b4209bede8f8d3f580707bf2f2a58bf0602c03d3cff49bf581d073f72f6a03e000080bf0a9f39bfe19a0bbeaddd8e3fba5ae3bec65265bf8bc19dbcd5f95abf31b8d53e070e9d3e000080bf7e003abfb8c908be008b8c3f6999943e248c62bfba75babec64665bfc13fc5bea9bc633e000080bf22513cbf151cfebdf41a8d3f703d72bf674a243e04ca8f3e8dc1763e2dcb6d3f4802903e000080bfb9363cbf672a04be21748c3fed0268bf5306bcbe943a56be6407d6becf135a3fc891a13e000080bf30bc3abff017f3bdb0738d3f0387d6be39c9673fb5e18b3d2b1a683fb5b1d73ec266b9bc000080bfd0643bbff51108be38698c3f2ae0f0be977f50bfffe2adbed5df61bf7141e13e39322b3e000080bf9cc23abf591707be57058c3fabb18cbd05ba20bf767a46bfead068bf4e658fbe36619d3e000080bf52653cbf97a8febdd3a28c3fae5476bf64aa633eafe120beea84173e235a693f9972c43e000080bfeee83bbf2106fabd4d4d8c3fd9c123bfb2c3133f79f101bfa971c93eab2c503fea95db3e000080bf2ee73abf2cb8ffbd0c3c8f3f477c75bf48a1a33d4a598b3e1082ed3df06f7c3f59f8f33d000080bf7a8c3abf74b3ffbd8ece8f3f1c806dbfc523e33d3077b63e1ac6173ebc5c7c3f26e8a13d000080bf51853bbfadddf6bd95d38c3f0a2a07bf5205593f67c34fbdccf7563f5fb1073feb9ff13d000080bf8d9a3bbf1e6f02be6afb8b3f040204bf5e428cbd50a35abf715d08bf376e4e3f6c8f833e000080bf153c39bf100709bebd348d3fdff2c23e5b4562bf03168bbe35f562bf4968ddbe2c53283e000080bf3c1538bfa6d009be6a868e3f0ea3fe3e7e1653bfaf198abe1a6456bf939709bf6787ca3d000080bf006f39bfe04c0cbe616c8f3f026cf4bea0d55fbff0a2b23dd8ea52bfedb6f53e85599a3e000080bfda5439bf04a904beae468c3f52e83a3f3e523abe149e28bf3fa2d1beb86063bfa07e55be000080bf126838bf151e04bee0d98c3fb547593f2f24ebbd462404bf4808a3be56ea63bf85aea6be000080bf5b083abf804704bef0f78b3fb4bad83ee8b122bed05664bf023cd9be269667bfc5b824bd000080bf4f923abf6c5cffbd4eee8b3f394b673e549ea33e70956bbf89071ebe4ac66bbf1d25b7be000080bff5f336bf1cd303be2e718e3f7c14693febc270bd2e9ad1be70526dbe8e7064bf104ec6be000080bfa2603abf7b6af5bd637a8c3ff6e1803e2b4f533fe55901bf5b4bbe3c87ef06bf357859bf000080bf8ca039bff31ff2bd6a138d3fc426bf3e30bb5c3f9442afbee2f5723e6413e4be94005dbf000080bf51853bbfadddf6bd95d38c3f0a2a07bf5205593f67c34fbd66b29c3d72a044bc283b7fbf000080bf2f4e38bf7a50f0bd74cf8e3f5bfab03e0ce96b3f483235be0b7cc03e41189ebe9da95fbf000080bf7ffb3abf71e6f7bddf338c3f67e2d7bd1f023f3fd44b28bff1987bbda62a2abf159c3ebf000080bfeee83bbf2106fabd4d4d8c3fd9c123bfb2c3133f79f101bf8cd3903d50061dbfc55f49bf000080bf8d9a3bbf1e6f02be6afb8b3f040204bf5e428cbd50a35abf4110353cb64b7fbf4a1c963d000080bfe69537bff7580abe342b8f3f95fef33e34b856bf6be186be284f5abf7b8c03bf0256bf3d000080bfc49636bf962304be1bda8e3fae00633fbe12d5bdc99ee6bee2d59dbeedf15bbf351dd1be000080bf30bc3abff017f3bdb0738d3f0387d6be39c9673fb5e18b3df575943ec59f513ece546fbf000080bf65e339bfa6e9f3bdf3038f3f691608bfcc57543f26932f3ef652993efd2fbf3eaec460bf000080bff5d733bfe0a203be9643913f14045a3fd641a7bd4b8b04bf9dada0bebee05ebfe7fac1be000080bfb21035bfbb280abed97b913f0e9fee3ec4da56bfce5d8fbe6fa94fbf171d08bff556793e000080bfddb336bf70280cbea3ea913ff4a1b9be625c66bfb45a783ef7264abf56a2de3e0a9fdd3e000080bf027e35bf7809eebd4294913fa64eab3eb0b5683ff86b7ebec1662d3ec27ca2be4bdd6ebf000080bf6ceb37bf446cf0bd50348f3fb26ab83e7845693f20ab4cbe3498b43eb2a9a9bebb0560bf000080bf346739bf821cf4bd97ab8f3f50ad04bf2288543f3c42523e201e933ef653ca3ee05c5fbf000080bfbe3637bf7e94f1bda8e7913fd2c3fdbe3aa9583f03cb473ea8abae3d87be8a3ec57375bf000080bfbe3637bf7e94f1bda8e7913fd2c3fdbe3aa9583f03cb473e31eb543f02f7063f494332be000080bf346739bf821cf4bd97ab8f3f50ad04bf2288543f3c42523e0a27513f7e350d3ff91a2cbe000080bf65e339bfa6e9f3bdf3038f3f691608bfcc57543f26932f3e1755513f102c0e3f87131bbe000080bf0b2834bfe0f509be020d923f003ce73e913b50bf31b3bbbe368543bf229b10bf14f69f3e000080bf6a5133bf4c6b03bed2a7913f30964a3fb02126bdaf291cbf4bbb80be965c6ebfb54d87be000080bfb2b936bf50a6f1bdd882923fd9df05bfe774553f881a353e8909d4bdeb44133ec9f27bbf000080bfb2b936bf50a6f1bdd882923fd9df05bfe774553f881a353e1b335a3f4591023ff8ebec3d000080bf37fa34bfed9df1bd1ac3943f506463bf7383ecbc65baeabe96f5fd3c67f27d3f46f3fabd000080bf66a337bf4dd6e8bdeb57923f4c7a233e90f373bff2f583be758c7cbfeef413befb5f9dbd000080bf3fc939bf4549e8bd29ec923f45ee1dbfc84e42bf261b553e7eac3abf4396263f30cd583e000080bf07b23abfc6f7e5bd1e33923f4b781fbfb1d03bbf0f028b3e3d9734bfaa442d3f8372573e000080bfc28938bff9d6e7bd3a92913f9a29263e5bc277bff40145be599372bf0b3554be0f1d793e000080bf86913ebf9df7dfbd38be8e3f932a2abfcfce39bfa752353ee13332bfe310303fdaec523e000080bf3a583bbf66ddbfbd4694923f02774fbf4f43e93eb996bc3efcdbc73e6a83633fc82d76be000080bf68233fbfe9d2bfbd7e1c8f3f47b759bfc422b63ef86ac63edfdcaf3eb7f86e3f0c28d3bd000080bf80823fbf9431bebd5e708e3f0b3760bfc80ec93ef0a18f3e924dc83ed9076b3f378b82bd000080bfa6613cbfc574e1bdc85d8e3ff979223ee09276bfb3425ebedfa775bfc2084fbe7569483e000080bf977339bf6cd0b7bd0f0e923f3cba2abe2a297b3f7732c93d2105633f2a63453e970fd7be000080bf4c333dbfecdfb5bd21e48e3f2c8268be3ce0743fb4513b3e629d6b3fcd598b3e94c38fbe000080bf81cd3dbf4a99b4bdf2238e3f6a5262be9cce753fd6f92e3e8e2c6b3f3810873ead9496be000080bf49d93ebf99d7b1bd5c728c3fef1155be52e8773f32e10c3e6824733f50426f3e2d2b55be000080bf144140bf86e6babdc4cc8c3f6f605cbf4feece3eba4d9e3ef571dd3e62b8663f88e8d53c000080bf9ad13fbf98a1b1bd166a8b3f977698be2362743f54039e3bb862743f3374983e53fd873b000080bf431a41bf4fc9b9bd51bd8b3f23f95fbffdf2d13ed0f1833e0d05e83e0480613f94230c3e000080bffbce3fbf187cdabd4d858c3f1bce32bf131435bf9cc2de3df29d30bf6eb6343fec36243e000080bffaee3ebf9b1cdebd53238e3f86fa33bf8ace34bf7632aa3d85622ebfa0ce333faf7b533e000080bf09fd3cbfbaa3dfbd1aa38d3fb751313e6b9076bff4c952be6bb074bf60e75bbeba8e4d3e000080bf382f3ebf6973dcbd2bf68b3f4672193e98dd75bf887b70befe1b79bf44c53dbe1c450c3e000080bf562b3fbf2882d8bd0fee8a3f3e82b03c2d2f6abfc486cebe39cf7fbf6295debbe9871bbd000080bfa8a640bfbebed6bde7728b3f4b9a3abf27322fbfb281953cd4c22ebf5b853a3fb5d1643d000080bfde8d41bf0b7cc5bd83be8a3f166379bf01629ebdc34259be7da8e0bd24b97b3faabe143e000080bf42ec40bf506dd0bd50c68a3f12cb40bf48d211bfa68ea8be50da19bf90994c3fe49203bc000080bf130f40bf6459d0bde02d8a3f91fa90bea1b216bf68d541bfec8347bf52f1193f9e4734be000080bfaf4341bfef3abbbdcefe8a3f121362bf308be93ef7f2e0bdafa1d63ea34b5f3fe4f8803e000080bf558740bfc6dcb5bd66878a3f3a88fbbe35b73c3f1088edbe17312b3fe616293f05cbae3e000080bf2d9840bf6b65c2bd5f0d8a3fb2f507bf3782c53db28057bf823fa8bd45a37b3f0263283e000080bf10b046bf6344a2bce4db8b3fde122dbfe8f42d3f71e2913e1976133e3e47003fec735abf000080bf204446bf3cdba3bc21cb8a3fd4459abe65c4443fba7510bf26b04c3f8240f3bd61b616bf000080bf080347bffd31adbc3d468b3f068b3abfc1482b3f86a215be63b3f13e441aac3e36a150bf000080bf04ae47bf460bd0bc412a8b3fb0dd76bf9b73733ec683eebd843f733edc35153fbcee46bf000080bf2c8247bf904c07bdebc68b3ff1c369bf1ff3b5be897b4c3e9fb0c6be10a01b3f845531bf000080bf8d9647bf8cf6f8bcf4358b3f693c71bf75da7cbe715a67bec98417bcc3a9313f9b4c38bf000080bfe60647bf205f02bd4ab48a3f756a16bfe107ecbec93e2abfd7c2233e784e3d3f8a6627bf000080bf7e8c45bfd02b9ebc4e9a8c3f8f8e0ebf59293a3fac7fcd3e85a716bdc61cec3e55f562bf000080bf60ea43bfad518fbc2e1a8c3fe511463e7bde7a3f892143bd4d3b473eedeeafbd9e247abf000080bfb09243bffe99c1bcbad88e3f194122bf02671d3f9048f03e042e9cbdded90d3fcd3554bf000080bf321e45bfe96594bcc45b8b3f1643b13c2c8b773fae0982be4292013fd52f6bbea3d054bf000080bf4d4946bf0abc13bde73a8b3fad12c8bedd0256bfaf42c5bea77bdebe0859093fba3139bf000080bfd06245bf954521bd98f88b3f787694be12b46fbf6bb34abe5c4637bfa3efb23e3ebb1abf000080bf9b9046bf683c11bdba858c3fcb025cbf764ac2be336eaf3e203702bf241c113f9be625bf000080bf2c8144bf840f25bd069f8e3f583a56bf5692d3bef3ddb73ee9fc0bbf0f67193f96b015bf000080bf914443bfb20f32bd5f078e3f9e1a37be8eb178bf439a1fbe49a158bfac406e3e876ff5be000080bfbc7443bf2c642ebd145d8f3f1bf344bf094401bf265fc83e876123bfe57f143f0b9401bf000080bfc4b542bf01f6d1bc31b38f3f0a9022bfb06b0a3fc73d0d3fd5c637be1366173f454149bf000080bf87f93ebf3a924bbd473b923f9de53dbfb4ea0dbfb83bc13eac1a2bbfb69e103fc7bef7be000080bf034342bf55dc38bd5dc38e3f41ca10befea378bf3e1b44be114f62bf1503583e2d94d5be000080bfeeee41bf266daabc8c5d8e3f81a3f73dbff37b3ff889043e853e9a3da8a3f73d9e637dbf000080bf700041bf124cb5bcca318f3f8032953df2c97b3f9642293e746fe3bc73b12b3e9a467cbf000080bf5e2a3ebf76fa01bde28f923f586825bff115063f0d1e0e3fab0950be7445153f3a5e49bf000080bfde923cbf48f8debc5fee913f578002bc5cc77b3f8e02393e468705bcbef1383e09c87bbf000080bf302e3dbf231205bd7253933f56ca1cbf1de00c3f3648113f02a439befbda193f744647bf000080bfebfe3dbf787e51bd3ffe923fd36642bff3a708bfb976be3e99de25bfbd76113f1fdc01bf000080bf15c73dbfbe4c54bdc171913f3f2184bd74ec78bf64ca65be3d8566bf86551d3ea251d0be000080bf062e3bbffa09e7bc77bd923f33029e3c83067b3f02ea473e3c25713964f2473e86127bbf000080bfbaa135bf34f324bd8d9a973f9d4adbbecdad193f07e82c3f96711fbe9bee2f3f32a535bf000080bf130c33bf8db715bdb9a6963f4ec90b3e78267c3f07e2d83dfda9303d559fce3d50747ebf000080bfd8d43dbffdd9cfbd008b8a3f02de2e3f370ec1bede1f20bfa1380bbf1d9155bf1d5cbabd000080bf130f40bf6459d0bde02d8a3f91fa90bea1b216bf68d541bf574606bfc0de10bfabd8223f000080bf2cd83ebfca52cbbdac1a8a3f0fbaa13e268ab2bed1e461bf467ee5be7ce15fbfed973d3e000080bf1af73ebf4ca5bfbdc3f0893fae22ae3ed44b7b3e9f6568bfba945bbef96f6bbfd06ca8be000080bf404c3ebfb6bcb2bdafec8a3f2b3cfc3e3ec5453f601bcdbefbb0e43d1a3d03bf1aef59bf000080bf11353dbfaf07b3bd81ec8b3f4f0c203fba5a3d3fc20b7fbe5a8a813eb3e8fcbea2f454bf000080bf49d93ebf99d7b1bd5c728c3fef1155be52e8773f32e10c3e2db0c23e43b6563ef49a66bf000080bf81cd3dbf4a99b4bdf2238e3f6a5262be9cce753fd6f92e3ead51f53e65de843ee3a756bf000080bf01333fbfd95fb6bd1b628a3f0103fe3d5cc0403f017425bff0e14ebbc3a926bfed5042bf000080bf558740bfc6dcb5bd66878a3f3a88fbbe35b73c3f1088edbe2f6bbfbc46290bbf04ca56bf000080bf562b3fbf2882d8bd0fee8a3f3e82b03c2d2f6abfc486cebe5cd85fbf93f859be6a3fdf3e000080bf382f3ebf6973dcbd2bf68b3f4672193e98dd75bf887b70be4e2b76bf058949bef2e2433e000080bf77bd3cbf670cd3bda0888b3f876f4e3f5d2fc5bef8c7e5bedafc0bbfd24946bfb9bda2be000080bfa8a73bbfd09cb5bd1fd68d3f4afc1d3fc926433fcdb247be2e1b983ef413e9be99df56bf000080bf1e193bbf950ed6bdc06f8d3fa82b533f5ad7c2beb807d6be4a5009bf2ea842bf9781bbbe000080bf09fd3cbfbaa3dfbd1aa38d3fb751313e6b9076bff4c952be4ea47abf129e43be0aca8f3d000080bfa6613cbfc574e1bdc85d8e3ff979223ee09276bfb3425ebed1dc77bfb98447be819b203e000080bf9ad13fbf98a1b1bd166a8b3f977698be2362743f54039e3b9a0b693ed66e9b3d1e8678bf000080bf2d9840bf6b65c2bd5f0d8a3fb2f507bf3782c53db28057bfd2fe6bbee9f478bf29370b3d000080bf4c333dbfecdfb5bd21e48e3f2c8268be3ce0743fb4513b3e9b48e53e18e8893e4d435abf000080bf35423bbfe86bb6bd03438e3fa861153f2e5c453f79b182bebf78953ec821fcbe58e651bf000080bfdf1737bfcea5b8bdfa7b913f08d01c3f6e143c3ff44995bec2f7b53dd370dcbe5aef65bf000080bf306b36bf22e4dcbde832913ff764433f26cfc9bef90d03bfad7210bf2dea4abf60856cbe000080bfc28938bff9d6e7bd3a92913f9a29263e5bc277bff40145befe285ebf4b5b6ebe40c4e03e000080bfc7b935bf64ffdcbdc3b6913f5097403f259bb2be7a120fbf847cb7bed9b26dbfe7f6c63d000080bf70b53abfb2f3d6bdb6d88d3ffeee483ffe12c7bebe03f7bedf6611bf7b3f43bf0d669ebe000080bf977339bf6cd0b7bd0f0e923f3cba2abe2a297b3f7732c93decdf8c3ee160113eb46b73bf000080bf80bf38bff7e6b7bd98bd923ff8a12bbec3027c3fa4e2593de4255b3e7947b63d510779bf000080bf66a337bf4dd6e8bdeb57923f4c7a233e90f373bff2f583be00ca58bfb46288be64b2eb3e000080bfb22d23bf4b5a71bc54e5913f2264153f931233bf0a33d3be6797163f8e4c643cd6fd4e3f000080bf751e29bf180541bcc443903f15da07bfeae040bf0ac7c6be24a33f3ff7a621bf6f104f3e000080bf6b2924bf986810bcf1b98f3fae2d013f172420bff45318bfbca8183fd1c17bbe75a0433f000080bf26aa27bf9f22073b828e8e3f230228beadb990beeaf071bf17254c3f1f1a1abf36672a3d000080bf130e25bfa3e96c3bdaac8e3f599ef03eb65126be211c5ebf16eb403fea3ee0be5cf9fa3e000080bf20b224bf6f7e433c0bd28e3f9f32123f7fc0f53e177b2abf1a66503f2906dfbeb3aec43e000080bf598529bf6e15443a4f238f3f8c2821bfeb02babed4d22fbfb592253f61203cbf45ff50be000080bfbbec27bf1d015c3cc9ac8e3fe82a6dbee61b1b3f69d642bf72ea313f0486e3be1ab510bf000080bffda42abf944f0f3ced618f3f8c9e62bfadc9913e1a52bcbee96c933c41e944bfad8623bf000080bf475a2abf74b600bbfb07913fcb6d7cbfa593f8bd6f43e93dea37043e11577dbf8589813d000080bf221823bf842ee13aa627903fa560723f0de2d23db3219cbeaa04a03eb8af8abda88e723f000080bf84d627bf155795bc8d44923fcc0aecbe621a4ebf3f16bfbe44d2373fafe715bff39ac03e000080bf7b3029bf5f5c2abcf5a2923f510476bf8c227ebe20d2f93d7c01893e2a2372bff3293c3e000080bf77d622bf9e3e82bca853923f49a0243fe0af04bf0a5210bf24d6233ffa1a26bdc96e443f000080bf9b3b22bf6669a7bbf112923f54a67c3feb201b3d728120be9c611a3ee13f033e0ff07a3f000080bfe5ec21bfd0d300bc1a14933f91ae783f4932543e9732edbd876de43df32d043dba447e3f000080bfb01f22bfbb45e0bc0b97933ff7def53ecebae9be45be3fbfc9e6213fd8afd2be0702283f000080bfbb4227bfe8bbdbbc38f3933ffa850cbf3ac820bffa330dbf1c2f3b3fd3372ebfce78413d000080bf566321bfea3caabc685a943fd31a753f9a22e23d998988be09c7933e9b90b9be86dd623f000080bf8c9e27bfda8ea9bc40a1923ffc1ecbbefdc248bf8f43f4bed4143e3fd26914bf09ccab3e000080bf31d128bfbb977bbc9c51933ff38976bf2aca89beff0336bcf54c843e7e4b6fbf29bd793e000080bff2d328bfdc0da2bc863d953f6de87ebfdec1bc3d25008fbb11afbbbd074d7ebf135c8ebd000080bf35963cbf28275abd162f923f1ed299bd6db177bf7d0b77be7e554c3f043c50bed22a113f000080bf80bf38bff7e6b7bd98bd923ff8a12bbec3027c3fa4e2593ddaef7a3f034d303e5ed8c7bd000080bff29835bffa49b5bd4469953f382559bf42c28cbc098407bf5b0d303e09b96f3faf9c9cbe000080bf687a413f884762bd9fe78d3fa4b2d23d16e17a3f0e722e3ec5f90c3f65824bbe8f8a4f3f000080bf66a3373f4dd6e8bdeb57923f4c7a23be90f373bff2f583be6f6c50bfc4ab8c3ed2f302bf000080bf57e946bfebc5d0bcdb858a3fa29111bf3ffa473e46904cbf3ad34a3f3356c83ec1b3efbe000080bfb50ece3d6a4efe3d7ba4893fd476c83e4649693fdfa902be3c836b3f04f1c7bebe2a0b3d000080bf664f423dc537f43d2848823f0e2c753eb013623f6393cebeee84783f741966be1f86ac3d000080bf01a34b3d7a110d3e62ed873f26f37e3efac26e3f9ca985be02f0773f235076be74b8833d000080bfff75ce3d2718ee3d863c843f9e63f63db8ff7d3fe0c107bd9f207e3fff8af5bd0681683c000080bfa791163e416cc93de3a98b3fc1e6163faaeb4c3fd453de3defd84d3f752318bf4ddd823c000080bf1afd283d8013ca3df680793fae1926be4e50693fe0a9c1be0f9a7c3f8c841c3ef1b260bd000080bf000000004376de3d7490783f00000000d662383fbd9631bfffff7f3f15eba8b93862afb9000080bf7c45373c6c22333dccba6f3ff81e4dbfcbb9803efefd0abf1439163f40e4013fe18b21bf000080bf00000000d42d3b3d4c56713f000000004fca623e7da479bffaff7f3fb2b454ba173c41b9000080bf7c4537bc6c22333dccba6f3ff81e4d3fcbb9803efefd0abfd02e163f642c02bf535b213f000080bf1afd28bd8013ca3df680793fd81a263ef84f693f3cabc1be97997c3fe5d31cbeb8bf5d3d000080bf00000000aa48053e94fc803f00000000711d683f41f3d7befeff7f3fc5f7efb81af780b9000080bf00000000d63d123e1b2d873f000000003457793ffc0a68beffff7f3fa15a55b8324265b9000080bf01a34bbd7a110d3e62ed873f26f37ebefac26e3f9ca985be15f0773f2430763eb09d84bd000080bf664f42bdc537f43d2848823f0e2c75beb013623f6393cebe7a85783f85e1653e947dadbd000080bfb50ecebd6a4efe3d7ba4893fd476c8be4649693fdfa902beb7836b3f40eac73e1ac50cbd000080bfff75cebd2718ee3d863c843f9e63f6bdb8ff7d3fe0c107bd54207e3f0b83f53d12ab6fbc000080bfa79116be416cc93de3a98b3fc1e616bfaaeb4c3fd453de3d38d74d3f2f25183fc89e85bc000080bfaad71d3e88d4d43de28d863fa636ff3e3c50573f1a22573e6d075c3f04d802bffaade23b000080bfe92b383e92d26c3d05538d3f8f35613fc4b7eb3e0f74f33d7c71ee3e567c62bf2b85a4bc000080bfe04b413eed7e553daed6873f2952663fd511ca3ebe013f3ef165d13e885669bf08a534bd000080bf124f263e8f8adf3d7011823ff9fd003f32df543f886b6f3ef4735b3f21bf03bfd35d8cbc000080bfda754f3ec8d207bc1f4c883f643c7c3f5f06f43ba7c92e3ece3e653c48cc7fbfdb4218bd000080bfe86a4b3ee84f5b3dc095823f1a62673f1effad3e631a853e9eb9b93e084b6ebf3eb135bd000080bf09df5b3ef38f7e3d84f1773f1a37683f59daac3ea9b9803e26ceb83e1f5f6ebf93b754bd000080bff7c8563ea0e0e2bcc803813fb4de783fde7932beb871203ef9c126beb7ae7bbf4871aabd000080bf1f84403edee38cbd4cfb883f24a66b3f423fb9be8512173e6463b9be5d896ebfaa84d4bc000080bf0c233d3e980e5dbd8ca38e3f497c713f638195be95a1213eba7896be20ad74bf960241bc000080bf1a4d3e3eda75afbdfbe9813f0bdf673fde02d8be3b22253d58b0d5bea38967bffdc4b4bd000080bf5bce353ed3f6cfbd8f787a3fded2573fcf5d09bf77e2143de89d06bfe82a56bf0b4e1dbe000080bf221a1d3e074418bee529813fcbda2b3f1cad3dbfedc19fbc00373dbff9d02abfd28ebcbd000080bf37391c3e244409bee6cc883fde103a3fa6d029bff65a363e843b2cbff4613dbfed3c1fbc000080bff7e51c3e1c61f1bd871a8f3f8972403f16aa1fbfc75a5b3e05d423bf81b344bfe98a0e3c000080bf30f8443e7c698a3b9c738e3fc7957d3fb991833d7fe3f73d760a883dbd687fbfd3cc66bc000080bf5860c83d80882dbe78bb883f9975873ed5f873bfa711173e61c876bfd9fc87bed862553c000080bfde8ed03dce741fbec6578f3fb93ea83eb16b67bf310e8c3e0c0b71bf7b23acbe8105a43c000080bf7571bb3df17d31bee811813f5922613d732c7cbfc02927be19937fbffead69bd35f9043c000080bf5b7b0f3ee99b14be88b9743fb18ee33e5da445bfc29ee8bee65c63bf0558e4be203fe3bd000080bf32a9413e40f9bbbd6cc7743f00634c3f41f419bfe943f8bcfc3719bf387b49bffd1d19be000080bf03b6633e151a88bc55a6743f0a38783f0c333fbe88ea213e7f7b30bec8db7abf216dcdbd000080bf52ee6e3edb6fedbb1b65653fde1d7a3f147b44bec822be3df9403dbee0c37abfc3d4a2bd000080bf4ed23c3db2642ebe143f883f642a37be42b37bbff181143d5d517bbfa223393eb643743d000080bf2d1f493d8ca924be3c2d8f3f8d62ddbd970e75bf685d893efb2b7ebf85f3f03d78baa13c000080bfb7d3163d332221bef371813f4fc2abbe1f1f64bf1c7a9cbeed2971bfae0fa33efcf7d73d000080bf8ca19c3daace1abee61c743f8bb245be9ad447bffa2f18bfa1c47abf6ab1403e657b913d000080bf768d063eb24ef5bde3a76d3ffcf3753e3df14dbf34140bbf367177bf27ec7fbef3826abd000080bf60ab443e7e6ea8bd0dfc6c3f71743b3f3dfe2cbf4e72adbdd64b2ebfb12e39bf2331ebbd000080bf0f7c4c3e6af595bd0e4e603f2c64333f2e8836bf9142c2bc0f4036bfb15d32bf4808b4bd000080bfec16513ebc0788bd2157523f92b0333fa5f435bf3c233dbd885536bf992e33bfd81459bd000080bf00000000d37220be2276883f0000000047ec7fbf0702c93cc3b87ebfc77e203b1758cc3d000080bf00000000334e13be29248f3f00000000fb0f7abf8c435b3ef52e7ebfdf98d03cc6e5ed3d000080bf649c7f3d8224ccbdbf1a6c3fdf12fbbeed8727bfbf5713bf549a59bfc042013fadb5193e000080bf5c7b9f3c4b7df9bdd962773fa0aff0be291e12bf94582cbf94ae51bf01f9103f6d06bc3d000080bf008d023e718fe5bddf6d663fc9219a3d955c78bf82026cbec5427fbf92c19abd0654f6bb000080bf8ec9023e239fd7bda8ab5b3f00c4f83cec8f7dbfff8109be50df7fbf22f6ecbc42914fbc000080bf0a64063eaed9cabd249b4f3f8561123df5127ebf0ad3efbdb1d47fbfd62d0ebd9ec230bc000080bfa9320c3e9e96bfbd5019433ff151813d95cf7dbf2fe3e9bd237d7fbf50d680bd0ed5b9bb000080bf00000000d5f213be38c3813f0000000092ce6abf4cfacbbe79087dbfbab7773d33940ebe000080bf000000007a50f0bd853d793f00000000801019bf5a334dbffa9f5cbf032ad03e69469bbe000080bf00000000f13118bd1020733f000000001e2366be777379bf788202bfb699563f24fc45be000080bf29e9613d8d6299bd7d045a3f99eb2cbfbb7339bf4ff90cbea2b53cbfd40b2b3f73c0ce3d000080bf1328623d5c1eabbd2042643fe33527bf1c823bbf3daa44beeaae41bf3446243fb3cb003e000080bfce177b3d0abf94bdada34e3f61c829bf9d983bbf18d21bbe3d283fbf0862293fdc908b3d000080bfba66923d33a595bd629d423f571224bfb0ce3fbf5af22abea76d43bf1c19253f25b6143d000080bfa393a53cb5dc19bca46c593fa1b776bf09b346bec2923bbe0f9e62be53fa763fa3c7113e000080bf87a66c3c4b0595bc4018643f229575bf1fd376be039a16beabbc87bee3b9723f7f81333e000080bf630a563cfacf1abd6a86703f045148bf18ce8bbe22420fbfe583cfbea0d6673f40aaff3d000080bf427bf53c956508bcc93c4e3f9bd274bfcbb12abebad275bea3b247be13cb793f5e78cb3d000080bf177e303d462836bc7c65423f037174bfff392abefe227cbeda5548be4abe793f1de2cc3d000080bfcfbac63ccb64783d2fc05a3fa98867bf49b6c73e15f230bee05db83e76486a3f8675393e000080bffeb4113def39703d425e4f3f3d4164bfb6cabf3ed33982beabd5a83e0f136c3f0f054f3e000080bf00000000d42d3b3d4c56713f000000004fca623e7da479bfccda8fbe1a966f3f93a7593e000080bf57ee853cbf9c593d7863653fee2171bf9f86a43e6ad3c7bd4194963e3ff86d3f329c633e000080bf473bae3d310997bdd174363fb00119bf452448bffae935be76b84bbf69fe1a3f85e8523c000080bf14af123e44a5b1bd49d5363fef22c73dbf2d7ebf3ac28cbdc7c77ebf0ea4c5bde05363bc000080bf93e2633d170d99bc5cab353fcf4c72bfbdea6ebeb05a64bebfaf83be0271763ff1eeac3d000080bfef38453d27dd563ddf17433f98236abf8de6a33ee8f37cbe1b7b8d3ed1da703f53d4483e000080bfa2f61b3ea893acbdf3c82b3f6e71053eb9c67dbf0c82913c06c27dbf50c905bef2939dbc000080bf5d52d53d42079dbd34a02a3f5b6d02bf437c5abf51b2e0bdd7685bbf02c1033f36f0c0bc000080bf1343923d715905bd6f4b283fe5056bbfe4cab0be497347bee124b8be599e6e3f50382f3d000080bf91d54d3eb1dd7dbd64af2b3fe490393fbce82fbfeaa2483df55130bf766c39bff241013d000080bf57044f3e3d0f6ebd73bb373fb7a73b3f9c032ebfa701ccbced0a2ebf8bbb3bbf81eea23b000080bfc218513ee8887cbd7dcf443f98f2363f880832bf29f299bd58b932bf1b3f37bf0e4673bc000080bf9dba723ec636a9ba842a553f986a7c3faa392abeca8053bc899b2abea23d7cbfb9fb18bd000080bf32cb6e3e23650b3b8f51463fb26d7c3f15820fbeaff2b7bdf75c0fbe78787dbf0888013c000080bf86cb6a3e700a8b3d4b77573f350c6a3fee6dcf3e62fd77bb3752cf3e4afc69bf598ecdbc000080bf87f8673eaed4b33ac30d383fd63b7d3fb033f1bd76d2b2bd197ee8bd78fe7dbf47be553d000080bfb405643e2c67efbb29612a3f7da97e3ff4a2c5bd27a208bd82b0bebd14cf7dbfc06cbb3d000080bfa8534e3e6d1e87bd5c40203f52ce373f37822dbf2d4a223ee84631bfc0f337bf1992833d000080bf7e1a273eedf5aebd46d0203fc5823d3eb00979bf01a20e3eb7507bbf880742be3aa29bbc000080bf8c5ff83d622ba8bd8e581f3faaffd9bed8a167bf7e06a5bba01767bfceadd93e525e87bd000080bff0deb13d740c48bde8331c3fc49061bfb212dfbe4b4a3cbefcd1e1be38bb653f357852bc000080bf56bc913d973c9e3cd940263fc9466fbf1d722b3ed691a0be2b28003ee70b7b3f74261a3e000080bfea3f6b3d93e2233dd314353fcfd86fbff9c2753e8f2582be1fae4b3eb0c2763fcf36353e000080bf2369673e9698873df0c2463f157a653f0aeadb3ecb41e0bd5b05de3eaaa466bf0f89813c000080bf5722603ec1fe6b3d1459373f3f09613f2ecbe03eae3a3ebe63aae83e64b563bfc7ef443d000080bf81cd593e6de5253d931c283f0eae653fcefbd83e8594febd7e4cdf3e1cff64bf6df5c83d000080bfccb6633e6c7ca6bc20251e3f0cc47d3f5ec3d8bd7ef2a03df0f0ebbd6b3c7cbf7231013e000080bfe696663e0264883dae28693fa9756b3ff486be3eeb73ff3db9a8c23e7d756cbff40a44bd000080bf761c3f3e904ce73d342d693fa7fc0c3ff727553f09046f3d1da6553f73520cbfbe3362bd000080bfe237353eaa5ce83d10ea763fc859073fcbfe543f44022c3e36dd583fd29707bfd7a02fbd000080bfa12b013e861d063ec6e1643ff40281bbfefd7f3f8b02debbd0687e3fc7064f3be3d9e3bd000080bfd506073ecb4a033e355f553f0f03523c98f47e3f02f2b6bdeb6c7e3ffc74b8bc7f0edebd000080bfb6a2ed3dc7bb033e475b713f08c2b2bde05a7e3f8c91933d99537d3f5729c23d165edebd000080bf6552833d041fe33d2e765f3fdcdf0fbfbf2a533f37437abd91bb503fdf420a3f738f55be000080bf622f943dafe9e13df14a523f9c3d0fbf5b16513f874110be3427533f3a36083fefd243be000080bf7f84a13d4c71d53dc2f6433f60b614bf403f4a3f24ab48be0f00503f9e600c3f4fa04abe000080bf6a32633d81e9d43db03d6b3f3e9217bf0f314e3fbec3dbbccac0493f1b5d123f258f69be000080bfecacd63d9891fa3de6777e3faac2f2bdb4767c3fb7f2ec3d6e857d3f9bea003e879d6fbd000080bf57ee853cbf9c593d7863653fee2171bf9f86a43e6ad3c7bdd624a93ec39b553f50e0e1be000080bfcfbac63ccb64783d2fc05a3fa98867bf49b6c73e15f230bebe61da3e2fdb553fae86b1be000080bffeb4113def39703d425e4f3f3d4164bfb6cabf3ed33982be490de23e5c07583f981c9cbe000080bfef38453d27dd563ddf17433f98236abf8de6a33ee8f37cbefc35c43eec91613f7fd68dbe000080bfea3f6b3d93e2233dd314353fcfd86fbff9c2753e8f2582be50f8a03ecb7a653f36f79fbe000080bfc4cd093eeca3f33dee5f453fb5801a3ca6127c3fd66932bea79f7e3f82dedebcffa1ccbd000080bf30bc423e1d93e53de17f573f11f8073f45a9583f070225bdc62a583f3e5b08bfc5746abd000080bf3274ac3daef4ba3d1729343fa35c19bf46f93e3f90ee94bef7ed4c3fd4d10c3f28a173be000080bf4967403e0801d93df835463ff2f5003f34ff593f50ba14bea23d5b3fa4aa03bf03cd38bd000080bfc1190c3eb2f3d63d6f0c353fdd81133cd01e773f819985becadc7e3f55a207bd0389b4bd000080bf30d7c23db8778d3d732b243fc6661fbff2bc2a3fa687d1be4b3d483f718d0b3f62789abe000080bf56bc913d973c9e3cd940263fc9466fbf1d722b3ed691a0be348e983e03a2593f3e4bdebe000080bf5a673c3e7dcbbc3d2311363ff025023f2ad1533fc05374bebece593f2b8006bf0d1115bc000080bff2ad0f3e63f0b03dc0cb243f8c2242bd872d743f25de97be75a17e3ff3ae913c9661d0bd000080bf4df73a3e34a2943d8b6d263fd8950a3fd706533f4b9a29be42d5563fe5b90abfc8d63b3d000080bf8066403ed1048a3d35d4183fbdcd093fbc08543ff1611fbeaeb7573f8e2d08bf411eab3d000080bfb003173e00e3993d1a7f163f0c1359be3cb56d3f12069cbe4128793ffc89303e7f5f1bbe000080bf882b473ecaaa483d12db0d3fff05113fba40483fd7b584be93be523fb1290dbfc8520a3e000080bf1c13e23d0aa22e3dcbbf163f02bf38bf50a60e3f644bd2bee0ce303f0ca61e3f7cd8bebe000080bf4303b13d0f9b48bb0267193f41f56dbfde39043e5ddab0be39b29e3e17f3473fd5c70abf000080bfffcf613e2a1b563c6535113f6e596f3f901eb53ea902db3c3d50af3e23686bbfce6b453e000080bf76715b3ed68ee23c22711b3f56646e3fd2d1b93e17c108bdb321ba3ece1e6bbfa5a81f3e000080bfae67683edee7f83aa4c3073f5757683f13f3d23e61a2a53ddd8bc73ea1f865bfe3a24f3e000080bf145d673ed68c0cbdcbf8133f0d427b3f3af3d7bdc2ca233e6bb708bed6a879bfb692343e000080bf179a6b3ed78a36bd3d440b3f85a6783f5f2199bd5b42673e40b9f2bd99a779bffb543f3e000080bf39985d3eb62daabd33a90d3ff4103f3f25ee0abf1b43c53e385d1fbfb02546bf30e1ec3d000080bf7ec6553eb4ae91bd446e163f25223d3fbac919bfbf619c3e6d8027bf147a3fbf9b7fe43d000080bf07b1333e1233bbbd54e2163f0b2b763ef9266bbf10a6a03ed05c77bf62b683be519551bc000080bfec2f3b3e361fd7bddbdb0d3f9cb25f3ec07a61bfa91ad73ec3a577bfde0f81bed987d0bc000080bf99290d3e5af2b8bd4f74153f4e8ebabe03b56abf3e3a273e80386ebfdb07b43e613fd1bd000080bf90f8153e93fdd3bd2f6d0c3ff60abfbe845561bf4f26963e2f7e6dbfe536b33edee204be000080bf1daed53d1bf184bdc6fb113f560d59bf148206bf23c291bd362905bf39ab593fe4cfa4bd000080bfb96eea3d425aa3bda0dd093f57bd56bf28760abfe7a37d3d67480bbf5236543f7dcd04be000080bf4e64c63de8dec3bce4fb0e3fc61576bfb6e23a3d2c2a8bbec9cf2f3d52bb7f3fae25823c000080bf4303b13d0f9b48bb0267193f41f56dbfde39043e5ddab0be5e91c43d0a377d3f854ee43d000080bf180b433e38a2fbbd0f2b043f8d8a4d3ee0f062bfbb7ad53e086378bfb46674bea14b25bd000080bf494a1a3e2768f3bde529033f45a3cabe94d95dbf799a9b3e04176bbf5febbd3e18800dbe000080bf28d1f23d0266bebded2d013f1a8657bf4f5306bf1e21013e91f809bfd054543f427d16be000080bf89786b3e094fc8bd7a6c033ff2f2423fd87ffdbe3527d63ee55f18bff9254abf1487183e000080bfe8f5773e9a94e2bd41b8f23ea9674a3f15eb03bf624da93e148813bfe8084fbf9feff03d000080bf5b22773e4dbb58bdca6f013f3e1d743f4402b0bc13ce993e2a75b8bda7de78bfd8905d3e000080bf3ca2723e33c4b1bb618bfd3ef7cd5f3f3658ef3e5e3a063e9b34df3e6eeb5fbfd6ea583e000080bf09c14a3ece17fb3ce3a9033fba9efb3e4622593f0c6a4abef1e45e3f2955f2bedefc083e000080bfee5d533e4487c03c1fbff73e0087d23e4e27673f7af3ffbdfbf2683f8806ccbee429eb3d000080bf24257d3ee52b81bcff25e93e7de0603fb61af33e2d625d3dbb2ceb3ea7bf5ebf01f7363e000080bfd907593e938d873c0f7ce43ed672b53eafef6b3f8cf221be05566f3f950cb1be267fa33d000080bf2aab813efe437abd11a8ee3e038d783fd800aabb122b753e839047bdbbae7bbfba80343e000080bf15744b3e75770dbe3e3ff43e5f0a583ebc6a6bbfe5ada93e795c78bf5b2874be093c34bd000080bf651b803ee0f2f8bd6b9edb3e91da4d3fcc930fbf9ed2493e06a914bfa4df4fbf69d76f3d000080bfc477523e8ee618be0daadd3eb322693ed51274bf7daa4a3e9e4a78bfe4da75bea37527bd000080bfeb6e863e18428ebd16a6d73e301f7e3f86837e3cf692f53d45ac673a3a1c7ebf7f60f83d000080bf7f15803ebfb9bfbc12c2d33e50e95a3f0a90043fd1c3ccbc5032043f0cb558bf2f8c043e000080bf376f5c3e4223d83b5e63cf3e388ead3e12ff6d3fc5b113beb2d7703fde46abbe5787603d000080bf4b23263eb779633c40a0e33e70dea9be50a5683fd59581be1274713f02eba03e1decdcbd000080bf4a27223e6421ba3c0681f53e9832bcbe0b355f3f50a6a5be67106e3fd176ae3ed8890dbe000080bf4c17223ed1031f3d6ccd023fe7b58cbe07d35b3ffe7addbef320763fb170763e0e4908be000080bf1075ff3d91b506bc6094f83ef72157bf345d053f714119be6ada093fba5b453fd326aebe000080bf7499fa3da3e881bcb954e53eea2e51bffe8f103f6253edbd53b3123fe41a463f021f8abe000080bfda73d93d734a80bd7fdde93ee2fe7fbf2100ae3bc1f91f3b58fe883bb91a713f6716acbe000080bf081eff3d7a89b1bc1822cf3e9cb847bf020e193f678a3cbea222203fabd13f3ffaa45ebe000080bf965e2b3ef228953b8940cd3e19129bbe1f0d6e3fefc255bebce5733f2669943e2d86babd000080bf9cfa603e193d373abcafba3e78e2a93e89a76f3f7a33eebd8b7e713f88e2a8be125b143d000080bf6af9313e1a6929bb43c5b83e99d19dbe64886c3f5fea67bed488733fe88a993ee20392bd000080bfc32b813e037ae1bc726fbe3e7c28593f8c47073f33210dbd8989073fae4d58bfe2a29b3d000080bf4223883efe6597bdb090c13e49d57f3f4302f93c6f829f3c3e72ef3ce9767fbfdf2f6c3d000080bf2921083eb741edbce484b93e625e43bfcb0b133fd59597be1d10233f5ef13e3fcf7d47be000080bf3739dc3d88d98bbd5d6fd33e6b8d7ebfd0000e3cc9c2d8bd741b2a3d5af3723f88f99fbe000080bfadf7fb3dac8b5b3be8a3043f518251bfaffef13ed759a7be158a123f947b383f7b48c8be000080bf87881b3e2895703df3570c3fbc137fbe3e3f5d3f5ac7dfbebca1773f24ad4c3ea5cf1fbe000080bffd49dc3d88f15abd6b81fd3e32d37fbf7041bc3cd442edbc51cd093d6bdb633f9cbfe8be000080bffb92ed3d923ead3c6aa50c3f90e848bf1dd7f23e943eccbedc8b1d3f1a232c3f958fd2be000080bf1327d73d9d1125bd0d19073f44c87bbf4d02b93c95a937bedbeaf93d1fa0503f440911bf000080bf4e64c63de8dec3bce4fb0e3fc61576bfb6e23a3d2c2a8bbe1f18533efa0a463f136519bf000080bf5323643e1cd2a8bbe833a83ee2b1aa3eb1786f3fcfb2f0bd6231713f3795abbe84b2ac3b000080bface3803ef6b403bd5263aa3e3add5a3fe9e1033f56a378bdeb77043fe3ec5abf4c78f73c000080bf6da8803e529d0ebdd09a973e4ed15b3ff30d033fcfc3ccbc6a20033fb4dc5bbf826fc83b000080bf6153873ed4609abdfd2eac3e6aa07f3feb01593cc66156bd96aa523ca0f87fbf011efdbb000080bf1827863e97e395bd2103993ebe7f7f3fe70353bc19a47abd3a8c82bc95a67fbf60b14bbd000080bfc268663ef22815bc3690963ee23dad3e8920703fd0419abd29cb703fdcd3adbefb5927bb000080bffb96393effe81bbceb6ea63e14d2afbed27c6a3f748a54beb76e703f797dab3ea3209bbd000080bf2429813e7ee416bd45d4843e07df5f3f7047f83e16012a3ce153f83e71db5fbf6dfa2cbc000080bff305853e7bf591bd6fba853eb7137f3f57d28dbd3ac348bdf6d594bd78a87ebfbb5293bd000080bf632b803e096ee4bdb6489a3eecb6513ff05b0dbf14aa1ebe9d4411bf31cf51bf91a0a2bd000080bf49bb813ed829f6bd6f9fad3e160a513f751b10bf6ff102be296412bf49af51bfbde73bbd000080bfea06823e0d7217bd3810623ec1cd633fc98be83ebdc2303deba2e83efb0a64bfb9eeca3b000080bf6ccf5c3eab4118bec5ffad3ebc799e3e975470bf9bd91abea96d73bfb76b9cbe36814bbd000080bffbb05e3e77850ebe1d779a3e0787b53ed6716abf2c3b41be925e6fbf0096b1bec88996bd000080bf116f7d3ef23fd9bd79e9863e2559513f2fee0fbfff23fcbdf8fe12bfb3c44fbfc99ddcbd000080bfdd5c843e8d808abdf81a623e59277e3ff752efbd7543dbbcfb33f3bd303c7dbf9ff6afbd000080bf25ce823e454908bd8ea63a3e94e7603fcebbef3ee3a2c13d4095ee3e8d3362bfaa473c3d000080bf79ac593e2d971dbe022dc53e28d28b3eba3576bf0303ad3c150576bfc2268cbe2bb51fbd000080bfc477823ebb2a00beacffc33efafc513f1b4a12bfd443cb3c255612bf2d0d52bf0198c739000080bf08e82e3e759017be7349ad3e790eaabe6d956cbfad4241be8dee70bf5110ad3e013b943a000080bf003b373ed6e60fbe2e1a9a3e1992a6bef23467bfc96d8fbebbaf70bf4665ae3e7862cdbb000080bfcb2e283ef8df1abe376cc33ee035b7be5dea6ebf9ec1ffbca1d36ebf0dadb73e0a3affbc000080bf234c213e57b514becdaedb3e9cf2c8be012b69bfcd11033e555e6bbf4cf0c43e0317a8bd000080bf53940b3ea12ef2bddd23ab3e385e52bfbefafcbe875991bee5c70abf7ad4543ff258fa3d000080bfdc12193e13d3e5bdeacd983e839350bfc04fe1be454bc1be521806bf0e7c563fa7861d3e000080bfa113023ec70ff5bd34bebf3e888055bfa94309bf775905bed1f20bbfebbf553f045e813d000080bfdee7f83dfc1deabd82c7d73eb53957bf6b900abf9f826f3c579d0abf0f24573f5416c1bc000080bfdd09f63d7de7d7bde15dee3e88e555bf489a09bf1934e93d4b4e0cbf8f79543f295fd4bd000080bf3739dc3d88d98bbd5d6fd33e6b8d7ebfd0000e3cc9c2d8bd1d0a313c85ef7f3fc9f4a0bc000080bf0e13ed3df12e97bde84abc3e30e977bfd801953c4db37ebe0fff61bc67ed7d3f4845013e000080bfc021043ecadf9dbdace3a83ec2ae6ebf0e62073d2c56b8beaeb373bd90dc773f3fcb783e000080bf840c143ec85f9abd4089973eec836cbf92235c3d43fbc1be199b8cbdcd63733f41c59a3e000080bf1442273ef50ed7bdbb44853e2e1c56bf36f2d7bed445b3be25f1fcbee9535b3f9b99173e000080bf19c5223e7dcd92bd228b843ea25972bf94a37e3d72daa1be1b5320bd81a5733f83d89b3e000080bfa9501d3e84ba08be8d27f23eb37acdbe061162bf57fb783e7b756abf734bc43eca3ef4bd000080bffd49dc3d88f15abd6b81fd3e32d37fbf7041bc3cd442edbc4041d83c1bf17d3ff778fdbd000080bf1327d73d9d1125bd0d19073f44c87bbf4d02b93c95a937bec3bb0f3ddd447f3f60f288bd000080bfda73d93d734a80bd7fdde93ee2fe7fbf2100ae3bc1f91f3b1f7ba33ba13f7e3fa0efeebd000080bf8a592f3e1b4a8dbdf7575f3ed90977bf5ac29b3c0fee85bedb4f07bd7d097b3f40c8453e000080bf3f70353e7ac7c9bd9df75f3e480358bf693be3be567a9abe7595f9be1c765e3f7528ae3d000080bf1322403e1406c5bd22a9353e5e4b57bf11d0ffbe5b9354be8ee001bfed8e5c3fcbec95bc000080bf9146553e685bedbddd24363edca926bed9fc78bf0df229be629c79bfd7b63c3e2090fdbd000080bf64425c3e704be4bdfd4c0d3e84819fbda2187fbfd661003dfd757bbf5c10923d928a31be000080bfd0ef4b3e7d20f9bda038603ee36aa3beff1968bf68428dbec38670bf797dae3e512607bd000080bfd9436b3e79e8dbbd1ea4373ee6a50b3fe08854bf1f13ebbdab5555bff2ce05bf882838be000080bfb088713ea241cabdca4b0e3e1e97253faff540bf50a4ed3d9c1d3bbff6f827bfda3440be000080bf6b0d653e39f1f5bd2b88613ed2c6c83e408965bf139352bee8426bbfb565bebebb2e06be000080bf2844403e53b006bee545863e165bbabeb9e961bf8a8a98be390b6dbf1f3bc13eaba35a3c000080bfd09d603e878906bed6e3863ef6e5b73e96d869bf45da43bee0d66ebfb742b1be62d2c9bd000080bf1e6d7c3ed23acabdcb2c623e5ec6513fa7f70fbfbbd2e2bd1cb312bf56d34ebf9ec30cbe000080bf9e0f7f3e09aeb2bd919d373ed9fe573fcea508bfbc8267bde6f208bf5adc53bf952c2ebe000080bf20b8823e93539bbd622d0e3eab035a3f6374ffbeae82243e9d12f1be2be45cbfcb363cbe000080bf58c8843e59a273bd1496383e7e6f7e3f07e3d3bd52a21d3d871bcbbd00717dbf6a59cdbd000080bf30a0873ef7ae41bd920e0f3ee45e703f6ce255bd261eae3eb1639abc23a77ebfc33ecebd000080bf9b59833e42afbfbc6422153e2bb93b3f5f1e0d3f79c7cb3e0017103faa0f52bf6eb6cb3d000080bf5517703ee19b26bc9f1c153e6123d53de957713f993aa23e3a77683f994c61be9976b63e000080bfc456703ef2776fbc36ca3a3e6b7ea53e6eb9713f0e92803d4aa26b3faa80a8be78f0573e000080bff48c6d3ebc2278bcf627613eaaa9b63e3c246f3f62801b3c137e6e3fe788b6be82cc903d000080bfa1ba693eadc351bca147843e57f6b33e126d6f3fce412bbd23aa6f3f7bbbb3be9274923c000080bf145d473e055177bc65fc833ec702c7be3735693fe4590dbec8b36b3f7184c73ecb47abbc000080bf3750403eb9ff48bcab76953e83f6bebe06db693f236a26bed0866d3facc5bb3ea9248bbd000080bf581c4e3ed00a8cbc2dee5f3e5b7acebe9b28693f2682b5bd312d683f4247d23e15f8bf3d000080bf9d822c3e598723bddee8833e8d8853bf8d3f023f166377be46e40c3feb0e523f690a1ebe000080bfb822213e38bc20bdd384953e4a714cbf1b26053f760e9bbeceaf163f34a8473f74dd59be000080bf959f543e03788bbc5e30383eda41d1be1088693fe281e6bc88fa603f1aa9cd3e58db833e000080bff7ad363e68eb20bdf3925f3e6a7b59bffdd7fc3e20f33dbe1354003ff7805d3f8dcbfc3b000080bf19c5223e7dcd92bd228b843ea25972bf94a37e3d72daa1bed1cc143ea547753f03aa7cbe000080bf840c143ec85f9abd4089973eec836cbf92235c3d43fbc1be2f1b503e9667683f23cdbbbe000080bf0cc3573e9deb7bbc4e290f3e8b2707bf6408553fdcb92d3e52f34b3f1906d53e6975e03e000080bf5d1a3f3e64e818bd5ef7363e3d325ebf8982f43e80a10bbe9a37d13eb0bd573f5b6eb33e000080bf8a592f3e1b4a8dbdf7575f3ed90977bf5ac29b3c0fee85bec9f3a03c59f37f3fc0214939000080bf1686383ec3678bbdc712363e988d7abfc2029fbce82a51be4a6891bd5a4f773ff6597e3e000080bf8181403e202a8dbd626d0c3e741a7ebf364233bd6122e8bd88dcb0bdd50b693f773ccf3e000080bfc021043ecadf9dbdace3a83ec2ae6ebf0e62073d2c56b8be75a73f3e2d68653f5609cebe000080bfeb70143e6af816bd9292a63e7f9745bf74020a3f1197acbea6b91e3fef6f413f1a4f58be000080bf0e13ed3df12e97bde84abc3e30e977bfd801953c4db37ebe9081e23d8cdb6c3f7ad3b9be000080bf8a58443e67981abd2f870d3e4ada6ebfc4f1b73e35c2a4bc3a5d903ef2c2433faf55143f000080bf1686383ec3678bbdc712363e988d7abfc2029fbce82a51bec6899bbca7f37f3f3c3984bb000080bfb22c483ef88cc4bde2210c3e6a7653bfa7dd0fbf57e230bd28900dbfd1a6523fd8f805be000080bf8181403e202a8dbd626d0c3e741a7ebf364233bd6122e8bd6981c9bc9c667c3feb3d29be000080bfaad71dbe88d4d43de28d863fa636ffbe3c50573f1a22573e73045c3fa8dc023f2e7fefbb000080bfe92b38be92d26c3d05538d3f8f3561bfc4b7eb3e0f74f33d3b6eee3e927d623fab6aa23c000080bfe04b41beed7e553daed6873f295266bfd511ca3ebe013f3ec55fd13ee158693f5967333d000080bf124f26be8f8adf3d7011823ff9fd00bf32df543f886b6f3e91705b3fcac5033f7f7e883c000080bfda754fbec8d207bc1f4c883f643c7cbf5f06f43ba7c92e3e36a7643cd3cc7f3fb467173d000080bfe86a4bbee84f5b3dc095823f1a6267bf1effad3e631a853eeeafb93ee54d6e3fd567343d000080bfecacd6bd9891fa3de6777e3faac2f23db4767c3fb7f2ec3d3e887d3fcbd900be47326d3d000080bfb6a2edbdc7bb033e475b713f08c2b23de05a7e3f8c91933dad587d3f5f13c2bde3fddc3d000080bf09df5bbef38f7e3d84f1773f1a3768bf59daac3ea9b9803e24c2b83ef0626e3fed0a533d000080bff7c856bea0e0e2bcc803813fb4de78bfde7932beb871203e58cf26bed0af7b3f22d5a93d000080bf1f8440bedee38cbd4cfb883f24a66bbf423fb9be8512173e0867b9befe886e3f96fcd23c000080bfe23735beaa5ce83d10ea763fc85907bfcbfe543f44022c3e52db583fa29d073f71752d3d000080bfa12b01bec91d063ec6e1643ff402813bfefd7f3f8b02debbd06d7e3f89594fbb7973e23d000080bf1a4d3ebeda75afbdfbe9813f4ade67bf1c06d8beb221253d12b6d5bef589673f733eb43d000080bf37391cbe244409bee6cc883fde103abfa6d029bff65a363ee33c2cbfd6603d3fdccb1c3c000080bf5bce35bed3f6cfbd8f787a3fded257bfcf5d09bf77e2143d29a006bf1b2d563f1cff1c3e000080bf221a1dbe074418bee529813fcbda2bbf1cad3dbfedc19fbcf4373dbf4ad22a3f4705bc3d000080bf5860c8bd80882dbe78bb883f997587bed5f873bfa711173ea1c876bf1dfa873e5ab457bc000080bf5b7b0fbee99b14be88b9743fb18ee3be5da445bfc29ee8be435a63bf646ce43e04a0e23d000080bfde8ed0bdce741fbec6578f3fb93ea8beb16b67bf310e8c3e500b71bf9a21ac3e2273a4bc000080bf2d1f49bd8ca924be3c2d8f3f8d62dd3d970e75bf685d893ed22b7ebf4ffaf0bd6b1da2bc000080bff7e51cbe1c61f1bd871a8f3f897240bf16aa1fbfc75a5b3e15d523bf8db2443f482b10bc000080bf0c233dbe980e5dbd8ca38e3f497c71bf638195be95a1213e9f7b96beccac743f9bb13e3c000080bf7571bbbdf17d31bee811813fa42261bdc62c7cbfd62127bec9927fbfbadc693da06e09bc000080bf4ed23cbdb2642ebe143f883f642a373e42b37bbff181143dde507bbf632439bed7bc74bd000080bf8ca19cbdaace1abee61c743f8bb2453e9ad447bffa2f18bf1bc67abff27240be4e2392bd000080bf00000000334e13be29248f3f00000000fb0f7abf8c435b3ec02e7ebf89a4d0bc16f3edbd000080bf768d06beb24ef5bde3a76d3ffcf375be3df14dbf34140bbfc96e77bf1813803e171a693d000080bf649c7fbd8224ccbdbf1a6c3fdf12fb3eed8727bfbf5713bf56a159bf392e01bfed2a1abe000080bf32a941be40f9bbbd6cc7743f00634cbf41f419bfe943f8bc6c3919bf377e493fc7c7183e000080bf60ab44be7e6ea8bd0dfc6c3f71743bbf3dfe2cbf4e72adbd4a4c2ebfa332393fcd54ea3d000080bf03b663be151a88bc55a6743f0a3878bf0c333fbe88ea213e8c8d30be99dd7a3fe5a0cc3d000080bf0f7c4cbe6af595bdfd4d603f2c6433bf2e8836bf9142c2bc7a4136bf1a60323f0913b33d000080bf008d02be718fe5bddf6d663fc9219abd955c78bf82026cbe71427fbf0bfc9a3dfae3e63b000080bf072762bd5c1eabbd2042643fe335273f1c823bbf3daa44be05b041bf0e3e24bf135701be000080bf29e961bd8d6299bd7d045a3f99eb2c3fbb7339bf4ff90cbe3fb63cbf42062bbf26c3cfbd000080bf8ec902be239fd7bda8ab5b3f00c4f8bcec8f7dbfff8109be98df7fbf8e82ed3ccd7d473c000080bfce177bbd0abf94bdada34e3f61c8293f9d983bbf18d21bbedd293fbfef5c29bfe88d8cbd000080bfa393a5bcb5dc19bca46c593fa1b7763f09b346bec2923bbeb5b162be76f476bfde4712be000080bf87a66cbc4b0595bc4018643f2295753f1fd376be039a16be43c487bec6b172bfc51934be000080bf630a56bcfacf1abd6a86703f0451483f18ce8bbe22420fbf51b0cfbe5dc767bf266f00be000080bf5c7b9fbc4b7df9bdd962773fa0aff03e291e12bf94582cbf4aba51bfd1e310bf8ad7bcbd000080bf0a6406beaed9cabd249b4f3f856112bdf5127ebf0ad3efbde6d47fbf546b0e3d12a2283c000080bfa9320cbe9e96bfbd5019433ff15181bd95cf7dbf2fe3e9bd147d7fbf81f4803db86fa93b000080bfec1651bebc0788bd2157523f92b033bfa5f435bf3c233dbdb25536bfde30333f220f573d000080bf52ee6ebedb6fedbb1b65653fde1d7abf147b44bec822be3db84d3dbeafc57a3f4ee6a13d000080bf57ee85bcbf9c593d7863653fee21713f9f86a43e6ad3c7bdb083963e00ef6dbf526264be000080bfcfbac6bccb64783d2fc05a3fa988673f49b6c73e15f230bee94eb83e20456abf1bf439be000080bf427bf5bc956508bcc93c4e3f9bd2743fcbb12abebad275be43cc47bee5c679bfc75bccbd000080bfba6692bd33a595bd629d423f5712243fb0ce3fbf5af22abe3a7043bf461425bfd7af16bd000080bf14af12be44a5b1bd39d5363fef22c7bdbf2d7ebf3ac28cbd01c87ebfbab6c53df0f95a3c000080bf57044fbe3d0f6ebd73bb373fb7a73bbf9c032ebfa701ccbc260a2ebf02bc3b3f61aeb4bb000080bf177e30bd462836bc7c65423f0371743fff392abefe227cbe576e48be57ba79bf5eb5cdbd000080bf473baebd310997bdd174363fb001193f452448bffae935be97bb4bbf9ef91abf0dcf5abc000080bfa2f61bbea893acbdf3c82b3f6e7105beb9c67dbf0c82913cc5c27dbf30c7053eaf31993c000080bf91d54dbeb1dd7dbd64af2b3fe49039bfbce82fbfeaa2483d795230bf526a393fce9c03bd000080bfa8534ebe6d1e87bd5c40203f52ce37bf37822dbf2d4a223ec44931bf5fed373f44d484bd000080bfb40564be2c67efbb29612a3f7da97ebff4a2c5bd27a208bdada3bebdb5cb7d3f759dbcbd000080bf87f867beaed4b33ac30d383fd63b7dbfb033f1bd76d2b2bd2363e8bdf3fc7d3f6e0058bd000080bf32cb6ebe23650b3b8f51463fb26d7cbf15820fbeaff2b7bd3f500fbea2787d3fbc520abc000080bffeb411bdef39703d425e4f3f3d41643fb6cabf3ed33982bef9c4a83e75106cbfcb6a4fbe000080bf5d52d5bd42079dbd34a02a3f5b6d023f437c5abf51b2e0bd456b5bbf66be03bfaffdbc3c000080bf93e263bd170d99bc5cab353fcf4c723fbdea6ebeb05a64bef5b983be696d76bf60baadbd000080bf7e1a27beedf5aebd46d0203fc5823dbeb00979bf01a20e3e69527bbf58f3413e2af2963c000080bf7ec655beb4ae91bd446e163f25223dbfbac919bfbf619c3e888727bf9d6d3f3f35cde5bd000080bfef3845bd27dd563ddf17433f98236a3f8de6a33ee8f37cbeed6c8d3e25d870bf762f49be000080bf134392bd715905bd6f4b283fe5056b3fe4cab0be497347bece2db8be6a9b6ebff8db30bd000080bf8c5ff8bd622ba8bd8e581f3faaffd93ed8a167bf7e06a5bbab1967bf5cafd9bead56863d000080bf07b133be1233bbbd54e2163f0b2b76bef9266bbf10a6a03e896077bf2e9e833eaa03483c000080bfea3f6bbd93e2233dd314353fcfd86f3ff9c2753e8f2582be0d924b3edfbf76bf9e9335be000080bf236967be9698873df0c2463f157a65bf0aeadb3ecb41e0bd640cde3e4aa2663fb24c86bc000080bf86cb6abe700a8b3d4b77573f350c6abfee6dcf3e62fd77bb3953cf3e16fd693f9fe0c83c000080bf572260bec1fe6b3d1459373f3f0961bf2ecbe03eae3a3ebe96b5e83e73b0633f675247bd000080bf5a673cbe7dcbbc3d2311363ff02502bf2ad1533fc05374bec2d3593fab78063f05e40b3c000080bf9dba72bec636a9ba842a553f986a7cbfaa392abeca8053bca89a2abeeb3e7c3febe7163d000080bfe69666be0264883dae28693fa9756bbff486be3eeb73ff3d1ba2c23e96786c3fbdf0413d000080bf761c3fbe904ce73d232d693fc0fb0cbf9128553f81026f3d3ba7553f8b540c3f96d55f3d000080bf30bc42be1d93e53de17f573f11f807bf45a9583f070225bda12d583f165b083f8fe5673d000080bfd50607becb4a033e355f553f0f0352bc98f47e3f02f2b6bde3717e3f4bf6b73cb0a7dc3d000080bf496740be0801d93df835463ff2f500bf34ff593f50ba14be1e425b3f98a6033fce58363d000080bfc4cd09beeca3f33dee5f453fb5801abca6127c3fd66932be11a47e3fdbf1dd3cba51cb3d000080bf7f84a1bd4c71d53dc2f6433f60b6143f403f4a3f24ab48be6702503fd56d0cbf0ee7493e000080bfc1190cbeb2f3d63d6f0c353fdd8113bcd01e773f819985be49e07e3f6207073d6e69b33d000080bf3274acbdaef4ba3d0729343fa35c193f46f93e3f90ee94be9aee4c3fa6df0cbf9f18733e000080bf622f94bdafe9e13de04a523f9c3d0f3f5b16513f874110bec22b533fc94208bf16f8423e000080bf655283bd041fe33d2e765f3fdcdf0f3fbf2a533f37437abd8fc3503f7c4c0abf6dae543e000080bffeb411bdef39703d425e4f3f3d41643fb6cabf3ed33982be3e00e23e3c2058bf96a59b3e000080bfef3845bd27dd563ddf17433f98236a3f8de6a33ee8f37cbeda27c43ef1a461bfe7708d3e000080bfea3f6bbd93e2233dd314353fcfd86f3ff9c2753e8f2582bec9eca03ecf8865bf47b29f3e000080bf56bc91bd973c9e3cd940263fc9466f3f1d722b3ed691a0be2786983e5fac59bf2c28de3e000080bf6a3263bd81e9d43db03d6b3f3e92173f0f314e3fbec3dbbc39ca493fdc6512bf8bb4683e000080bfcfbac6bccb64783d2fc05a3fa988673f49b6c73e15f230be7f60da3e1bf555bf1f0bb13e000080bf57ee85bcbf9c593d7863653fee21713f9f86a43e6ad3c7bd682ca93ee0b755bf2b70e13e000080bf30d7c2bdb8778d3d732b243fc6661f3ff2bc2a3fa687d1beb63c483fe69a0bbfbf4a9a3e000080bff2ad0fbe63f0b03dc0cb243f8c22423d872d743f25de97be93a47e3fbbf592bcdf5ecf3d000080bf1c13e2bd0aa22e3dcbbf163f02bf383f50a60e3f644bd2bea7cd303f6cb41ebf2cadbe3e000080bf4303b1bd0f9b48bb0267193f41f56d3fde39043e5ddab0be07ab9e3e16fe47bf0aba0a3f000080bf4e64c6bde8dec3bce4fb0e3fc615763fb6e23a3d2c2a8bbe8306533e2e1a46bff452193f000080bfb00317be00e3993d1a7f163f0c13593e3cb56d3f12069cbe9c2b793f20bc30be0dd01a3e000080bffb92edbd923ead3c6aa50c3f90e8483f1dd7f23e943eccbe8e891d3fec342cbf285cd23e000080bf4df73abe34a2943d8b6d263fd8950abfd706533f4b9a29be30d7563fc4b30a3f93233ebd000080bf81cd59be6de5253d931c283f0eae65bfcefbd83e8594febdf651df3e80f9643f6b2ccabd000080bf806640bed1048a3d35d4183fbdcd09bfbc08543ff1611fbe36b8573f7e26083fc559acbd000080bf882b47becaaa483d12db0d3fff0511bfba40483fd7b584be3ec0523fa21c0d3ffefe0abe000080bfffcf61be2a1b563c5435113f6e596fbf901eb53ea902db3cd747af3e63606b3f281d46be000080bfae6768bedee7f83aa4c3073f575768bf13f3d23e61a2a53d2e7cc73ef7f0653fb76650be000080bfccb663be6c7ca6bc20251e3f0cc47dbf5ec3d8bd7ef2a03d3306ecbdd8367c3f9dd501be000080bf76715bbed68ee23c11711b3f56646ebfd2d1b93e17c108bd851fba3e36186b3fb34d20be000080bf145d67bed68c0cbdcbf8133f0d427bbf3af3d7bdc2ca233e4fd008be04a0793fb64235be000080bf179a6bbed78a36bd3d440b3f85a678bf5f2199bd5b42673efd0bf3bd239d793fbf1440be000080bf3ca272be33c4b1bb618bfd3ef7cd5fbf3658ef3e5e3a063eb11bdf3ef3e35f3f71cc59be000080bf09c14abece17fb3ce3a9033fba9efbbe4622593f0c6a4abee4e35e3f863cf23ee1c509be000080bf87881bbe2895703df3570c3fbc137f3e3e3f5d3f5ac7dfbefda3773f51054dbe6b261f3e000080bf39985dbeb62daabd33a90d3ff4103fbf25ee0abf1b43c53ef4681fbf6615463f9b4eeebd000080bf5b2277be4dbb58bdca6f013f3e1d74bf4402b0bc13ce993edff3b8bdc6d1783fa35d5ebe000080bf89786bbe094fc8bd7a6c033ff2f242bfd87ffdbe3527d63ed86d18bf38124a3f384a19be000080bf2aab81befe437abd11a8ee3e038d78bfd800aabb122b753eb37148bdbba37b3ff96535be000080bfe8f577be9a94e2bd41b8f23ea9674abf15eb03bf624da93e9a9413bfb1f74e3fd9b5f2bd000080bf180b43be38a2fbbd0f2b043f8d8a4dbee0f062bfbb7ad53ecf6978bf1317743e4372223d000080bfec2f3bbe361fd7bdcbdb0d3f9cb25fbec07a61bfa91ad73e60ab77bfb2ec803e998ecb3c000080bf90f815be93fdd3bd2f6d0c3ff60abf3e845561bf4f26963ea47e6dbf1d51b3beca47043e000080bf99290dbe5af2b8bd4f74153f4e8eba3e03b56abf3e3a273ec8396ebf4a15b4be9d28d03d000080bf1daed5bd1bf184bdc6fb113f560d593f148206bf23c291bd762c05bf35ac59bf09d4a33d000080bf651b80bee0f2f8bd6b9edb3e91da4dbfcc930fbf9ed2493eabb114bf9bd44f3f280274bd000080bf15744bbe75770dbe3e3ff43e5f0a58bebc6a6bbfe5ada93e496378bfe7e0733e96dd303d000080bf494a1abe2768f3bde529033f45a3ca3e94d95dbf799a9b3e50176bbf6009bebe8ed60c3e000080bfb96eeabd425aa3bda0dd093f57bd563f28760abfe7a37d3d0b490bbf303b54bff945043e000080bff0deb1bd740c48bde8331c3f1691613f0413dfbe71423cbeacdbe1be3cb965bfbe874b3c000080bf4303b1bd0f9b48bb0267193f41f56d3fde39043e5ddab0be5749c43d40357dbff80ae5bd000080bf56bc91bd973c9e3cd940263fc9466f3f1d722b3ed691a0bebb08003e81097bbf077f1abe000080bf28d1f2bd0266bebded2d013f1a86573f4f5306bf1e21013e8bf709bfe15b54bf53ec153e000080bfa9501dbe84ba08be8d27f23eb37acd3e061162bf57fb783e14766abffa66c4beceb6f23d000080bf1327d7bd9d1125bd0d19073f44c87b3f4d02b93c95a937be15690f3df4467fbf9b0d883d000080bf4e64c6bde8dec3bce4fb0e3fc615763fb6e23a3d2c2a8bbe99572f3d38bb7fbf4d7785bc000080bfc47752be8ee618be0daadd3eb32269bed51274bf7daa4a3e275078bfdeab753e9f85233d000080bf234c21be57b514becdaedb3e9cf2c83e012b69bfcd11033ed55f6bbf3402c5befd3da63d000080bfc47782bebb2a00be8bffc33efafc51bf1b4a12bfd443cb3ca25712bf0d0c523fbefbc7ba000080bf36ac59be2d971dbe022dc53e28d28bbeba3576bf0303ad3c230876bf5a258c3e2c3d1b3d000080bf49bb81bed829f6bd6f9fad3e160a51bf751b10bf6ff102beb25d12bf44b8513f75da363d000080bf6ccf5cbeab4118bec5ffad3ebc799ebe975470bf9bd91abea56d73bfef849c3e199c463d000080bf632b80be096ee4bdb6489a3eecb651bff05b0dbf14aa1ebe7d3d11bf30dc513fd500a03d000080bf182786be97e395bd2103993ebe7f7fbfe70353bc19a47abd2be681bcddaa7f3fbf58463d000080bfcb2e28bef8df1abe376cc33ee035b73e5dea6ebf9ec1ffbc60d66ebf87aab7beed91f63c000080bfdee7f8bdfc1deabd82c7d73eb539573f6b900abf9f826f3c5a9d0abfa02557bfd6ecb93c000080bf5709f6bd7de7d7bde15dee3e26e6553f5f9909bf8f32e93d974b0cbfef8054bff6f7d23d000080bffd49dcbd88f15abd4981fd3e32d37f3f7041bc3cd442edbcf422d83ca5f57dbfd956fc3d000080bf3739dcbd88d98bbd5d6fd33e6b8d7e3fd0000e3cc9c2d8bd0db52f3c8bf07fbfe3af9a3c000080bf0e13edbdf12e97bde84abc3e30e9773fd801953c4db37ebe909f65bc0de67dbf0e2502be000080bff30585be7bf591bd6fba853eb7137fbf57d28dbd3ac348bda6b694bd22af7e3fd68a903d000080bffbb05ebe77850ebe1d779a3e0787b5bed6716abf2c3b41beae5e6fbf0fb9b13ed5e2933d000080bf116f7dbe7940d9bd79e9863e255951bf2fee0fbfff23fcbd6ffb12bfc6d24f3fb0dfd93d000080bfdd5c84be8d808abdf81a623e59277ebff752efbd7543dbbcf627f3bd2c447d3fa221ad3d000080bfea0682be0d7217bd3810623ec1cd63bfc98be83ebdc2303da09be83e2b0c643fbdcef6bb000080bf615387bed4609abdfd2eac3e6aa07fbfeb01593cc66156bd55b8533c25f97f3f2dfad43b000080bf6da880be529d0ebdd09a973e4ed15bbff30d033fcfc3ccbcea21033f28db5b3f5d08f2bb000080bf242981be7ee416bd45d4843e07df5fbf7047f83e16012a3c2453f83e9edc5f3faa79173c000080bfc26866bef22815bc1590963ee23dadbe8920703fd0419abdaacd703f05c7ad3ef35a983a000080bf532364be1cd2a8bbc633a83ee2b1aabeb1786f3fcfb2f0bd6034713f3b81ab3e77b7d8bb000080bface380bef6b403bd3063aa3e3add5abfe9e1033f56a378bdd77a043f35e85a3f3dca00bd000080bfc32b81be037ae1bc726fbe3e7c2859bf8c47073f33210dbdac88073f5647583fe1029ebd000080bf9cfa60be193d373abcafba3e78e2a9be89a76f3f7a33eebdde7e713f25cea83e8a8a19bd000080bf422388befe6597bd8e90c13e49d57fbf4302f93c6f829f3c933fef3c9a727f3f88d870bd000080bf7f1580bebfb9bfbc12c2d33e50e95abf0a90043fd1c3ccbcff2e043f24ac583ff2a805be000080bfeb6e86be18428ebd16a6d73e301f7ebf86837e3cf692f53dd362473a2a147e3fb66efabd000080bf24257dbee52b81bcff25e93e7de060bfb61af33e2d625d3d441beb3ee3b65e3fcefa37be000080bfee5d53be4487c03c1fbff73e0087d2be4e27673f7af3ffbda8ef683fcff2cb3e5c0cedbd000080bf4c1722bed1031f3d6ccd023fe7b58c3e07d35b3ffe7addbe8621763f28db76be2877073e000080bfd90759be938d873c0f7ce43ed672b5beafef6b3f8cf221bea4546f3f84f3b03ea7aea5bd000080bf376f5cbe4223d83b5e63cf3e388eadbe12ff6d3fc5b113be71d7703f9a2eab3e136165bd000080bfadf7fbbdac8b5b3be8a3043f5182513faffef13ed759a7bed187123f2d9238bfc6fbc73e000080bf1327d7bd9d1125bd0d19073f44c87b3f4d02b93c95a937be13c8f93dfcb250bf0eef103f000080bf1075ffbd91b506bc6094f83ef721573f345d053f714119be55de093f0d7345bf7eb0ad3e000080bf4a2722be6421ba3c0681f53e9832bc3e0b355f3f50a6a5be0a116e3f9aa4aebeec950c3e000080bf4b2326beb779633c40a0e33e70dea93e50a5683fd59581be5f75713fac12a1be1dc0da3d000080bf7499fabda3e881bcb954e53eea2e513ffe8f103f6253edbd35b8123f573146bf1e89893e000080bffd49dcbd88f15abd4981fd3e32d37f3f7041bc3cd442edbccbbf093d85f463bf565de83e000080bfda73d9bd734a80bd7fdde93ee2fe7f3f2100ae3bc1f91f3b3b2b893bad3771bfce73ab3e000080bf965e2bbef228953b8940cd3e19129b3e1f0d6e3fefc255beade7733f5a8e94bed205b83d000080bf081effbd7a89b1bc1822cf3e9cb8473f020e193f678a3cbed121203f3aed3fbf28315d3e000080bf3739dcbd88d98bbd5d6fd33e6b8d7e3fd0000e3cc9c2d8bd046d293d641673bffa269f3e000080bf292108beb741edbce484b93e625e433fcb0b133fd59597be4904233fc0153fbf8ae9453e000080bf6af931be1a6929bb43c5b83e99d19d3e64886c3f5fea67be9588733f78b599bea34a8f3d000080bffb9639beffe81bbceb6ea63e14d2af3ed27c6a3f748a54bea46e703f8aa5abbe685c983d000080bfeb7014be6af816bd9292a63e7f97453f74020a3f1197acbef4aa1e3f909641bf64d1563e000080bf0e13edbdf12e97bde84abc3e30e9773fd801953c4db37ebeadade13d55086dbfb2feb83e000080bfc02104becadf9dbdace3a83ec2ae6e3f0e62073d2c56b8be6b203f3e5f9865bfa351cd3e000080bff44f40be87fb48bcab76953e83f6be3e06db693f236a26befa866d3f20e5bbbe7964883d000080bfb82221be38bc20bdd384953e4a714c3f1b26053f760e9bbe7aa3163f39ca47bfb371583e000080bf840c14bec85f9abd4089973eec836c3f92235c3d43fbc1bebb9a4f3eaf9068bfda24bb3e000080bfa1ba69beadc351bca147843e57f6b3be126d6f3fce412bbde7a96f3f47b3b33e1dad9dbc000080bf145d47be055177bc65fc833ec702c73e3735693fe4590dbeb1b06b3f019cc7be3179a03c000080bf9d822cbe598723bddee8833e8d88533f8d3f023f166377be92d90c3f152652bfe2b41c3e000080bf19c522be7dcd92bd228b843ea259723f94a37e3d72daa1bea76d143eb75e75bfe47a7b3e000080bff7ad36be68eb20bdf3925f3e6a7b593ffdd7fc3e20f33dbe8647003f84875dbf8f2011bc000080bf581c4ebed00a8cbc2dee5f3e5b7ace3e9b28693f2682b5bd2123683f384ed2be6784c2bd000080bff48c6dbebc2278bcf627613eaaa9b6be3c246f3f62801b3cf4776e3fff85b63e378593bd000080bf8a592fbe1b4a8dbdf7575f3ed909773f5ac29b3c0fee85be20ea9e3ca0f37fbf8a7791ba000080bfc45670bef2776fbc36ca3a3e6b7ea5be6eb9713f0e92803d538f6b3fd77ea83e384059be000080bf959f54be03788bbc5e30383eda41d13e1088693fe281e6bc08e7603f559ccdbeec7384be000080bf25ce82be454908bd8ea63a3e94e760bfcebbef3ee3a2c13d6d82ee3ed433623ff8d441bd000080bf5d1a3fbe64e818bd5ef7363e3d325e3f8982f43e80a10bbe4916d13e04af57bf9fdbb3be000080bf168638bec3678bbdc712363e988d7a3fc2029fbce82a51be73b991bdc24177bf8a217fbe000080bf818140be202a8dbd626d0c3e741a7e3f364233bd6122e8bdd3fbb0bdfaf868bf868fcfbe000080bf551770bee19b26bc9f1c153e6123d5bde957713f993aa23ebc56683fbd9c613e2b03b7be000080bf0cc357be9deb7bbc0b290f3e8b27073f6408553fdcb92d3e82de4b3f45d2d4be14f2e0be000080bf8a5844be67981abd2f870d3e4ada6e3fc4f1b73e35c2a4bcf54b903e49ae43bf227514bf000080bf58c884be59a273bd1496383e7e6f7ebf07e3d3bd52a21d3de640cbbd2d7a7d3faa59ca3d000080bf9b5983be42afbfbc6422153e2bb93bbf5f1e0d3f79c7cb3e56f40f3f531d523fbc4ccebd000080bf1e6d7cbed23acabdcb2c623e5ec651bfa7f70fbfbbd2e2bdecb112bffae34e3f5f4e0b3e000080bf9e0f7fbe09aeb2bd919d373ed9fe57bfcea508bfbc8267bd42f708bfa8ed533f2ba32c3e000080bf30a087bef7ae41bd920e0f3ee45e70bf6ce255bd261eae3eb1a19ebcc4af7e3fbd5bcb3d000080bfd09d60be878906bed6e3863ef6e5b7be96d869bf45da43be0ed96ebff76ab13e33f2c63d000080bf6b0d65be39f1f5bd2b88613ed2c6c8be408965bf139352be12476bbf4997be3e229e043e000080bfd9436bbe79e8dbbd1ea4373ee6a50bbfe08854bf1f13ebbd1f5f55bf91e3053fae87363e000080bf20b882be93539bbd622d0e3eab035abf6374ffbeae82243eb941f1be62ec5c3f56a93a3e000080bfd0ef4bbe7d20f9bda038603ee36aa33eff1968bf68428dbe2a9570bf3443aebefb1f003d000080bf914655be685bedbddd24363edca9263ed9fc78bf0df229be12b079bf626c3cbef78cf93d000080bf284440be53b006bee545863e165bba3eb9e961bf8a8a98be99156dbfc400c1bed96973bc000080bfb08871bea241cabdca4b0e3e1e9725bfaff540bf50a4ed3d04353bbfdafc273f0b903e3e000080bf3f7035be7ac7c9bd9df75f3e4803583f693be3be567a9abeccc9f9be755c5ebfc69fb1bd000080bf132240be1406c5bd22a9353e5e4b573f11d0ffbe5b9354beb4f701bfba835cbf6fd5863c000080bf144227bef50ed7bdbb44853e2e1c563f36f2d7bed445b3beb222fdbed6345bbf0c1c19be000080bf64425cbe704be4bdfd4c0d3e84819f3da2187fbfd661003d338e7bbfea4292bdff572f3e000080bf8a592fbe1b4a8dbdf7575f3ed909773f5ac29b3c0fee85be383709bd8ff27abf158347be000080bf19c522be7dcd92bd228b843ea259723f94a37e3d72daa1beb85622bd258773bf948d9cbe000080bfdc1219be13d3e5bdeacd983e8393503fc04fe1be454bc1bed22f06bf695d56bf5ae01ebe000080bf003b37bed6e60fbe0d1a9a3e1992a63ef23467bfc96d8fbed6b870bfd935aebe0ee0a13b000080bf53940bbea12ef2bddd23ab3e385e523fbefafcbe875991bec2d50abf53c054bf94b2fcbd000080bf840c14bec85f9abd4089973eec836c3f92235c3d43fbc1be429f8dbd5e4973bf5b5c9bbe000080bf168638bec3678bbdc712363e988d7a3fc2029fbce82a51be2be69ebc88f37fbf5d99073b000080bfb22c48bef88cc4bde2210c3e6a76533fa7dd0fbf57e230bdab9e0dbff6b152bfe7e6033e000080bf08e82ebe759017be7349ad3e790eaa3e6d956cbfad4241be91f370bf93f3acbe015219bb000080bfa11302bec70ff5bd34bebf3e8880553fa94309bf775905beccf70bbf9db755bfb46e83bd000080bfc02104becadf9dbdace3a83ec2ae6e3f0e62073d2c56b8be834075bd48cb77bfcec579be000080bf818140be202a8dbd626d0c3e741a7e3f364233bd6122e8bd65a0cbbc757d7cbfd40e273e000080bfb7d316bd332221bef371813f4fc2ab3e1f1f64bf1c7a9cbefc2971bf1704a3beb67fd8bd000080bf00000000d5f213be38c3813f0000000092ce6abf4cfacbbec10c7dbfec0577bde12d0e3e000080bf000000007a50f0bd853d793f00000000801019bf5a334dbf08b55cbf9af0cfbe961b9b3e000080bf00000000f13118bd1020733f000000001e2366be777379bf1ea302bfda8656bfbfea453e000080bf00000000d37220be2276883f0000000047ec7fbf0702c93ccfb77ebfd0ba20bb12a4ccbd000080bf00000000d42d3b3d4c56713f000000004fca623e7da479bf374f90be75856fbf759859be000080bf7c4537bc6c22333dccba6f3ff81e4d3fcbb9803efefd0abf2073353dd10b6ebfb3fdbabe000080bfc21851bef4897cbd7dcf443f98f236bf880832bf29f299bddab732bf4341373ff6bd6a3c000080bf7c45373c6c22333dccba6f3ff81e4dbfcbb9803efefd0abfee38383dc01f6e3f388dba3e000080bf30f844be7c698a3b9c738e3fc7957dbfb991833d7fe3f73d1c00883df9687f3fe81e643c000080bfda73d9bd734a80bd7fdde93ee2fe7f3f2100ae3bc1f91f3b888ca33bbf447ebf1492ed3d000080bf44a5513d93c4923c9812d93fa8291a3f3bc64b3f17e37a3d15df403f6b8d17bf388a923e000080bfadc3913d70b1a2bbd094d93f602b4b3f792a143f250b403e8a6ff13e7caa47bf8faed23e000080bfb22c583da5f78d3c04e8d73fd0c91d3f3af4453fca79183e218e3c3f150c22bf3516743e000080bfff3f8e3df4496ebb1ac3da3f40d3573f0c50073f3a53cb3d0e66e93e6cde4cbfa475c73e000080bffabaac3d38e033bd912cdc3fbe47503f5aa3bc3e344ce63ee9c4543e682168bfe9d9bb3e000080bfdcb8a53dc7dd20bd063fdd3f09fa6b3f4ee2883e68c28f3ed018273e7eaa6cbff668b03e000080bff641b63de3c6adbd35a1dd3fdba5163f3e8234be7a004a3f68ddbcbe024f6dbfea488b3d000080bf0841a73db16e9cbd86d1de3fef72433f295a12be633c213f5ce1bcbe749f65bf087e793e000080bfc91c4b3d8291973c2e3dda3ff8951a3fa0084c3f4e01453c2cd0413f5c0414bf63bc9b3e000080bff014723d42f0f83bc421db3f08eb3d3fb3582b3f95e2253d6be11e3f0b5035bf7543ac3e000080bfdec1cf3ceacffe3c7e53d83fb7f1993ec21c733fdd41b43dfee36f3ff6669fbe56cd213e000080bf4e2a1a3d2415c63c3dd9d93f0d30e53e06e8643f42811ebcd9fa603ff134e0be9b06423e000080bfb433cc3cef8ff73cf06ed93f4e52a43e4f63723f05c2b9bc73c96f3f8fa6a0be7c4d1f3e000080bf3d07163dbb14d73caa14db3fb2c2f13e8970603f58c2bbbdd9765f3fafb0e6be7da23f3e000080bfff5bc93cdcd4003d8cbcda3fed09b33e98446d3f87110cbec0796e3f4d28a8bee3ce1f3e000080bf9221c73c1fd7063db217dc3f643ac33ee482693fe0e119beb0476c3f509dbbbe8e0ef13d000080bfe3e3133d17d2e13c8250dc3fdefbfa3e716d5d3f9233dcbd94205e3f9af5f1bee3f41d3e000080bf467d123d923bec3c0c72dd3f8ef7033f852e553f71da4ebe83525b3f6415febe20e50f3e000080bfca51403d3bc5aa3c3fcadc3f3ffc1e3fcf62473f6ec2b3bd2904463fec4817bfa68d6a3e000080bf6c0f3b3d1230ba3c99dfdd3feaa31f3f5542443feca11cbe4b86473fa93218bf6b744a3e000080bfe025383d1c83ce3cedcede3f2b16293f24f4293f4e92b3bed05f3f3fb40220bf0f14663e000080bf0b53143da2c9fe3c5369de3f3dea0f3f9cf6273f02e400bf8be54f3faf960dbfba7a3e3e000080bf47231f3dde7d0e3d081cdf3fbf37173ff0b5a43e26703dbf59eb373fc48e20bf5b069a3e000080bf67d43c3da81ee93c2288df3f9744333f48efdf3e1e7010bf92de2a3fd5752ebf54aa993e000080bf3b35573d6343b73cbc05e03f2eaf4c3f9be3ea3e2177c6beb6f6133ff55f43bf1ff0933e000080bfbbca5a3da9fa953c6a4bdf3f4f6e433fd26d1b3f9fba61be1930253f6e743bbfa50e5f3e000080bf9544763d3293283cbb0de03f10415d3f86bbff3eb82374bd2a95fe3ee49354bf05be803e000080bf41de6b3dd905833cabb7e03f3feb673fac7ebe3ee6fa4ebebe15d63e3c7e5cbf0dcb933e000080bf5151753d1a8b263c7aa8e13f4fdd6b3f1fb6963ed50182be3debb63e620d66bf0c57823e000080bf7e05693daf22a33c0e13e13f1e21673fec3a573e890ac0bee701b43e42f25cbfbfaab93e000080bf280a743d55c2933cd2c6e13fb2e4623fdbe1a93dca46e9be8e3b8c3e422063bfd916be3e000080bf9532693d36b0d53c6556e13f1d3f513f7741a13c2a6613bf8ea7a73eb99156bf6754df3e000080bf2daf5c3d4b1ecf3cfda6e03f0783533f563b663ee93b04bfde3de93e125a4ebff76fc13e000080bf2c66843d950c803cd9e8e23f8b1e523fcb82b9bcc81f12bfa44d703ebacb65bf7001bf3e000080bff06d7a3df5bfdc3cd3fae13f754a453f4da2a7bd0dc821bf7d3f8a3e20395bbf6661e13e000080bf6bf76b3ddb8f143daf41e13f19773f3f27d28c3db70429bff2bcce3e522956bf0f96bd3e000080bfbb5e5a3d7f160b3d4bb6e03f28583a3f31637b3d0ad42ebf9d4de63eee614bbfecead03e000080bf86ab433dd6c52d3d4227e03f38ec2d3fa472da3d51da39bf09bd093f93c23ebf62bdc93e000080bfeace533d7ac33d3db7d1e03f04d23e3f5b4a653eb8bd20bf2774043f8cca49bf4f8eaa3e000080bf1d51613d5c5a4d3d7ba0e13f2fde483fe289b13e698f03bf6b63043f98c152bf53b46f3e000080bf0182793d0cac233d1deae13f62a3493fc87b5d3e70b013bf8cd2dd3e9d355cbf58bb893e000080bfeb19823d7044373dbae2e23fd6ea513f9e3ebd3e08c3dfbe868df53ed8455cbfd843303e000080bf061a6c3da33a5d3d12a4e23fe4f04c3f279be13ee4f2cfbe6614083f44c755bf2d2b113e000080bf8ee7733d0a9f6d3db4dce33f0ddf4c3fea2b003f85f2a8be868a0f3f98e251bfc557ed3d000080bf08e7533df295803d2272e23f26e84c3f91caf43ee621b9be079b133f8e6f47bf6c287c3e000080bf4cc15a3dc79c873d75ade33fa409493f7bdc093fca629cbe49691a3f90d746bf19b0393e000080bf2bdd5d3d0adb8f3d80f1e43f6910433fcd8b133fe63597bed4ab223f9ede40bf3d392d3e000080bffb93783d6bf37f3ddf32e53fbfa44a3fca77073f1f769cbe03e1153f5acd4cbf935d063e000080bf55b77a3d39598a3da977e63f072d483f1e500c3f570698beafc81a3f546348bf7cde163e000080bfb5515d3d3e549a3d3c28e63fca8a3b3f5db41c3f586a98be4c812b3fbacc39bf2506203e000080bf76d7593d0425a53d724fe73f4964323f34b42a3fc83d87be6158363f63c12fbf5177153e000080bf9e107a3db3ed943d55ade73f52e8453fc291143f941583bea1fe1f3f241144bf57af1a3e000080bf1e71883d38785f3df993e53f91235b3fb50be33e330a88beb7c0f93eebf05cbf6d47063e000080bf08558a3d2bdc723d0ce5e63f04e55e3ffb2adb3e370b78be5e28f13e0c145ebf0eda233e000080bf1d39923dbfda513dc66ee73f2bb1713fe775943e378a20bef00da13ee6476fbfb684293e000080bf0a4a913dd8bb3f3da81be63faedc6c3fde4dab3eee2137bebfe7b83edbd06bbf988f143e000080bf5537973d3cfd203d56ace63fc79c743f9c018c3ed252e2bdfc55953e82836ebf16b35d3e000080bf67b7963dab24323dfdf4e73fa509773f92d3763e42c3d3bdcd6c823ea18874bf9f391a3e000080bf1ff5973d0c01403ddd7ae93f920f783f4beb6d3eb652acbd2237783e37bb75bf704d103e000080bf454a933dbe61623df0dde83f5aea733f73d9903efeb1e1bd76b1983e75ac70bfbbeb283e000080bf75208b3d5dfb823d0431e83f0ae9603f007fe03e8afa41be75bfef3e4c6f5ebffa63243e000080bfe0649b3dae9e133df969e83f6d14763f5751853ea271b9bda0208c3e92d770bf25d44c3e000080bf1b2c9c3d56651f3d28d2e93fd90b763f14e6843e32f3c0bddb348a3ef77e74bf75c1fa3d000080bfa2989c3d3b39033d774ae73f5c2c773f66ea783ed1d1bebd9719853ed3546bbf1c58973e000080bf7e629d3dc593dd3c3f47e63f289c7a3f3a211c3e42f90abeab60473e98a965bf310bcb3e000080bfec16a13dba4ccd3cbafce73f71697c3f06e2123e9282aebd4987293ea18967bff94bc93e000080bf4e7da03d7273aa3cd239e73f2c2d7e3f8c01b43c39d3efbd15f79e3d906d5dbf52dbfd3e000080bf4da29e3dea3e803ca1a2e63f68577b3fd4b900bee8c111be6ea923bded975ebf470ffc3e000080bf41659c3dc170ae3cf968e53f8c6e7a3f540a5a3b3c6254be442dd83d72645ebf04c5f73e000080bfc1ff963d4d8ce53c554fe43f5df3703f1a93ef3d3a42a2be43cc7e3e3ee45fbfe514d53e000080bfa015983d26a60b3d6e6be53fae6f743facb3783eaf522fbe78d3933e230165bfa3b2ae3e000080bf6a34993dc0e8723c57b5e43f32176f3fbc8109be3c96a9be0169003d527364bfb27ee63e000080bff7c9913d376eb13cca88e33f0c3f583f4592abbde95307bfd3fe513e4c945cbfbcb1ed3e000080bf3336943da3e9ec3bb64ae43f03c76e3f8f0281bc3f72b8be4b0ee73d0aa76fbfdc82aa3e000080bfe2e9953d17b751bb381ae43f5270753fbf91323e20e265bee7d1663e139272bf7b0e683e000080bf724f973d1ac65d3b45c4e53f8cc77d3fc6c116bdf13101be63f4933b632b73bf730aa03e000080bf3999983da214adbb1fa2e53fb29b7c3fcab3fe3d0a63d5bd922a103eecbb79bf05f82c3e000080bf0ebf9b3d780d7abc22c4e53ff5727c3fa511973dbd4118be5204b73d8ca87dbfd915cf3d000080bf75029a3d8d9683bcc955e43f683f7c3f3743dd3c667a2cbe1e22803df3cd79bfb08e563e000080bf4ed6883db6a4233b67c7e23f32db653fdf2d8b3e814eb1be645fb93e964867bf0a0e6b3e000080bfc91d963d446f71bc2ba6e23f4f3f7a3febb90a3e316225be92e92f3e78bb74bf1093733e000080bf49809a3d86e7253c4f22e63fd6a9783fc91a3bbe77aa1bbe5d48d3bdbd7866bfb387d83e000080bfe030913d4b01293d079de43ff0b1673f06f7ae3e369e81be4da6cb3e600f64bf85b9603e000080bf59888e3d4ed1113d5565e33f4417613f9033713e15fbd3be0c62c53ee7c65cbf71f8a73e000080bfa915863d11e24a3dab22e43f44a7563f6007e23e6f8ea3be64f0fc3e0bfd5cbfeb7fd43d000080bfe1d4873d9985f63cce8ee23f3c074d3f5507f83b6d4819bfdd74a33e65f259bf3b20d53e000080bff376843d0c604a3a651ee13f9067683f2ae7d23e62d2a0bd1159d63e612b61bf9f76673e000080bf20938c3d7024d0bbf664e03fefb8713ffd1da63eab8266bda837a73e3fa166bfa65c923e000080bf50ac933d1bd8aabca69ce13f5b2a7f3f2191943d71a110bd8b0fa33dd48474bf4c07923e000080bfe9f9933d0381cebc2d9ee03f53547e3faaf1c23d62b1803dcdfb913d03c072bf696f9e3e000080bf3b3a8e3d698e2cbcbc76df3fcec8743fb599953ebb8194bcbb47903ed5e066bfa8a7a73e000080bf842b803d3eb2b93b9946df3fedbf5d3f871cfe3e15446dbdc6fcfb3e02d053bf73858a3e000080bfd78e823dad1f1b3bb05bde3ffaa3603f21faf33ea3615dbde7a4ef3e309053bfe73ea03e000080bf8d09913d8cbf6dbc2d58de3ff14f713fc446a73e79a28c3d2e71903e51b663bf2509b83e000080bf6102973d76e8f4bc0877df3f1f3b793f19c2213e3ffa283ec8d1c33dbd1570bf8ed5aa3e000080bf365f853d7f013dba3f3edd3f96755f3f0a9cf93e9f43a23ce8bae73e50fe52bfca46ae3e000080bfc2fb6a3da0362a3c0454dc3f3f1e413feef5273fd001b1bcde1a213f23a336bf94cb9d3e000080bf9629663d5e354f3cef78dd3f9f3c423f30ae253f1e6297bd909a233fa0b537bf7db68d3e000080bf98c2433d4d9f9d3cf99adb3f03d81e3f8354483f0c2352bdc410443f493217bf5223823e000080bfbdb1603d616e773cb972de3f2ed13f3fc8d8263f2094f0bdc49d283fce0737bf6e25703e000080bfc91c4b3d8291973c2e3dda3ff8951a3fa0084c3f4e01453c675b443f5dc915bf23d1863e000080bff014723d42f0f83bc421db3f08eb3d3fb3582b3f95e2253d965f1e3ff0dc34bf67fbaf3e000080bf51bc8a3d432017bb5af1db3fc9855a3f48c6033fd7d2a33d1773ea3e738d50bff135b63e000080bf19ce953d7e923bbdd76fe03f888c743fd1c0a0bc7f15973ec2d2dcbdffc473bf524b923e000080bff99e913dce1b27bd50a6e13fa1077a3f2963d4bdcf82403e21661cbed47373bffcaa893e000080bf9ae4873d61de63bd7071e23fc04a653ff031a2bef3cd9f3ed812c8bebe4a65bf9a65593e000080bf2f368d3de29178bd7a2ee13f4bd65d3f6d0279be4e26df3ebbf8bbbe04f366bfb809683e000080bf446c903d249c16bd6fbde23f81277b3fb17a3fbed9224e3dbb4946be55fc72bfe3227e3e000080bf7fa2923df60108bdb3d3e33f0b3d763f01137ebebfb2ebbda9e05ebe3cfe72bf3ebf683e000080bf8a1e983d9979f2bcc809e53fc263743f68235dbe25e351beef6d37bea96a77bf39633c3e000080bfeacc9d3dcc25d5bc8943e63fea17783fda92c3bdb0d368be9c499abdb0177ebf4521c43d000080bfaf089e3df41910bd4e0ee73fdbc66c3f8bc580bec5f991bedc146ebe59af77bf4b40cb3d000080bfb3b7943dc18c29bde21fe63f3079623fd5fac7bec95982be4e99b4beedf36abf0bba3a3e000080bf1992933ddbc449bd0e81e73f40634f3f11ec04bf3f668bbe58b900bf63a85abfc0ef073e000080bfcb849f3d2a1d2cbdee22e83f5983613fd302bebe396296be8ea2b3be6cb76dbfcfd4f73d000080bf357ea13dc18e3fbd0265e93f74d8593f8a62e9be759985be8e4ee6be819363bfee23b03d000080bf6f66943d6d8f5ebd1c06e93fd8a9423f728917bf5dcd88bece9f17bf05044dbfe57cb53d000080bfec18973de5986cbdc289ea3f8c18423f0e1c1bbf3cb376be81661dbfe98f49bf3c16393d000080bfbe31a43db6304bbd7cbaea3f7c19593fed83f8be7ec359be7cd0f9bec72c5fbf3d6c343d000080bf21afa73d80634fbddd26ec3f4c055e3fa2cff1be6b3a21beefc0f4bedfda60bfa280cb3a000080bf6b0f9b3d047374bd4417ec3f5c0e4a3fb52115bf60c246be8f6c18bf21a94dbfdc7624bc000080bfada29f3d96b076bd13baed3f4864553f712709bf6ee909be94b50bbf252156bff8134ebd000080bf76c2ab3da4884cbd04aeed3ff71d663fc8e7dabe8e53c4bde99dddbe558466bfbddd2ebd000080bff790b03d99473ebd3f72ef3f8dab713f85dea8befa05c4bb1b95a8beade570bfafe89fbd000080bf0935a33da75b76bdb472ef3f356d5f3f88dff7be9c1180bd0ad6f9be2b695ebfb97eacbd000080bfcc5d8b3d40178dbd800fec3f96cc393f504a25bf3b1b73be3d362bbfb5393ebf9b14c2bc000080bf2d09903d450e91bd49bbed3fe486433f556e1ebfbad23bbe4f5723bf695044bf71518ebd000080bf84f1933d9c5193bd817aef3fdb9d4c3f645917bfcac1dcbd86b419bf68114bbf8ab5cfbd000080bf1364843d27697ebdcac5e83f6080343f421a29bfc10d84be10272bbf768f3dbf4dc68c3d000080bff629873d252387bd7a6dea3f0e30333ff8c329bf95c187be60f22ebf0cd13abf4ae0ac3c000080bf94317e3d014da4bdb2d7ed3fbab62b3fe3da35bf5e535abe799d3cbffcd22bbf5232a7bd000080bf378c823d4a29a8bd6799ef3fc211333fc8cd33bf771907beedf036bfd26830bf6159f6bd000080bf2ffb753de78e9ebd2827ec3f0c68243f43c637bfb69989be429340bf955828bffe1d28bd000080bf95bb4f3d4f5caebd2652ec3f759f043f39d04dbf9c8195be2aee58bf2a6407bfea9d41bd000080bf828e563d7829b5bd8e04ee3f78c30b3f21304ebf74426cbe7a1256bf65740abf4ccdb9bd000080bfab225c3dd3f4b9bd19c6ef3f0878123fd9aa4ebf172214bed2d551bf2f890ebff7e809be000080bf06f56d3dce3697bdc477ea3f5f3a203fbbdc39bf29da91be40ac41bf836827bf27c7913b000080bfccb2673d473e8fbde4bde83fe161233f274c3abf7f9d80bea7543ebfdad32abf8d25353d000080bfe597413d96069ebdcfd7e83f405a033fa44952bf43ec7ebeff1958bf611209bf996fdc3c000080bf4a5f483d40f7a5bd919aea3f084c003f59654fbf72ba9bbe1cf559bf044506bf523abfbb000080bf4fca643d4e9d87bdfeede63fc4f02e3fe25e35bfdf8234be443335bf75bc33bfc3799f3d000080bf7500843d6f9e6abdf608e73f7aae413f04941dbfe90262be792d1cbfc63249bfc21cce3d000080bf72fe863d0daa4dbd1515e53f17725d3f562efbbe2062d7bdb716f1becabc5dbf6b772b3e000080bf3909653d513083bdc845e53f58ee3d3f16922bbf0743a2bcfd2a2abf3a343dbfa687df3d000080bf4fcc3a3d5d8b96bde95ee53fc30b163f6b4e4fbf57c3d93ced354fbf987015bfb1d6823d000080bfb6843c3d079598bdf203e73f8b900c3fe3ad52bfc23a15bec68b53bfaf880fbf7d09583d000080bf711e0e3da4fca4bdb01ee73fab2ec63e34bf69bfb56903bee3436bbf1364c9be58b8da3c000080bf5bee0c3db08ea3bd5c71e53f14b7cf3e61b569bf2b63363db5fa69bff044cfbe4a37e13c000080bf2d0abb3cd273abbdba7ee53fd07b7a3eb5f377bf4e82393dee3378bf58cc7abe1a56a7ba000080bf3be0ba3cbf2cadbd2a39e73f958a773e9b3876bf488903be492578bf22537bbe02755d3c000080bfc9e5bf3c800eb3bdb323e93fa73a733e7da06fbf64ed84be7ce277bf0a6b7fbe6d9d5b3c000080bf6b80123d492faabdf0fce83fe48abc3e984165bf1dd47fbe05376cbfe81ac5be98dca23c000080bf944d393ce57cb1bd6e4ee73f69b2e13de4fe7bbf85c10cbe31707ebf31c5e0bd9f6a32bc000080bff6833a3c5375afbdb188e53fd0b2dd3d5a4f7ebf01821b3d465c7ebfd6f7dfbd66f0e8bc000080bf00000000927db0bdd28ce53f00000000fad97fbf83820b3d23cc7fbf5b92b1bad7d322bd000080bf00000000fbacb2bdc557e73f0000000090677dbf057211be05f57fbf4c672a3b937194bc000080bf00000000da73b9bd2250e93f00000000bf0376bf2f9a8dbea0fe7fbf01c8ea3a35f3cbbb000080bf67d73d3c5dfab7bda242e93f2543e43d28bb74bfd6f98abe82407ebfc1d8eebdb310403b000080bff4de183d4ed4b2bddac7ea3f1d16bb3e837a5fbfe371a5be916f6cbf2d41c4be672611bc000080bffef2c93ca7aebcbd3cf5ea3f8283763e55a968bf786eaebef17477bf7e2a83be5900c239000080bf8be2d53c1101c7bd29b4ec3fc0c1843e22bd68bf48e2a6be46ed76bfbb9085be8e8b22bd000080bfc7da1f3d5c3cbcbd4984ec3f1377c53e8b4f5ebf87929fbe273e6bbfbd9ec8bec9b839bd000080bf96d1483c8467c2bd5518eb3f0ab3ed3df3a46dbf4ddeb4be7a2d7ebf0db2f1bd66d283bc000080bf00000000b43bc4bd4e27eb3f000000004b0a6fbfc341b7beedfd7fbfb1ba3a3bdd91f3bb000080bf000000009ca6cfbd9be7ec3f00000000320871bf8181acbee0bb7fbff4a17b3ca4cb2fbd000080bfe355563cea7bcdbd66d8ec3ff109043e5c036fbf751aabbeb6dc7dbf50f5f6bda5533bbd000080bfb516263daeb9c3bdfc36ee3f7ca2d33e93aa60bfcda278be351169bf9572cebe6d67bdbd000080bf098de03cb1fbcebdcb66ee3f6e45903e773c6dbf899a7ebedc9a75bfcf9089be44d8afbd000080bfd922e93c1a6ad4bde125f03fc275983ec75c71bfd55119beeb1973bff88d8dbec82c17be000080bf501d2b3dc3f5c8bd51f7ef3f0342df3e222063bf74591abe2ad165bff592d5bea12411be000080bf1669623ca6efd5bda08bee3fd3a9123e312575bf51fb7fbe80d17cbf5a61f9bdb283cbbd000080bf000000009755d8bd529bee3f00000000bcdf77bffaf37fbebeed7ebfb121bb3c9039b5bd000080bf000000000610debd795af03f00000000ff667dbfb08111beab717cbf7858c13c7f5b28be000080bf4f206c3c6490dbbd944af03f7ae91b3e48487abf465914bebc957abf09fe03be95b122be000080bf4a7c2e3d309ccbbd83dcf13f97cee73e920c64bf89c11cbdff8060bf1ed0dfbec1634cbe000080bfcec55f3df453bcbd22abf13f1902183fdbc04dbf0f021cbdd0974bbfeb3b14bfa6d937be000080bffa97843de0daa9bd4e7cf13f0b1c393feca530bfb8e101bde37a2fbfd60b36bfa41820be000080bf63d5603d282abbbd79b0f33f14521b3faf4a4abf2502b13dce8642bf31c41bbf69576abe000080bfef02853d1b66a8bde97ff33f04b63c3fdabd2bbf00b2a53d241926bfeb743cbf4a3d45be000080bf6dca953d618a92bddf53f33f92b1563f52e209bfaf02a63d41de05bfc37b56bf709b20be000080bfadda953d302b94bde256f13f702b533f5ba810bf5b0286bc20e10fbfb00f51bf495906be000080bfd591833dc0cda2bda9a3f53f965e3d3f416a24bfd6a24d3e76811abf51e443bf607265be000080bfe2ae5e3db459b5bd13d3f53f629c1b3ffb9643bf7e7b5d3e0a6f36bfde2125bf6d368dbe000080bfc2dd593d11e2aabd5ce7f73f9e88193f260f38bf25d7b33ebddf26bfbc8d31bff4049dbe000080bf7a35803d41ba98bdc7bdf73f43a63b3fd1dd17bf0b6aaa3ef1970abf7d164ebf046078be000080bf1d5b8f3d16a283bde693f73f70ee543fa30ee8beea1da43eaf97d5bed42a64bff1ff35be000080bff4c4933d8d5e8dbde674f53fef44573fc1c301bf7c2a423e5207f5bed12c5cbf771235be000080bfd428a43d417e76bda741f13f3ed2653f496ee1be8f816a3cc276dfbe45b464bfdb8edabd000080bfb402a33d25c973bd882ff33f9804693f42eacebee011b93d24bfc8be794869bf0c0201be000080bf4835ac3dbb0f40bdff21f33f2e65753fbd2187beda62db3d6b5e82bedc6976bf348ebebd000080bf5e68ae3d35b742bde84ff13f8df6733fa28998be45e2623d78cb95bef1c273bfa414b4bd000080bf5a48a03de2e86abded44f53fe938693f6c1ebdbe4db23b3e36f9b2be77766dbf8f0707be000080bfe50e9b3d4ce357bdbf60f73f989e653fdb75a1becda99e3e478294beb5dd72bff5e400be000080bfdc10a33d598723bda931f73f7beb6f3fbaa239be3396983efa3328be26a97bbfbec6a6bd000080bfd6e1a83d556d37bd0323f53fd4bd743fa30b6cbeedb2393ecaaa5dbeb2c478bf238cc0bd000080bfbf7fb33d0d8b11bdfb94f13f0f107c3f75d219be28b3b63de28313bef6a87cbf9d4493bd000080bf1762b53d7f880dbd1b49f03f5b9b7c3f22f21abe2823703dba7a14be9ffe7bbf9007cdbd000080bf25ebb03de90f0dbd693af33f3cf57b3fb99103be0e53f93d2462f8bd1f917dbf57df84bd000080bf2f50b23d8fc5b6bc2e59f33f8ade7d3f158197bc6179023ee5d960bcf2c97fbf33881cbd000080bf00ffb43df110c6bc08e5f13f355a7e3f34a118bdaf11db3df20302bd4c837fbf558558bd000080bf179bb63dc3bcc7bc9ad2f03f1e247f3f09a120bd7221933d5c32efbc20877dbffcc70abe000080bf1d55ad3dc09401bd541ef53f087e7a3f79b3cebdee42383e5d2abcbd277c7ebf456a6dbd000080bf0c21a73db8cdd4bcf913f73f51da743f668272bd6955923ef1c645bdc0707fbffcc938bd000080bfc6fda73d94a03fbc91edf63f5b4f763f8122413dd16d893e28605b3de8987fbf5aea87bc000080bf4086ae3d80b996bc091af53fdf247c3f7400e63befe9303e2b32493cbade7fbf47daf0bc000080bf0473b43da4375cbc2714f23f920e7e3f4d825e3d10f2e13d613e713d3c5d7fbfb0391ebd000080bf8b18b63d58c771bced2df13f4b0a7f3f2f225a3d14a18b3d6b71753d66427ebf8868ccbd000080bfb98eb13dc1702ebcaf5ef33fd7627d3fdea18f3dba22fe3d219f933d5a517fbfd2b038bc000080bff54caf3d5567b5399641f33ff6bd7b3f32d2113e6fe3e63dae39113ecd637dbf2f5b583c000080bfb070b23de9b559bbb115f23fa1917c3ff5f9053e0db3c73d9de8043e17cc7dbf832b8b3c000080bf1d91af3df357c83bace0f13f0a8c7a3f26c3433e4042993d0af03e3ed4f27abf3567863d000080bfa932ac3d97e22a3c4df9f23f2c55793fb112533e9572c13d2863503e7d777abfad5d163d000080bfc3efa63d616d8c3ce750f43f8188743f6459833e6a11173e719b813e836e77bf60e02a3d000080bfa851a83d0377a03cc780f23f5d1f763fd809883ee001923dfb38863ecfa376bffbc0623d000080bfdb6ea23da087da3cadbff33fa339713f5b129d3efb51093ea3b39a3e17a473bfbba65d3d000080bf9dd4973d986b113df5f3f43fac2f6b3fbccaae3e11634b3e642dad3ee08f70bff2954f3d000080bfec689c3df6cfd33c94a2f53f31606c3fdd32a13ee913613ec2669f3ee7eb72bf926a523d000080bf7250a23d419d723cec34f63f256a703f378d853e1c02653eb3f0843e190e77bfc275103d000080bf569caa3df838d33bccb7f43f4cae783f4dcb3b3e8a621a3e88f93a3ee5a57bbf31bc9d3c000080bf6f0dac3d7573713ca873f13fb2ce773fb8da7a3eea225f3d8725743ed02877bf1112d73d000080bf603dae3d5567353cbabff03f28807a3f6beb523e29010f3c11324d3e19d075bf6c37473e000080bf5a66b13d7d3e4a3b9127f13f0e1c7c3ffc5a313e2c82523cb5e02e3ec3ab7abf57abe03d000080bf1729b43d26aab7bb514df13f86a77d3fdc81033e00422b3dfcd9033e78dd7dbf7f35b2bb000080bf5c5aad3d2ae5b5bb3cf9f43f58697b3fe132cb3d451a243ebdebce3d4db07ebf3b7d52bb000080bf4163a63d46b5083b23a4f63f601f753f46ea1e3e6deb783e238e203eefcf7cbfc7d3523c000080bfa1f28f3dbb9c123d0ddff63fba8c683f10dea83e9491833eb159a93e405d71bf845b273d000080bf92058c3d4ab3393dec17f63f45ed683f7dbeb33e4f6b623e13edb33e90766fbfa90d203d000080bf9301803d00ab633d7e1cf73f845e623f4076c83e7955823e9ef0c93eb8006bbf46642b3d000080bfefc6823d4b943d3d5df8f73f1d61633f63caaf3e21529c3e34a7b13e6ed46fbfbfab343d000080bff487863dfa0a123d98bdf83fa68b613fb68ea93ed5f2ac3e08d8ac3ee3bc70bfd4bc293d000080bf2fc2943d68eccb3c438cf73fab72683fcc81a13ea42d8d3eb46fa23e1e9172bfeebb203d000080bff0be6a3d0261673d5bd3f83fa7e04e3fcf26d83eb84ed23e2312df3e81d065bfaa24863d000080bf7636643d94bd853d9be2f73f32f14b3ff805003fb7d2ad3ec9e0023fdf6c5bbfdbdd803d000080bf5f406f3dd3333d3d2db2f93f42c34d3f130fbf3eda3fed3e82f0c53e356a6bbf204b8f3d000080bfb1174a3d2d96623d126cfa3fa4242c3f7f97e43e5e20173fb96cfb3edca95dbf2995c33d000080bf386a453d51d8853d3d7cf93fb70c2c3f1ff8063f1e1c053fc35e113fa94f51bffab4c23d000080bf691b3f3dd00b973d297af83fbb002a3f8b7e1c3f9d67dc3eeabb243fe5ad42bf1ea6b23d000080bfe735763d1c7a0b3d9676fa3f48c1493fb872a53e381e063f2d87b03e30d36fbf375d723d000080bf05c24e3d79b1303d9948fb3fbc262a3f0543bd3ea938263f12a6d33e69e567bf8a8cbd3d000080bf1af8513d247cef3c1409fc3f0b20253fc5e58f3e3bea353f21eea63e9a3671bfc11e9d3d000080bf0d1d7b3d1e35a63cf222fb3f1055433fe2bb733e6dd8193f4746853e26d376bf8771523d000080bf2ba17b3de179a93bd0b3fb3fa18a3d3f2ec2133e5b10283f6185253eb37a7cbf77340d3d000080bfb345523d81d1653cc2a4fc3f1d921e3f76ea413e910a433f15df643e900c79bfe225763d000080bfc900503de030d1babe13fd3f268e173fdfd2c83deec84c3f8deaf43d73057ebf72b4073d000080bf1155783d87c528bcd21dfc3fbb52383fc6e2403d9c3e313f45256c3deb907fbf802b023c000080bf0aa28e3d7633233ce90afa3fafd75b3f095b373e15ccf53e2705443e86317bbf4ff3c03c000080bf02b78e3dd847a7bb6286fa3f9734593faca19c3da011063fd43cb23dad067fbf34e7923b000080bfc74a8c3dbc04a7bc72e1fa3f1a33553f0003f7bc15800d3fe6ff8abc16db7fbfbb34edbc000080bf698b8b3d309ec13c2e72f93fe0045f3feac9913eafcacc3efa3c973e7a6674bfcd95143d000080bf6cb49c3d8d9c85bc8deef83f83776a3feaff6f3b1d87cd3ed003733cc2e47fbf6c87cabc000080bfb265993d6f2efebc952cf93f3b50663f3c02e2bd2546d83e299dc0bd96697ebf54fc72bd000080bfbe119d3d92cec0ba7c9bf83fd5c26b3f85c2df3d3a86bf3ee687ed3d09457ebfa481953b000080bfd8d79a3d323e4c3cb324f83fdde26a3fd7e26c3e159ea53e4800723e96ab78bf9161c73c000080bfe069923d1fbc36bdc361f93f49a05d3f89b272be50b6e13e9e9e59be72b478bf0df6d6bd000080bfc11d883dd3a068bdd28af93f694a4f3f3286bebebf4ee83e75c2abbe638e6dbf564326be000080bff2b47c3dc7f143bde734fb3f2baf423f48a68dbe7964163fa3987fbe45b175bf83f203be000080bfc3b9863d4ab20ebd2f19fb3fda0e4e3f22ba18be0e08133f6f5906bebd197dbfa53d95bd000080bf51bd753d95d489bd7ba4f93f0bac373f7b6104bfb1f6ee3e8ecbecbe57ca5abfec9e71be000080bf91ef523dc6c39bbdbec1f93f0c9c153f3c1626bf758bf93e06a712bfd95841bfb30ba3be000080bfa0fd483dcc248abdcb4cfb3fe2df0d3fd8ed0dbf1cf21e3f420cf9bef32c52bf910c99be000080bffa09673dd0b870bdfb3bfb3f1c5a2e3f9216d7bed887193fda5abebe726d67bf3a1858be000080bfdcb9703dc30fcebc0c58fc3f6f14323f930379bd8e40373ff42859bd8f7f7fbfdb2708bd000080bf88b9643dcd561ebd616dfc3f55d2293f667a34be9c2c3a3f64c029be147a7bbffae1b1bd000080bf9b03443df65efcbce25cfd3f6676083f8893d4bdd3f5563fd4bbdebd491c7ebf4aca5bbd000080bf4e7e4b3d4c3789bc124efd3f204c103fc66660391e75533f7deb0a3ca6fc7fbf621bb5bb000080bf3541543dbc214dbd9068fc3f10801a3f144e9ebe7e263c3f163a92beacc571bf59b126be000080bf4b223b3d645970bd0c73fc3fccf3ff3e4e03dfbedca23f3fa946c5bea0cc62bfdc3084be000080bf4d4b2c3da81c53bd691bfd3ffda6e23e2d86aabec720553f4d13a4be22086dbfe7cf4cbe000080bf49db383d79b130bd5a49fd3f5157fb3ef65a65bedc88573f4af862be7a7977bf590103be000080bf6e4f103d833423bd7afdfd3ffababa3e4feb4ebeb9af683f5a025dbe1bca77bf88ab03be000080bf3f1a0e3d024657bd5d88fd3f6baeaf3e6c56b3beff1c5f3fed98aabee2b469bf036071be000080bf3ca2c23c4aec5abd4aedfd3fa23b663ee2aabcbe9aeb663faa01b6be649864bfd7668dbe000080bf7ba4c13c00c71ebd0680fe3fc70b793e633359beb44d723fb6f75ebe2e7c76bff3a723be000080bf40c1c53c4cfdbcbc5cc9fe3f35818c3e8ae1afbd2f30753f9b52a4bd869c7ebfe38e87bd000080bf7f4d163d9ab2d3bc132cfe3f670ece3ef8b1a6bdb16c693f9dc6a7bd66c87ebf71ca57bd000080bf3961423cf1811dbd25ccfe3f91f3fa3d2e7b66be6773773fbbc46abeb03a74bf27b845be000080bfdcb8453c4e0b5ebd0f29fe3f6953e53d1dabc4beb09d6a3f3d74bdbe673f5fbfb6fda3be000080bf0000000042795fbdb03cfe3f00000000b112c8be30a56b3f3799c6be213259bf9d68b8be000080bf00000000d6aa1dbd9fe4fe3f00000000074b6cbe4f17793fedd67dbe025171bffdea64be000080bf000000002b6ab0bcf73eff3f00000000c281c7bd4bc87e3f551eacbd8ce17dbf13cdc6bd000080bf672a443c9f8fb2bc0c23ff3fc8c10d3e7422c0bd20657c3fa207a5bde9467ebf2565aabd000080bf5b971a3dc93931bccc2afe3f0727e03e8782ae3c2319663f5a372b3d5bc67fbf0b88593b000080bfef1cca3c787de6bbd0d5fe3f43069c3e1e43c23c92bf733fcf2e773d8c877fbfe4b6b53b000080bf5b5dce3c0e4a183cdfa5fe3f888aa93e0b1a023e8a5b6f3f3bbf443ea9ad7abf9f26853d000080bf938f1d3d3c66a03b38f5fd3fc6bbf03ebdf3f13d80e75f3f9bc6263ef34f7cbf7cad3a3d000080bfdc9b1f3db2bcab3c0587fd3f39f4ff3e9be3593e8eeb563fc2838d3e2e3675bf8921a03d000080bf882cd23cefe4d33c193afe3fe132b53ec8ab6c3e9e01683fe643a33eb1d470bfb352ec3d000080bfaf95503ccf65ea3c5a9dfe3f919a353eaac37c3e7ae3733fad40b93ebea56abf35372e3e000080bf8a73d43c734b2b3dd68ffd3f3ab6be3e2faab23ea1245c3ffd1fe53e081a61bfa4e2263e000080bf28d4533c4181373dfaeffd3f60c23f3e3a66bf3eb78c683fc9c9003f95ad54bfd6e3733e000080bf00000000823c3b3dd80cfe3f000000006177c33e209c6c3fa334093fa3c147bf6e05a53e000080bf00000000ef3cf13c0abbfe3f000000001759813e29b2773f5219cf3e478762bfa5966c3e000080bf0000000088d94b3ca227ff3f0000000041b90c3e33927d3f95cb6d3ea2a376bf6de0083e000080bfd5204c3ca20d403c4209ff3fe7e92a3e75b9093eb00c7a3fb1575e3e22aa78bf7fefc53d000080bf4a99543c98a7733d2efefc3f8b53483e68d4ff3eb505583f628d223f676438bf14008f3e000080bf00000000c8b7773d1e1bfd3f00000000bc91023ffc325c3f56d8303fc1361fbf9dd0bc3e000080bf000000000b97953dd6fffb3f00000000a503213f0f06473f7adf483f92c2f6be4aa2c73e000080bf8d45533c9771933d8fe3fb3f6a6a4c3ebe6f1d3f384a433f223b3f3f2d6f19bfd94d933e000080bf9b3d503ca438a73dbabbfa3fd9794a3ec77d383f9c1b2a3f00314c3f122803bf6ef8a23e000080bfa5d8d13cd2ac8c3dea92fb3f0b03c53e48d0123fe524393f56652c3f2ed535bfb4db513e000080bf745fce3ce389a03d1076fa3f48aec23e099e2c3fe10f223f48b5433f9c471dbf6fe5473e000080bff372183db118953dff09fa3fce3f093f08781b3ff217163f170e2d3fa09039bff8db073e000080bf5b9a1b3d51f4803df911fb3f00fc093ff391033f86d62a3fd79b163f89f44bbf1fb80d3e000080bf30f1c73c2d3fb03d7f4ef93f7f53bd3e9957423f9022093f4da3563ff06505bf1889233e000080bf7c9a133d6c79a53dcbf3f83ff8d7063f9a6c313f9efbfb3ef3673f3fc03727bfc701f53d000080bf00000000245fa93df6d4fa3f0000000019a53c3fde0e2d3f1eb64d3f3904cebe6292e03e000080bf00000000b5a3b83db69ef93f00000000bd9a513fe4f9123fddff7f3faf6a973aedefd7ba000080bfa2d5493ccd94b63d5089f93fd7d2433ef7a64d3f1662103fe1dc533f80bfe1be38dfb13e000080bf5b781e3da8a74f3d030bfc3fb957093fb05ad63e59943b3f2eebfd3e98e25bbf49b6023e000080bf8f1dd43caf97663d76a4fc3f0d0ac43e7ad6ee3e29204c3f11b9103f4b0c4dbfc2da493e000080bfe21d203d0b97153dc1e2fc3f6020063fd682a13e9f8b4a3fa0ecc63e5e466abfd255dc3d000080bf02663e3cfaf2c23df04ef83f57fa3a3ee51e5f3ff0f6e83e4f5c733fd99a8cbed102143e000080bf73d5bc3cc427bd3dd61cf83fd822b53e41e3543f6c33db3e4eef633f2017e1be9d08f23d000080bf8368ad3cef74c73d46cef63f7eeaa83e5c8b643f511a9d3e303f6d3f6581bcbe5c20993d000080bf334f2e3c4d81cc3d3bfbf63f2bb22f3ef6d06d3f09eea73e93a87a3f78564abe0f58423d000080bf7ced193cf86ed33dc47cf53f9cda1d3e0afa753ffcc36b3ee2777c3fa9c927bef990c03c000080bf000000000420ce3dbf0df73f0000000009f6703fdee6ac3edcff7f3f8864383ad07c00bb000080bf000000008db4d43dc094f53f000000009fd7783f5d73703ee3ff7f3fc0d6e03989afe8ba000080bf00000000fe0ad93dba36f43f0000000067b77b3f898a3a3eebff7f3f5d379a39f918d0ba000080bf1045013c7732d83da819f43f6cb1013ea36e793f0e823e3ebada7d3f404a04bec887c73a000080bf48a9843cfc8dd63d60a4f33fde72683ee480733f7d1a563e4ce3783ff3876fbe73620d3c000080bfa8069a3c7257cf3d0950f53f82de953e01fc6d3fc63b653e5444733f53239ebebd2f243d000080bf39b4c83b4742db3d0118f33fa6b1ab3dacd07b3fd231233e42117f3fe799aebd6a3a083b000080bf4ee5343c7c5cdb3dc4aff23f1a53e73d5a677a3f4cca323ec25a7e3fd26de6bd35b74bbc000080bfe0d65d3ce414dd3d08e7f13f3559083e590a7c3f6a32e93df2b77d3fb3e607beda783bbc000080bf6727033c157add3dfe0ff23f6263663d41257d3fec310d3e01987f3f6ca862bdb6ec2abc000080bfd68b213cc080de3dc077f13fa4e2b93d9e4b7e3f5352913d7ce87e3f92f6b6bdd1b5bcbc000080bf249b2b3c7885de3db0c9f03f0e63563e8a9f773f1cc212be50367a3ffc8258be18ac493a000080bf59466a3cce53dd3d4b05f13f7a437e3e3de3743f113a1cbe0ae6773f21347fbe68515b3c000080bff78e9a3c15aadb3d4e42f13f46f2593e9f60783f70c2ecbdee0a7a3fdf9d5bbe3591e0ba000080bf77f6953c4c8bda3d744cf23fd8424b3e951d773f67ca2d3ebcac7a3fe49d4fbe6bf5013c000080bf24f3c83c919ad63d6877f23ff5f99b3eeb0c6d3fe16a643e77ea723f8a73a1be409b563c000080bf942ad13c32e9cf3dfcbef33f822ebd3ef922663f15db703eb6196c3fb47cc5be7d18d03c000080bfb8740c3d0777c73de8a2f33f9f62fd3e3b4c553fbaa27c3e1a955a3f2edd04bf68db233d000080bf52d2033dbb2ad03d726ff23f31a7dc3e34c55c3ff101883e9ce4633f41b2e8befbc8ff3c000080bf22e8283d5724c63d213cf23f72a10e3f097a473f88fd923eca564e3f2a3317bf950c1f3d000080bfbf13333d22abbb3d9854f33f323c1d3fa66a3f3fcd31813ea8b7433f259f24bfebb5363d000080bf448c573d72e5ac3d40dff23f69143e3f0abe203f02eb6e3ec0f9223faf1245bf01693b3d000080bf462d4d3dde1db93df8e4f13f3c20323f25f02a3fbb75873ecfd72e3f2aa73abf3004343d000080bfc80afe3c97add53d2578f13f4f8eb43e1f076e3f96f2d73d5d4e6f3f94d7b5beada9b23b000080bfacde213d9f75cd3d9a5ff13f0aa6003f690f583ff8fa3f3e82f75a3f5c5504bf80c00c3d000080bf9fb0443d5918c23d1523f13f0b72273f40fa3b3f35023a3e3a7c3d3f29ba2bbfd7103e3d000080bf12156a3d5cafa93d4c71f13f10074f3f26dc0d3ffa0a4a3e78290e3fc57054bfac6d5f3d000080bfc8d9743de8859b3dc24df23f10ba563f370f013ff199523ea768013fa2835cbf772f4c3d000080bf3465873df6d1893d4776f13f754a633f4aded63ef331413e4c00d53e834768bf7cd5773d000080bf630b813d16da993d5ebbf03f7c065c3fdebefe3eac22f03d37e0fb3e9c0e5ebfa31c993d000080bf5ebd8a3d5dc08b3d3d9bef3f8fb9623fb4afed3ec68136bc0136ed3eddb961bfd7cfb53d000080bf7a56923d9e95743ddd28f03f11436f3f3cf6b13ede519a3d87cbaf3e36e26fbfda71823d000080bf07b7953d79af5a3d0002ee3f9c0c713fd839ac3e0d837e3ceecdaa3e9b2870bf7960be3d000080bfabce8a3d3501863d9834ee3f7ac4623f8b6aed3ee64092bc7233ed3e64a961bfe60ebb3d000080bf444d743d02bfa63ded2cf03f011e543f55530f3f5e0b98ba12ea0e3fb47753bf9c959e3d000080bff917813d435f9a3d324bef3fc13e523fe2850f3fbfc2d8bdcdd4113fc8eb50bf3866c73d000080bf4357823de524943daf44ee3fc0604d3f02ec173fded184bd51d3183ff60f4cbfe8b8b93d000080bf2635743d967ea23dda1eef3f2c0c393ff507263ff63274be6c612e3fc50f3abfc966b43d000080bf7fab753d26fa9c3d575aee3f4b7a313f6818353fd9f90cbe8a4a383f384e30bf05eeb03d000080bf3bc2693d5438a23d876cee3f80b21c3f28cb423fa7735cbe375e493f9e241dbf6bef883d000080bf3640693d80d4a63d4702ef3f34c2213f6ff4313f5a86afbe93ef403f6f8027bfde787f3d000080bf1d416a3d71e5ac3d3dd1ef3f6d443e3f14b4233fa56a49be365c293f480b3fbfeeca963d000080bfb707613db988af3d478fef3f184a243f39242f3f546eb1be19423e3f5f922abf3f77793d000080bf2ed06e3d2b419f3dff9fed3f2938243f9416443f11622d3d8bd7423f8f7224bf201cb83d000080bf18937e3dad4c983df147ed3fcd6f3f3f94e9283f4c11973da182273ffe5140bf7cf2b03d000080bfe84b6f3dbd56a23ddc64ec3fdf37283f22083e3f9f41063e8ed23c3fc9462bbfc001bb3d000080bfb45a603d9a3fa63da6f0ec3f4e60103f451f503f3b6a143e706b4f3f642314bf40afbe3d000080bfc8a3543debcda83d3650ed3f3828063f9c8f583f6e43ca3d2b57573fd14108bf9bb5c33d000080bf7a71623d2fa4a33d2bdded3ff207153fa618503fda0195bc51b24f3f0e4b14bf1273a13d000080bfaa6c583da939b93da055f03fb0dc333fa12a333ff1c103be32bf353f39a333bf95f8743d000080bf8e3f513dee62ba3d6404f03fbaf6183f5ff33a3f008fa9bee583483f31b71ebf4fa53c3d000080bfc7293a3d2928c53d2a57f03f3f18f63e8dc54d3f267bb3beba3a5d3fc58600bf6b1a0a3d000080bf53ee3e3d5d6dc53d00aef03fffc1153fc2704e3f1542b1bd949a4f3f734915bf0b01443d000080bf902c603d0c94b43db9c3f03f4963473f9f521e3fa6d3d53d6ecc1d3f3a1849bf2653603d000080bf11285b3dd76fa63d3cfeed3f4696133f32f34f3fbdd2b4bdbd2c513f2dba12bf8b837e3d000080bf2f034e3d89a0aa3df588ed3f4a340a3f877b573fa407d93b0878563fccbd09bff364be3d000080bf50a43b3d9352b03da411ed3fa197ef3e7283613f4102913deb33603f132af2be734bc53d000080bf269d413d0a6faf3d99c1ec3fa0f2e73e84e05f3ffb51313eea66603ff8d7f1beeceabc3d000080bf6efc493db01dac3d93aaed3fb7890d3f98da543f132360bd03d4543fb0c60bbf7c15d43d000080bfbbb6373d7368b13db647ed3f5486f53e2488603f5e41e4bc04985f3f7caef2be58d6e43d000080bfd2e1213d2671b63d1003ed3f8b11b43e18f26e3f1b61923da0a06e3f1f61b6becf3c853d000080bf035b253db326b63dccbbec3f06a2c63e6d64673ff799383e74e6693f5e46cebe402c5c3d000080bf32aa0c3d6b0fbb3da9acec3f15a6a63ed0d2603f496ab33e3667703fb4e2afbe216139bc000080bf57052a3dd47fb63d9f59ec3f1ad7d23e58595f3f0eba863e89a1653f0cc4e0be6a13543d000080bfd1e80e3d4889bd3dee43ec3fee2ac33e4b195a3fc3ceb73e81c7693f2ba4d0bebd9429bb000080bf5408e43c49a3c23d0a6eec3fab7fb93e2970503f9e44e83ed8ba6b3ff9acc6be158a1fbd000080bf36cbe53c865bbe3d4ed6ec3f080e9b3ebb5c4c3fc845053f8d28723fd001a3be653c7ebd000080bfaed90a3d529eb93d98f9ec3fd6ba773eca2c6f3f9719863ecc1b783fcc8a7bbe9e439bbc000080bfbd70e73cd602bb3dcd1fed3fc44a563ee558593f5e67f83ef63a7a3f5e6f48bed6f7a1bd000080bfedd6b23c1c76bf3d9d28ed3f0f12cc3eac4f2b3f918d203ffcbe653fb4dcd9be183beebd000080bf13f3ac3c3529c53dadc6ec3fea46f03e30c6343fa6bb073f1ecb5b3f075901bf232bb2bd000080bf1ae0823cc3bcc73d7e54ed3fe4262d3f63460d3f34c4f93e6c542a3f5feb3dbf0988aabd000080bfa4888c3cd1cdbe3d1d97ed3fb07a1e3f64460c3f7606103f350f3b3f79172abfa3ad20be000080bf5bcdba3c4775ba3dad68ed3f1416913ea80e353f72ce253fced4743fb05584be29750bbe000080bf863b973c603bb83dc4cded3f6ccd073fd303323f8f3af83ee476553faef007bf745c1abe000080bf65fb103ddc9ec03d7bbdeb3f5262d33e740e5c3fba259a3e503e663f3eb4dfbe0f90673c000080bf4cc02f3dd2e3b73dbad9eb3f4636e43e324a5b3f4b15853ece14613fd46cf2be70d1573d000080bf1b12373de3fdb83d3c33eb3f2628fc3e9a855a3fe5d22d3e32e35b3f9f1602bf7d9e813d000080bf4242143dc0cdc23d840feb3fa346e23e9890603f201a403e25d0633fc2ffe8be990f013d000080bf05fc1a3d0ad4c23d6e34ea3f164ef13efd33613ff0a0813d89ab603f3924f3be7bd8853d000080bf1d38e73c24f6c93dc233eb3feebfe63eb6875c3f12b46f3ef235623f447cefbe7262a43c000080bfaa90f23ca624cb3d4650ea3fa96be93e9acb623fe402af3df212633ff499ebbe64151d3d000080bf035dfb3c8eb6ca3dd82ae93f345fdb3e7101673fa3423ebde7bb663f16add8bec06ebd3d000080bff0d7243dfc55c03de337e93fa33d023faf1a5c3ff8a134bde4de5b3fbfdb00bf6d0ec23d000080bfe89a493dc4ceb43dbe66e93f175e173fc9b24d3fbf518dbd5c324e3fee8615bfc89ccd3d000080bf4f1c403de430b83da25cea3f831d0a3f5e20573f0022573d6a3d563f30c40abfdc2f9c3d000080bfbd8f633d4d12ab3db2d6ea3feb27233f48b0443ff382723de134433f2dcf23bf3274c33d000080bfa27b563dbdc3ad3dacaceb3f742d0f3f2890503f80d91c3e2053503f452613bfccf8af3d000080bf31987f3d75749c3d4ca7eb3f0c51413f9984263f5922a73dfad5243f786242bfce9fc03d000080bfa5306f3d7e32a63d72dce93fb0f9343fb14f343f31e183bd5ad6343fabd532bf6f84e93d000080bf99a0863d61fc943d4ab2ea3fbc08563fc46b0c3f85822dbc15bd0b3f406b54bf534dee3d000080bfdfdd4a3db8e6ae3d6e4dec3f38dff73ed8c6593fcfba513e9a1e5b3fd04e02bf0255ba3d000080bfbc07883d21cc8d3d46d6ec3f4263583f0550073f5e92a03d8ea1053faa2059bf7dedb83d000080bfdc4a8f3dca8d823d5c04ec3fdafc693f92dece3eb541153d17eecb3e172b69bf263bde3d000080bf16ba923dd0be723d978bea3fca46723ff241a43ef2411abdc94ea53e97986fbf791d103e000080bfbe2d983d8ec74c3d5a6ceb3f14aa753f6b628f3eb042d7bc9edc8f3e243b73bf7f990a3e000080bfd7aa9d3de54b283d259deb3f3073743ff081953e12c35dbd20c3973ea6c972bf01c8e63d000080bf8deea03d84f5ff3c5f07ea3f2c51773f0333723ed242d4bdc9a8803edb1974bf014a2a3e000080bfdc9ea03da64cea3c06dfe83fd680793f5cea553ef6c1a4bdc618643e8ad170bfb601833e000080bff67ba23d2f85073da777eb3f9583753f04628a3e8eb2adbda8eb8e3ed7e073bf08f1f63d000080bfde54a43dd7a2053d7de8ec3f8324753f92fd923e3d41c9bc042f933ec63072bf840c193e000080bfc7d79e3d04ca263d3062ed3f1aeb723ffe89a13e2d02dc3b5a79a03eb0d771bfba9ec53d000080bfdae3a53d9e40d83c0f60eb3fb249793fec2a4c3e5f53e0bd5b7f5e3e393175bfd0c6403e000080bf5588a73d2c62d83c469aec3f26b9783fe21a6c3e40c35bbd8d69723e1c6372bfae215f3e000080bf8f1ca93dcf4bc53ce7c3ed3fc0c4783fc2aa713ea10b18baa4ee643edf746bbf7d2ca53e000080bf6d1ba63d7ec7f03ce528ee3fa2a3753f10768f3e3303e73c97998a3e910072bf1c443a3e000080bfbc3da83da8e2c63c2a3bef3f749d763fedb1873ea0a22a3dc2647d3e061170bf6b83793e000080bfbfbaaa3d546ea23c2cd8ee3f8271793f41bb643e9383d43c59dc493e7a6b67bf4442c23e000080bfb089ac3d90dd853cec9cee3fd603783fca4b793ed9823d3d9506553ee68366bf6a93c33e000080bf1e19ab3de4f8a13c2e8ded3f43da783f36526f3e2c82abbc7b34633ef6f062bf8aeacf3e000080bf0952a93d5001b03c9e67ec3ffe7c7a3f4b52423e2132a6bdcea7523ee3ad6dbf6a619e3e000080bfdcbea73d98e2aa3c5454eb3f19047b3f50ba0e3e55a20dbea93a2b3e264376bf42365d3e000080bf1406a53d18609f3cda57ea3f10ab7b3f1b12ae3d0e2a26bebf38003ea25775bfe862833e000080bf28efa33d3a23ca3cdb34ea3ff7a07b3f91890d3e15c3f8bd8d0a243ea4b277bf86ff473e000080bfefc6a23da41db73cfa49e93fb4567e3f9c41b13db92197bd2257d83d125371bf9113a23e000080bf6cd1a23d679b9b3c7eaae83f0e5b7f3f4283273cb1b18fbdcb5b223d53a066bf6d4fdd3e000080bf75c7a23d83f66a3c1920e93f873a7e3ff6600dbd44e2e5bd32305b3b1b7772bf2f44a43e000080bf4565a33db60e8e3c849ee93ffe157e3f30420e3dd0a3efbd5e52953d110270bf572bae3e000080bf016fa13d2d0d7c3cba1fe83f5efa7c3fbd61cfbd1b72ebbd13982ebd3c0b67bf0a6adb3e000080bfa9bf9e3d83a53a3c809fe73ffed8783f3a2a40bede6110be81a4fabd37f36abfb16bc13e000080bf59a39e3de6e7063c4434e83f543c783fc16931be9e8930be44a811be573f79bfd2ad363e000080bfcc29a13d226f393c90a4e83f8c727a3f78210abeb2f920be6f73c2bd806c77bf822f743e000080bf2b6b9b3d9148db3b9f39e73fee9c793fe97127beeab919bed72ae5bd603672bf858b9b3e000080bf469d993da8aa503a26fce63f17627d3f8480193c44b911bef75e1e3d95647abf436f513e000080bfc5579b3db345d2bbb6f2e63ff89d793f6a5a203e750221be34e4333e04457abf3220ed3d000080bf66109f3dec176cbc960de73f92e2773f6be1113e351a52befa900f3e08637dbf4d9dd1bc000080bffb5ba23d2d405bbcf0fde73f11ec743fb1793b3e069a67be2d013b3e0da07bbfaa8fbdbc000080bf2c499e3d7dceddbbaccfe73f1d26753f3b6b433ec2f35cbe2c915c3e73c478bf6e9dc53d000080bf60e69b3d118a2dba9cc1e73f31737a3f94b18d3d76e247beb670d03d0e437bbfb91c263e000080bff165a23d5b5eb9bc0b5de73f4608783fa680993c66c27cbec5a1093c71c17fbf1f962fbd000080bf3d47a43d359ff3bc3feae73f23e6743fafd3d5bd593a8bbe0ef8e0bda3727ebf88df9dbb000080bf0bb5a63d0c1f11bdf0c0e83f4094713fe8c146be433589be4c7445be4c117bbf9850003d000080bf62f5a73d87dfcdbc9fb0e83f4db6793f5a82d53c00fa5fbe0cb8b23bf7da7ebf9d21c1bd000080bf6267aa3d8d7bf3bcde57e93f9d537a3fbe42e2bc1b8354be4d4c17bdb39b7fbf259728bd000080bf76c5ac3de8bf07bdcb2eea3fe9187b3fd4d18abd20fa3abe51c594bda7457fbff239a4bc000080bf4241a93d9e0822bd0cc9e93f35e26f3f4f3d86be38326cbe75f883bebc0577bf99924b3d000080bf5682a53de389a0bc3042e83f344b783fb972cf3dddc262be49059e3d09887dbf6da6ebbd000080bf1adbab3df5d72bbdabedea3f92ce6f3f930597be00f240be7d9597bedb7374bf2701bc3c000080bf84d7ae3d17782ebdb326ec3f15ef703f07fa9abee8011abe0c239ebe5f6f73bf11559bbc000080bfc046b23df0e629bd3672ed3f1a3b743fda7d91be4c32c3bdca6995be550474bf951ea2bd000080bff7c9b13d04a312bddc2aec3f4da07a3f0094eebdd2422bbee3c609beee597cbf8ed4cebd000080bff8ddb43d61df0ebdb83ded3f20e57b3fb73103be0823febd6cd119beaa6a78bf68c241be000080bff2cdb63ddeb203bd0042ee3ffe6d7e3f5903d1bdea822ebdbd3fe1bda7d473bf687691be000080bf3b2fb53d5e441bbd3d9eee3fdc057a3f66535bbef30188bce2855bbe287977bf512b0fbe000080bf6c0baf3d892610bd8923eb3faa197b3f9d42bebd803a2fbebc7cccbddc957ebf07d304bd000080bf94a5b63d9df7ffbc8d7fef3f3c397e3ffa22e5bd6261143d68f3cfbd1d9c78bf6d085dbe000080bfbc1fb73df04ebebc0f2bf03feebc7f3f3c81a6bc6e82253dd2bc17bce46177bf16a483be000080bf8879b63d6c0979bc51a5f03f2e5a7f3f18d18c3d5a01943c4002913d15d07bbf889929be000080bf4256b73d39afb1bcedd3ef3f60b07f3f22820fbcf4a1463db570c53bfc7974bf76da97be000080bfc268b63d427b75bc8c4cf03f0b037f3ff331a03d5022233dfe0dac3d49287bbf7e9732be000080bf7b67b43d1893febb467df03f0e077d3f036a1b3e80ffedbbbd1d1b3ef6eb7cbf2294fdbc000080bfa88bb43d1a6ceabb02d8f03fba857d3f27820b3e0f03d9bc08590a3e55707dbf8fac26bd000080bfd7dcb13df6462d3a9cbef03fa6547c3fbc09213e21237abd565d273ea5d87abf6cceea3d000080bf49bbb13da8212aba7469f03f720f7c3f526a2d3e3ec230bdebc7303ee11c7bbf0754b73d000080bf4433af3d6adac53b0f0ef03f7ab27c3f8369233e670256bc34c3223edd7f77bf32e94c3e000080bf780caf3df12f023c735df03fd6757c3f7cb2233eb6e232bd06aa293e84cc74bfc6e9763e000080bf96b2ac3dfc566b3c4dbaef3f107d7b3f43523f3ee804ab3bfb58333ec30f6ebfc78ea53e000080bfd312ab3d569a943c581af03f4968783f2f2a763e0081d03c6bff673e9dea70bffa8c803e000080bfc11da83dfb90b73c5fcef03ffe01753f565a923ef582453d2a888e3e88e273bf0c19fa3d000080bf7b4ca43de410f13cd0edef3f1a98733f93b29a3eb4a36a3d532b973ecd1d73bfd845d63d000080bff7069f3ddf33123db4e9f03fcfbe723fe0d59f3ed5626f3dd1e99d3eb5f272bf7c67853d000080bf41bba33d48dce33cb7d2f13f9244733fb8059d3eee215e3dda559b3ec36d73bfbb097b3d000080bfa7b19d3d6423103da801f33f1b2d6f3f3efaae3ea612d03d5cb1ac3e2c8770bf8dd5703d000080bf058a983d5245313d4818f23ffecf6e3ffef2b13efe02c23d9e84af3e3bf26fbfa509813d000080bf2dd08e3d48c4543ddd42f33f3511683fdcaecb3ef4b9103e3a97c93e5ede6abf1586693d000080bf40a0933ddf6f343d7429f43f8aad693fe236c13e81e21f3e3479bf3efe0d6dbf3b01543d000080bf1f10883d0a815c3d4339f53f69b1663ff8aacc3e7aca2b3e9b39cc3ead866abf1e29253d000080bf30d7823de6b07b3d7043f43fe36f633fd717de3ebdba193e5157dd3e1b9166bf584b343d000080bfcf897d3d59198d3df343f33fe6f95e3f064ce93e2c133c3eb875e93e519263bf553b303d000080bf01348a3dc842743d2251f23fcc73673f3287c53e211b3c3e66f2c33e481d6cbff6ea5a3d000080bf65506d3d76df913d081ef53fe4b6553fce79053f6cf2343ed3d7053f40f559bffd932c3d000080bfeebb623d28d89f3decfcf33f5eeb4a3f7606143f58eb453ed7e4143faeee4fbf89f3363d000080bf3b30403d753ab03d878bf43f5e2c2c3f81a2353f1873573e189f373ffee731bf87b64f3d000080bfa5f74d3db399a33d8bc3f53f4c583a3f103a263fe292613ea7bd273f73dd40bf9b74633d000080bf3815293d93c4b23d8a3bf63f5d3e1b3fe8f6403ff49d813efe49443fe67e23bf42da843d000080bfeb211a3d7ecebd3d8ef0f43f0eaa0d3ffc004e3f2e2b5c3e2106513f743913bfa696503d000080bf164de73cb627c83daa29f53f403ada3e67a4603f4e12613ed2bf643f177fe4be2e8c483d000080bf13ef003dc4ccbe3d6491f63fe7f7f23e7371553f627e903e32405b3f78e902bf36b3903d000080bf71ac0b3d774eb33d31d0f73ffbef013f06cb443f013fc73ebfcf4e3fa9e514bf9c15c33d000080bfe388353d63efa53d0267f73f41d0243f64e42f3f5372ac3e4647353f1aa733bf73ce9f3d000080bf03245a3d4791953d37dff63fd906453f1b52143ff25d893ebd59163fdfa74ebfcc886f3d000080bf01a7773d61a5823db727f63fd7625d3f14bfec3e897a483e3936ed3e6b9662bf9e1c343d000080bf8f3e6d3dde6ec9bd9b68df3f2eb2b13e10c021bf416c313f0b5a61bf11e2f2be31a9083c000080bf26b3fa3cc44ae5bd2597dd3f0a43a2bca77054bfc3c10e3f51397bbffe71b9bd2ead2dbe000080bfdec87c3d846fdabd9c3dde3f1224693eff1a29bf3125373fc48269bfc9bbcdbe7356a5bd000080bfb919ee3c1460d8bde4f9de3fbcb18c3dc13c57bfce79093f28a37bbf339f18be6f5fdcbd000080bf000000009082e7bd0417dd3f0000000010975dbfca31003fef467ebfe5906dbd6652cdbd000080bf000000006d7bdbbd749dde3f0b002e3b735e62bf931aef3ea6f37ebfe56d36bdfc1da1bd000080bf46b45d3dc16eb8bd9693e03f5c66e43eb60723bfaefb203fef9957bfae5409bf99e55d3d000080bfb951243d1974c2bda776e03fc1b36a3e3a8949bf5e8c123fb8c172bf996aa0be8dba51bd000080bf6882e13c6575cbbda45ce03f534a173e68c15bbfdb7ffb3e13e37abf879046bef7a334bd000080bff0155d3c897ecdbdb23fe03fd6c10c3db48263bfbe12ea3e11197fbf5d1f86bdf4a556bd000080bffa7f553c26abc2bd10b9e13fd6118c3dfc4c67bfdf9ad83ecb987ebfc14bc3bd3ea22fbd000080bfaea1d43cff85bebdc3cae13fef793a3e554c5fbf5b62e83e816879bfc5ce63be6f1b16bd000080bf7fa7c93c5ff1b4bda01ee33f62c35a3e729f64bf14bfca3e8a4d78bf271678beed4bbdbc000080bf444f4a3c0937b9bdcb16e33f7ea3b83d3fec6bbf7a53c13e87227ebf38a0e8bde2aa24bd000080bf00000000de56babdf911e33f0000000075c16dbfc6d2bd3eb9947fbf52b5adbc499259bd000080bf0000000012c2c3bd96afe13f00000000aa9069bf589ad13e53b27fbf5a3ba3bc91e435bd000080bf88661e3d936fb6bdf5d9e13f911aa43e4d5b4ebf07b8fe3ed2706dbfa659bfbeaf0503bc000080bff46c163dc3a0acbdae22e33f2adebe3e5ef053bf5b92d63e04296abf43c5cebe69e2813c000080bfe337453d54249fbd9413e33fc0850f3f3f8c35bfa3e2da3e0d9a4dbf016717bf1ec8933d000080bf7c224f3dac34a9bd1ed2e13f9685043f10682cbfa517073fba9e50bf097413bf1ac0833d000080bfcabd403c7e6cb2bd6c3ee43f2c63d13db87576bff731803e66267ebf0ecdeabdfe3011bd000080bf768bc03c4050aebd923de43f31eb713e1eab6fbfc039853e1ff977bf9e0d7ebed1fa57bc000080bf00000000077bb3bdf73de43f000000005b2078bf5a027c3e46947fbfc41867bc488963bd000080bf8926103d4338a6bd4039e43f3fcfcd3e941f60bf2a56893eff4b69bfa06dd2be68b7c63c000080bf12113e3d6cd398bda328e43f5516173ffe8e43bf17a6853e32104dbf4e2318bfd851933d000080bf7342683d2dd284bdf302e43f133b443f63ae1abf7dd35e3e8fdb22bf1bc342bf4585033e000080bf180f6f3da85a8bbdd6e1e23f5ae73e3f720a09bf9417cb3ed12f20bfa86644bf4161103e000080bf3049853ddb9255bd7999e33f6ed0673f19e6ccbe8159103e88f8d7bedb8b62bff4104a3e000080bf46097a3d6f9f95bdc79ee13f48da333f3227fbbeacfb033f868422bfd36642bf9efc113e000080bf1940983d80168bbdd701e03f13db483fd26a31be5266183f3705bdbec6e566bf6b70653e000080bfac8b9b3dcdad50bd7025df3fbbea6a3f04329f3d408ac73efc1836bdb55674bf4c10973e000080bfbfb69e3d55db0dbd7e51de3f5c05713f37e3633ee399813e08c7033efe746ebf973aae3e000080bf842a953df32b9dbce62edd3fb4dc6c3f1b86b63e95e1043e01f68f3e54bf5fbfede5ca3e000080bf7e57843d1de5a0bded47e03f80711e3f39eae1be9859263fbfb529bf3eb63cbfaf01063e000080bf842a953df32b9dbce62edd3fb4dc6c3f1b86b63e95e1043ec802903e9dc75fbf53b8ca3e000080bf51bc8a3d432017bb5af1db3fc9855a3f48c6033fd7d2a33d1031e53eb4a84dbf2e14c93e000080bf1940983d80168bbdd701e03f13db483fd26a31be5266183f6288bcbe331767bfd4ed633e000080bf7e57843d1de5a0bded47e03f80711e3f39eae1be9859263f6cce2cbf96c738bfea7b1c3e000080bfb951243d1974c2bda776e03fc1b36a3e3a8949bf5e8c123f53a972bf16e0a0be706357bd000080bf8f3e6dbdde6ec9bd9b68df3fdfe6b5be77701bbfe6f0353feed95fbf5f20f83e691abdbc000080bf26b3fabcc44ae5bd2597dd3f0a43a23ca77054bfc3c10e3f18307bbff845ba3d96492e3e000080bfb919eebc1460d8bde4f9de3fc6a180bd0f3757bff0b1093f37257cbfbd870e3ee0fed13d000080bfdec87cbd846fdabd9c3dde3f7c3a68bec6d926bfff45393fc1ba68bf7b08d13e6b91a93d000080bf000000009082e7bd0417dd3f0000000010975dbfca31003f66117ebfdb847b3d8b61d93d000080bf000000006d7bdbbd749dde3f0b002e3b735e62bf931aef3e07547ebfd5a2503d6617d13d000080bf2312a5bdc9019bbd99bfde3f6f783dbf98f2bdbd37822a3f53c2b9bea095633fc5088fbe000080bff641b6bde3c6adbd35a1dd3f215812bf849a27be0bd34d3fcc0ababeafd76d3f5dc38dbd000080bfc211a4bdaf1c21bd0534dd3fadcb64bf56528f3eee7ab33e926c203ef74e6d3fed7eaebe000080bffabaacbd38e033bd912cdc3f3a154abf20afc03ef853f83ebe0c563e0f5a683f2663babe000080bfbe2c8dbdc8bc8ebbd9cdda3f7be751bf53ca0b3fe2f22f3e746de63ea3e64c3f43c1cabe000080bfadc391bd70b1a2bbd094d93f3c0347bf78c2163fb553623e43a2f23e2e86473f52d7d1be000080bfa4fd4fbde7a98e3ce61fd93fdc3b18bf7c8e4b3ff462f33d99fb3d3f8a88193f7a3b99be000080bfb22c58bda5f78d3c04e8d73fbe1e1cbf7c11463f2dcb2f3e2a473c3fbf19223f3aed76be000080bfa3ea97bd38ba4abdb1fdde3f82776ebf4dc34f3db766b83e31da5ebdd4ab753f263f8dbe000080bf50e293bdb13c88bd06dedf3f8e7b55bf88c219be48f4073f9d69a5be64b9693f13257fbe000080bfdec1cfbceacffe3c7e53d83f0eba9bbe4e71723fa1e2d23d9fec6e3fc0c3a23e5c062bbe000080bf0950d3bcfe08033d0c38d73f11ea93be5c8b6f3f00434f3e8d45703ffe13a33e860d08be000080bf00000000ef6f103d80f2d73f95eb0fba67bf7e3f8352ca3dfdff7f3ff796163a1c3870b9000080bf00000000bde0133d50c8d63f0000000098627a3f424a553efdff7f3fe6a2fe38117615ba000080bf0950d33cfe08033d0c38d73ffecd933e25f56f3faaca473eb55f703f174ea2be4edc083e000080bff3e75b3c41bb033d5249d93f5ce2323e54cf7b3f13e234bdf0c77a3ff62a2dbe7717de3d000080bf000000002e000d3db91cd93ff40b18ba60bb7f3f35623bbdd9ff7f3f85d7303a167d063b000080bf72516dbd327bd93b3034db3fbcab42bf7a3d263fbf02ef3bc9fd1b3f02a4373fd0f5acbe000080bfd09588bd737f75bbda06dc3ff5715fbf3786f83eb0e14e3d6371e13e52f2533f1bdcb1be000080bfbe331abdf4febf3c21ebd93f7a7af4be40d6603f6142cfbc1e5e5c3f3577ec3e00e95abe000080bf8acd47bd425e8f3cc957da3fd24120bf3fa2473f5a09283a344d403f756d1a3faf3b89be000080bfb433ccbcef8ff73cf06ed93f4312a9be4293713ff881b2bca7976e3f0606a53e80c629be000080bf4c7240bc00e4043dc843d93fd5e22ebee5f97b3f1d2338bd6ff27a3f3816293e15abdebd000080bfc3fb6abda0362a3c0454dc3f7d8046bff7ef1f3f7e22bcbd26541e3f24d4383f5ad39ebe000080bfd09588bd737f75bbda06dc3ff5715fbf3786f83eb0e14e3d2326e13e07c0533fd429b3be000080bf365f85bd7f013dba3f3edd3f105763bf170bea3e5b6249bde8b3e33e06b6533f2318b0be000080bfd78e82bdad1f1b3bb05bde3ffaa360bf21faf33ea3615dbdce9bef3e2383533f5491a0be000080bf962966bd5e354f3cef78dd3f9f3c42bf30ae253f1e6297bd3a95233fbdaa373f87078ebe000080bfca5140bd3bc5aa3c3fcadc3f3ffc1ebfcf62473f6ec2b3bdf6fe453f4d40173f962c6bbe000080bf98c243bd4d9f9d3cf99adb3f631c24bfe172423f3153e1bdbc98413fa8c5193fb5d284be000080bf8acd47bd425e8f3cc957da3fd24120bf3fa2473f5a09283ab500403f55301a3f21f48bbe000080bf3d0716bdbb14d73caa14db3f167bfabeae005d3f3913febd426b5d3f4182ec3ee50449be000080bfbe331abdf4febf3c21ebd93f7a7af4be40d6603f6142cfbc5c155c3f3411ec3efd1d61be000080bfff5bc9bcdcd4003d8cbcda3f24beb6bec22c6c3fc62116be49de6d3f553fab3e922821be000080bf9221c7bc1fd7063db217dc3f643ac3bee482693fe0e119becb456c3f0990bb3e732af2bd000080bfe3e313bd17d2e13c8250dc3fdefbfabe716d5d3f9233dcbd5d1d5e3f7de8f13e538d1ebe000080bf467d12bd923bec3c0c72dd3f8df703bf852e553f70da4ebeb3515b3feffdfd3e4e9e10be000080bf6c0f3bbd1230ba3c99dfdd3feaa31fbf5542443feca11cbe1483473fde25183f8f404bbe000080bf62efc5bca90d0e3d3e55dd3ffa86dcbee5905a3ff3c195be3cdb663fca03d73e0726d1bd000080bf2e1fc9bce0d31c3d7540de3fc34fe4be1d74013f14113dbf12bb5b3f1280f33ea23b45be000080bf0b5314bda2c9fe3c5369de3f3dea0fbf9cf6273f02e400bfdded4f3f4f7b0d3f912e3fbe000080bf46231fbddd7d0e3d111cdf3fbf3717bff0b5a43e26703dbf1300383fb066203f4b4a9abe000080bfe02538bd1c83ce3cedcede3f2b1629bf24f4293f4e92b3bea2633f3f36ec1f3f28db66be000080bf67d43cbda81ee93c2288df3f974433bf48efdf3e1e7010bfbeec2a3ff3542e3f7b009abe000080bf3b3557bd6343b73cbc05e03f2eaf4cbf9be3ea3e2177c6be0d01143f1443433f205f94be000080bfbbca5abda9fa953c6a4bdf3f4f6e43bfd26d1b3f9fba61bee331253f4c613b3f3cfa5fbe000080bf990f48bd3961023dd027e03fc30837bfd9ca433e96282cbfaf970d3fc0383e3f2de8c0be000080bf2daf5cbd4b1ecf3c05a7e03f078353bf563b663ee93b04bf086ae93e8a354e3f67d6c1be000080bf953269bd36b0d53c6556e13f1d3f51bf7741a13c2a6613bf81e8a73e566c563f2bb3dfbe000080bf8a0669bdaf22a33c1613e13f1e2167bfec3a573e890ac0be0425b43e9fd15c3fd923babe000080bf280a74bd55c2933cd2c6e13fb2e462bfdbe1a93dca46e9be1d748c3ed6fd623f6891bebe000080bfbb5e5abd7f160b3d4bb6e03f28583abf31637b3d0ad42ebf2f8fe63e9f3b4b3fb337d1be000080bf86ab43bdd6c52d3d4227e03f38ec2dbfa472da3d51da39bfcddb093fef993e3fe902cabe000080bf78f86bbddb8f143db741e13f19773fbf27d28c3db70429bf9a01cf3edf05563f35ebbdbe000080bfeace53bd7ac33d3dbed1e03f04d23ebf5b4a653eb8bd20bfde8f043fb3a4493f1debaabe000080bf2a5261bd5c5a4d3d7ba0e13f2fde48bfe289b13e698f03bfda7b043f6ba1523f69a070be000080bf018279bd0cac233d1deae13f62a349bfc87b5d3e70b013bf5a10de3efb145c3f33288abe000080bf7f6a3cbd1cee633dea57e03f8cf64abf139b753ecd6d0fbf40b2043ff8b63f3f0768d3be000080bfd98349bd1e72733d7951e13f6e834fbf3087c43ebf6fe2be19830b3fa657453ff3dba8be000080bf08e753bdf295803d2a72e23f26e84cbf91caf43ee621b9be1aa9133f9d4c473fd65d7dbe000080bf061a6cbda33a5d3d12a4e23f88f14cbfdb9be13e9befcfbe202b083fffab553f785712be000080bf8ee773bd0a9f6d3dbddce33f84de4cbf952b003f24f6a8bec99f0f3fd3c6513f773ff0bd000080bf721a82bd7044373dbae2e23fd6ea51bf9e3ebd3e08c3dfbe5ec5f53e6a265c3fc17f31be000080bfa91586bd11e24a3dab22e43f44a756bf6007e23e6f8ea3be6020fd3e63e35c3f6d93d7bd000080bfe03091bd4b01293d079de43ff0b167bf06f7ae3e369e81be4fcacb3e61eb633f697d62be000080bf1e7188bd38785f3df993e53f91235bbfb50be33e330a88be5ee7f93e74d55c3fe4f707be000080bf0a4a91bdd8bb3f3da81be63faedc6cbfde4dab3eee2137bef703b93e89b86b3fa76916be000080bf1d3992bdbfda513dc66ee73f2bb171bfe775943e378a20be4c25a13e5e2f6f3f8c532bbe000080bf08558abd2bdc723d0ce5e63f04e55ebffb2adb3e370b78be0749f13ea8f65d3fa49425be000080bf75208bbd5dfb823d0431e83f0ae960bf007fe03e8afa41be06d6ef3e8e535e3f2f3626be000080bf454a93bdbe61623df0dde83f5aea73bf73d9903efeb1e1bd9bbf983e9d94703f29d52abe000080bf1ff597bd0c01403ddd7ae93f920f78bf4beb6d3eb652acbd954f783e06a7753ff44512be000080bf67b796bdab24323dfdf4e73fa50977bf92d3763e42c3d3bdd77b823ecb73743f98141cbe000080bf553797bd3cfd203d56ace63fc79c74bf9c018c3ed252e2bd2a60953e6d676e3f13795fbe000080bf56b77abd3a598a3dab77e63f082d48bf1e500c3f580698be97d81a3f4244483f736b18be000080bf9e107abdb3ed943d55ade73f52e845bfc291143f941583bebd0a203ffff1433fff5b1cbe000080bf76d759bd0425a53d724fe73f496432bf34b42a3fc83d87be5661363f32a22f3fcf1017be000080bfb5515dbd3e549a3d3c28e63fca8a3bbf5db41c3f586a98be4c8d2b3f3ead393f417f21be000080bffb9378bd6bf37f3ddf32e53fbfa44abfca77073f1f769cbe8bf3153f43af4c3f0bee07be000080bf2bdd5dbd0adb8f3d80f1e43f691043bfcd8b133fe63597be4ab8223fdfbe403facb12ebe000080bfe0649bbdae9e133df969e83f6d1476bf5751853ea271b9bdf1278c3e50bf703f7b864ebe000080bf1b2c9cbd56651f3d28d2e93fd90b76bf14e6843e32f3c0bd4a438a3e066d743fed99febd000080bf8deea0bd84f5ff3c5f07ea3f2c5177bf0333723ed242d4bdd9b6803e9d03743f231b2cbe000080bfdc9ea0bda64cea3c06dfe83fff8079bf7fea553ed2b1a4bd721f643e33b7703fe4bf83be000080bfec16a1bdba4ccd3cbafce73f71697cbf06e2123e9282aebdab8e293e8065673f53f0c9be000080bfa2989cbd3b39033d774ae73f5c2c77bf66ea783ed1d1bebd5f1c853e12356b3fa11a98be000080bf7e629dbdc593dd3c3f47e63f289c7abf3a211c3e42f90abe3679473ee97f653f5cc1cbbe000080bfa01598bd26a60b3d766be53fae6f74bfacb3783eaf522fbeffe2933e77d7643f707fafbe000080bfc1ff96bd4d8ce53c5d4fe43f5df370bf1a93ef3d3a42a2be6c257f3e3cb65f3f42bbd5be000080bf41659cbda86eae3cf968e53f8c6e7abf540a5a3b3c6254be8cb7d83d6c345e3f9b69f8be000080bf4e7da0bd7273aa3cda39e73ff22c7ebf6401b43cbde2efbd3e3f9f3dce405d3f6674febe000080bf4da29ebdea3e803ca9a2e63f68577bbfd4b900bee8c111be957722bdaf665e3f03c0fcbe000080bf6a3499bdc0e8723c57b5e43fcd176fbf168209bebc92a9beae88023d0249643f5f21e7be000080bf7eca91bd376eb13cd488e33fec3f58bff792abbd7f5207bf0ea6523e0e695c3f172deebe000080bf49809abd86e7253c4f22e63fd6a978bfc91a3bbe77aa1bbe8d72d2bd5747663f7d66d9be000080bf724f97bd1ac65d3b4cc4e53f8cc77dbfc6c116bdf13101becefc9b3b4f05733fb0f0a0be000080bfb93694bda3e9ec3bb64ae43f03c76ebf8f0281bc3f72b8be0b15e83d47856f3ffc29abbe000080bfe2e995bd17b751bb381ae43f527075bfbf91323e20e265be680e673e9a7a723fce5969be000080bfb26684bd950c803cd9e8e23f8b1e52bfcb82b9bcc81f12bf82f3703ea0a8653fe775bfbe000080bf4ed688bdb6a4233b67c7e23f32db65bfdf2d8b3e814eb1be8c80b93e9a32673f05ff6bbe000080bfc91d96bd446f71bc2ba6e23f4f3f7abfebb90a3e316225bed80d303e19a8743f9daf74be000080bf75029abd8d9683bcc955e43f683f7cbf3743dd3c667a2cbeb195803d21ba793f70ed57be000080bf0ebf9bbd780d7abc22c4e53ff5727cbfa511973dbd4118befa7cb73d449c7d3fc966d2bd000080bf399998bda214adbb1fa2e53fb29b7cbfcab3fe3d0a63d5bd744f103e0fa7793ffab82ebe000080bfe1d487bd9985f63cce8ee23f3c074dbf5507f83b6d4819bfa3c8a33ef8c6593f6191d5be000080bf59888ebd4ed1113d5565e33f441761bf9033713e15fbd3bec197c53ecb9b5c3f8f9ba8be000080bff06d7abdf5bfdc3cd3fae13f754a45bf4da2a7bd0dc821bfef918a3ea9145b3f7ebce1be000080bf515175bd1a8b263c7aa8e13fd5dc6bbfd2b5963ea20582be2b02b73ed7f5653fc0dc82be000080bf41de6bbdd905833cabb7e03fdfea67bf5d7ebe3eb1024fbeed20d63ea5635c3f365994be000080bf954476bd3293283cc40de03f10415dbf86bbff3eb82374bd9b8afe3ecb82543f864381be000080bff37684bd0c604a3a651ee13fe86768bfb1e5d23e42d1a0bd7c54d63e861c613f536e68be000080bf20938cbd7024d0bbf664e03fefb871bffd1da63eab8266bdb132a73e4690663f1dcd92be000080bf842b80bd3eb2b93b9946df3fedbf5dbf871cfe3e15446dbd39f3fb3e7cc1533f80ef8abe000080bf3b3a8ebd698e2cbcbc76df3fcec874bfb599953ebb8194bc1f40903e94d1663f1e02a8be000080bfe9f993bd0381cebc2d9ee03f53547ebfaaf1c23d62b1803d72d5913dafaf723f8ad59ebe000080bf50ac93bd1bd8aabca69ce13f5b2a7fbf2191943d71a110bdda16a33d9c70743ff48d92be000080bf8d0991bd8dbf6dbc2e58de3f08d674bf4a85953ea105be3b88d68a3e8f24653f7a39b5be000080bf43a591bdd4f198bc9e16dd3f0a216fbf46deae3eeff2d43d288f8f3e06d1613f65cfc1be000080bf8b689bbd1d580ebd823bde3f860a76bfef293c3e452a533ef848d93d46576f3f8d5eadbe000080bf610297bd8deaf4bc0877df3fcee07cbfeda2f83d1fa2c73d59d3a93d2dac703f1a42a9be000080bf446c90bd249c16bd6fbde23f81277bbfb17a3fbed9224e3d1f4a46be77e8723fd8517fbe000080bff99e91bdce1b27bd50a6e13fff077abf7863d4bd3a7b403e388b1cbef260733fcc258abe000080bf9ae487bd61de63bd7071e23fc04a65bff031a2bef3cd9f3e7a33c8beb032653f8f825abe000080bf304985bddb9255bd7999e33f6ed067bf19e6ccbe8159103e6e01d8be7b74623fb38c4bbe000080bf72fe86bd0daa4dbd1515e53fed725dbf5b2bfbbef062d7bd63f0f0bed8b35d3f3b062dbe000080bf7fa292bdf60108bdb3d3e33f0b3d76bf01137ebebfb2ebbdf8a55ebe0bed723f8a156abe000080bf8a1e98bd9979f2bcc809e53fc26374bf68235dbe25e351beac1237be465d773fd9d33dbe000080bfb3b794bdc18c29bde21fe63f307962bfd5fac7bec95982be6c5db4bed7ec6a3fbd2e3cbe000080bf199293bddbc449bd0e81e73f40634fbf11ec04bf3f668bbef59900bf5eab5a3f1b7c09be000080bf750084bd6f9e6abdf608e73f7aae41bf04941dbfe90262be0b141cbf0139493f1c61d1bd000080bf4fca64bd4e9d87bdfeede63fc4f02ebfe25e35bfdf8234be2b1f35bf67c4333f87e8a2bd000080bf136484bd27697ebdcac5e83f608034bf421a29bfc10d84beff0d2bbf839c3d3fadf58fbd000080bfccb267bd473e8fbde4bde83f8f6123bfca4b3abf2ea180bee23f3ebf41e42a3f6c643bbd000080bf06f56dbdce3697bdc477ea3f5f3a20bfbbdc39bf29da91be9b9841bf737e273f7d4fc3bb000080bfe59741bd96069ebdcfd7e83fbf5b03bfc94852bf39eb7ebe610958bf8827093fd394e8bc000080bf4a5f48bd40f7a5bd919aea3f084c00bf59654fbf72ba9bbe82e659bf935d063f9a7b923b000080bf95bb4fbd4f5caebd2652ec3f759f04bf39d04dbf9c8195be2ee258bff47f073f9f813b3d000080bf2ffb75bde78e9ebd2827ec3f0c6824bf43c637bfb69989be748340bff470283f34b0213d000080bf94317ebd014da4bdb2d7ed3fbab62bbfe3da35bf5e535abe8a933cbf76eb2b3ff9aba33d000080bf828e56bd7829b5bd8e04ee3f78c30bbf21304ebf74426cbe980c56bf8b8f0a3faf67b63d000080bfab225cbdd3f4b9bd19c6ef3f087812bfd9aa4ebf172214be3bd951bf77a10e3ff100083e000080bf378c82bd4a29a8bd6799ef3fc21133bfc8cd33bf771907be08f036bf2e7f303f6d7bf23d000080bf84f193bd9c5193bd817aef3fdb9d4cbf645917bfcac1dcbd32b119bfe8234b3f1fc4cb3d000080bf2d0990bd450e91bd49bbed3fe48643bf556e1ebfbad23bbe8e4b23bfb164443f64a68a3d000080bfada29fbd96b076bd13baed3f486455bf712709bf6ee909bef7aa0bbf402f563ffd77463d000080bf0935a3bda75b76bdb472ef3f356d5fbf88dff7be9c1180bd66d2f9be80765e3f8a7aa83d000080bff790b0bd99473ebd3f72ef3f8dab71bf85dea8befa05c4bb639aa8bea4ef703fc1c09b3d000080bf76c2abbda4884cbd04aeed3ff71d66bfc8e7dabe8e53c4bdf18cddbe1f8e663fb729273d000080bfcc5d8bbd40178dbd800fec3f96cc39bf504a25bf3b1b73be1d242bbf5c4d3e3f8278b43c000080bf6b0f9bbd047374bd4417ec3f5c0e4abfb52115bf60c246bef55a18bf78b74d3f65cf073c000080bf21afa7bd80634fbddd26ec3f4c055ebfa2cff1be6b3a21be419ff4beb3e3603f4d005dbb000080bfec1897bde5986cbdc289ea3fb51742bff51c1bbfabb476be4d4f1dbfb99b493f3bd23fbd000080bfbe31a4bdb6304bbd84baea3f7c1959bfed83f8be7ec359beaf9ff9be81345f3f3f9b3bbd000080bff62987bd252387bd7a6dea3f0e3033bff8c329bf95c187be47dc2ebfabe23a3fc4acb9bc000080bf6f6694bd6d8f5ebd1c06e93fd8a942bf728917bf5dcd88be158317bfba0d4d3fdab6b8bd000080bf357ea1bdc18e3fbd0265e93f74d859bf8a62e9be759985becb11e6be5c98633f8c80b3bd000080bfd428a4bd417e76bda741f13f3ed265bf496ee1be8f816a3c3987dfbe91c0643fcd3ed63d000080bfadda95bd302b94bde256f13f702b53bf5ba810bf5b0286bc54e90fbf941f513fd13c043e000080bffa9784bde0daa9bd4e7cf13f0b1c39bfeca530bfb8e101bd71862fbf241e363f6dfd1d3e000080bfcec55fbdf453bcbd22abf13f190218bfdbc04dbf0f021cbd73a84bbf974e143fabbe353e000080bf6dca95bd618a92bddf53f33f92b156bf52e209bfaf02a63d5af405bf9a88563f295e1e3e000080bfef0285bd1b66a8bde97ff33f04b63cbfdabd2bbf00b2a53dd33426bff9813c3f2bfd423e000080bf63d560bd282abbbd79b0f33f14521bbfaf4a4abf2502b13d4ca942bff2ce1b3f0018683e000080bfd59183bdc0cda2bda9a3f53f965e3dbf416a24bfd6a24d3ea4af1abf1ceb433fc120633e000080bfe2ae5ebdb459b5bd13d3f53f629c1bbffb9643bf7e7b5d3e9aa636bfe523253f6f0c8c3e000080bff4c493bd8d5e8dbde674f53fef4457bfc1c301bf7c2a423eee54f5be94355c3fd7bf323e000080bf1d5b8fbd16a283bde693f73f70ee54bfa30ee8beea1da43ebb0cd6beea2c643f46ac333e000080bf7a3580bd41ba98bdc7bdf73f43a63bbfd1dd17bf0b6aaa3e1adb0abfef154e3f7b0c763e000080bfc2dd59bd11e2aabd5ce7f73f9e8819bf260f38bf25d7b33e102c27bf2d86313f5ee19b3e000080bfb402a3bd25c973bd882ff33f980469bf42eacebee011b93deee5c8bee553693f0982fd3d000080bf5a48a0bde2e86abded44f53fe93869bf6c1ebdbe4db23b3ee43bb3bedd7e6d3f79b4043e000080bf4835acbdbb0f40bdff21f33f2e6575bfbd2187beda62db3d1b8482bedd72763fa0fab93d000080bf5e68aebd35b742bddf4ff13fcef573bf5f8e98be78e3623db9e695bec1cb733ffca0af3d000080bfd6e1a8bd556d37bd0323f53fd4bd74bfa30b6cbeedb2393eef225ebe38cc783fdee5bb3d000080bfdc10a3bd598723bda931f73f25eb6fbf55aa39befc95983e17fb28bee4ac7b3f8328a23d000080bfe50e9bbd4ce357bdbf60f73f989e65bfdb75a1becda99e3e96ea94be22e1723f2c2efd3d000080bfbf7fb3bd0d8b11bdf294f13f0f107cbf75d219be28b3b63d51bb13bef3b07c3f9be88e3d000080bf1762b5bd7f880dbd1b49f03f5b9b7cbf22f21abe2823703d54a114be790a7c3f02e9c83d000080bf179bb6bdc3bcc7bc9ad2f03f1e247fbf09a120bd7221933d8363f0bc99977d3fc8da083e000080bf00ffb4bdf110c6bc08e5f13f355a7ebf34a118bdaf11db3d6df402bdf3897f3fb4f04f3d000080bf2f50b2bd8fc5b6bc2e59f33f8ade7dbf158197bc6179023eb99365bc1fcf7f3f3462133d000080bf25ebb0bde90f0dbd693af33f3cf57bbfb99103be0e53f93d9cfbf8bd45987d3fdc42803d000080bf1d55adbdc09401bd541ef53f087e7abf79b3cebdee42383e060bbdbd16827e3f3514643d000080bf4086aebd80b996bc091af53fdf247cbf7400e63befe9303e9dae423c3fe37f3f1843de3c000080bfc6fda7bd94a03fbc91edf63f5b4f76bf8122413dd16d893e35cb583d699d7f3f379d6a3c000080bf0c21a7bdb8cdd4bcf913f73f51da74bf668272bd6955923e8b9048bd1e757f3f5d842f3d000080bf0473b4bda4375cbc2714f23f920e7ebf4d825e3d10f2e13d5954703d2a637f3fd2d1153d000080bf8b18b6bd58c771bced2df13f4b0a7fbf2f225a3d14a18b3d8601753de44d7e3f3befc83d000080bf1729b4bd26aab7bb514df13f86a77dbfdc81033e00422b3d16c9033e84de7d3fc7107d3b000080bfb070b2bde9b559bbb115f23fa1917cbff5f9053e0db3c73dc0b5043e71cb7d3ffd249bbc000080bf1d91afbdf357c83bace0f13f0a8c7abf26c3433e4042993d13c33e3e22ec7a3f78768abd000080bff54cafbd5567b5399641f33ff6bd7bbf32d2113e6fe3e63d3cf6103e16647d3fd5367dbc000080bfa932acbd97e22a3c4df9f23f2c5579bfb112533e9572c13d1527503ed7747a3f2daf1fbd000080bfc3efa6bd616d8c3ce750f43f818874bf6459833e6a11173e656c813ef46d773fc45534bd000080bf569caabdf838d33bccb7f43f4cae78bf4dcb3b3e8a621a3eba9b3a3e13a77b3fecccb0bc000080bf7250a2bd419d723cec34f63fe96970bf368e853ed203653e50ab843ead11773f0ff919bd000080bfec689cbdf6cfd33c94a2f53f31606cbfdd32a13ee913613e27209f3e03ef723f9ef65bbd000080bfa851a8bd0377a03cc780f23f5d1f76bfd809883ee001923de91e863e419e763f81726cbd000080bfdb6ea2bda087da3cadbff33fa33971bf5b129d3efb51093eab869a3e4aa2733fa54467bd000080bf9dd497bd986b113df5f3f43fac2f6bbfbccaae3e11634b3ebcebac3e0193703f876959bd000080bf5a66b1bd7d3e4a3b9127f13f0e1c7cbffc5a313e2c82523c55d42e3e5ea17a3fdab2e3bd000080bf603daebd5567353cbabff03f28807abf6beb523e29010f3c8f1d4d3e1fbc753f38d548be000080bf6f0dacbd7573713ca873f13fb2ce77bfb8da7a3eea225f3d17fa733e6c1c773fe55bdbbd000080bf5c5aadbd2ae5b5bb3cf9f43f58697bbfe132cb3d451a243eb428ce3d16b37e3f0f7a6d3a000080bfb98eb1bdc1702ebcaf5ef33fd7627dbfdea18f3dba22fe3d6e0d933d29547f3fcaf9133c000080bf4163a6bd46b5083b23a4f63f601f75bf46ea1e3e6deb783e25f81f3ebed37c3f795c78bc000080bfa1f28fbdbb9c123d0ddff63f568d68bf71daa83eec91833ecd01a93e9365713f924431bd000080bf92058cbd4ab3393dec17f63f45ed68bf7dbeb33e4f6b623edda1b33e857d6f3f706a2abd000080bf930180bd00ab633d7e1cf73f845e62bf4076c83e7955823e6b99c93e890b6b3fe0e535bd000080bfefc682bd4b943d3d5df8f73f1d6163bf63caaf3e21529c3e2d42b13e68df6f3f7ca03ebd000080bff48786bdfa0a123d98bdf83fa68b61bfb68ea93ed5f2ac3e6d6dac3e28c9703fab2d33bd000080bf2fc294bd68eccb3c438cf73fab7268bfcc81a13ea42d8d3e1518a23e3999723f96542abd000080bff0be6abd0261673d63d3f83fa7e04ebfcf26d83eb84ed23e028cde3e9ae5653fa9f18abd000080bf763664bd94bd853d9be2f73f32f14bbff805003fb7d2ad3e53a8023f3d825b3f86fd85bd000080bf691b3fbdd00b973d297af83fbb002abf8b7e1c3f9d67dc3eeb78243f30d4423feb93b7bd000080bf386a45bd51d8853d3d7cf93fb70c2cbf1ff8063f1e1c053f360d113f1c77513f4740c7bd000080bfb1174abd2d96623d126cfa3fa4242cbf7f97e43e5e20173f58b4fa3e33cf5d3f19bfc7bd000080bf5f406fbdd3333d3d2db2f93f42c34dbf130fbf3eda3fed3e735ec53edb7d6b3f18bf93bd000080bfe73576bd1c7a0b3d9676fa3f48c149bfb872a53e381e063f61e6af3e20e86f3ff2ba7abd000080bf698b8bbd309ec13c2e72f93fe0045fbfeac9913eafcacc3e56c0963e0a74743f11ac1dbd000080bf0aa28ebd7633233ce90afa3fafd75bbf095b373e15ccf53e86d6423ebc3c7b3fe563d2bc000080bf0d1d7bbd1e35a63cf222fb3f215443bfb7ba733ebad9193f7d88843ec2e5763f5a6c5abd000080bf2ba17bbde179a93bd0b3fb3fa18a3dbf2ec2133e5b10283f81e2233e70877c3fddc214bd000080bf02b78ebdd847a7bb6286fa3f973459bfaca19c3da011063fc59faf3d2b0d7f3fb61fd7bb000080bfc74a8cbdbc04a7bc72e1fa3f1a3355bf0003f7bc15800d3fd02296bc43dd7f3f0871dc3c000080bf115578bd87c528bcd21dfc3fbb5238bfc6e2403d9c3e313f0d38653d35967f3fa7121fbc000080bfc90050bde030d1babe13fd3f268e17bfdfd2c83deec84c3f48ddf03d9e117e3fa2cb0dbd000080bfb34552bd81d1653cc2a4fc3f1d921ebf76ea413e910a433f1ffb623ec121793f05a07cbd000080bf1af851bd247cef3c1409fc3f0b2025bfc5e58f3e3bea353f890ea63edd53713f25a7a0bd000080bf05c24ebd79b1303d9948fb3fdb252abf0b42bd3ed539263f69dbd23ee906683f9360c1bd000080bf6cb49cbd8d9c85bc8deef83f83776abfeaff6f3b1d87cd3e7f18633c1be97f3f045db83c000080bfb26599bd6f2efebc952cf93fdc4f66bfcc03e2bda447d83e4cbec2bd8a6b7e3f79f9693d000080bfbe119dbd92cec0ba7c9bf83fd5c26bbf85c2df3d3a86bf3efab1eb3d084b7e3f4eb0debb000080bfd8d79abd323e4c3cb324f83fdde26abfd7e26c3e159ea53e7535713ef8b3783fa21bdabc000080bfdc9b1fbdb2bcab3c0e87fd3f39f4ffbe9be3593e8eeb563ff2748c3ecb55753fafe6a2bd000080bf938f1dbd3c66a03b41f5fd3fc6bbf0bebdf3f13d80e75f3fda92243e68637c3fcc933fbd000080bf5b5dcebc0e4a183cdfa5fe3f888aa9be0b1a023e8a5b6f3f2a58423ec4c77a3faaf686bd000080bf882cd2bcefe4d33c193afe3f8f32b5be3bb36c3e3501683f721ba23e0ffe703f8586eebd000080bfaf9550bccf65ea3c5a9dfe3f919a35beaac37c3e7ae3733f3ec0b73e73e76a3f6f0a2fbe000080bfd5204cbca20d403c4209ff3fe7e92abe75b9093eb00c7a3ffdcd5b3e00cb783fbbf1c6bd000080bf0000000088d94b3ca227ff3f0000000041b90c3e33927d3f23f06a3e9ace763f46f808be000080bf00000000ef3cf13c0abbfe3f000000001759813e29b2773f5139cd3e6ded623f56016dbe000080bf8a73d4bc734b2b3dd68ffd3fd7b2bebeb1aab23e42255c3fdb0be43eab50613f9c2e28be000080bf28d453bc4181373dfaeffd3f60c23fbe3a66bf3eb78c683f5726003f2afd543f9ded74be000080bf00000000823c3b3dd80cfe3f000000006177c33e209c6c3fda91083fd920483f1654a5be000080bf4a9954bc98a7733d2efefc3f8b5348be68d4ff3eb505583fc81d223f10ac383fb0888fbe000080bf00000000c8b7773d1e1bfd3f00000000bc91023ffc325c3f5377303f50861f3ff72ebdbe000080bf8f1dd4bcaf97663d76a4fc3f0d0ac4be7ad6ee3e29204c3f0444103f36484d3fcd474bbe000080bfa5d8d1bcd2ac8c3dea92fb3f0b03c5be48d0123fe524393f1ef22b3f661f363f50bc53be000080bf8d4553bc9771933d8fe3fb3f6a6a4cbebe6f1d3f384a433f12cf3e3f3dc6193fc71294be000080bf9b3d50bca438a73dbabbfa3fd9794abec77d383f9c1b2a3fe6704b3f85c4033f20bea4be000080bf745fcebce389a03d1076fa3f48aec2be099e2c3fe10f223f7e45433f2d9f1d3f1a674abe000080bff37218bdb118953dff09fa3fce3f09bf08781b3ff217163fa0b02c3f72cc393fb2290abe000080bf30f1c7bc2d3fb03d7f4ef93f7f53bdbe9957423f9022093f0f3a563fc6cb053ff7ec26be000080bf7c9a13bd6c79a53dcbf3f83ff8d706bf9a6c313f9efbfb3e09183f3fa873273fe150fabd000080bf5b9a1bbd51f4803df911fb3f00fc09bff391033f86d62a3ff836163f83294c3f38a10fbe000080bfa2d549bccd94b63d5089f93fd7d243bef7a64d3f1662103fb51e533fe8dde23e20f8b3be000080bf00000000245fa93df6d4fa3f0000000019a53c3fde0e2d3f07744c3f194bd03ec00de3be000080bf000000000b97953dd6fffb3f00000000a503213f0f06473f025b483f65c6f73e7f74c8be000080bf5b781ebda8a74f3d030bfc3fb95709bfb05ad63e59943b3f3e08fd3e62135c3f187204be000080bfe21d20bd0b97153dcae2fc3f602006bfd682a13e9f8b4a3fe8f0c53ed56f6a3fd674dfbd000080bf02663ebcfaf2c23df04ef83f57fa3abee51e5f3ff0f6e83e8b12733f49878d3e030318be000080bf00000000ccd4c43d5b61f83f00000000e099623ff039ee3ee7ff7f3fc4ec563acd6fccba000080bf334f2ebc4d81cc3d3bfbf63f2bb22fbef6d06d3f09eea73e338a7a3fcfac4b3ed17c52bd000080bf7ced19bcf86ed33dc47cf53f9cda1dbe0afa753ffcc36b3ee7687c3feba0283e8de4ddbc000080bf8368adbcef74c73d46cef63f7eeaa8be5c8b643f511a9d3ec0126d3f4100bd3e0363a0bd000080bfa8069abc7257cf3d0950f53f82de95be01fc6d3fc63b653ec32b733f807e9e3ef60632bd000080bf48a984bcfc8dd63d60a4f33fde7268bee480733f7d1a563e21d8783f4b21703ee3033cbc000080bf104501bc7732d83da819f43f6cb101bea36e793f0e823e3e4dd57d3f06de043eb67794bb000080bf39b4c8bb4742db3d0118f33fa6b1abbdacd07b3fd331233e360e7f3f2e7daf3d7c979cbb000080bf00000000759cdb3d0634f33f0000000047077d3fff911b3ef0ff7f3f06955e399902b5ba000080bf00000000f215dd3d2d77f23f000000004cca7d3f5a41063ef3ff7f3f33482c394fd6a2ba000080bf503a913b2e1bdd3db260f23f7402263d15697d3fb2390b3e0ec87f3f41ea28bd7f841d3b000080bfcafa4d3b8a3bde3d94dcf13f5282653c8a607e3f3672e43dcff87f3ffee06cbc3b55533b000080bf6a34b93b488cde3d24a3f13f18c2c63c49997e3fdc22d03d55ec7f3f64ebc2bcdebabebb000080bf74efe13bbe17df3d3d2ff13fa6412a3dcf907f3f2002273d2bb97f3f1c9926bd4b49b8bc000080bf9c50883bcae2de3d1261f13fe503963b69597f3fe5a1913d44fe7f3fde7988bbb438c3bb000080bf6f4f903b4138df3d0d0af13fdd835e3c2fe57f3f0943ce3cb0f47f3f213259bc1a4455bc000080bf5a820c3b8a3edf3da304f13fe801c33bb0e37f3f83c3eb3c79fe7f3facc0bfbbe9a067bb000080bfee56963bf226df3dfb93f03f8763673da4fd7e3fff118cbd53857f3fcd5d6dbd321aa0bc000080bffb07113bc843df3dbd94f03f5b83e73c01c27f3f9d6207bd27e27f3fd23deabc63101ebc000080bf00000000e450df3d8699f03f0000000076f47f3fb8c199bcf8ff7f3f102395b7b44378ba000080bf00000000643bdf3de009f13f00000000edda7f3f2ac1093df8ff7f3f1e21083831d67cba000080bf0000000089d2de3d6078f13f00000000cc3a7f3fb8c19e3df8ff7f3f9090a838b67f87ba000080bfaef1193b13dede3d5c71f13fabfc0f3bf9457f3f98229a3d7cff7f3f21c51fbb02b34b3b000080bff6e0ee3b5804df3dc4a4f03f7362ea3ddacc7c3f67f2ddbdca297e3fbaa2f0bd91c7b5bc000080bf00000000da21de3db2eaf13f0000000039677e3f1263e43df7ff7f3f133ef8389f428aba000080bf30bc123b34d6de3d0d20f03fb771a93d54407e3f9781a8bdba157f3f94bcabbd5cba27bc000080bfa628973b384ade3d6820f03f99da1a3e450c7a3fc39a1bbe33d97c3f7d421fbe465f89bc000080bf0e6c953b0022dd3dc5b2ef3f1b4e8f3e9803723f972a2bbe8f47753f157492be8bd65bbc000080bf6842133bbc3fde3d64afef3f99d91f3e94d47b3fd981b6bdafcb7c3f624421be49130ebc000080bf00000000a20adf3d9621f03f0000000060917f3f6de36dbdf9ff7f3f44216bb8b69a7cba000080bf00000000e0a3de3db8adef3f00000000917b7f3f112282bdfaff7f3f47f65ab8faef56ba000080bf93aaed3b0879dd3d9427f03fc3a2773e92a86f3f61a582be42c3773f59cd80be2e32bbbb000080bf4260e53b645adb3d1cb6ef3f3b9ecd3e72465e3fac2195beeda9683f8883d5be1a88233c000080bfdac61f3c6b31d83daabaef3f0436043fe5e83c3f6a6fdebe676f553f7c8f0cbf5f906f3d000080bf9432293c22e1db3d7a37f03f540ab93ed4805b3f6e8ebbbe55366d3f3280bfbeed911e3d000080bfac53653c8e01d93dfc51f03f166fc83e1fb54b3f989becbe361f683ff09cd6bee9cd3d3d000080bfc615973c8dbad63d5b7af03f986d833e9e62533f9b9500bfcc75743f68fd97bedf520537000080bfb158c33c5cecd63ddfb3f03f433a263e1609653fe416d5be9e627a3f0a854ebeb53855bd000080bf0bebc63c8bc3d93d806bf13fae3b6b3ede1d793fbf8189bc7425793fdb536bbe81ae76bb000080bf19aff93c23c4d53d16dff03f55e2853e12ec6d3f456285bef4de753fbe008ebeaf1ad0bc000080bf1c18f93c5207d23d9d71f03fd20a413efeb8513ff6a50abf677c773fa2f380bebc2036bd000080bf0a9ec23c4ab8d03d942ff03f8771033e2c24423fe29923bfd461783f48f16abe237b9ebd000080bf884b8e3c22ffcc3dd2c4ef3fdc4d983e147c2c3f142a2dbff1b5693fdeefd0beefd8a3bb000080bfb8291e3d1570cf3d78dcf03f358fdb3e47d3643fd11106be191a673f99e3dbbe4f9bca3c000080bfa60c1c3d5e9bcd3d2c7df03f66fea93effee563f1d23dcbe80836e3f66e7b9be29312b3c000080bfb1c6193d8d7dc93d420cf03fd8aa7d3e38bc4b3f8a710dbfb6d1733f6ef09bbe725b3fbc000080bfb2d4fa3c880fcc3d1efdef3f5dda0d3e0cdf403f9b8e24bff28c793f368a5fbe32883bbd000080bf1339fd3cb50bc63d199aef3f1cb2c73dbcfd353fb24d32bf76d97b3f13e232be353326bd000080bfa6bf173db6ddc43d84a6ef3f79e22c3ef370433f69981fbfae69783f897175be73c9fbbc000080bfb7b32f3d0dd9c03d0992ef3f6ae6993e1d894a3f245c08bf706f6d3f82ccbebec2abf6bc000080bf73a7343df953c33d03f0ef3f4846c93e4e144c3fa99aeabebdfa653ff0e0e0bed304d83b000080bfe418c93ca0cac93d95bdef3f9c03d33d4eed333f4e2f34bf8964793fb0525bbe7af491bd000080bfc6c5d13c9ac2c33ded67ef3fc092a93db0562d3fe0303bbf4a627c3f44c026be566220bd000080bf57ecaf3cc9e5bf3de61fef3f8af9023e13d0303f303636bfaa7f793f2ed461bea92f1fbd000080bf2fffa13c1911c53dfb62ef3f0ee3293e0b572d3f2d8937bfc00f753f7c0692be1ff543bd000080bf8010493da5d3ba3d6cadef3f668f073ff32d3f3f1702cebe960e523f1a3e12bf808ba03c000080bf4761573d29ceb13d7650ef3fd4bb183f32f8323f83c6c9be6c18453fb31e23bf0742103d000080bf17f75f3d7f13aa3d1ee5ee3f49b4193fa272333fd812c5beb1ff443fb92b23bff732223d000080bfc59f613dbea0a53d2472ee3f0598173f93bc423fc32188bec0624b3f55361bbf51920e3d000080bfc3b85b3da0c4a73d7a71ee3fde370c3fa85e483ff45997be6e38533fad5a10bf2477123d000080bf428f583d7c44ac3de2cbee3f2d580b3fcb3c363f7a3be3bee2d64c3fb17619bfcd57a23c000080bf2b314f3d255db33d851cef3f67f20a3f2b57363fe7dfe3be8d454c3f4a491abf6b950c3c000080bff46c563d904fa83d6f0fee3f88e50e3f359a523f1502ddbd1a67543f74e10dbf1775883d000080bf4ce1413db29eba3d4e61ef3f9542e73e2e6a433faf76ecbe42265b3f3a4104bf407c88bc000080bf8faf3d3df2d6b93d9430ef3f3d6fc23e4197453f2c8c02bf9610613f03fff1be768b78bd000080bff15d4a3d1fdeb33d43fbee3fe0f3f83eda60373f051e00bf7fdc503fc6c713bf6c8d09bd000080bf0f98473d05dcb33d9fe4ee3f7f73fd3e8de0373f8b53fabeae084e3f665217bf89375bbd000080bf7f673b3daa0eb93d8810ef3f9393cc3eaf5d4f3fe9bfdbbec2b85f3f5bb7f4bee535b5bd000080bfc4d02a3d2e1bbd3dad30ef3f3c2b773ee2825d3fdaf2e0be2cae723f123a9dbe63fcabbd000080bfcc962c3dae9fbe3d9f56ef3f82eb663e1deb483f50c413bf4525723f19f7a2be698481bd000080bf945b533d3c6dad3d2ebbee3fbc0ff53ec9f0353ffdfb03bfa70a553fa3ee0dbf2f39083c000080bf3eb44f3d0800ae3d3fafee3fb58bf03eb988313f2ad40bbfaf4a523fc9ec11bf26938cbc000080bf1d39523d9640aa3d7670ee3f4baffa3ec114503f2d96a1be7ded5c3f15e100bf72232d3d000080bf1f86563d4c37a93de370ee3f9793f93ef87a503f393ea1be75a45d3f46bdfebe19285b3d000080bf7bbf513dd8efa93def1cee3fb32d0b3f94cc553f09b2aabdcfb8563f497c09bf18deb73d000080bf2f16463d32adad3dcac4ed3fa442123fc879503fe4e3d0bd3fbf513f3f060fbf6dd4033e000080bf7fbd423dc448af3d8cdaed3f23101f3fa4dc413fca024ebe3795483fbd5419bf4f55293e000080bfe7a64d3d0b63ab3d3528ee3f4a46173f29734d3faa42a8bd53204e3f009514bf8654f93d000080bf5af5393da9d8b83d73f6ee3f6787fb3e0263583fd54257be6896593f879904bf1e6cc5bd000080bff78f453d43e1b33d89d0ee3fec9d133f66da373f9c6ec7be646b423f179e25bfdd5f8cbd000080bfd908443d6404b43d62beee3f54ba2a3f7180323fd08986be3b36353f03f733bfd30f8dbd000080bfe2fd383dcc06b93d21e0ee3fe41f103fcc84533fea829cbc3b07523f32bf0fbfd4afdcbd000080bfc823383de469b93d8ecbee3ff70ed93eb2b8483f221be8be9723553ffece08bfa43115be000080bfd6c4423df25bb43d79adee3fc0aafa3eda6d273fa0a113bf7a9f3c3f1cfa29bfd98c02be000080bf72e1403d245db33d48a3ee3fd4618ebd159a983e3fb773bfb780503f9fba08bf442168be000080bf7cae363dbe2db83d5cbfee3fe6613cbdc0fd903efa3c75bf65755a3fa08af9beff7c3dbe000080bf01f8273d4850bc3d0ed7ee3f95c190bc186a963e6fa974bfe6ee6f3f90f6a7be1503f2bd000080bf7fda283d4d9fbd3d76e4ee3f52018e3e3488663fad75abbe98ee6f3fad18a9be201ee5bd000080bf0c94143d82eabf3d1ff2ee3f4552d43dd630743fb24190be56b27d3f5d43fcbd767b56bd000080bf855c293d4512bd3dbefaee3f2c7eb73ec87e6a3f13a2383e30e76e3f1f3ab1bec86ac5bd000080bfead1143de450bf3d7409ef3fb081033e1a2f753fa8c1833ebac87d3f624aefbd354075bd000080bfe353003d0ea0bf3d7405ef3fb012e3bdcd667a3f1a32343eaa467e3f199feb3dbee45fbc000080bf698a003d8020c03d94eeee3fd8c18bbd8663723f65faa0be710c7f3f5a73a63d909de93c000080bf897a013daccabe3dd2e0ee3fae019b3db811a13e8e3a72bf5afe7e3ff2908abdfc356a3d000080bf7787143dd097be3dd6e3ee3f4f03393c3c7a9a3e8c0d74bf39067c3fa67a2ebe771d2dbd000080bfbb0e153d7afcbe3d9223ef3f5ab9013eca627d3f6ad185bd53437d3fef0206be99cc83bd000080bfd311003d946abf3d2220ef3ff2c14cbdd3367d3f9ab10dbe8da57f3f649b413d0389bbbc000080bffb7dff3c5a12c03d9b3eef3f0043b03c80aa583f993d08bf5ead7f3fa3722dbd34e4dcbc000080bfed7e153d5185bf3da242ef3f0b13dd3d08c55e3f6d23f6bed2627c3f44b31fbebb8f79bd000080bfa4e0293d62bebc3d1613ef3ff011a23ee7be713ff6e1b7bdbc00713f6811a6be4d24bdbd000080bf5af3e33c5016be3dc8d3ee3f0e621bbee21e5c3f4a97f9bec995773f4e846c3ee3d2d93d000080bf67d5e73ca7aebc3d10c9ee3f3fca373efe319b3e12976fbfacd77b3f70b75bbd09662f3e000080bf3faae13cb1ddbd3dcde7ee3f11768ebe97f3743f9bc2abbd2453753f249f903efe5f313d000080bf5053cb3cde59bb3d12bfee3fa68b67be8a67663fddc6bebea97a753f47c28b3e45909e3d000080bf5309cf3c4b22bb3da3adee3fc88370bd9fde3c3f64282cbf9446763fdf0d633e5914233e000080bff8a8bf3c5e9cb83d1688ee3fcbb3d83dd4702a3f23153dbf8d627c3fb2d6da3c9c48293e000080bfd238d43cb090b93d5aa5ee3f9dd1943ed0cd9e3e8cb867bfb5df713f803f78be129d613e000080bf54aac43cd7c0b63d7c7eee3f2f47c03e3f33c23ea27b58bf8f8f513f814710bf2bcee23d000080bf1ee7b63c0fd5b43d4453ee3f69bd023f870b123fc1a924bf9377273f3d493ebfff370fbe000080bf8c15b53c5becb63d3869ee3f1892863ea860283fe0b634bf442a743fb34493be9d6bb23d000080bfe413b23c9e0ab83d8179ee3fe9c3d63d831d4c3fa02818bfb6417e3fb66feabd8a89b13c000080bfd846bc3c2c65b93dd099ee3f5c6367bddfbc563fd69d0abffc527d3f4ff2f33d0e7aa63d000080bf7a04b73c7022ba3d6daeee3f5803b9bc3fb55f3fa3a7f8be13e37f3f6385ee3cd192c13b000080bf145cac3c6c09b93d0d8cee3f5582523da5fc5b3f8c4302bf7f2a7d3f3821ebbd8385c0bd000080bf3293a83c83a2b93d069dee3f49e20e3dfe18603f55dff6bea8927d3f6364c1bd1757ccbd000080bfdae1af3cb7b4ba3d7bbeee3faf41093d3fa55b3fe93703bf89dc7e3f593797bd70a66fbd000080bf5a9bc63c2eacbb3dd8d5ee3f8eb903be81de663f4632d3be04377d3fe120163e0ec8453c000080bf2ec6c03c5246bc3ddaecee3f08058cbb76ac553f9dfd0cbf00fe7f3fc74c23b8d01400bc000080bf68cace3c89ceb23d6282ee3f8b18fd3ea4fa933ec9df51bf57418b3e6f7a72bf79002ebe000080bf575fdd3c3c2fb53d2aaaee3fac76cf3e51f2343ef5a065bff00c433f7a861bbf8fe4653e000080bf1459eb3c77a0ae3d2aacee3f7f12c93ec2498a3ed80c61bf248a503f96ba0bbfdceb483e000080bf3013c53cb30cb13dea59ee3f51161f3faac3f73e47bc1dbf9249ae3ef20660bf8e1cb0be000080bf1288d73cbaddab3d3963ee3f3c48243fe6950b3fda110abfdbf755bda4a72bbf85733dbf000080bf5ce1dd3c2e6cad3d9b88ee3f6feb013f0bdaba3e34d247bf5c9b5a3eb04e6ebfedc597be000080bf1459eb3c77a0ae3d2aacee3f7f12c93ec2498a3ed80c61bf79a304bed31c6ebffbf0afbe000080bfcdcea23cee26b83d1870ee3ffbe2e13de33a603f107ff0be004a793ff96242be305500be000080bfe351aa3c3855b73d8d5fee3f7c7b533e61db513f2fc008bfca4c723f018e9cbe5d91d3bd000080bfadbfa53cbebeb63da245ee3f37f2873ea4bf603f50ffcbbea8b26f3fa1a8aabe0a40e2bd000080bf5b069c3cb66ab73d0951ee3f8909843ecb60683f1372a9be262d733f1e029abef4bbadbd000080bf0fb9993c6ccdb63d5b25ee3f3bdbce3e9e37683fb8d3f1bdc76a663fa9a0d5bee1ab00be000080bfa7cea33c162fb63d9527ee3fa379a43e422e693f48a984be33b56d3fa1a2b6bed575d2bd000080bf05c4a43c10adb53d700bee3f5bc6b53e123d6d3f6823fcbd67a16d3f10ecbabe27f091bd000080bf22179c3c0f44b63d7efced3fc97ee53eca2a633f7922dd3dd279643f05f3dfbe36c6e1bd000080bf9d9d8c3cb5a3b83d7120ee3fa1bc243f1cad423f9eb2b23dda57433f0eda20bff81c1bbe000080bf94be903c4911b93dd575ee3fa787d83ea20d563ff8d6b2be9e13603ff610f4be7e94a6bd000080bfa3409f3c9142b93d118fee3f35f9003e07e65a3f35c300bf69f4773f8cc95cbe6ff6fdbd000080bf6894ae3c407eb63d3a57ee3f20abb43e211b353fb8c41cbf0980613fc69af1be0edf19bd000080bfc8ecac3c59deb53dfe43ee3fa847e03e22e1403f2110fbbe2f7d573fd30509bf5f4790bd000080bfa837a33c71aab53dc1e5ed3fdbd9953ed5826a3fa4618c3e299f743f25048abe2881f4bd000080bf4dd6a83c9336b53d51f7ed3fff624e3ea0e5763fad122f3e6ef2793ffb4e3cbe02b9e8bd000080bfea42ac3ca8c1b43d6400ee3ffba23a3eaa196f3f5d5a9d3e53a2773f5711eabdd8c467be000080bf5a49ab3c14ebb43dce10ee3f2226c73e95966b3f8ba12e3d49b3673fc005bfbe4df150be000080bf8693b43ceeb4b53d32e3ed3f606247bee2c26f3fc335953e13816d3fe9698b3ec1ab82be000080bf7041b63cfd5fb53dedf2ed3feff2d4bdc2005b3fabdd013f64a15f3f8411a53e51b1babe000080bf4696cc3c9275b83d0bd9ed3fc93b7ebe3789573fab47f53ec0c85b3f2831d73ee76296be000080bf7904b73cc021b43d0f0aee3f62e58d3ee6dd473f545f0f3f3635583f61d4a33df48907bf000080bff1d8cf3ca5f2b63d4feaed3f0ac2143d4a6ff13e1c8f613f56fa4a3ff8e7053f6c10a0be000080bf0a0bee3c3ee8b93d6cd0ed3fecc1373d9cf6e13eb46e653faa5a6e3fbb049d3ebd5e4abe000080bf700dec3cf891bb3d0ebded3faa491abe78786b3ff07db93eb41e743f086e6d3ee4b244be000080bf0683eb3c0a48bb3d80a5ed3f881374be62236f3ff60588bead3a773fe2d84b3ec97c2abe000080bf1aa5cb3c9e76b83da0c4ed3fc935babe4d726e3ff380513cc050663f07a6b53ee64182be000080bf50e1083d527cbc3d5da9ed3f7542fe3c1427773f937d843edaa87f3f010a9ebc97d143bd000080bf9c53093d6ad9ba3d27bfed3fd482453dc1bbee3e8521623f0da77f3fd65aa6bbd85154bd000080bf2e8e0a3de4beb53d31d2ed3f3f21143dd122713ee3a0783fcfc57f3fe5c84c3cb6cc24bd000080bf504bf33c4a05b53d48e0ed3f7682dc3dea2a7b3ef1a4763f01ae693f2e1db83e643446be000080bf6e891c3d0fb9b93d93c3ed3f70fef7ba844ffd3e11795e3fcd9d7a3f349834be11fed13d000080bf2b6e1c3d2ae2b43d2cd7ed3ff5d2bbbdf3a3763e035a773f75cd7b3fc38004bee7a1003e000080bfa1f31a3d7adead3df1f3ed3ff4f1a1bd275e9c3e4aed723f1d577b3f156c10be0842023e000080bf86040c3d00e2ae3dd1ebed3f60c3e63c99ed963eab84743f46b67f3fddb8e63c4a441cbd000080bf164cfc3cb403ae3d51f9ed3f3e52db3de1d9a03ec27c713fae103d3f712d1c3f89f492be000080bf12dc083d9600bc3db48fed3f0580023c8884693f42c6d1beceaa7f3fb971e4bc95c62ebd000080bfb4e51c3dc895ba3d9a93ed3f2f2e923e332b5a3f3b77e0beee35753f97a589be2a3dcf3d000080bfb1a41c3d8b32bb3d54aded3f02d35a3e418d743fa94a513e2b05773fc1cd74be3b34de3d000080bf30112f3db6a0b73d0ed8ed3fa716b73e6799673f7f3b6d3e09bb623fce7dd0be2275643e000080bf71542e3d2671b63db3eaed3fc6a194bd0763fd3eb0ac5d3f7c6e713fc1667ebe5656623e000080bfdb873c3d5248b23db41eee3f1613efbd5517f73efe365e3fffe9723faec250becabc763e000080bf6ced3d3d4414b33d4012ee3fb7bee73e8a96573fb915963e305f503f644206bff3dc7f3e000080bf41d73e3d5e49b23d8a01ee3f81782b3f93c6303f04c68bbeb6053e3fa9e521bf89de623e000080bf68972f3deeedb63d6ac1ed3f71ab053f18f4423f1896c4beab3b5a3f7182f5bef839553e000080bf3604473dc2dcae3dbf44ee3fb686eb3e82a6553fda319b3e72f1533f65ca06bf89e4453e000080bfd2f5443d4d87ae3dca49ee3f1e4371bec07d0b3fa1024e3fac5a753f24f2883eb6c4cb3d000080bff642413d11e5ab3d4e49ee3ff253e5be3c47c13e907b4f3f889c333f6cd5353f9518693d000080bf1b84393d7ae1ae3d8924ee3ff1b599bea239873edba46a3f2f10743f52fb543db335983e000080bf1a30483dc6e1ac3df46cee3fda6eefbeaefe613faaa236bd08f05d3fc27fe53e57265fbe000080bfcf48443d2e8eaa3d8369ee3fd4c03fbf748e283f21d2963dab701c3f71c33a3f16409dbe000080bf18b53b3d51a5a63d6668ee3f0c3c1abfb0924a3ffa72d53d032f253f514c0f3fff1905bf000080bf9d103a3d8fe3a73d024bee3f7c16c2be4673fe3e9ed4473f6770403f1846283fe8df5abd000080bf0398323d4faea93dcb2eee3f18ca70beaf15b83e072c673f6df96a3fead564be58eea73e000080bf618c483da2ecad3d5c3cee3f26bc373f0ec02f3fb292eebd5f00323f819032bf315e313e000080bf3a954c3df60dac3de76fee3f60d4263f994a353fff198bbe64d63e3fd5022abf57ae693d000080bf1aa24a3d3b01ad3deb6eee3fc5290a3fa4524c3fb91989beb20c563ff2930bbf0633763d000080bfa613493dad87af3d3690ee3f15dff43ef5a91f3ffe471ebfa8f43f3fb71028bf3165a8bd000080bf4cc5463df20baf3d4c89ee3fe92921bea006e23ea42462bfbb70683f37fd92be3f489cbe000080bf56d24a3d19e4ae3d149aee3f241b243f152b213f3ec4e0be2a96303f7a2f39bf0fe6f6bc000080bf80f14c3d2f6fae3d55a4ee3f64ba093ffe2c2b3f476603bf1758453f14fa22bf82d2aebc000080bf08034f3df12aab3d4370ee3f633c103f4019453f976a99beb013513f56e312bf8f557b3d000080bf8aab4a3d98bdac3dc232ee3fe0c42a3f30b33c3fb273ddbd717d3e3f65ef26bf80b6143e000080bf9262403dacebb03de6eeed3ff6b2293f1815313f98b292bebc493f3fbbaa22bf9d5f473e000080bf999e303daf79b53da8a7ed3fde55083f8e32393f04f3e0be3ba0573f7e0801bf0ea1433e000080bf0742323d10d2b33d8b8bed3feb4f053ff0324a3f7be2a5be6e6d5a3fe907fdbebb9c2a3e000080bf2a711d3dee29b93d7d75ed3f315e993eefa44c3fe75305bfb991733fb0eb94be3e68ce3d000080bff3591e3dc5acb73d8654ed3f6a4aa23e5f2b603fd08ababefbaa723f5c399cbe2b12bb3d000080bfd9ec083decc3ba3df070ed3fe741af3ca6055d3f260e01bf089b7f3f7b5735bd180309bd000080bf0e32093da38fb93df54eed3fe061953d3c57723f18baa0bece0b7f3f8962abbd74eeaabc000080bf00c8093d8c2cb93d802bed3f77121e3ed0d57c3f4843df3cc2ea7c3f7ab31dbea0cd74bc000080bf34d7e93cc0a7b93dde6aed3f2403dbbd896b7c3ff5e102be5a047d3f6b38bb3d2540f9bd000080bfdecce83c79acb93da14ced3f5ea3753d4095773f5d137d3eb34c7e3fde1009bd5d78e1bd000080bfd5b01f3da0dcb63d2f32ed3f89f6a73eaf57703f4e73d6bd8394713fee28a4beb369a73d000080bffdbfea3c3869ba3d4889ed3f132b55be4c536a3f8d7eb0be61a6793f62242b3e689c14be000080bf2121ca3c6a31b83db0aded3fb0899abeafee733f5803fdbcbde06e3fddc6933e24985bbe000080bf4030c73c6210b83d2098ed3f92291bbeb03c793fdce92e3e6adf773f0b4c393e379930be000080bf85b5b13c48fdb53dead0ed3f69a2afbd5225723f293ea03e3ce5783f5fa2173ee57839be000080bf7dd0b33c04afb63d5abbed3fbc41a0bdef746c3f6d12c03eee337a3f8ac5143ec78a1dbe000080bfa984a73c3b93b63d48c3ed3f5e83603e120b4e3f152e0d3f1f9b793f86214ebe1e35c0bd000080bf7ee5c13c5470b83db487ed3f3b52bc3dc6665b3faac9013f16c87d3f5a82fcbcb3c202be000080bf651e793ceb35bd3d3016ee3fe68d463f7d85163f36226b3e36601f3f41c945bf23fffebd000080bf2f405b3c0eacc33d3116ee3f8ed2543f098ff63ebf0d8e3e803d013f2ef35cbfbf4770bc000080bf6ce43a3cb630cb3d8c2dee3f9fca563f06abfd3eb442663e5652013f19e55cbfd74e853c000080bfe299503cb08fce3dbf87ed3fc4ac3e3f0c440d3fdd12c03e4a451e3f593f48bf0c739dbd000080bf405d5d3cdf00d33d74d9ec3f53cd2c3f313f273f608baf3e2705393f54cf2dbf824804be000080bfdd0e8d3c4ce5cd3d8797ec3ff865193f5242303fc02ad13e26b5423fb31c26bfd83cb4bc000080bfefe1923c4888d23d2ae1eb3f899f0b3f32da473fcd359c3e3b7e533fb3e80fbf137d1dbd000080bf49d6613cf744d73db228ec3f7054223fca62383f380a903ed4b9453fbd7b1bbf73623ebe000080bf60e7263c44a6dc3d5161ec3f3d50383f01f8233fbbcd883e96f4303fd03832bffa6146be000080bf572a283c0449d83dc90ded3ffd04363fa6b0233f73ce953e87bf323f78f530bf059b3ebe000080bf436ff13b03cfdd3d6138ed3f1808453f9d8f153f64d9833e89e9213fabb640bf0ad83abe000080bf2dd0ee3bbdc2e23d7d8dec3f50444a3f9e9f0c3f85458b3e4c351b3f120544bf1eea5bbe000080bf709ba93bd575e83d6db4ec3fe817293fed39293f0346b63e23053e3fc17025bf167435be000080bf8143a83bd55be33d8a5bed3fc859273fe8b3303fb4d19e3e2653403fa12324bf6b4620be000080bf0e65a83b5185df3de2f1ed3f3488243f7f24383fd501873e4f14433f7ebe22bf4c46fcbd000080bf8a78eb3b1c26da3d91d5ed3f28d1473f5360153f9ea3653e365b1e3f38cf45bf5aea11be000080bf2886e43b7973d83d3464ee3f2195473f85ae1d3fdac3e73d0b15203f478746bf3732b2bd000080bffed2a23bcb12dd3d2675ee3fb8ee193f78ef463f67633e3ed4294c3ff41519bfe192a3bd000080bf10919a3b40f9db3d5ce8ee3f768b043f5e925a3f62025f3d01025b3f142204bfa7a329bd000080bf68ebe03be671d83dc9e2ee3f3068353f3848343fa08233bd1140343ff7b435bfa3b0aabc000080bf467d123c53ead23dcbd8ee3f53014f3f5d88133ffc83f2bd4878153fa0914fbf10c2273d000080bf1992133c0a4dd23d9a4bee3f08d3513f0a6e0e3feee90b3e3e7e103fa63753bfc68dd6bc000080bf4451203c3a57d43d8eb1ed3f6c54413fd9cd163fd635933ee9ce223fdfc443bf1d42d4bd000080bf9082273b8869df3d897bee3f8fc98c3e9bb86d3fe02a7f3e79ee753ff3368dbe1f3904bd000080bfa8e41c3bde01de3de2e8ee3f6509843eaaa8753f6862e63d7b4c773fec3784bed0fd3ebc000080bf000000007fa6de3de6e7ee3f00000000f8027e3fbcc2fe3dfcff7f3f8091b338580a33ba000080bf000000000000e03d0f7cee3f00000000f242773f8fa1843efdff7f3f8e823439bb4228ba000080bf00000000e084e23d0000ee3f0000000058ce6f3fca35b33efcff7f3f01386c39a10b1eba000080bf48a72e3b0c07e23d11feed3fcb65903eca14663f1de2ab3e8049753fa23f90be0e954fbd000080bf2bfb2e3b2fe0e53d236bed3fd9b2913e4e5e5f3fed53cb3e5cf8743f7b2591bec9af80bd000080bf000000006150e63dc26ded3f00000000b6ee683f7366d43efeff7f3fc2a66d39f54f02ba000080bf00000000e86aeb3d20c9ec3f00000000fbe7613f0ddaf03efeff7f3fd0f25139a8ebc4b9000080bf7df2303bb5faea3debc5ec3f3c86933e5835583f9713e73e8087743f0fda92be10ae95bd000080bf1a3d373b705df13da911ec3f9125963e3c28523fbedefa3e0ae2733faa7996be5b479fbd000080bf00000000d6dcf13dc215ec3f000000007dfc5b3f75ed023f0000803fb2453539c14998b9000080bf000000001e56f83d866feb3f000000005a9d573f29020a3ffeff7f3fb01e833939daccb9000080bf68cb393b75c6f73d9c6aeb3f4de2953e0fe14d3f006a043f10a9733f290098be4fe69dbd000080bffdf9363bf5f5fc3d03edea3feb018a3ee61c483f10fa0f3f4383743fbb3c95be579b57bd000080bff08cb63b6efdf43d3657eb3fcb3c233fce66233fcbcfdc3e0bce403f235822bf672e33be000080bf77a1b93b5340fa3d2bdaea3f10d01a3f2a62203f5cc3fb3edb2c453f11fd1dbf39ce24be000080bf00000000c488fd3d32f2ea3f0000000066d9513f5ea0123ffdff7f3f210aae391b15f9b9000080bf000000001440013e9e84ea3f000000006ff6493fe74f1d3ff8ff7f3f9cc6123a8d6f3cba000080bf3a24353bbaf7003ee882ea3fc43b5a3e465b413faba81e3f8e38763f31278cbebcba3b3b000080bf702bbd3b7172ff3d8179ea3f82ed063fbd091c3fa999173fec634c3f620818bf8d6ecbbd000080bfa1513a3b80db033e9015ea3fab4a2b3e35db4d3f3b08123f969a773f4eed7bbe5f66813d000080bf000000009623043e3910ea3f00000000eb1a543ffd570f3ff6ff7f3fd1c1243a5eca73ba000080bf000000006060063e7991e93f000000007b71733f54629e3efbff7f3f18fb8439b9654cba000080bf6ada453b8017063e9395e93fcea9373e72d26e3fa6e59f3e86eb783f31915dbea40eb43d000080bfe90f4d3b5a9b063e8315e93f8e62563ef9e2793f30636dbdd9d9793f8adc51bec157973d000080bf000000001de7063e9914e93f00000000f6ad7f3f5be34cbdfdff7f3fb267e9b70ba211ba000080bf000000009819063e98a4e83f0000000012066d3f4e73c1befdff7f3fb76e6eb9a11112ba000080bfbd943a3b1dc9053ee3a4e83f05db5c3e3e49653fbe26c7bedaf4793f12834fbe9f24993d000080bf50e01d3bea04043ecf48e83faac2623e33bc353f14282bbf683b793f0c214dbe32c9e03d000080bf00000000a35a043ed946e83f00000000c596403f6ea828bfffff7f3f746db1b9569acab9000080bf000000001956013eb2f8e73f00000000f289053f39695abffaff7f3f539f29baf96acfb9000080bf1c12f73a7902013e3bfce73f3b22703e5eeef53e0d5c58bf8215773f000460beddea123e000080bf1e1b813bb804003ed108e83fbe23e73ed1b2ae3e6c1153bf11555a3fe592dfbee991923e000080bf84d8993b3333033e2251e83f1a47cd3e540a1e3f9d462dbf20e7673f202ec1be6213453e000080bfd02edf3b3315023e5662e83f2a62043f2b2a073fc8742cbf8e34523fec3507bf418d5d3e000080bf3108ac3bcae4043e6aa7e83f517bd53e3379503f38b3cebe3892683ff24ac6be9fd4203e000080bfaf40f43b3179033e92ade83f5a92103f0b77373f7c87d1be9922523fc2020abf7a2c413e000080bf17fbcb3b2eeeff3d4037e83f8464fd3e7dc68b3ec22f53bf9efb483fc8200cbfac67943e000080bf4da0083cfaa2fd3d4856e83f93e6f13e68b2673e51105abfd777423fe13818bf36db863e000080bf4cff123c386b003ebc77e83f5582103fd9f7eb3ed64e2fbf397a423f0d541dbf76b5593e000080bfcc483d3c92eafb3d5d8be83fa97b0a3fa86ae13e287437bfc65e3f3f2d6424bf10d92d3e000080bfccf01f3c7078013e0bb5e83f8de4253f7af6223f3d17d6be41153e3fdb7626bf30a3243e000080bfa779473c38a8fd3da7bae83fb00c2b3f6cea1a3f769fddbed667363f581b30bf51740d3e000080bfc4784d3c6ec5fe3d0101e93f4720403ff213273fbdf2d4bddfec283f45ac3fbf276d813d000080bfa7212a3c1f0e023e7217e93f26d0363f12e8313f3b72acbde234333f299735bf8aeea83d000080bf30487a3c31d3f63db8b8e83f59693a3f83ae0c3fc9b7d1be6cb4243fb20a41bfd63e073e000080bf20a07b3c8508f83dbaf3e83fe2454f3f6149153f25a187bd723d163fcbad4dbf5f8bcd3d000080bfe38b763ce505f83d7c2ce93fe7fe4e3f055a0c3f14bb5a3e99c90b3fa09c55bf2bef983d000080bfddd3553c0d23fd3d874ee93fcf60483f0874123fa3f37a3ef57f183fe77c4dbf864aecbc000080bf48a72e3cf437013e8d81e93f02c33f3f6984193f4d2a903ea56e213fbb9346bf3353d1bc000080bfb785673c7ca3f63d888ae93fb740403fee82d23ed745043f7a01fc3e23c45ebf58f9bbbc000080bfd177373ce9f1fb3d15cfe93f549e3e3f7422cf3eadeb073f53820c3f57e152bf1f7a11be000080bf7c60473c1193f03d5400ea3fd5ba403f6efea23e1f7a133f7ab3e63ea12463bf9ecbc9bd000080bfd47d803c7aa5ec3db3a1e93f0453393f868a983e934a1f3fa4ecba3ee9446ebf332eab3c000080bf9565883c7a20f23d8948e93f5974553f78beda3ef901b33e1545da3ebd9266bf92dfab3d000080bfef56963ca033e93d4a5ee93f7ad1603f0f2a893e2bdfca3e2624883e944976bfb6637a3d000080bfb001913c2992ef3d5af2e83f0f36683ff185d73eea0298bbceb7d53e5fdf65bf27df0e3e000080bf49f59d3c20a1e63d04ede83f6e16793f42da6b3e2084753c3de0663e545c76bfaf7b1b3e000080bfadf79b3c881ae53d9d84e83f6b0a643fa60a703e1e52c7bee39da63e63506dbf6ee73e3e000080bff8c6903c4325ee3dbfa3e83fe6fe523fe4d2d53eb1d2c3bef520003f42695abf5d7f163e000080bfb2f4a13c596dde3dfed6e83f0cdb7f3fbac2cf3c7a42b4bc7fdee43caddb7dbf670d013e000080bfeed79d3c0e37e03d9a48e93fec6b703f9882cf3cce66af3e5ce7043d0ed67fbf77af76bc000080bfe31a9f3c0b7bda3d1e19e93f6c31773f2f43debd68fb713e4edcdebd32767ebf0b1742bc000080bff25fa03c36ecd73d1bbfe83f433f7d3fbe8101bee97196bdc0a3fabd32a57dbf78816c3d000080bf49649f3ca034d43dcbb5e83fc4fc783fa8a91e3ef67131be2a0d2f3eeb5d7bbf12f3a63d000080bfb64b9b3c6171d83d1a39e93fe8d6733fd40239bce6d19b3e660d94bb0fee7fbf9408bcbc000080bfeded963ca65ed73d0c6ce93ff982653f4772b03ede818e3e61acba3e31506ebf0a56b2bc000080bf4c1aa33ca339d23d5ad5e83f3a162e3f64783a3f1752abbd7b913b3f51c12bbf29d4e93d000080bf6795993c332dd13d0a2ae83f5e80063fb8a3523ff2db5dbe6993593f5d0105bf8604b43d000080bf9696913c8732d43d5e49e83ff6eb5e3f4472773ef239dbbeef47bf3ebf2f64bf6073833e000080bf3a35973cf239d73d6d4de83ffd0d5f3f0a23b4bd6230f7be5c29013dd3c378bf8e8f6f3e000080bfac8e9c3c012ddd3dd464e83f6aff653feec2253d5bdfdfbe2eef1c3e8b4776bfb047673e000080bf2909893cc40ced3d8375e83f1cde083f1ba7c63efe3040bfdfa0263f6e7241bfbd80953d000080bf268a903ca285e43df948e83ff02b183fdbd9943e6ff03fbf5e4e0c3f5c2854bfa2c4e73d000080bf5438823cac7be43d1330e83f78aa713efa0dcc3e44e262bf915c3f3fe43e28bfab9bc5bd000080bfbac57c3ca6f1eb3de15fe83f78fa2c3e667ea63e64316ebf5ac8463fad1520bf3bdf9ebd000080bf49f85e3c3b54f33d9377e83f114e813ee923763ebbef6fbfc6d2483f652f1ebfd1b5583d000080bfae846e3ca858f53d768fe83ff65d033f4a07dc3ee3323ebf1d5c3b3f3dd92bbf600cf03d000080bfb728333c6654f93d1270e83f0753c63e6aeb5b3e7b8565bfa125473f861919bf4b76453e000080bfa8962d3c1eaef53dfe66e83fa0f2723ee60dfc3aaeb078bf304c4b3fc18b13bf5f6f453e000080bf164e523c3d81f03d8f70e83fad8309bceba3733da5897fbf22eb553f83410cbf568122bd000080bfa79b443cd0d7ec3d4877e83fc0424abe906181bd516f7abff6bb5e3fd72ff1bee2bc14be000080bf7f71293c8033f13daa6ce83f56c3fe3d3ba21ebe85e57abf86444f3f201e0ebf5816433e000080bffd69233cc81fec3daa7de83f4c62ba3d77023bbe349d7abf604d503f6d990dbfcf1e373e000080bfd5b40b3c7c64f33d0157e83f19c2b73e9e5106be9c926cbf0ed7363f784b19bf148ab93e000080bf1232103ce42cec3d8e74e83fb756b83e361218be72c96bbff3b0323fbbb51cbf803cbe3e000080bfaa63153c1156e33d168ae83f21ae8e3e897be73e50e958bf7c075d3f5e1a01bfd69f733c000080bf4f07323c904fe83d8388e83f09a217be088138bc4c297dbfbf0b623f4a5ae7be771f02be000080bf6f7e433c965fe63d5378e83fbd1be8be68534d3e90555ebf5579573f1bb965be1577fbbe000080bf6bd3583c1ea7e83d6864e83fdaa6e7be37323a3ebf805fbf6e7f543f74458bbe6040f9be000080bf71723f3c6a68e33d7f6ae83f56bfd9be1dfa073fed983bbf72f2523f2e78dcbd7e660ebf000080bffb3b5b3c3967e43de244e83fb434febe67cc023f54a533bfc631493fce10a1bd00021dbf000080bf7097fd3b0894ed3d885ce83fa0080d3f67f201bee72953bfd0b4143f0ebf26bfe1f1f93e000080bfaa49f03b5391ea3d5858e83f5cfe313f2afe3d3b6dfe37bf7773083f3c442cbf6c4e033f000080bf9be3dc3b9f94e93d293ce83fdb49553f75d4ec3d7f720abf136bed3e89d02dbfd6b6113f000080bfe789e73bb136e63d423ee83fd87a543f349b743eba0701bfa4f8033f486d2cbfbb9a073f000080bfc042e63b9e44e43df225e83f07a9553ff8b6d03ea4aebdbe8e880c3f5ccc2bbf0c1fff3e000080bf2b88013cff05e23d3f35e83f1e87243f49212d3f804fb8bededd433f994217bf4409833e000080bf5da7113cc5a7e03dfd28e83fcb3eb63e8ecf653f13f684be519f693f7998c9be22c4e1bd000080bf3f8b253cf295e03daf44e83f12054c3c9b95683f4fd3d5bedbfb623fbdfd4fbeceb3d4be000080bfba1c2f3c346ddf3d5c00e83fb901f63c181c6c3fb845c5be73b2633f02594dbe0d48d2be000080bfdb140f3cdbfcdf3d7aeae73f74dbd53e9f5d5d3f50d28ebe7e5e643f45abe5becc5460bd000080bfe9f2e63b1b49e23d9be8e73fc678333f9a7c293f0fa687be8b52363f9da021bfe61c9d3e000080bfc3dec43b2d9fe53d97e7e73ff31b5a3fd8a9c83e98bdb1be72ac053f053a2fbff63d023f000080bf68cbb93b0472e93d55f8e73f61af5f3f44d35b3e596fdfbe304cea3ed1ae2abfe298163f000080bf8d84b63b4ef0ed3d8d0ae83fa876563f0113ea3db5b108bfd5cbf03e2edd25bfa164193f000080bff4c0c73ba94cf13d9f27e83faa58393fce000f3c7d9230bfe9d4073fdc5f25bf167d0c3f000080bf69a7e63b1ac8f33d483de83f8c99093fada189bd663057bf78a8203fa24922bf1869e73e000080bf3a773b3c7383e13db149e83f7f72b3bece8a4c3f692ffabe95644b3f573eb9bcc3591bbf000080bf1d7d4c3c431ee13df81ce83f9c91a4befdcf493f4c4d06bf46f44f3f9af861bde5a114bf000080bfe030d13b072ffa3de02de83f046e033fe9a1843d680f5bbfca9a373f487514bff0d7c53e000080bf42f4a43b2336f83d890be83fdaab273f9472d83d138c3fbf13c6243f57c718bf764ff53e000080bfec69073c2c2ff93d394ce83f3013cf3e0684f13ca8016abffa19403f4a0115bf8f61a03e000080bfc09c593c01cadf3d33f8e73fcf81a1bcf3e9343fed0d35bf60cf5e3f5407acbe3851b8be000080bfacb26f3c9a9ae43d1330e83ff39930be72e3003f6dbc58bfae84573f6ee4bdbec7bac8be000080bf92cc6a3c747eea3d315be83f41834abe170a803ee4a372bf37ce543fd974f0bee33f98be000080bfa1176e3c4e41de3d29efe73fa357b93ea18cec3e14444fbf0c803b3f2aa12dbf67f273bd000080bf573e4b3cff3dd83de47ee73f38d2103f102d453f5eca96be68614e3f307817bfd72d963a000080bf2635343c6360dd3d3fc7e73f227a863e6035503f20e804bf57ea643fc38cd0be982d3ebe000080bf7daa8a3c6940dd3d9715e83fbb44253f2de33a3e29d73dbf6f05de3e6d0c63bf1a0d233e000080bf6da9833ceaafd73dd8f1e73f4c3d3a3fc45b593ef60627bff748ce3e9ee166bf55921f3e000080bfcf320b3c14b3de3ddfb0e73f317e013f6fb34d3fb9aea0bec59a593f7db906bfee52b93c000080bf2f690c3c7c98dd3dbf62e73f41e60f3f417f513f0544f5bdaa9c533fc1880fbf18c2463d000080bf8713183c666bdd3de6e5e63f4ddf0f3ff8a3523fbdf1ac3dd9a7523f700811bfca56333d000080bf4810ae3b2d60e23d8867e73fb3cd0f3f53fc463fb61191becec2533fbc8b05bf08df553e000080bf1cb5c23ba451e13d47ebe63f8492c73e07bd6b3f7f801e3c407e6b3f2b98c7befee42e3d000080bff2df3c3bcbc3e23d6fe0e63f4252153efab77b3fb873dfbdaffa7c3fcce40ebe4554813d000080bfb8a5d53bb69ee13db471e63fc421a63e88e6703f3972c43d4ab2713f8b23a8be39dde43c000080bf03ea4d3bd999e23d1669e63f7be1893d90407f3f9ec1133d854f7f3ffbe38bbd8cb6da3c000080bfcaa05a3b300de33d070ce63f64214a3d54627e3f1652ce3d8a9a7f3f51a653bd27aca83c000080bf00000000cc62e23da35ee63f00000000f0f47f3f6c81963c0000803fbd4a8536c4ae62b9000080bf00000000e6d0e23db000e63f00000000598a7e3f3262da3d0000803f8f2e79370e3811b9000080bf000000009276e33dc3bce53f00000000e5fa7e3f08a2b63d0000803f118697362f8c53b8000080bf2bc1623be292e33d54c8e53f8a51873d7ab87e3f8b51993dc15c7f3fdcb28abd5a94a13c000080bf78e6653b84a0e33d0a9de53feeb2c43d9ced7d3f7c12aabdecc27e3fd56ac0bd1668eb3c000080bf0000000086abe33df791e53f0000000079837f3f96637cbd0000803f29d1aa358eeeac37000080bf000000005e67e33d666be53f00000000d24a7b3f237a43be0000803f761eb3376c43e638000080bf0cac633b7e1ee33d0376e53f8e31083ea422763fad6276bea5b77d3f1b1b02bea05c243d000080bf3c165b3b721ae23d9a3ee53ff799383e7b5c6d3fcc1da8be99cc7b3ff57830be86a55a3d000080bfaa49f03b1591e13dbc78e53f7dc18c3e6706693f9a859ebeefea753f20158cbe1c00473d000080bf7c0beb3b431be03d4642e53f490e903e8c5d5d3f6e07d5beb52e753f815e8fbeba8d863d000080bf77f43f3c9594db3d0225e53f5292ae3eb7ce4e3f3827f6be44106e3f72c1babe1ce23e3d000080bfc37de43ba0fcdd3d3203e53f26ee9b3ef2f0503f7767fbbe6ea2723fe0279fbebebc913d000080bf5d3c3c3ce05ed93d6ceae43f085ea73e5d82453faab90bbf21716e3fbebbb8be69dc433d000080bf99a0863c8482d23d01bde43f38f6ae3e4afc363ffd331cbf6040683f7d36d7bea77a803c000080bf5222893c029ed43d74eee43fbc36bb3edc04423f09500abf4ac3663fa0aaddbeedfa333b000080bff9dab33c95afcb3de3a4e43fc146a13e068b353fb87a21bf1f3d653f0476e2be2f2f4dbd000080bfd61d8b3ccc28d63dbc1be53f4882dc3e26764e3f2466cfbef0f4603f5540f4bed51f7ebc000080bfb1f9b83c80bbcc3d6ac6e43f7a56ca3e6b42453f900500bfc7f85f3f609bf6be6ef04fbd000080bf481adc3cd07ec43dd36ce43f5eba7c3efa9d4c3f52450cbf64026f3fd4fbb1be3a44b1bd000080bfeb3ad43cd21dc43d8a5ce43fe829013eb44e353f9cd231bf463d723fb99d97be973805be000080bf7498af3c3cf8c93d7a82e43f4d8d893e9ec9233fd75538bf5ac4683f0d95d4be251af3bc000080bfe97ece3c80f3c23d304ce43fde81073d259c143ff14650bf7b06783f2ec55fbe2da5eebd000080bffbb0de3cae47c13d4e2ae43fcb82543de0017a3f68c355be8328723fd1aeebbd0d469bbe000080bf2f4fe73cf437c13d4225e43ff8095b3e48ce733f1c925ebebe54753f50aa7dbe39b711be000080bfffebdc3c685ac23dbee2e33f46ebc03ee24f6b3feb93ea3d7f18683fd764aebecf017fbe000080bfe9d1d43c26abc23d5801e43fdea1933ed3b4603f84e6c33ee003613f7249acbd2256f0be000080bf22cdd83cd2a8c03d8c2be43f00ab7dbedf08773fdcc1b0bd1c78713f2928613eabe07ebe000080bf5d35cf3c9e08c23d6116e43f74e90c3e95111e3f0344463f5528573fb691ae3e9ba2d7be000080bf56dc383c96e6d63d92b1e43f727d8c3eba372c3fc9e72fbf072c6e3f3a9cbbbec161513c000080bfd733843c0c52d03d1c90e43fc645863ef8cf193f805041bf7c19693f7091d3beefbe4dbc000080bf0b0a833cbf2ccd3d9772e43f44819a3c02968a3e796576bfa915673fe94ad6be1cd5ccbd000080bfec51383cd576d33d0d8ae43fd0b1b93de4adae3eac846fbf387b6c3f1d7ac2bebfa448bd000080bfd6f7e13b18a9d73d0893e43f8542253ed86ebf3e86cf69bf30f6703f4547acbe6f16ea3c000080bf4d11e03b3c4cdb3df4c1e43f4fa2923eca32343f8e6626bf232a713f4542a9be19c9693d000080bf920b4e3b492bde3dc8b8e43ff8b3683e2ef93b3fc3c223bf8b20783f9fdc6fbe8e859a3d000080bf882c523bf6abe03dacfce43f1c2b5f3e05155f3f1d03e1be1cac793fde5558be2d96843d000080bf000000003753e13d52f2e43f000000006d55673f3047dbbe0000803f3c079b382c8d2339000080bf000000005fefde3ddaaee43f000000007180413f249c27bf0000803f7862fa3816881039000080bf000000005a64db3df67fe43f000000009a92c23e3fcb6cbf0000803f1149df370a793737000080bfa46f523b5440da3ded89e43fd8922d3e0263bd3ecdd969bf4838773f25437dbed0e2a13d000080bf000000000ddfe23d1a33e53f00000000bc42753f99bd92be0000803f661c3d38fc091e39000080bfa627ac3cbcd1c73dc462e43f095b2c3e3136003fa95959bf41496b3f5c39c8be478f46bd000080bf0475ca3c2cf1c03d753ae43f9b9183bdfc170e3ffb4e54bf1f8b783faa3c21bea8ec38be000080bf2843d53cf63cbf3d2428e43ff806e7bef0fe633f2423683d0fc75f3fba62e83eda0831be000080bf5d35cf3c9e08c23d6116e43f74e90c3e95111e3f0344463f5525573d45b9463fb7d220bf000080bf8ac7c53c245ebe3d1f2be43fc241b0bdaa427e3fb171a03d485f773f61a3d13da5de71be000080bfa244cb3c6133c03d8a20e43f780283bb6074293fb8e23f3f1ada563fbbccd13e89fbb6be000080bf25e8af3c05fac43dd923e43f4f22a23e2343de3e1fe7573fa41f723ff29c9dbdf38aa1be000080bfdd97b33c18ecc63d5805e43f1047d73e797c313f10d4153fb46c643fd5d64bbe2779cfbe000080bfc138b83c1bc4c73dc0d4e33ff147fb3e5293533f303a8d3edbef583f8c24c2be6647bebe000080bf17458f3c5c5acd3daaf4e33fef67fa3e1cc9453f4247cf3e7a475f3fed0cdbbeb1de72be000080bfeda0923c954cce3d8fade33fa5c5033faf4a583fc821153e1f19593f7c1cf4beb1df6cbe000080bfde8f5b3c01fcd33dc094e33fcbb6ee3ea95a623f0682ea3c83d1613f23a4ecbe4a4cbabd000080bfd216573c7859d33da3e0e33f85dff03e26dd563f0f7e8b3e4e83613fd6f7edbee7e7b6bd000080bfc4ea0f3cc823d83dffcde33fdce9b93e665c6a3fe589313e27536e3f956ebabef6daddbc000080bfa985123ce25bd83dfd84e33f0d53b33e23e46e3f9b72a5bd4a7f6f3f879ab4bec25798bc000080bf05a3923bbaf5da3dd478e33fbaf93c3e6c5c783f990921be1e7c7b3fdd783fbe57183dba000080bf96e9173c7382d63dc826e33f376e9d3e285d603fa3bebdbe23b4703f93ecadbe1644bebc000080bf96e9973be0bcd83df819e33f11ba233e09d3603f1cc7e6be48f67b3ffe1835bedf23953b000080bf000000009e79d93d9014e33f00000000a7c4603fd912f5befcff7f3f70e8aeb9816a20ba000080bf00000000e1d0db3da873e33f000000000ca77b3f56ea3bbefcff7f3fa49b04b9019631ba000080bfa73e903b10f2da3d61c1e33f2932423ecba0793fce42eb3d29557b3f306b42beb7d715bc000080bf12548d3b8819da3dbc03e43f2cda313ec9dc673f6efac53e0b7c7b3fff723fbe10055abb000080bf00000000cbd9db3d99bce33f00000000b0c87e3f1662c73dfcff7f3f9e698038ea1724ba000080bf00000000ee04db3d1effe33f00000000ca976d3f0fa3be3efeff7f3f162146393eeef6b9000080bfcbf70c3cb429d73d960ee43fce09ad3e3a58553f4eeadf3e6f116e3f2500bcbe3e339bbc000080bfa854093c8a0ad53dd63de43f7a1a673e8e3b0e3f4adc4c3feafa6d3fcdaabcbe948ecfbb000080bf444c893ba800d83d7e36e43f9ec2e23df361223f53de433ff96e7b3ff60f40bed8ec5a3c000080bf00000000effed83de831e43f0000000096a9283fc395403fffff7f3fb3e9603980f944b9000080bffc00a43bc2bdd23d8e95e23fbc51033eb004513fd01d10bf62e97c3ff6931ebe402aec39000080bf000000006537d33d1e90e23f000000002713503f3c2215bffcff7f3f97b9dfb9b6121cba000080bf000000009ed3cc3d3ffde13f000000004cfe6a3ff41dcbbefdff7f3f65848cb9c19122ba000080bf764eb33b9a5ccc3d0405e23f7fd3e43db193693f2a97c9be85127e3fc6d0fabdcbb10dbb000080bfcd8fbf3b043fca3d8677e13f6b22e83d79627d3f8221b1bd22597e3f83f6e7bdb306c13b000080bfd124313c4247cb3d5c1de23ff84a5b3e414b663fc0e2c2be02f8773fc2c67bbee9f913bd000080bfa91a3d3cdcc1c83d1a92e13f3242583e90a2773f95a90fbe59dd793f019b5dbe6b87bbbc000080bf00000000270fcb3dc66ee13f0000000036747f3f18b185bdfdff7f3f151b35b889062dba000080bf0000000070d7cb3d8cdbe03f00000000bd367f3f7261a03dfdff7f3f60b94838cbb41fba000080bf8670cc3b55c7ca3d4be4e03f28da0f3eb10f7d3f95c3633dc9507d3f2e7e11be6ec7d43c000080bfdac4493cfc17c83d1504e13ff2b1853eaa17773f948364bc3310773fd77e85befa93cb3c000080bffd69233c962ad13d2aa8e23ff0cd803e305d533ff84701bfa458733fbf289ebe990601bd000080bf1a118c3c8b69c63de5c9e13fe4b2a73efe496c3f84cb4ebe2ca2703fe111aebea06cf0bc000080bfb8af833c029dc93d004de23f5002aa3e23bd603f6caab0be583e6c3fa492c1be933c97bd000080bf6ea7ad3cf0ddc63d6399e23f584fe73e12a5593fe56d8abe3ff45e3f00d4f8bed65e95bd000080bf49d8b73c2a58c33d8922e23fcd97e63e9abf5c3fc1136dbec076623fcc9feebe97a075bc000080bf3a57943ce15fc43dd23de13ff232c53e777f6a3f59c3e5bd3e336c3fb2f9c4befa37d83c000080bf560dc23cb8cebf3da19fe13f5f7f013f47d4563f4a8a4cbe42825c3fe5fe00bf3aef833d000080bf8427743c5b93ce3dd1c7e23fd125c03e0eac553ff665cebed5da643f77b6e1be50e8a4bd000080bfc6e6633cacc6d23d7637e33f21d7db3e2c095e3fcde580beacc4613f03ececbedb77b8bd000080bff547983c32adcd3d0459e33f7f43033f69245a3fa0a2d6bd422f553f6bf805bf440d39be000080bfb535a23c91c1ca3de7fee23f7e9ff83e0819563fda4d82be3c70563f0d4707bf058b0dbe000080bfa7e7dd3b3066cb3d1b49e03fdcaa373e01d67b3fb48020bcd5907b3f19f836beee51493d000080bf4051593c3ab1c73d7a6fe03fce52ac3ef9cf703f4b6330bd71b9703f1ca8aabebe228c3d000080bff28d683cea25c63d62d2df3f3e93cc3ebee5663fbaca27be68796a3fd94dc5beb1dde53d000080bfc68cf03b0e6bca3d22a9df3f1daa563e5730763fc9f934be45327a3fe3694dbe08b48a3d000080bf0000000020becc3d643ce03f000000009cff7f3f120a62bbfeff7f3f329a01b68dc712ba000080bf00000000e1ebcb3de998df3f00000000a2707b3fe76940befeff7f3f565fbcb8b228f6b9000080bf145e023c5a32c73de702df3f7a4b623e75b1693f95c2afbecaa5793feee64ebe5f4eb93d000080bf4794763c0f7ec23d1024df3f345fdd3e18f3593f3a1698be5bce663f0a56cebee50a213e000080bfa27f823c5113bd3df27ade3f3527e73ec3e0453f293be4be856c643f2964c7be30e6693e000080bfaa100f3cfa25c23df163de3f1003653eca36583f3913f9beb783793f9cd944beb725ea3d000080bf8a92103c9eebbb3d5fd3dd3f2263533ed0a2393f8b2c28bf8f6a7a3f7ad52cbef6f6f73d000080bfb490803c249cb63dfbe5dd3fbd07e03eb8ea213fbf9e23bf00f3653f2125aebe37848e3e000080bf00000000d6fdc33d6d59de3f000000001d615c3fd14302bfffff7f3fccf136b933c09ab9000080bf00000000e5b6bd3d96ccdd3f00000000a8843e3f5ffe2abf0000803f32e040b91fe656b9000080bf000000000ccdb53d2461dd3f00000000cdaaff3e6acc5dbf0000803f59ce53b91c26f4b8000080bf3676093c2635b43d1766dd3fbd1a243e0690f93e96bb5bbf64297c3fcb7b0abe1a5ddb3d000080bf2f17713c7501af3d0c78dd3fddd6bc3e3047cd3e48ad56bfcfea6b3fd0078dbe60188c3e000080bf000000001eddc83d1bf5de3f00000000c43e6e3f345abbbeffff7f3feb6a24b99614d1b9000080bf1bd8aa3c917ebb3dec4edf3ff3071b3f60803f3fc8f98abea7ad4b3f7ef60fbf20ae663e000080bf8a59af3c3885b53d6c97de3f83b6223f8f32253f64fbd8becf83453fe8dd0cbfb377a33e000080bf6f30d43cb01dac3de4c3de3ffcf6373f452a0b3f960bdebe186b313f087d1cbf60a7c33e000080bfafe8d63cd87eb23de998df3feb32333fbc3e283f3e128fbe61d1363f474424bfbc3f8f3e000080bff20a043dcfbda73ddb17e03f0c49403f6496173f5d7295be83fb283f36a42abf3157b13e000080bf1c43003d3bfda03d2210df3f0871413fd63ff33e8adbe6be3f4e263f5eac21bf49b4d83e000080bf8643ef3c40e2973d2e56de3fa6a12c3f4a6a7b3eb64732bf6f09303f3d6f0dbff230f13e000080bfb0e8163df8a4933d5c73df3fd2454e3f8a3fc03e5280eabefb0d143f295d2abf2f98f13e000080bf78280a3d1e168a3d8aadde3f4440333fb401093e4b8833bf9ee21e3f8d7d19bf595a013f000080bfa4c7ef3c4b9a7f3d1e3dde3f3fd8013fda02b1bdce835bbf27ef363f069703bf0ff1f23e000080bf1b83ce3cfc348e3dcee0dd3fe517f93eca02dcbb76a75fbf6cc6453fe065edbe5e18de3e000080bf0989b43cfbcf9a3debb1dd3fbf49003fe9c2c53d05275cbffaae4b3fdb6de2be21f5d33e000080bfe45fcb3cbabaa33d8f21de3f18b9293f30f7af3e0d432abfa742383fd17509bf0e4ae13e000080bfae631c3da3c89a3df19de03f1b754d3f0278023f68c29ebe76af183f864b32bf634bcc3e000080bfe292233dda38a23d6713e23f3293453f6266123f495e8ebebac0223fb5fd33bfa41aa33e000080bf0491053db497ad3dcf17e13f0ed7383fb11c243f3a3a85bebb19313f32892cbfecb4843e000080bf92cbff3cba6cb43d91bce13f138c2b3f21be323f96f980be74eb3d3f161a24bf157a493e000080bf61c9d53c3e76b73d3470e03fdea3273f121e393f690261be3875413f7f601fbf9b31503e000080bfbd8dcd3c83debb3d1216e13f6244163f2429493f319b47be2a3e4f3fb09312bf47c3043e000080bffe26143d1a50af3dc095e23faeb6383f63fa243fed9981be6e3e313fb3912cbfdac3833e000080bfe7c2083d7a70b73db4e9e23fb44d2a3fd439353f5dfa72be7b173f3fc32c23bf05b6433e000080bf9eaeee3c44d6ba3db531e23f778a193f23df423f028c7cbe7e5d4c3f1d1e17bfa088f43d000080bf1f701d3d39d4af3d5c96e33fce293b3fa5a9263ff9f950beb03f2e3f3eed2cbf842f913e000080bfcad8103de76eb73dc2bee33fdea6303ff82e343fc3b22cbe4521383f651224bfeb4b893e000080bfe3a9073d9b41bc3dc4e8e33f38f41e3fc092453f088a0cbea0fa473fae3b18bf76b5423e000080bf33dc003d467bbc3d763de33fdd0f183f6a84473f7f324cbe9ccc4d3f7c9815bf12d0e23d000080bf413af53c7272bf3dee86e33f10ec023f6335593f267a0bbe1c925b3f098603bf54eca33c000080bfaa64003d4f0ebf3d4e0be43f0ea8033f6dff583f378a05bebfcc5a3f22edfcbefe72233e000080bf47b6f33c1ae0c23d58abe43fbb990e3f8c0a533f3af2cdbd3db9533fc4240abfb944213e000080bf58eb043db2aabe3d7fa4e43f428e1b3fe37c4a3fd9e192bddb02493f6eb015bf36c1503e000080bf38320f3d2b68ba3d09a6e43fce73233f25f2423f6c72e4bdebe0433f25c91cbf55674b3e000080bf6284f03cd1b1c33d4870e53fe34f113fbdac523fcf81c1bc3fae523f626611bfffdd3abc000080bf1ff5d73c5c15c83db263e53fa8e6163f957b4e3f3043363dfd104d3f493b17bfa409c63d000080bf002bc03ce3b5cb3d78dde53f1f1a0b3f32bb553f90e2b33d0fdf543fffb40cbf1d9aa43d000080bf64cdc83c8f1fca3dc620e63fc839023f16435c3f39c3fb3c3b5e5c3ffaf501bf74b712bd000080bf0aa1033db119c03d5a94e53f6de3063f4a7c573fa1f2f0bd9587593f8a5206bff243533d000080bf5681da3c91eec73d2a8fe63f3f66d53e7d70673f20d2c1bd6595683f4cd8d5be834e3a3c000080bf9a10f33c8797c03d2c1de43f5246bb3efd166a3f568a31be90f86d3f3179bcbefddba03c000080bf0c8ae63cae25c43d507ee43f3092d13e56445a3fc351a6bef297683f24b0d3be8062743d000080bfe8fabe3c26dfcc3d93e3e43f9697033f86f04f3fc2258dbe07d1583f321208bf45bc563c000080bf253d8c3c8aafd63d9c3ce53ff6670a3f149b543fe35109be5fe7553f16730cbf1b81edbc000080bfe143893c85cfd63d236be53f19d6173fc7c04b3f54b3f83ddf514b3f4c661abf2454973d000080bfe278be3c3962cd3d041be53f8fae193f62b94c3f85811b3c09bb493fa6ee17bf05af273e000080bfa454423c38dedd3dea7de53fe33ef43ea3d45f3f14c2b6bd0fd0603f02dff4be82e60b3c000080bf9c69423c2730dd3de358e53f8966c73eb4665a3f48bab1be3bd5693f2ef6cfbed561d93c000080bf446ff13b783be23d40a0e53fc2d9983ed0e4723f6652d3bd0153743fcabe97be6f87133d000080bf94aaed3b7250e23dd2cce53f70b29e3eb2a9723f84a2963de418733fbffa9fbefeddcd3c000080bfe6223e3c7bf9dd3dbdaae53f5c95073f34e0563f6ba2fa3d073f583f52f808bfd711653c000080bf59beae3cfa62cf3d8a89e53f32b6143f0b794d3f2aaa0a3edde5433fe55f18bf22247b3e000080bfbfde7d3c0726d73d49c1e53f369a193fd67e463fe9aa493e46d7433f58cc20bffaab113e000080bfe007673cc781d73d0038e63f2c061a3fd6ac473f814a303e4c09443fb7e21fbf51171d3e000080bf965e9b3c77dcd03d780be63fc1910c3f9cca523fbe99123e12824c3f744311bfd5634c3e000080bfe129e43b9207e23d7312e63fd5c59e3eba70713faa52f53dcfee723f6a20a1be3ae1ac3c000080bf8b3d343c8ddadd3d01f6e53f97410c3f63ac513f0d6a2e3ee8a1533f69ae0fbf87b1223d000080bfcbda263ce0a0dd3d4a5fe63f12f00e3f0d9d503f3c421f3ea3c9513f1e2a12bfa9104b3d000080bfdf3c553ca65ed73dfcc3e63ff933173fa43e4d3f7052bb3dcca04b3f2bf818bf8160cf3d000080bfef56963c1d94d03d4487e63fe10f053f0ad3593f42929c3d6f27593f9b4f06bf2fa9933d000080bf9580983cceaacf3d4cf7e63f749bf73e2d0f603fdc021ebc8511603f739ff7be61327eba000080bf1c959b3cd495cf3d8d5ee73f2796e63e15f2633f43e186bdba8a643f7781e6becdf5933c000080bfe750863c1c06d33d87bce73fa976173f7b8d453f2bec6ebe767a4d3f2d4817bf3696a53d000080bffdc7c23c6fa1cb3d7763e73f0e3fae3e23726e3f430204be7ea5703f1d45aebe672ab73c000080bf7773f13c3540c93d34a5e73f66eebb3e0c256b3fea6116be7e1f6e3fe4e5b8bef16f873d000080bf4d8dd03c10ebcd3daf82e83fdc29aa3e8d366f3f591903be3971713f500fa9bee0081d3d000080bf9432a93cee75d23d662de93f19e4003f996d5c3f765292bd75165d3f8f86ffbefdf5913d000080bf9337c03c73d4d13dbce4e93f318ed33e6ffe683f9fc2f9bc4a62683f5766d1bee945bf3d000080bf0953943c8df0d63db268ea3f36240a3f6397563f83b2a03d5522573f7abb0abfbb1a253c000080bf1b64923c93a5d63d85cee93fe545353fe7e3303fa8e9143e655c333f729136bf6a0cbcbc000080bf5f5f6b3c6cf3df3dce33ea3fdbaa4e3f07fbdf3ed1ceca3eceecfd3ee0df5dbf80835bbd000080bf92af843ca529e23decd7e93f2ef74c3fb7bb6c3e32800d3f78bd943ef3e674bf8c6ca9bc000080bf86c6933c61cde13d2595e93f0225503fb272ac3d1e78133f60d5013ec9c87dbff3770bbd000080bf95a5563c39dbdc3d83b5ea3fc5173c3f8ce3243f09f2593e344e2b3f015a3dbfc5bb92bd000080bf2d7a273c8412e63d9df4ea3f88be5a3f9946df3eb68d903ec2e9fb3e2f8f5abfb87b2ebe000080bf618d333c1a0eeb3dd872ea3f9633543f0487b03ed987e13efb89df3ec21b64bf7e42febd000080bf5422093cdf39f43dceafea3f66534e3f99abd83e8aefd33e5717093f52b951bf041052be000080bf3b8f0a3ccafef93d724eea3f48d33c3f9a67d03e66ec093fdfaa133fc26b4bbfb2ea41be000080bf57b00d3c09a8003e2b02ea3fb7142b3f0ffa013f2f300b3f7790273f50a63fbfd7f0d7bd000080bff148bc3b3fc8023e1217ea3fd24add3e4ae4313feb21133f3eed583f68ee07bfb3ad9b3b000080bfd82ac13b1c27053e809de93f2edfd53e32f3593f6876a23e6d31613f74c7eebe5b08bf3d000080bf9a44bd3b5bb3053ecb18e93f8813dd3ea627663f97d294bdfc7a653f0d6cd6be4a9f143e000080bf4cc2053cb62b043e3f1de93f64641c3f0ebd493f51c29bbd7edb493f15d518bf3c5c173e000080bff019093c3179033e6897e93fbe1d223ff887363fba199a3e20983d3f2ad32bbf7738023d000080bf72c2043cdbdeee3d9b30eb3f1af1553f4707e13e6e96a83e1334053f905153bfe90b60be000080bf790dfa3bd8b6e83dfad6eb3f77f7523f0608f83e7452963e70400d3fe5c34dbfa9d863be000080bfb4e1b03bd1b2ee3dd2feeb3fc632283fc3cc233f701bcc3eafb73d3f882925bf115b3ebe000080bf8c69263c654ce13db0a5eb3f22364a3f8b9d113f7bb26a3edfcf1b3f79db45bf8ec937be000080bf04e3603c3febda3df772eb3ff97e263f65b33c3f6feb3b3e205d423f627023bfaf6401be000080bf804a953c67b4d53d0c23eb3fabff003fcc4c593f20c2233e82bd5c3f0e5601bf1ac910bd000080bfee7cbf3c0875d13d38beea3f937bed3e6a55603f0b52053e465a613f8fe2f1be6af5323d000080bfa251ba3caaa4ce3d068beb3ffe0ef73e8c78533fce15953ed2b45a3f8c6604bfe0d3523d000080bf4c5db23ce37cca3dcf3dec3fac13f53efdcc453f2f7fd53e0596593ffde006bf9c271e3a000080bf0993e23cf792c63d16e4eb3f7d6bd33ea26d563f161bb73e5153663fa24edfbeeae88dbc000080bfd2c9123d95b7c33daef5e73f91faf93e4f405d3f9612f8bdb3485f3fb5fef4bec7c9cf3d000080bf5915213d47e4bb3defe1e63fbf0e123fd46b4c3f969344be173e523f06b10dbfa2d90d3e000080bf471e083dd11ac33df6b1e63f16c4e63efc9d5f3f7a633cbea785643f8182e1be43f5c33d000080bf890a153dc421bb3d1db2e53f9ab1103f3dae4d3ff9a13fbec8fa523fbd360abfb84b2f3e000080bf266d2a3d5b41b33dd0cee53f0035263f622b3a3f401c64be40b5423fa5f31ebfa848423e000080bf04021d3d312bb43df0a7e43fb01c2d3fce84373f8dda2dbe4f503b3fea7020bfb73b893e000080bf80c12e3d6c2aab3da8b0e43fa340383f629e283f56ab60bed6ac313fe0cb2cbfc333803e000080bf1ef72d3d063ba53d407fe33f72f6423fe76b1a3f1aa372be51de253fac5e33bfedf8983e000080bf12f5423db66a973d1789e33fa0a6473fef9d103fc0018abe04d91f3f0f6c3bbfd6648b3e000080bf30ba3c3d823e913d5e43e23f96d74c3f46d0023fc4caa0beca92183f1a763cbff030a43e000080bfc9d3323db6308b3d2bfde03fba9b533fe373dc3e3f8fb9be1a260e3fd4993abfe708cd3e000080bfd983493d1e72733d7951e13f6e834f3f3087c43ebf6fe2be2e730b3f4e7d45bf4060a83e000080bf7f6a3c3d1cee633de257e03f8cf64a3f139b753ecd6d0fbff19c043ffddf3fbf9408d33e000080bf99292d3d440e513d1da4df3fbef5303fbf21a13dd1e337bf5ce8093f55fa37bf6d1ee13e000080bf446a1a3d48533d3d642adf3ff9b90f3fb9017f3cf9ce53bfd359203f5c5029bf6b3fd33e000080bff0a5303db5c01e3da9a1df3f3bba1f3f69b3ed3dcfd645bf88871b3fe8ac31bf9ac4c53e000080bf990f483d3961023dc827e03fca07373fcdc9433eb2292cbf797d0d3fb0603ebf7697c03e000080bf9ab4293da2b8833d00e1df3f6e5e533f8ecd8d3eeda6fbbe74d9043fcef036bf1d2af03e000080bfe59d033d0b962a3daabdde3f21ebec3ebdc10c3ee93260bf47e03e3f024018bf8be9993e000080bf2e1fc93ce0d31c3d7540de3f2b4be43ed173013fac123dbfb2b15b3f6ab8f3be45cc443e000080bf62efc53ca90d0e3d3e55dd3ffa86dc3ee5905a3ff3c195be95d9663ffc1fd7be5bc9cf3d000080bfac1cda3cae484c3dfa65de3f2fe7b93e5733babdfe636dbf8519453fc2ff07bfde04b53e000080bfb039073db0415f3d4ab6de3f04c8063f9ad29ebd39bd58bf81bc263f9d6f1abf48aaeb3e000080bf0b45ba3c3a626d3d3b04de3f7cf2a33e3c1b52bea2c36cbf6329503f21ffe1be7947c23e000080bf27369f3c0186853d6ea7dd3f4fda993e7d3a2cbea15770bf31ef5c3f3904bebe6278af3e000080bf2b34903ce57f923df279dd3ff8819d3e6662b1bdf79272bf711b633fa0faaabeef17a33e000080bf6e18853c3cbe9d3d695ddd3fca19a83eddfe6f3b9bce71bf0454683f1d968ebe58f5a03e000080bf50de473c05508c3dc05edd3ff7194c3e89f117be82f877bf3824733fa83f5bbe69b6693e000080bf0cf74a3c0b67973d8f45dd3f382a483eec31c0bdcfe879bf8539773fa3a81ebe4e44553e000080bff775e03bf949953d272edd3f0003d13d5512abbd91c37dbf85147d3feac2d1bddf1fe23d000080bf67f2cd3bb5c1893da741dd3f85e3fa3d173215beb0517bbf1ccb7b3fa930eabd3c0f0f3e000080bf00000000b760893d6132dd3f000000000dca0cbea1917dbfffff7f3fa9637ab925060b38000080bf000000002b4e953dff21dd3f00000000ba4186bd08737fbf0000803f17cb5eb9fb2f6a37000080bf00000000eeb5a03d2e1fdd3f00000000e542bd3c81ee7fbf0000803f062380b99f83bdb6000080bf5aa5f43bc025a03dff25dd3f99f1ab3d7b05fc3bae167fbfaf2f7e3fdd23aebdcffda93d000080bf88be3b3ca3409f3d2a39dd3f8cc9293edb409fbc4a687cbff12c793f693721bec1ca2a3e000080bfedf99a3c2515a63dc691dd3ff3a1003fad636d3e323b55bfc1cf543f73e5c9befb90c83e000080bfaa505d3c5c3aa63d3d44dd3f5815853e5d59063e8ae874bf0f5c743f151e3dbe69a26f3e000080bf6477013ceeb3aa3d7232dd3f3b12d33d1852473eabb679bf589c7d3f4441ddbdca36aa3d000080bf00000000f5d7ab3dcb2ddd3f00000000e4724d3e6bcb7abf0000803f01485bb922a233b8000080bff8dedf3bee017a3d7f69dd3fe329143e066b68be478d76bf3f4f783fa2ab23beb8ca3b3e000080bf4c555a3cd5777e3d338cdd3f7ada5f3e6a0263beb24673bf598f6c3f042488be9c988c3e000080bf2d60823ca65c613d28e7dd3f9a43733e703369be95bd71bf6b4b623f7a65b4bec85d9d3e000080bf585d073c37e45f3da1abdd3f3eca273e34cb75be34f374bfd278733f896760be68125f3e000080bf3f8b253c749d463d01e1dd3f94425e3e6703173ccbe279bf9fc06f3fa46691be3e80523e000080bf3fc99d3c71e4413d4835de3f318e953e930337bc8cd174bf81115e3fd901d6be4f288a3e000080bf00000000ffcf613dfc8add3f00000000817181befaae77bf0000803f9a3857b9c3f46038000080bf000000003fab4c3d7db1dd3f00000000e34094bc45f57fbf0000803fa6f49ab89981b335000080bf00000000c13e3a3ddf8ddd3f000000006a74093fd4f757bf0000803f710acfb8d6c583b8000080bf16be3e3ca1f5303ddfc1dd3f3a9e9f3ed353083fb97249bfa8876f3f59e3a1be2679203e000080bf000000005cca793d2254dd3f000000005c5a68be965279bfffff7f3f83f17eb95e976d38000080bf3f8b25bc739d463d00e1dd3f94425ebe6703173ccae279bf42cd6f3f8b0e913e248d52be000080bf16be3ebca1f5303ddfc1dd3f849e9fbe1a56083f1f7149bf3f8c6f3f5eb8a13ee6b820be000080bf3fc99dbc71e4413d5035de3fc99195be290337bc00d174bfb2205e3ff3bad53e54348abe000080bf2d6082bca65c613d32e7dd3f2a4373be243b69be24bd71bf7364623f67f3b33e60509dbe000080bf585d07bc37e45f3da1abdd3fe4d127bee6ca75bee6f274bf7d89733f43705f3e9ce75ebe000080bff8dedfbbee017a3d7f69dd3fd83114bec26a68be008d76bf925c783fd79d223e549b3bbe000080bf4c555abcd5777e3d338cdd3f7ada5fbe6a0263beb24673bfefa56c3f9b9c873e69838cbe000080bf27369fbc0186853d6ea7dd3f4fda99be7d3a2cbea15770bf50095d3f958ebd3e0774afbe000080bf0b45babc3a626d3d3b04de3f22f6a3beb31a52be08c36cbf443d503f0eb5e13e6148c2be000080bfa4c7efbc4b9a7f3d1e3dde3fc1d901bf2502b1bdec825bbfe903373fcf70033f4c05f3be000080bf1b83cebcfc348e3dcee0dd3fe317f9bed506ddbb73a75fbfafdd453fbefeec3ea233debe000080bf8543efbc3fe2973d2e56de3f99a22cbfac6b7b3ea84632bfb218303f54400d3f5372f1be000080bf0989b4bcfbcf9a3debb1dd3fd84900bfceb2c53d30275cbf07c44b3f2ffde13e671cd4be000080bfe45fcbbcbabaa33d9621de3f32ba29bf4bf6af3e30422abf5050383f8a3f093fa5a1e1be000080bf6f30d4bcb01dac3de4c3de3ffcf637bf452a0b3f960bdebe5c6f313f09521c3f4821c4be000080bf1c4300bd3bfda03d2c10df3f087141bfd63ff33e8adbe6be7c53263fd485213f1017d9be000080bfb0e816bdf8a4933d5c73df3fd2454ebf8a3fc03e5280eabea215143f60362a3fb3f2f1be000080bf78280abd1e168a3d8aadde3f444033bfb401093e4b8833bfb9f31e3f4357193fbb7201bf000080bff20a04bdcfbda73ddb17e03f0c4940bf6596173f5e7295bec7fa283f8d852a3fcdcfb1be000080bfafe8d6bcd87eb23de998df3feb3233bfbc3e283f3e128fbe01d1363ff325243f7ecc8fbe000080bf61c9d5bc3e76b73d3470e03fdea327bf121e393f690261be6774413f94491f3fa15551be000080bf049105bdb497ad3dd817e13f0ed738bfb11c243f3a3a85be6c1a313f5e6c2c3fc94685be000080bf92cbffbcba6cb43d90bce13f148c2bbf20be323f96f980be43ed3d3fc001243f199b4abe000080bfbd8dcdbc83debb3d1216e13f624416bf2429493f319b47bed73e4f3f7482123f66e105be000080bf560dc2bcb8cebf3da19fe13f5f7f01bf47d4563f4a8a4cbecf855c3f1aef003f094a86bd000080bf9eaeeebc44d6ba3dbe31e23fc48a19bf81df423fa1847cbe6f614c3f0e0a173f43ccf6bd000080bfe7c208bd7a70b73db4e9e23fb44d2abfd439353f5dfa72bec2183f3f9f13233f52f044be000080bf0b2814bd1a50af3dc095e23faeb638bf63fa243fed9981bec93e313ff6732c3f4e5d84be000080bfe29223bdda38a23d6e13e23f329345bf6266123f495e8ebec5c1223faadb333f74aca3be000080bf1e701dbd39d4af3d5c96e33fce293bbfa5a9263ff8f950be6e3b2e3ffccd2c3f6dd891be000080bf1ef72dbd063ba53d407fe33f72f642bfe76b1a3f1aa372bef2dc253ff13a333ffea599be000080bf80c12ebd6c2aab3da8b0e43fa34038bf629e283f56ab60be2eab313f05ac2c3f26e880be000080bf04021dbd312bb43df0a7e43fb01c2dbfce84373f8dda2dbe5e483b3fbf54203f45ea89be000080bfcad810bde76eb73dc2bee33fefa730bffc2d343fd0b12cbe3019383fa9f8233fdbf189be000080bfe3a907bd9b41bc3dcde8e33f38f41ebfc092453f088a0cbe12f3473fc421183fad7344be000080bf38320fbd2b68ba3d11a6e43fce7323bf25f2423f6c72e4bd40d8433f11b31c3f8ffb4cbe000080bf58eb04bdb2aabe3d7fa4e43f428e1bbfe37c4a3fd9e192bd83f2483fd297153faad452be000080bf47b6f3bc1ae0c23d58abe43fbb990ebf8c0a533f3af2cdbdc0ad533f060b0a3f6b9223be000080bfaa6400bd4f0ebf3d4e0be43f0ea803bf6dff583f378a05bea5c25a3f8ab6fc3e7c9925be000080bf33dc00bd467bbc3d763de33fdd0f18bf6a84473f7f324cbe52cf4d3fc283153fbb98e5bd000080bf413af5bc7272bf3df686e33f2feb02bff335593f36790bbede975b3f6f78033f1c43b0bc000080bf6284f0bcd1b1c33d4870e53f385111bfd1ab523ff580c1bcd7af523f2f66113fc66e1e3c000080bf0aa103bdb119c03d6494e53f4fe306bf187c573f2502f1bd5c89593f0c46063fac4b59bd000080bf5681dabc91eec73d2a8fe63f3f66d5be7d70673f20d2c1bdd097683fe6c8d53eaa5b4fbc000080bf64cdc8bc8f1fca3dc620e63f4a3b02bf33425c3f35c2fb3c995e5c3f50fb013f3e540d3d000080bf002bc0bce3b5cb3d78dde53f1f1a0bbf32bb553f90e2b33d2ed3543ff4b70c3f12c7a7bd000080bf1ff5d7bc5c15c83db263e53fa8e616bf957b4e3f3043363dc0034d3f8538173f0af4c9bd000080bf9a10f3bc8797c03d341de43f5246bbbefd166a3f568a31be9aff6d3f1644bc3ecb38b4bc000080bf0c8ae6bcae25c43d507ee43f3092d1be56445a3fc351a6be29a5683f6249d33e66da7dbd000080bfe8fabebc26dfcc3d93e3e43f5f9903bf22f04f3f6d218dbe49e1583f0bf5073ff35f75bc000080bfe278bebc3962cd3d0c1be53f95ad19bf1dba4c3f88801b3c4da6493f67df173f91162abe000080bfe14389bc85cfd63d236be53f19d617bfc7c04b3f54b3f83d43444b3fa66b1a3f90809abd000080bf253d8cbc04afd63d9c3ce53f506a0abf8899543f335209be61ed553fef6d0c3f71dde33c000080bf481adcbcd07ec43dd36ce43f8bcb7cbeee9e4c3ffb410cbf6f2f6f3ffc52b13e1b97ac3d000080bfb1f9b8bc80bbcc3d6ac6e43f005ecabef541453f4c0300bf501a603f2938f63e7c14493d000080bff9dab3bc95afcb3de3a4e43fc146a1be068b353fb87a21bfb766653f3ee4e13ebfc3463d000080bfeb3ad4bcd21dc43d8a5ce43f352101bede4f353fd2d131bf657a723f0193963eb8fa023e000080bfe97ecebc80f3c23d304ce43f716207bd2f9c143ffe4650bfb841783f5cc65c3e615eea3d000080bf7498afbc3cf8c93d7a82e43fbf9189be1bc8233f595638bfbbef683f6ee4d33e0dcfe63c000080bf99a086bc8482d23d01bde43fd0f1aebeeefb363fa6351cbf8753683f37dfd63e54d387bc000080bf522289bc029ed43d74eee43fbc36bbbedc04423f09500abf49d6663f6a5add3e961779bb000080bfd61d8bbccc28d63dbc1be53fa487dcbe66754e3f7163cfbe5d03613f960ff43e117f6c3c000080bffbb0debcae47c13d4e2ae43fe58154bdc9027a3f82b255be1c72723fac53ea3d1f99993e000080bf22cdd8bcd2a8c03d8c2be43fa7aa7d3e8908773f9ae1b0bd1eb7713fbfc761be838e7a3e000080bf5d35cfbc9e08c23d6116e43f01f20cbe5b121e3f0443463fbc27583f6bd5abbe75d5d53e000080bfe9d1d4bc26abc23d5801e43f78a593be54b4603f14e6c33eb27c613f2311b13d7857ee3e000080bfffebdcbc685ac23dc6e2e33fa8eec0be364f6b3f4093ea3dd837683f0fabae3ea7757c3e000080bf2f4fe7bcf437c13d4225e43f580a5bbeb4ce733f5e8a5ebeda80753fc8017d3e612c0e3e000080bf77f43fbc9594db3d0225e53fba8eaebe47cf4e3fe327f6be20166e3f479bba3ec2e640bd000080bf9c6942bc2730dd3de358e53f1667c7be50675a3fb7b6b1bea4d9693fb4ddcf3ebac7ddbc000080bfaa49f0bb1591e13dbc78e53f7dc18cbe6706693f9a859ebe5aeb753fbe0e8c3e219c47bd000080bf7c0bebbb431be03d4642e53fb50990be845e5d3f7806d5bef22f753f8c528f3e1dc986bd000080bfc37de4bba0fcdd3d3203e53f26ee9bbef2f0503f7767fbbe1aa3723fed209f3e42ee91bd000080bf5d3c3cbce05ed93d6ceae43f085ea7be5d82453faab90bbfe4756e3f879cb83eec6a45bd000080bf56dc38bc98e6d63d94b1e43f6b7a8cbe08372c3f14e92fbfb2326e3f1079bb3ed0ec55bc000080bf4d11e0bb3c4cdb3df4c1e43f4fa292beca32343f8e6626bf072b713fdf3ba93ed2066abd000080bfd6f7e1bb18a9d73d0893e43f9c3a25be186fbf3ed5cf69bf11f7703f8642ac3e77f7e9bc000080bfec5138bcd576d33d0d8ae43f35a2b9bd02aeae3ed7846fbff7826c3fd255c23ef14d483d000080bf0b0a83bcbf2ccd3d9772e43f5e429abc07968a3e826576bf2323673fb613d63ea6a3cc3d000080bfd73384bc0c52d03d1c90e43f6e4986bea8cf193f1c5041bf7328693f6551d33ede7b453c000080bf920b4ebb492bde3dc8b8e43ff8b368be2ef93b3fc3c223bf2c1f783fae01703e972c9abd000080bf882c52bbf6abe03dacfce43f1c2b5fbe05155f3f1d03e1bebdab793fed67583e1a4d84bd000080bfa46f52bb5440da3ded89e43ffa992dbe4466bd3eced869bf4034773f408a7d3e79afa1bd000080bf3c165bbb721ae23d9a3ee53ff79938be7b5c6d3fcc1da8be8bcc7b3f3084303e35265abd000080bf0cac63bbf71de33d0376e53f483908be6322763f6c6276be6eb77d3f8e27023e411524bd000080bf78e665bb84a0e33d0a9de53f84c2c4bd6ded7d3f5e12aabdb2c27e3f4679c03d9d9febbc000080bf446ff1bb783be23d40a0e53fc2d998bed0e4723f6652d3bdf452743fd1bb973eaa5f14bd000080bfa45442bc38dedd3dea7de53fe33ef4bea3d45f3f14c2b6bd7ed1603f35d8f43e1b2416bc000080bf94aaedbb7250e23ddacce53fc4ae9ebe4caa723fe4a2963d6d18733fe2f99f3eb3b2d0bc000080bfe6223ebc7bf9dd3dbdaae53f5c9507bf34e0563f6ba2fa3d2b3b583f13fd083fcd6471bc000080bf2bc162bbe292e33d54c8e53f8a5187bd7ab87e3f8b51993d785c7f3fc4b98a3d9c0ba3bc000080bfcca05abb300de33d080ce63f64214abd56627e3f1752ce3d029a7f3f3ac7533d8e3dabbc000080bfe129e4bb9207e23d7312e63ffac59ebef370713f2943f53df2ec723f4827a13ee9e8b0bc000080bfb8a5d5bb309ee13db471e63fc421a6be88e6703f3972c43dccaf713f8b2aa83e1836eabc000080bf03ea4dbbd999e23d1669e63f7be189bd90407f3f9ec1133d854e7f3f48ed8b3d16f7debc000080bf8b3d34bc8ddadd3d01f6e53f97410cbf63ac513f0d6a2e3e499a533f75b50f3f3e5826bd000080bfcbda26bce0a0dd3d4a5fe63f78f10ebf229c503f87411f3e87c0513fc131123fc1f04ebd000080bfe00767bcc781d73d0038e63f2c061abfd6ac473f814a303e05f5433f33e61f3ff7711ebe000080bfbfde7dbc0726d73d49c1e53f369a19bfd67e463fe9aa493e6cbf433fefd2203f7e3613be000080bf59beaebcfa62cf3d9489e53f33b614bf0a794d3f2aaa0a3e69c1433fba5a183f2b1b7dbe000080bf965e9bbc77dcd03d780be63f10940cbf0ec9523f089a123eb6684c3f2246113febd94dbe000080bff2df3cbbcbc3e23d6fe0e63f425215befab77b3fb873dfbd6bf87c3f48ce0e3ec2d182bd000080bf1cb5c2bba451e13d47ebe63f8492c7be07bd6b3f7f801e3c197c6b3f6197c73eecfd31bd000080bf4810aebb2d60e23d8867e73fb3cd0fbf53fc463fb61191be24c2533feb7b053f458756be000080bf22df25bbdb7fe43d6a47e73f11d28abe25734f3f08fa04bfbf58763f4446763e612502be000080bf100107bb6ec3e83d8673e73f9b058ebe5922d13e6e9e5ebf196a733f595d7c3ec60940be000080bf30767bbb2ad0e73d1789e73f5c4219bf433fd73eaa8a2ebf77ce483f92ccf53ee614c9be000080bf00000000d3f5e43dae3fe73f0000000062de4f3fc46b15bffeff7f3fc77e83b95ceeb6b9000080bf000000005738e93d6e6de73f0000000081decc3edf9c6abffaff7f3f7cc64fba226fb5b9000080bf1101073b6ec3e83d8673e73f9c058e3e5a22d13e719e5ebfb55e733fe07e7dbe3e733f3e000080bf0000000028f3ef3d3488e73f00000000e8418b3e5b5976bffaff7f3f5e4e55ba532871b9000080bfe06dde3aa491ef3df48ce73f72c1853e834d8a3eb23c6dbfdf36743fa80a60bee612523e000080bff666543b435bee3d3d9fe73f5b7e143f043a823e1a1b46bffa66463f2cfcedbeef35db3e000080bf30767b3b2ad0e73d1789e73f5c42193f433fd73eaa8a2ebfa9c5483ff21ff6be08d2c83e000080bf22df253bdb7fe43d6a47e73f7fd18a3e4a724f3f85fb04bf8157763f33c376bee65d013e000080bf000000004ce4e23d39d7e63f00000000c4e47c3fce091fbeffff7f3f1e295eb832a2b0b9000080bf59c2da3a1cedf83d13bce73f8545833e0062aa3eb45068bfd1f0743fcbd961be92fd413e000080bf00000000906df93de1b7e73f00000000c949b53e4c6a6fbffbff7f3f8c9e2eba563984b9000080bfc384513b8ae5f63d5ccae73f62d40e3f22cc7e3e65ad4abfcdf64b3fbce8dabe09acda3e000080bf1572a53b71c8e63d8eb1e73f72884d3f7e5ece3eb7e6e0bef30b173f888624bfcf37fa3e000080bf5bd5923b253dec3d37c3e73f25ea4d3f76826a3e7c590cbfc1830f3f4f2319bfc596123f000080bfbb52cf3b7450e23d7aace73f7169313f41ad273ff5369abe3d89383f5bc022bfa6578d3e000080bf9696913b04cef23d94e4e73f76b0443f1ac2213e00ca1ebf674b133fff5218bf7aa80f3f000080bf4436b03d6bba9ebcfb76ea3ffb75233fc53911bfa22305bf29bff3be9c7552bf1cdf9f3e000080bf4624aa3d28b597bcc2c2e93f7a8a6a3f75c106be14d2c1be058102be76be7dbff3f7133d000080bf6c3eae3d896187bc7500ea3f884a193f42a807bf91bc19bf9dafe0beb22558bf056c9d3e000080bffe64ac3dd7a6b1bc7041ea3fd8536e3f94e227bea106a7bee81c29be9b687cbfb56cc63c000080bfad84ae3dbb62c6bc93e3ea3fd7816e3f9bd369be53ae90bee7f86bbeed0479bff83ad73c000080bf1618b23d2e1ab2bcc009eb3f366c1f3f600028bffe22dabe31640bbfcb2841bf9991bb3e000080bfe6ccb63db075a9bcbc06eb3f94c2663dc7aa67bf9cf2d7beac8727bfbe7cb4be6e3f2b3f000080bfa88bb43d6a8995bc8d7cea3f08c2833d44c350bf434013bf3f6f0cbf19a902bfd688293f000080bf349fb33defe27dbc800dea3fe982393d98a942bf0cdb25bf664b12bfec390dbf3f871b3f000080bf70ecb93ddb6d97bc6954ea3f6ec297be3b434dbf20d604bff8391ebfb69d81bec3863e3f000080bfe8ddb83d925c7ebcbceae93f7d7e8cbe622b3ebfbc521cbfeafd16bfe537bebe928d373f000080bf1288b73da14a4dbc357ce93f4b922fbe78c43dbf2a2026bf8fd10dbf9ebcf1be438a2f3f000080bfd02bbe3d6ea381bc00c4e93feef184bd82a833bf8f9c35bf63cc2bbfd7aafdbe91300d3f000080bfc3bbbc3d0bb350bc016be93fbbe1953d07141fbf92b247bf42e613bf6ffa29bf850ef33e000080bf9a60b83db98c1bbc3c12e93f9c925d3ebf7311bf73404bbfe31290bef7a350bf07ad013f000080bfd881b33d7ced19bc7311e93fdcc259bda42039bf8a4a30bf197c9abe9f4f25bf6d8f333f000080bf00e2ae3d1f4ab4bb228de83fe503f53bb2621dbf76e549bf0ffb23bd87c949bf0b341d3f000080bf9291b33de04db7bb1f9fe83f8f3aa73ebe53f0be430352bf687623bd11c15fbfbceaf73e000080bfabafae3ded0dbeba5244e83f878ec23e6942e2bc0eb16cbf0240843e37e574bf5af8093e000080bf3a59aa3d2d0abbba9339e83ff1008fbb92c368bed04b79bf892c353e0f6975bfed52643e000080bf5244a63d8f39cfba4148e83f432a9fbe6e4ab3be233362bf4ef1223e9a8a6fbfb833a13e000080bfe831aa3d8b1bb7bb499de83fc5721ebedf4626bf40933ebf2625fabc5a0040bf6025293f000080bf2238ae3dd0b61abc321ee93fd10258bc577e36bf578033bff53489be0b4e2cbf9077303f000080bfc284b13d3cd94dbc5490e93f99e3593df1523dbfa4c62bbff95706bf96a617bf0a7e1c3f000080bf126aa63d0ce9f03a9e40e83f036256bde6e5b73e848a6ebf773ac03e3b885bbf830ab4be000080bf0309aa3da452ec3a844ae83fbcb29e3e3d6a033f89dd4cbf17b6dd3eec5753bf5e44b9be000080bf53b0a63dc172843b938ce83f3555843e03d8543f62d6fbbe614cee3e92a80dbf04d730bf000080bf19ada33d07cf843b8c82e83f7f821abd13a5493f616c1dbf20abcf3eace20cbfb0d43abf000080bff33aa23d1250613bd577e83f1d8bbabe658a0e3f2b193fbf1f93c33eb84524bf62422abf000080bf3d44a33d7cb8e43a444fe83f21a3cebe0143453e70f964bf2f52a53e567b62bf6727acbe000080bf8412a63d4837c2bbf5bbe83febe2373dfb170cbf09f555bfb9f64a3de29855bf158a0c3f000080bf1173a93dc47a23bc3a24e93fdaa2ad3e31d006bf3f8f47bf1fe229be706059bf725f003f000080bf21cba23d5bd1e6ba336ae83face98dbe0696afbebec465bfd6f8423e0e6a6fbf13da983e000080bfa20da03d9faeeebaff75e83f04a2063f47d299bd42e358bfcd78573eb62174bf61535c3e000080bfe8dba23dc4edd0bb3db5e83fc8892b3fa88921beeeaf39bfe18c173e87dc6dbfe576ad3e000080bf7cf1a53d62f632bc4303e93f914e4f3fcaf2e7bddb5f13bf4075003de2af78bf08e0703e000080bfb708ac3dbb615bbc3388e93fef91043ff62304bf89a42ebfe1a5b5be1df05abf796cc13e000080bf541fa83daf4074bc6955e93f9847633f8c93e4bd9c97e4be24939fbdb11a7ebf33dbbe3d000080bffdc1a03dbe86e03a9c6be83fd9d6b6be753a1a3eb9fd6bbf069a983e2bbd6abf1bd287be000080bfbb7ba03dd97a863b7397e83f19c228bd008e223f6a7c45bf9028983eeeb63abf75c01dbf000080bf444e9f3dbaf59a3bbe9de83f38ec3f3fe2dd9e3ebda315bf7bedea3dbc4a6ebf75a8b1be000080bf34d69e3d71e4013bd671e83f2bfc163ff3a2483ee48e48bf13f23b3e5f2d7abfea91d9bd000080bf2029a23d8bdea93be3c5e83f6d8e833eda554e3f898208bf775dba3e358317bf7e1c38bf000080bfbd53a13d81ccce3b68e9e83ff4fd4a3f0372d03e3c1ae8be8549303e08075dbf3dd2f2be000080bffe0ea53de335af3b13efe83f6fcfce3eb59f593fee02adbeca2ce33e844d01bffc823dbf000080bfbc5ca43d431ceb3bf968e93ffb3c553f40dbe83e4a5ea1be872eb93e5dea60bffeb29fbe000080bfe2aca83db0ad9f3b350ce93f587afe3e0ae0573f148a51be6559043f684ff4be96ed35bf000080bf4a5fa83dd8d7ba3b0f9ae93f6214303f5812313f047b61beba480c3f379731bfa450efbe000080bf2462aa3d9a0a713b7aa9e83fa9dff23e2fb14f3fb0f6aebe7263063f3a8212bf744721bf000080bf98f6ad3d94a0bf3a1970e83ff7d7173ffd83193fce8509bfc62ff73e1d844cbf14acb7be000080bfd4f0ad3d3291523b12fbe83f6418213fe716423f92fa2ebe1658103f91c018bf2a2d12bf000080bf3563b13d503a913a11c5e83f10c53e3f96681e3f0f8c7ebe588a073faa9046bfc4eaafbe000080bf65dfb53d2a3bfdbabfd7e83fa4a15f3f6e5bd13e332a87be7227cd3e9e7e69bf4fd9b1bd000080bf3ae8b23d3546ebbaca6ee83f92043a3f37fa263e63da2abfd1e4a03e1d5771bf99f7e43d000080bf7aa6b73da81abdbb41d5e83fcba6443f8b036bbd543e23bf2d8d053ead0876bf0e6f793e000080bf5c00ba3d9563b2bb7f31e93fb1ad6a3fabdaa93e9b0364befdbcac3e4bf770bfea915bbc000080bf7a8dbd3d1a860fbcc077e93fd5f86c3ffa8da93e3f523bbe11cd8c3e36c96bbf93348dbe000080bf65fcbb3d25e91abcfd2de93f85343d3faa02c7bd45a42abf23ac6fbd57bc7ebf4d36a43d000080bf22c2bf3d8f394fbce57ae93fab7c3e3fc50a4abe456623bfb50e8abe0e7b76bf92ee88bc000080bf8941c03db49341bc95b5e93fa6e9743f1642893e8963e8bd3119493ef5cf61bf1e3fdbbe000080bf62d8c13d66bf6ebc2ff7e93fe8f3733f5c02903eeaa3e7bd143d4f3edd355ebf5b28e8be000080bf4e80c13d8f8a7fbc5cc8e93f60bb333f1ec7a5be065d22bf93cdb4beaa856ebf7493ad3d000080bfe4d6c43da96997bcd330ea3fcee8373fbddab4be516a19bf2b75b1bed5be6dbfdd12073e000080bf85cdc03da4349bbc562cea3faa0341bd691d4bbf985a1bbf64ac29bf1b00dcbe48fe1c3f000080bf32e8c43d8b37b2bc66c1ea3ff901a63c8cdf64bf8223e5bec43635bf7e6ba8bef504203f000080bfb246bd3d957fadbc69e1ea3ff2327abec8ec67bf1906b1be9c6a23bfa8ecf1bdc7b8423f000080bf1d57c33db8cebfbcae9eeb3f2d833bbe2cfe75bfa3a354be154049bf947a853cd62a1e3f000080bffb20cb3d4be7c3bc4e80eb3f3213cb3d945b72bf47e69cbef13c4fbf94fc82be1d46073f000080bf096fcf3d44c4cdbc475aec3f059a183e3f0b79bf3f7235be8abd6dbf39064cbe682ca03e000080bf3fc7c73d7a6ccbbc1c79ec3f03ba02bede157cbfc4c3f2bda7596cbf0a33983d0601c13e000080bfbd36bb3d588cbabc62bfeb3f03418f3c16a475bf3ee58fbe95ab58bfc1c927be75bb013f000080bf81b4bf3d2906c8bc6094ec3f3e05adbb02d47cbfa69a20be443078bf8cbe08bd78b0783e000080bf2b18b53dc713c1bc72c1eb3f56ee0a3f501d43bf1cb7b4be10533fbf104521bf6e42583e000080bfa52eb93d99f0cbbcc590ec3f6527d73e980361bfc2e366be57f167bf0423d7befd234fbd000080bf8e76bc3d6aa2cfbc5168ed3f5bae893e197a76bf8144d9bc8e3a6abfc8ab7cbef97ea3be000080bf0d33b43d9220dcbc7e72ec3f011e5f3fec3fdabe7b1478bebab4f5be2dc957bf782579be000080bfc615b73d5edbdbbc1a4eed3f9876503fd26d12bf9902cabd53590cbffebf33bff69ee8be000080bf23a2b83d8482d2bc6726ee3f34ec353f1fb231bfbb32eb3d4b3704bf6d2120bfccb515bf000080bf76e3bd3dd5b1cabc4436ee3fb3b2cc3d60cf7abf75ca313e699b5bbfa16a31be9eb8f7be000080bf02bcc53d5beeccbc083cee3f5082e8bd65327cbf3bf1033ec55370bff2e1823d7955adbe000080bf23a3c33db439cebc3b71ed3f404257bd8a9a7fbf694295bcdef67ebf8c1a5c3d678093bd000080bfc6f8b03dd579d4bccba1eb3f31ff683f241a9dbee9858ebe4f43a9be0f5f71bfde632abd000080bf33a7cb3d8cd6d1bc855ced3fa9b2c3bdbeaf7ebf5f2208bd5bec7dbf9822bd3d54e4b23d000080bfddb3ce3ddcf5d2bca92eee3fa6f197bd36fb7dbf76e2ce3dcba77abfee175a3d43e148be000080bf4433cf3de318c9bc3e04ef3f7fe26ebd6b9272bf94e5a03eae8d55bf54b301be246709bf000080bfdb34d63d3200d4bcad14ee3f813a7c3e70b277bfc6a2653daef06fbf794b81be7d1a76be000080bf556ad63d7825c9bc44f7ee3f3e42933e9f0967bf9326a43e94c243bf81fcd5be0921fbbe000080bf029ed43ddf8bafbc53ccef3febf69a3e754b35bf184b233ff71306bf82c72ebf646d02bf000080bf4c1bce3d342db1bc57d1ef3fc072b4bdf40045bf78ea213fd4671abf8f9fedbe821126bf000080bf4e9ac63d1539c4bc9cfaee3facda3bbe4ea36dbf47a2a53e46fb4ebf7c1a37bd4b3616bf000080bf1955c63d1cb6adbcafb3ef3f917991be22f43dbfb3711b3fc2f513bf29d9bebe1ed839bf000080bfa1dbcb3da72380bc0b62f03f636203bef2ebe0be119e633fd725b3be329f51bfaefde8be000080bf1ec6c43d55df79bc793bf03fcbf6b4be7ebbe6be34db513f389ba4bebab043bf8b100fbf000080bfb4e8bd3d07d06fbc070af03f10abbabec49fe0be7543523f951f77be90b14ebf43d409bf000080bf616cc13dfeb8fdbb0e84f03fd4e5bcbe026a42be46ec683f76329abb58807abf4c0a53be000080bfbb2bbb3d008bfcbba94ff03f17f2dfbee22951be1e32603f621f483d7d527abf068d50be000080bf107ab63d6058febb8c2bf03fb2d1a73d3e12c1bdbdfe7d3f22a1de3d7f1d7dbf15cad2bd000080bf12c1b83d03426bbce1f1ef3ff8f93c3e1f82c0be9476683f0c710cbed4bb6cbf0dc6b5be000080bf7cb7b93da14ca3bced82ef3f3c56a73e26a422bf541e333f27c4b1bec2ef44bf434d09bf000080bfc2f7be3dc899a6bc3f8fef3f153e86bebed635bf7f3a273fa7610abfd5c1e7be9f8b35bf000080bf0f47b73de5d44ebaee41f03fee4b01bfade2a33d40ff5b3fc1a19b3ef8576abf721c873e000080bfe657b33d50fd83ba3f1ef03f7241c93cea9a763eca62783fed8f993e47786dbfa6fd633e000080bfd0eeb03d82aca73b37c7ef3f9542e53c5396133f470d513f0d77e33e1b2e3dbf0da9013f000080bf5664b43d97e2aa3b46ecef3fdb22f5bea872e13e4a70423fdf24d83ec2a024bf1591233f000080bf12f7b83da661783b062bf03f19ffccbec67ab63e471d583f3088db3e2ec73dbf3e2e043f000080bf527cbc3d7d7816ba9b73f03f22fac3be7939063e901c6a3fd28b7f3edb3b70bfd9b1743e000080bf6407b53de4f30a3c1d93ef3f9a4b44beae114c3fa092123f879d133f3eddc2be2a13393f000080bf8bc6ba3d72fdbb3b4d15f03f3192c0bdb6612c3fe9b93b3fa4afef3e5ec21ebf4226213f000080bfccb7be3d2a38bc3bcd05f03ffb01b63e1744463f66f5053f0f5d083fe7bd20bfdb44113f000080bf03b2b73d43fe193c7c47ef3fc4aea83ee9ed693f264c733e9e3b253f20a3cdbefe51263f000080bf1ccdb13dd7c1413c6075ee3f4af8413ffaff253ff3e1963de282013f36a927bfd1b50f3f000080bfc6f8b03d6213193c8940ef3fbb51803ed2ac503fd1b1053fe0f70e3f7cf80fbfb01a1c3f000080bfafb3c13d4704e3b9a08bf03f467299bd159a8f3e96f9743f6df98c3e1aa06abfad92943e000080bfa2cfc73d172affbb34a0f03fbba2f0bda672d9bdfec47c3f7d982dbdd8297ebfd5f9e4bd000080bff987cd3d1b4902bc889cf03fdd45933ef801403d14e3743f501c463ce2b77fbf7d9b393d000080bfcbdbd13d121780bcc861f03ffb998d3e853ab6be2685643fbde986be14df6bbfa54a92be000080bf69a7c63d45f215ba6a86f03f136ea23ec7d6dd3ebcf4573fbc4fa33eb4ee62bf93b2ab3e000080bf63eeba3db1a8083ca916ef3fd0f23d3f83c2283fb4e3f9bd5dfa193fa5fd12bfe2320e3f000080bfbfeeb43da2621c3c7d3cee3f35d15b3f97a7f03ef34a51becd8afe3e76b32abfbf1f0e3f000080bf253bb63d2026e13b211fee3f9a3d6d3f4b32143ea28ab1becbf5a03e51d94dbfd12b013f000080bfec68bc3d8010c93b00e2ee3fb5a65b3f188aac3e8676c6be216c013f4cf72fbf957f053f000080bf1d90c43dfc36443b55a1ef3f7bc9593f8673dd3e84e698be0c6d063fe76439bf29dde43e000080bf80f3c23daab69b3b08e9ef3fe3e9363fda572e3fcb19243e6eed093fd5852ebf4368fd3e000080bfd0d2d53d12117ebc193af03f0d29503fabe2c8bd23e2123fb4a817bc72dd7cbf967b1fbe000080bfbbb9d83ddc66aabc62a2ef3f3dbf4f3f1f87c9be661fdd3e439655be06b262bfda8bd4be000080bf4e60da3df4dcc2bc39d1ee3fb22e5f3fd396f0beb8b10d3ec0baabbefe4b47bf09cf07bf000080bf884cd93d99f2a1bc3883ef3f9722793f7d726a3ee900b63cdfed613e93d966bf504ebebe000080bf7979da3df702b3bc22e0ee3fb05c713fe349a53ec3c1a9bd3c7f7b3e614e57bfbac9f6be000080bf41bad83d433abcbc0804ee3f026d5d3f4397eb3ec92a4dbe6695a33e250f50bf8f75f9be000080bf40bdd93d1151ccbc4df8ed3f9ae9643f74efdabe06c207bebecfdfbe771f45bf86f4edbe000080bf4833d63d7381cbbc1b2bed3fb344633f5ac6c7be110b7abe6794e7be658056bfc86e9cbe000080bfa2d0d23dcd1fd3bc683eed3f0cca3e3e802c7abf15b2cfbda6cd7abfb03045bedf37643d000080bf2732d33dbea3c6bc5050ec3f309f603fc91ec7be01ca8fbe3796debe5a6364bf328bfbbd000080bf4433cf3d4068bdbc0f7feb3f11d1513fe6cec4be2187d9be025dcabe328a6abfa314883d000080bfadf9d13d107ab6bc1b64ec3f3ea1563f01a0063f3cc212be378ed43eeb5649bf921feabe000080bfb56fce3d7b14aebc9698eb3f6015583f0088ff3e0dcb48be73bbc93edb4653bf6f1dcfbe000080bf8ee6c83d1d739ebc4fe7ea3f188f5d3f3343ea3ed9ea50bec5ddb93e917a5abfb37bbfbe000080bfe318c93daca9acbcd2c5ea3fa014403f9642c4bee3e109bfb348b1be31026cbf67ec313e000080bfb8cdd43d5bcdbabcb939ed3ff8da523fe02f093fa5fa3dbe84f5c93eebc346bf7da5fbbe000080bf7503c53d8def8bbc9f59ea3f58a2693ff205c13eb0d121be0ed7943eddce5ebfed82cbbe000080bfd11ecf3db970a0bcf181ed3f0ecf543ff17d083f5fea20bead7def3e17e052bf660ea4be000080bfa1dbcb3df4c29dbc9ca7ec3f4233573f02bc043f6f5220be379bd63e644c4ebf7f21d6be000080bfff5bc93df56654bc6edaec3f5ef8703f73b5903ee2113dbeed75853e10bd74bf87c209be000080bf2190cb3d71af4cbc5a9ced3fc80e6c3f5f82c33e463180bd75b5c33efa8d6cbf1ad9c7bb000080bfa0c5d23d5b7b9fbcab5cee3f5f30483fcf27173f62724cbefcac0c3fb3e44dbf10aa67be000080bffdc0d53d433c92bc2a52ef3f3aee483f8b090e3f87418dbe3f96063f1ffa54bffbaf35be000080bf36afca3d970252bcb37bee3f46a8603f5d46e93ea7e118be0146f23e968a5fbf84d1ee3d000080bf0cadce3de0f343bc5490ef3fc9c2523ff79edc3e932ebdbe3630063ffbb053bfa978503e000080bf0403c83d3a419bbb6c5aef3f9a6e583f2576b23e7c2ecfbed36bfc3ef6f94cbf5242ae3e000080bffaf2c23d97c5c4bb8d5dee3f18a7523f07f0073fff2a4fbe19c8103fd5c54cbfd89d4d3e000080bf56f5d23dcb6523bcf434f03f952d6e3fa2a2ae3eef9109bee27db93ef95569bfff8a473e000080bf8465cc3d68252dbbfa08f03ffe60633fadc2c83e4f3b75be8c1dea3e4c2b4ebf3229c13e000080bf4a07cb3d8ca19cbaee5ef03f1316433f6761023f1fbacc3e6847c33ec5225abf6d83b73e000080bf99d7d13d8e580bbc857af03ff5fd4e3f3592653e56450b3f5b28443ea27879bf955def3d000080bff339d73d473a83bca3e6ef3fb466733fb5b59c3eeb8145bd3198983e342a72bf45e602be000080bf8c82c03d80996f3a7501ef3f3a07523f8f96a63eb7b7f0be8ba3043f385345bf1eccbd3e000080bf7fc2b93d4a7c6e3b0989ee3f7ffe583fee592f3e7a8f00bf2ed6d23ecf254fbf7898d63e000080bfc72cbb3d261aa4bae23eee3fcaf0413feed3073fd9aac2be1bf1203f4cf23fbfea4a533e000080bfdfdeb53d726da83acb0fee3f8e34563f035aa33ea9dee3be903bee3e43bf57bf28928a3e000080bf7fa5b33d33341e3bddcfed3fad836e3f4ff3ce3dcfa2b2be8636733e386e65bfe1d6bf3e000080bff6d2b43d21938c3b87feed3f451d6c3f946223bdb5cac4be0b872b3e5fe65abf9f3cfb3e000080bf15acb13dd97a863bb64bed3fb3db763f33420dbe6d8367be72dae4bc5de066bf05bcdc3e000080bf3e23b13d9acde33a9353ed3f220e753f6984f83d3c7286be5d92573eef306abf307ab03e000080bf8bc2ae3dd313963ae8a3ec3f818c783ff071c23d542a61beb3041e3e4a3973bf49d18a3e000080bf014eaf3de0136b3bc993ec3f159c783f26e33abeac4a1dbecc29febd73bc6fbf91f7a73e000080bf44faad3d90a24e3b1008ec3f2b37743fdfb590be7672cdbd9f5480be405d6fbf1a6e803e000080bfd9cdac3de23f5d3ab518ec3fe8ff7a3f4f020d3d154b46be8116993d19d579bfede5513e000080bf8926b03d9ca6cf3bd784ec3fa6867d3f9dfdf7ba72010ebe2e5f453decd36ebffab3b63e000080bff06caf3d0d39b63b67f2eb3f7bf57e3f133287bdba237bbd222342bd4f7076bf087b883e000080bf7e55ae3d0f98073ca3c9eb3f70db763f740b793eecd2d6bdd529863e7f066fbfb4e4793e000080bf48a7ae3d49f51d3c9066ec3f36b7753f5893773ed0d111bedab88d3ea92566bf48bfad3e000080bf2f17b13d2d05243c554ced3faec46f3fabc19a3e018a35be2243b33e04f053bf0b5de03e000080bf5bb5ab3dbe335a3cf914ec3f2968753f594a7d3e255110be76fa8e3eaecb69bf9bda973e000080bf68caae3d37fd593ce350ed3febb16d3f051bb63e7693dabd25c8bb3e155655bfacbcd33e000080bffe81b23d8600e03b724ded3fab51793f0e021d3d771365be4ab40c3efb5162bf66b7e43e000080bf616dac3d6edf233cf27deb3f32516f3f2c42a13e47ea27beeb48ad3efd166ebf428d123e000080bff030ad3d34ba033c2444eb3f725f6b3f7ff6a93e0aeb57be9e16ba3eb30a6cbf216a083e000080bff19fae3d2905dd3b1363eb3f68cf773fdb024c3e47321cbea8ec633e3c6276bf82351f3e000080bfb43caf3d420a9e3bf88deb3fff5c7a3f52fa42beebf1aebd256333bed1b278bf2ea6233e000080bf9c34ad3d5fec3d3b7fa3eb3f5f8d673f02abd1be70e3f3bd9ff6c5bef3bd67bf5569343e000080bfbd54ac3dc4b0433b8e5aeb3f6da9603f8c2fecbefab105beb71ae3be127562bf3c75133e000080bfc87dab3d89d25e3a86afeb3faa477d3fcf06be3b20c214be969efb3c31287cbf7df12d3e000080bf5bb2aa3d9626a53a9961eb3f59ad7f3f67a2323d8cc3cb3c38c91f3dda677cbf6c42263e000080bf054dab3d118dee3a9b1deb3f464c703f9e59223e83c99c3e3cf8013e0c0b7cbf5828f73d000080bfae12ac3d96ec583ba01aeb3f9c1a743f959995be9391963d4a3c99bea55872bf0c7ef43d000080bf3865ae3daf07933b4546eb3fad396f3f69129ebeed9235be156f9dbe4c6e73bf5d0e103d000080bf603aad3dbff38b3b3717eb3faf6e6e3ffb25aebe6fe904be9a49a9beb48370bf332bb73d000080bf2cefaa3d29771f3c3a07eb3fd7ba6c3fe0959c3ecb0a68bef1caad3e25956ebfea6f023e000080bf5c57ac3dd190f13b7ff5ea3f6c3f6c3f2e9e963e959b7ebe6a21a93eecba6fbf96e1f13d000080bf6ac1ab3dbb7ec13b3a95ea3f9f4b663f4cf3d33e1e820ebe0097d83e41b767bfa3502c3d000080bf029da93daa9b0b3c448bea3f8aa5683fa18eab3ec3ab7ebe3ad4c03ed54d6abfac86123e000080bff4c3a83d5c3ae63bf818ea3f8ba7583feaebef3e1db681be0f0ef83ef5f25fbf2c7fbd39000080bf309cab3d3543aa3b791eea3f6f97413fe21c233f9c7218bec9c01f3fd94d45bf1bd203be000080bfa1d8aa3d9198a03b34bae93f38ea243f8b2e403f0df215be30ce223f8bd021bf23afe2be000080bf431fac3da7eb893b9e5ee93f2bfa143ffa504e3f40c3debd890d063fa286f2bec14635bf000080bf342ca63d59341d3c87fee93fb42c6c3f8695883eb0bd8ebead2ca63ed55f6dbfe83e3f3e000080bf87c2a73d21e43c3c7783ea3fa5cd713f53435f3ed6737bbe32738a3ee5d070bf44d2513e000080bfbfb7a93d2d78513c802deb3fdb84743fab5a683e29d242beefa1873e351f71bfcb8d533e000080bf382fae3dd5ec813b4b00ea3f48e02c3f7b103c3fe74186bd90a62e3f55ec27bf0459a5be000080bf4c51ae3d4e2b853b9277ea3fd66e523fe879103f3a129c3d5271103f4b4253bff254cf3c000080bfc1acb03d3752363b29d0e93ff456383fd024313f8aa353bdaa1f213fedc32ebf8013bebe000080bfc495b33d1de4753ab8ade93fa47e4d3ffaf7173f64c369bd9ea2093f750243bfe514b9be000080bfe4dab03dd6c82e3b9868ea3fb49e473f20ec1a3f464a243e73ec1f3fa1de44bf60b90abe000080bf207db33d2f16863a3063ea3fc90e4b3f1512173f12f2193ec3ba1b3fcaa441bfa52276be000080bf68eab53dff0582ba5f62ea3fd550583fbd61063fbd62d13dd244083feb9d4ebf57c982be000080bf1adcb63d5776c1ba53b1e93f7eb45f3fbd2ef83e55a11abd1df5e73ed40857bf17e898be000080bfff76b93d92088dbbe9d6e93f7b43673f5d7fdb3e6a0339bc751fd53e740362bfbba85ebe000080bf8d29b83d8e765cbb2e73ea3fc6d6603ff0f6f23e6443703d0946f13ea89756bff7778cbe000080bfb2d4ba3d8e93c2bb8f8bea3f11a8603f437af53e0ffb4dbbc418ec3e8b8558bfaa6389be000080bf5931bc3dc1feebbb3f01ea3fef4c683fbb22d73e1a06a3bb592bcc3e5e625dbfbc409cbe000080bf548dbe3d278323bc2029ea3f811f6f3fc4cab63efd06db3b68bfa43e635d55bf4502e6be000080bf12a5bd3dc5750cbcbf9bea3f4a6b693fe556d03e2b6362bdcf79bb3e2ad65dbfe5a3adbe000080bf5d50bf3da08930bc9da1ea3f63af723f26c69d3e5952a3bd0220763e74755bbf0622e9be000080bf7affbf3d30d54cbcb953ea3fb4ff6f3fca26b23e6bffb7bbfd89943ecd554abfdc210abf000080bfb2bec13d9b7370bc4ca4ea3fc478663f9426dc3ed1118bbd8898ae3ea7274bbf240201bf000080bf6954c03d8ecb38bccbf5ea3fa2dd6e3f79a6a23e90c22cbe7a97603ecfcd5fbf7ec4ddbe000080bfd89fc43dbbd488bc7825eb3f79df5a3f0d8a003f002a05bef634c93e016d4abf9f52f0be000080bf1f49c93d27dd96bc45d5eb3f3331533f1a900b3f33a218bec65ede3e0dc047bf606ce6be000080bf8e93c23dce6d42bcee7aeb3f22eb6b3f1b8e9a3e4b037abe6857513e4f7369bf8d2fb6be000080bfd461c53d9a2757bc4f20ec3f1fd26d3f57fd8c3e2b3a7dbea228563e8f1b71bf69b586be000080bf28b9c33d3a77bbbb6d38ec3f427b393f0651293f9e9346bee465273f52a13fbfd91be1bd000080bff4febf3d75c8cdbb57b0eb3fc01c3d3f5f84223f3fe367bee3e9183fbdb245bfb5965dbe000080bfea58c53d368fc3bb20d1ec3ffa4f3b3fcff12b3f4902eebd8c8a2c3fe5043dbfc96fc3bc000080bf179eb73d7de882bb5ddcec3fc0c1003ff95c5b3f6183e7bd9eaf5c3f52bc01bff74fc4bb000080bf8979b63d707b82bb8542ec3ffd29e13e00e4643f4e81adbd0a54653fad09e3be4fb4f3bc000080bf2502b53d969265bbb6bbeb3fae95013fddc65c3f8a0398bb6f735c3ffe7601bfb06b54bd000080bf03edae3d240ed9bab533ec3fbe2c453f29f61d3f2e3a25be8b6e223ffc5744bfc921c43d000080bfad4bad3db2f2cbbab9c2eb3f1ee8413fd7bf263fe30137bd00f6263f1a6e40bf6be9c83d000080bfb037b13df437a1ba8bc2ec3f9e134c3f8d58103ffa035dbeeb56183f214f4bbf773bfc3d000080bfad68b33d5ea0a4b9b56eed3fdfe1513f3656fc3e5f3995be94530d3f25c150bfbd2f323e000080bff4a8b83debe14bbb508ded3f1210223f7de43e3fdfda54bed0a6443fce6823bf9c564b3d000080bf9d9dac3d0d6f56ba336feb3f976c413f289e213f6102333e88171f3f8c7246bfed76e83d000080bf4819b13d520c10bb0f62eb3fe8530c3fba324b3fd8f9863e05a0513f20d112bfc195c53c000080bf4183ad3d0f7ba1387027eb3f10952a3fce021c3ff8fbdb3eb397213fc08b44bf545ce13d000080bfe3a4b03d1399393a84d5ea3f40222e3f01641b3fb866d23ed3132c3f94793dbf1dbe9ebc000080bfad8ab03da8a78fba6729eb3fc7e9073f6322383f076be53e7e584c3f271d1abf2f9aa83c000080bf46b6b33d121354badee7ea3faa5c2f3f835e263f8896a83eeb61373fdae42ebf254511be000080bfd731ae3d5e63173beacfea3f94fc4f3fa94ed33eaadad23e0ce7d93ec10f67bf84f3843d000080bfa62aad3d0038763b03d2ea3f0c8c753f1dfb3d3e989b5a3edb6a283e8fdc7abffbb6e63d000080bffa26ad3d6344a23b60e5ea3f77307e3fdb627a3de371d0bd353b893df2077fbfd1ca623d000080bf73f3ad3da7b1bd3b7f16eb3f5f35783f24e28f3d4c2b70be3214b63d885b7ebf29298f3d000080bffdbbbe3d52eebebcafecee3f5f72b5bd326f6abfbd9ec83ee11b3abf5c7e56be5a6727bf000080bf9963b93d3d9cc0bc97e6ee3fdbef073f9a4a41bfadeec43e9844f3be302224bfe2461abf000080bf4697b73dc2a0ccbc0af5ee3f9891773f7f3368be5fc3ec3daff418be4f955fbfd15aedbe000080bfeaafb73d562aa8bce99cef3f53776e3ffc7256be1342983e46bfbdbda4606dbfdebeb9be000080bfc956b73d7458e1bc0c1fef3f827b7f3f920379bda6c2973c8a324dbde28e6ebf25f9b7be000080bf560cb73d50a5e6bcb422ee3f961c7c3fba0130be3641c9bc080128bed9f95fbf9d4be9be000080bfc8b4b63d48136fbcb20bf03f8679663f5f428cbd4e17dc3e9398a33cbae17abfc6b54abe000080bf40a3b43dfaec00bce63df03f7054613fb9f2e53d9e1aec3eefc5143e4f1c7dbf0bd415bd000080bf545cb53d9203f6bc2738ed3f246a7b3f312103be1a890dbec46a2cbe45fa6cbf806eadbe000080bfb070b23d1f31fabcb249ec3fee427a3fbeb19dbd42aa48be3783efbd7af778bfac1d4ebe000080bf4294af3d5d4ff4bc1365eb3f555f7b3f2383f3bc8d6a3fbec2b04cbd77467ebf3e21d6bd000080bf075ead3df859e5bc6892ea3f92227c3fb805c03bb52931be77b763bb63a17fbf628e5bbd000080bf643fab3da6cccdbcc6dce93fb0527b3fb241383d03523dbed87bfc3c11157fbfc658a1bd000080bf62f8a83d473eafbc3452e93f62227a3fa2919f3de0d14abe59cb6a3db7167ebfb47bdcbd000080bf0bb5a63d44528bbc2ce9e83f94ff773f66f3e23d5a4363bedfebc83d862d7ebf184d8abd000080bf1023a43d6ff346bca5a1e83f4007733f2362203ed4818bbe1f232b3e295e7cbfe6e47f3c000080bf5dbfa03d2633debbe466e83f32c06e3f98b9273e85a1a4be4d87643e624676bf8f06213e000080bf4e0b9e3d28a3cabaa83ee83f6c66703f5322de3daf01a7bee5b92f3e805a78bffb912f3e000080bfda8a9d3da8c7363b8c46e83f28e5753ff1ffeb3bdf618ebeea72d53cab627fbfa066833d000080bf7a8a9c3de73a8d3bdbe5e73f73ca7a3fec71bebdd22136be9f3f89bd91a47cbf905f163e000080bf39b69e3d5932c73ba67ee83fff10763ffc819ebdb99187be821bb9bd32c67ebf3a6518bd000080bf2711a13d93fc083c88e0e83ff622763f0f0230bda8058bbe631131bde7c17fbffadca43b000080bf062aa33d388a2c3c7a5de93f3cf5783fd202423d1a8b69bea233aa3dae377cbfcd58193e000080bf8578a43d5c1f563c23d9e93f1853793f7b92c13d963253be1436173ee54974bfcf1d853e000080bfd844a63d2e01783c5472ea3fc850783f0e73fd3d465a56be6e4d373e5c2e72bf72568a3e000080bfefada83dc078863cc845eb3f2d96793f5401183e5fa129bea18c403ef7a672bfd2bc833e000080bfcd90aa3d651d8e3cff41ec3fcc82793f32da443e6c62eabd6a6e603eee516cbff6bfa13e000080bf71e5ac3dbaf6853cd367ed3fbe3d743f5f3e973e5ca34cbdb81f943e9d755dbfffd2d13e000080bf8676ae3d8cf7633cd270ee3f8840693f30e6cd3ef651b83d4181a93e382858bf46add73e000080bf38d1ae3d08e3273c063fef3f7c855b3f823fe03e38328a3e74afa73e138c5ebf5184bd3e000080bfb8adad3dfd2a403c5473ef3f5fd57a3fc49a453e4483553d571d2c3eaac06fbf6e859d3e000080bf0e85af3dbf29ac3bd4d5ef3faebc5a3f488ab93e479ebe3e13868c3e765b6cbf999d893e000080bfe3ddb13d92088dba882ef03f5cfd5e3f01d6853e2cebd43e63ac6b3ecb1377bf0a2dff3d000080bf7b82c43da9c0c9bbce89ed3ff98e3d3fb2982b3f5f4349bdd5042c3faf9d3cbfb9c8993d000080bf28d2bd3d65fcfbbbdf17eb3fe87e583fb767023f2dfa22bed87dea3e968758bfde0f8cbe000080bf732ab93d65c39abb651ceb3fb2533b3f9b7b2e3f91fa17bbcd89283f0b2b35bf0e4983be000080bf8122b63d73301bbbe604eb3f352e393f03ce273fbb325e3e90b0303f210032bfda3b4dbe000080bf2dd0ee3c6518d7bd280af23f475a9d3e9c7773bfaca105bdff876ebf626a96be51745abe000080bfbb60f03cd8f3d5bd4d0ff43fafb99f3e99ca71bf05e2d23df94766bff631a8be186f93be000080bf56802f3dfc89cabd7ae2f33f9babec3e7fb761bf1773c13da40558bf42b2f0be4a7784be000080bf1684723cdc2cdebdb62df23f76c21f3eb5c97cbf5b03c8bc040676bf9e8a15beda5b70be000080bf00000000499de0bdf33cf23f0000000095f27fbf2ac2a5bc67da78bfe4929b3b9b3870be000080bf00000000fe27dfbd183ef43f000000002a547ebfe4a1e93df32f71bfa2a31cbddf83aabe000080bf1a34743c8cd7dcbd6e30f43f4f72203e9d3f7bbf8073e23d86bf6ebfe4493cbeb9fd9ebe000080bf577a2d3d999ac4bd0305f63fe87eec3ea4225bbfecc26d3e8ba04bbf43ff03bf6e14a3be000080bf0b9cec3c3eeacfbde430f63f76069f3e9d236bbfe28b7a3ed6005abf8938c4be7123b7be000080bf17b6e63cd3bfc4bdc746f83ff1bd9a3ec55e5ebf7a02c93e01fa48bfe5bcebbe0925d4be000080bf68b0293d05c3b9bd9819f83f2ce3e73ed34c4fbf9dfebe3ebfff3abf29b113bf5821bbbe000080bfd5cb6f3cf5a2d6bd2f4ef63faa611e3e7a7e74bf4679813e574463bf9d977cbe5cfac6be000080bf00000000b6d9d8bd2959f63f00000000a97777bffb15833e860469bf3f23d9bd8ef5ccbe000080bf000000005c5acdbdb669f83f00000000047069bfa02bd23ed19558bf331860be36e7f8be000080bfdc63693c3e3ccbbd3161f83fa35a183edcd966bf8cc7cf3ee7c753bffc39adbe76a2e5be000080bfb169253d2ff7a9bdaef5f93fa42fdf3e11e13cbf23f0033f681127bfa74927bf9d5bc4be000080bf94dce13c4c38b4bdd428fa3f2b82923ee02c4abf07e80a3f7fae32bff54c0fbf77aee4be000080bfe4a2da3c92959fbdd7c3fb3fb3cd853e36182ebf3b5c2f3f0f751abf7f452bbf6a37debe000080bfbe171f3d38f496bdb685fb3f1107d03e6c6823bf7460273f08a40fbf5c313dbff0e2bebe000080bf5f0c653c9450babdc443fa3f239a0d3e460f51bf46720f3f284f3ebf2a39ebbe7ce2f8be000080bf00000000db51bcbd344bfa3f000000000e0853bf72eb103f42b448bfb7ebb3befaff02bf000080bf00000000bb98a6bdffecfb3f00000000f30a35bff4fe343fd8462abf072707bffd2f07bf000080bf3b8b5e3c39d3a4bd3fe4fb3ff822ff3df36f33bfe6c7333f0d2023bf955b19bf2541f8be000080bf232d153d3e7782bd31b6fc3f061fbb3e1a6801bf4117483f4639eabe162e54bffbeda4be000080bf3998cd3cfc1788bd9b04fd3f44846f3e690809bfa7c74f3f94e9f7be17bd49bf03a7c2be000080bfed9d513cfab78bbde030fd3f5e92e73d73850dbf375a533fa6c203bf864b3ebf50c0dabe000080bf0000000085078dbd793efd3f00000000d0310fbfb134543faeac0ebf953130bfb0c9edbe000080bf5fb4473cf65ca6bb9c36ff3f77a91d3e4c01c03c55e07c3f42c58d3d565d7fbf1402533c000080bf000000001c4295bb7654ff3f000000000e82bc3ca5ee7f3ff7d8a03d44247fbfffecbb3c000080bf6d57e83cef57c13d01bce33f87cbdd3ea789663f66e217bd60bb653f199bdebee3119abd000080bfcf2fca3c9487c53d8f56e33f74a7043f607c593fff31cabdc514573f3ef806bfec2f02be000080bf3542bf3cb85ac73d6398e33f680f053f415a5a3fb901463d9de0543f70f9fbbee6da83be000080bf3788d63c5abac23d5b07e33f18da033f735f563f226b3bbe238e583f2ff207bfcf7149bd000080bfffcfe13c3062bf3ddaa2e23f80660a3fb5674f3f100468be39f5553fc6470cbfd39b0e3d000080bf46b49d3c0072c23d1cade03f0b43f33ece625f3fd4f2e7bd452a613f633aefbe0907b83d000080bfb169a53c21b7bf3d420ce03fe8e10d3fc614503f8aa237be5d0b553f357109bf87db0d3e000080bfce88523c26f9d13dbb1ce43fe4a3db3e4f3f393f796a0a3f69d3613f1fccedbe5c5ca0bd000080bf39b7893c1007c93d2d41e43fc583733e28e2853ec5796f3f3164653f2c8bdcbe28ecdbbd000080bff3388c3c2d91cb3d7026e43f0533d53e20de173f6d60303f2020653f3826cdbe18a348be000080bf6ddd4d3cffaecf3d0b43e43f049e8a3e1093d43e32575e3fc2aa5f3f8233f8be655b26bd000080bf5c90ad3ce42ec23d5133e43fd749413ec0a1323e5866773ff8e7773f3584053ef6c859be000080bf77fbac3c3fccbe3dc236e43f83c2413df6ff2e3ce5b27f3f7f92583f7f3708bfeecd0cbd000080bf88f8873c07d2c53d3643e43f98c3793d6303d6bca56f7f3f83ce5b3fd52402bf00b986bd000080bf77fbac3c3fccbe3dc236e43f83c2413df6ff2e3ce5b27f3f48994a3f08161c3f883a34bd000080bf679c863c0f48c23dec38e43f8e814cbc30e2e4bd4b607e3f02ab533f815b0fbf507057bd000080bff646ad3c191ebb3d3434e43fdd42ebbc2f0068baf2e47f3fb57e4d3f5b8f18bf729ab83c000080bfb114493cf94ecc3d864de43f3c23c93dc111873dc9337e3f39a05d3f1cd9febe854f57bd000080bf2f3b443c0164c83d284ae43f0d01323d4dd183bd103a7f3f20af593f897f05bfbddb90bd000080bf98defe3bf0facc3dd65ae43fa891953d5081923da6a87e3fa53b6c3f8b34c4bef79d24bd000080bf16a5043cc764d13ddf52e43ff172c63d16fb4b3ed9a3793f93086d3f7740c1be132c74bc000080bffbca833b3336d43d6150e43fa681223d88818e3e9eac753f3c4c7b3f75ca42bee3046f3c000080bf68ce7a3bc894cf3dd05de43f9ec2d03c217a253e128d7c3fc48d7a3fe1ec51bef1f8073c000080bf00000000d462d03de25be43f00000000ae513e3e228a7b3f0000803fd4553f3779c410b6000080bf00000000ca1ad53d014de43f000000008c6e993e203c743f0000803f5bd6e238a1800eb8000080bffbca83bb3336d43d6150e43fa68122bd88818e3e9eac753fcd467b3f0b38433ed10f71bc000080bf444c89bba800d83d7e36e43f9ec2e2bdf361223f53de433f96677b3f6ea1403edbba62bc000080bf11548dbb8719da3dbc03e43f2bda31bec8dc673f6dfac53e1d777b3f6ade3f3e38e6183b000080bfa73e90bb10f2da3d61c1e33f293242becba0793fce42eb3d08547b3f5f91423e111f013c000080bfa85409bc8a0ad53dd63de43f021367becd3b0e3fa5dc4c3f65ec6d3f0df5bc3ed47abf3b000080bfcbf70cbcb429d73d960ee43f3506adbecc58553fe6eadf3e0a086e3f0b36bc3e7655933c000080bfc4ea0fbcc823d83dffcde33fdce9b9be665c6a3fe589313e1b506e3f5d89ba3e8037d43c000080bf05a392bbbaf5da3dd478e33f21f23cbec65c783fd40921bee67e7b3f873e3f3e89af06ba000080bf96e997bbe0bcd83df819e33fa8ba23bed8d3603fdec3e6befbfc7b3f557a343eebfbbcbb000080bfa98512bce25bd83dfd84e33f0d53b3be23e46e3f9b72a5bded826f3f628fb43efd518e3c000080bf96e917bc7382d63dc826e33f376e9dbe285d603fa3bebdbed7c0703ff8b0ad3e7523b43c000080bffc00a4bbc2bdd23d8e95e23fbc5103beb004513fd01d10bf85f17c3f9fc11d3edd47d7ba000080bffd6923bc962ad13d2aa8e23f41ca80be995d533f384801bff969733fcacd9d3e1624f83c000080bfd12431bc4247cb3d5c1de23ff84a5bbe414b663fc0e2c2be3d03783f5f457b3eadcd0e3d000080bf764eb3bb9a5ccc3d0405e23f7fd3e4bdb193693f2a97c9be0f177e3f19b2f93d5e77653a000080bfce8fbfbb043fca3d8677e13f6c22e8bd7a627d3f8221b1bd6c597e3fddbae73de7e0ebbb000080bfa91a3dbcdcc1c83d1a92e13f324258be90a2773f95a90fbebae1793f596e5d3e6b15b13c000080bfdac449bcfc17c83d1504e13ff2b185beaa17773f948364bc890e773fa37b853ef38ad5bc000080bf8670ccbb55c7ca3d4be4e03f28da0fbeb10f7d3f95c3633df74d7d3f168f113e7810dfbc000080bf1a118cbc8b69c63de5c9e13f69b6a7be66496c3fffca4ebe2fa9703f67f8ad3e3994e63c000080bf3a5794bce15fc43dd23de13f7c2fc5be30806a3f0dc4e5bd75356c3fcee3c43ea340e2bc000080bf49d8b7bc2a58c33d8922e23ff09ae6bed6be5c3fee126dbe957e623f7086ee3e4a22643c000080bf6ea7adbcf0ddc63d6399e23f584fe7be12a5593fe56d8abe90015f3ffeb7f83e8f4c933d000080bfb8af83bc029dc93d004de23f5002aabe23bd603f6caab0be624e6c3f3162c13eefd3943d000080bf842774bc5b93ce3dd1c7e23fd125c0be0eac553ff665cebe9bef643f467ee13e407ca23d000080bfb535a2bc91c1ca3de7fee23f7e9ff8be0819563fda4d82be5081563f0a3d073f1a850c3e000080bff54798bc32adcd3d0459e33f7f4303bf69245a3fa0a2d6bd303f553fcff8053f39e2373e000080bfc6e663bcacc6d23d7637e33f21d7dbbe2c095e3fcde580be36d5613fb4ccec3ec2e6b53d000080bfde8f5bbc01fcd33dc094e33fcbb6eebea95a623f0682ea3cfcd6613f33afec3eedbdb73d000080bfeda092bc954cce3d8fade33f32c403bf8a4b583f6022153eed23593f0d40f43ecead6b3e000080bf17458fbc5c5acd3daaf4e33fef67fabe1cc9453f4247cf3e5f485f3ff365db3e3d8f713e000080bfd21657bc7859d33da3e0e33f85dff0be26dd563f0f7e8b3e0e7f613faa25ee3e7178b43d000080bfce8852bc28f9d13dbd1ce43fe4a3dbbe503f393f7a6a0a3f9ec6613f1d0fee3e7aa49e3d000080bff3388cbc2d91cb3d7026e43f0533d5be20de173f6d60303fea10653f87aacd3e779a473e000080bf39b789bc1007c93d2d41e43fd99273bea9e1853ee2786f3f924e653faaecdc3ec671db3d000080bf6ddd4dbcffaecf3d0b43e43f049e8abe1093d43e32575e3f149c5f3f636bf83e813c253d000080bfc138b8bca0c4c73dc0d4e33ff147fbbe5293533f303a8d3e660e593f87a2c23ea13abd3e000080bf3542bfbcb85ac73d6398e33f471005bfb6595a3f0703463d7af2543fc81bfc3e6125833e000080bfcf2fcabc9487c53d8f56e33f59a804bfcf7b593f5c33cabd7120573fd2f7063fdb00013e000080bf6d57e8bcef57c13d01bce33fb8ceddbee288663fe7e117bd1ec4653f079ede3e6881963d000080bf3788d6bc5abac23d5b07e33f18da03bf735f563f226b3bbe2598583fc4e8073fd8fd443d000080bfffcfe1bc3062bf3ddaa2e23f80660abfb5674f3f100468be33fc553f85380c3f080f13bd000080bfdd97b3bc18ecc63d5805e43f9242d7be167e313fc2d3153f858e643f35ff4d3e075bce3e000080bf25e8afbc05fac43dd923e43f7e26a2be5c47de3e3de5573f8d31723f8e1ca53d13a7a03e000080bfa244cbbc6133c03d8a20e43f2d02853b5e74293fb4e23f3f2722583f03d4cebe3d4fb43e000080bf8ac7c5bc245ebe3d282be43f9991b03d1e427e3f5d51a03dd86f773f35c9d1bdd5c6703e000080bf5c90adbce42ec23d5133e43f1a5341becea2323ed665773ffa16783fd20201be5c27593e000080bf2843d5bcf63cbf3d2428e43f5afae63e4202643ff001683d50ed5f3f7a60e8be3c082e3e000080bf0475cabc2cf1c03d753ae43f9b91833dfc170e3ffb4e54bfc7c0783f4a3f1e3e08fd363e000080bf5d35cfbc9e08c23d6116e43f01f20cbe5b121e3f0443463f1dae6e3d278746bf66ef203f000080bfa627acbcbcd1c73dc462e43fac622cbe0736003f605959bf77726b3fc186c73ea29f423d000080bfdc66aabc59c0c43dae4ee43f4402b83dcc6a4b3e6fd779bf4a3b773f9475633e7f57093e000080bf6234abbce048c03d224fe43ff8d1a03ec5f1a4bde22a72bfad21593f8365f13e8e48773e000080bf3a3c84bc1a30c83d266fe43f0cb3543e748355bd8a0f7abfc87a5e3f0fb5ef3eafa7233e000080bf1bf93cbc2a59ce3d6783e43f5822ec3d9bc2f8bc802c7ebf7a58643fabd4e23e9c63b83d000080bf679c86bc1048c23dc078e43fa3f58c3eb2410abeebaa73bfded1523fd3400b3f12e7243e000080bf2e3b44bc0264c83d2a8de43fed42433ef46103bea12579bf6055583fc2a4063f2916c53d000080bf98defebb1329cd3df295e43ffe41bb3db7b90cbe067d7cbf39ad6a3ffe04cc3eb258f13c000080bfe8dcedbbb6bcd23dce8ae43fac83233c92419cbcd2f07fbf676b6e3f8e75ba3e9eef193b000080bff646adbc191ebb3de259e43f42e3c73e77aa1abebb7d68bfe5f4433fcbf1193f788a6a3e000080bfee9664bbb664d53d0e84e43f046269bd534106bd43727fbf228e773f72a77c3e63af81bd000080bf68ce7abb624ed03dc891e43fc9044cbb56da22be96bd7cbf6913773f8e0c843eeda236bd000080bf00000000e57cd13d728ce43f130702b8161b38be15d47bbf0000803f182092b8c9889db7000080bf00000000bb7dd63d637ce43f0000000010423abd34bc7fbf0000803f91be8637ba4644b5000080bfee96643bb664d53d0684e43f0462693d534106bd43727fbf3f91773fe1767cbea0ad813d000080bfe8dced3bb6bcd23dce8ae43fa58323bc90829cbcc8f07fbf646b6e3fa475babee83119bb000080bf1bf93c3c2a59ce3d6783e43f4a22ecbd7601f9bc722c7ebf1e53643ffaeae2bee354b8bd000080bf3a3c843c1a30c83d266fe43f44ab54bece8355bdf30f7abf1f765e3f9cc8efbe669a23be000080bf98defe3b9929cd3df295e43fe861bbbd8ab10cbef07c7cbf6aad6a3f6903ccbef0edf1bc000080bf2e3b443c0264c83d2a8de43f1f4343bef75903bee22579bf6f53583fd3a706bfa718c5bd000080bf679c863c1048c23dc078e43fcaf58cbeb8390abe2eab73bf08d0523f88430bbf0ee824be000080bf6134ab3ce048c03d224fe43f12d2a0be26e2a4bd0a2b72bf851a593fee81f1be243e77be000080bff646ad3c191ebb3de259e43f0be2c7beaba11abe5c7e68bfb4f4433fc4f119bf508d6abe000080bfdc66aa3cdfc0c43dae4ee43ffc01b8bd5a724b3e0dd779bfa91f773f822465bed6a609be000080bf5870bf3c6e86bb3d1a36e43fd27f77bf4a63dcbdaa5b6d3e786012be29c57a3f6ad710be000080bf77fbac3c3fccbe3dc236e43f83c2413df6ff2e3ce5b27f3f59c911bef0637d3f97ca7bbb000080bfbf28c13c0246b73d643ee43fa0dd77bfb3037fbe07c2ba3c120880bec08a763f9ebfccbd0000803f6134ab3ce048c03d224fe43f12d2a0be26e2a4bd0a2b72bf72b2de3d449e7c3f8cf1f5bd000080bfbf28c13c0246b73d643ee43fa0dd77bfb3037fbe07c2ba3c9b3d7ebe7244723f62c253be000080bf68ce7a3b624ed03dc891e43fc9044c3b56da22be96bd7cbf3916773f17f883beb188363d000080bf38d3443dd4a29e3ddfc6e43fb2923f3f2a1c1c3fe5a585be2547293f258a37bf9b11623e000080bffe9c423d9a0fa83d8cf3e53f6354333f45be293fe01d87be050e363fb3f12dbf97d8383e000080bfc45a3c3d3599b13d2b12e73fd8e0233f41bf3b3ff84b6abe6372443f11e91fbf903b143e000080bf2119323dae27ba3d4927e83f1212123fe9c84e3f2ec217be0937523f2aff0ebf16aeef3d000080bfe4e0523dac79ae3de562e83fc3e4253f1a273d3f3c2b3dbedce4423f18aa22bf2938043e000080bfae71763dcc819e3dcfcee83f32c5403fab10223f1bc337bee500283fe50d3ebf44ff093e000080bf54258a3dbe548c3d1c80e93f769f5f3fb09bf23ebb43e4bd27c8f83e54cd5cbf67bd103e000080bf54a3d73c713fc03dbd38ef3f3c837c3d928a323faac836bf2fb47e3fae73ccbd032d3ebc000080bf85b3db3c0987be3dc91cef3f5382cfbc1e1b543f1d320fbfeee07f3fcd30fc3c1f17b039000080bff8a5fe3c2b2ac23de860ef3f14d2863d1755353f0eeb33bf56497e3f5e7ae8bd7307afbc000080bf3eb2b93c4953bd3d01ffee3f51c2bf3d267c3d3ff9752abff8af7d3f97fe08bebc7619bc000080bf61fade3ccadfbd3df800ef3fc02928be9558723f7af18dbe72457c3f2b1b2e3e59514ebb000080bf2d5c163ded82c13dcf68ef3fab03e73d4447403fd48626bf51ed7a3f7eff43befa0751bd000080bffcdea63c80fbba3d94c2ee3f8753f93d13d74e3f379613bfb0387b3f248a3dbebcbd55bd000080bf95869a3c9561bc3dafd1ee3f50c36e3ec1ee403f46521dbf8306733f7f74a0be32bdc5bc000080bf3776893c994dc03d9d02ef3fb7a6af3eb286333f6cfa1fbfff42633f4840ebbe3186e7bc000080bfc3eb7a3cd613bd3dc095ee3f2d62233f7236373fee4191bee7bc3c3f8e9d2cbf6ebe2dbd000080bf88a1553cb4ccc23dd4b5ee3f0fd9473f46fe153f4eab5ebe20cb1a3fdeca4bbf2958d33c000080bfae0f6b3ccf4ec63d1a35ef3f1c00053f7e781d3f65d217bfd794463f686d21bf7df2d03c000080bfb4fc403cf9f3cd3dec48ef3f53102c3ffcf30f3f52a3f6be66352d3f350f3bbf9584ba3d000080bffae8543c15f0d23db4c1ef3f6a9b013fc1e7243f8fc712bf5259513f6dd511bfba1ba83d000080bf0a9a163c8b15d53d984cef3fad3d2f3f9eb5253f9ca9abbe3920343fedfa34bfb8d3923d000080bff947df3b7e8cd93da04eef3f5588113f4b254c3f4f1b4fbeda8e503f647414bf147c613b000080bfc6a6953b292ddc3d804eef3f1267d03e78a7683f09a3bbbd787d693f43d4d1bed51f57bc000080bfc3c3343cb0e4ca3d00cbee3f9186573f8ceb033f050a24beea41083faa8557bff472b63d000080bf9b24163bdecbdd3d9e4bef3f3093603e8bad793f4942d6bc41be793f39db60befad804bc000080bf00000000795ade3d7249ef3f000000009ffe7f3f7dfed4bbfcff7f3fefcfa3b685e244ba000080bf9b2416bbdecbdd3d9e4bef3f309360be8bad793f4942d6bc7fbf793f1dd2603eb10dda3b000080bfa8e41cbbde01de3de2e8ee3f650984beaaa8753f6862e63dfb4a773f094a843e09d22a3c000080bf908227bb8869df3d897bee3f8fc98cbe9bb86d3fe02a7f3e5beb753f445e8d3ecadbfe3c000080bf10919abb40f9db3d5ce8ee3ffa8904bf46935a3f4e035f3d88035b3ff526043f4bc3233d000080bffed2a2bbcb12dd3d2675ee3fb8ee19bf78ef463f67633e3ee3254c3f8725193f1324a13d000080bf2886e4bb7a73d83d3564ee3f219547bf85ae1d3fdac3e73d2812203fce92463f5b9daf3d000080bf0e65a8bb5185df3de2f1ed3f348824bf7f24383fd501873e930e433fb2d2223fad1dfa3d000080bf8a78ebbb1c26da3d91d5ed3f28d147bf5360153f9ea3653e98531e3f35e4453fdda5103e000080bf445120bc3a57d43d8eb1ed3f6c5441bfd9cd163fd635933e68c0223f9adc433f678cd13d000080bf199213bc0a4dd23d9a4bee3f08d351bf0a6e0e3feee90b3e4175103f9740533f0743cb3c000080bf467d12bc53ead23dcbd8ee3f53014fbf5d88133ffc83f2bdb17e153f7a884f3fad462dbd000080bf68ebe0bbe671d83dc9e2ee3f3b6635bf304a343fa28233bdf445343f93b1353ffee69f3c000080bf436ff1bb03cfdd3d6138ed3f4b0745bf8090153f2cda833e5fe2213ffcd1403f1f77393e000080bf8143a8bbd55be33d8a5bed3fa95a27bfe0b2303f8ad29e3ebd4b403fa93c243f75391f3e000080bf572a28bc0449d83dc90ded3ffd0436bfa6b0233f73ce953e0db8323f7e13313ff54b3d3e000080bf60e726bc44a6dc3d5161ec3f3d5038bf01f8233fbbcd883eb6ee303f4757323f74fe443e000080bf2dd0eebbbdc2e23d7d8dec3f50444abf9e9f0c3f85458b3e892c1b3f5225443fd67f5a3e000080bf709ba9bbd575e83d6db4ec3fcb1829bfc838293ff746b63ec2fc3d3fe28a253f8b82343e000080bf2bfb2ebb2fe0e53d236bed3f67b291be9e5d5f3f3b57cb3ecbf4743f8156913e17d47d3d000080bf48a72ebb0c07e23d11feed3fcb6590beca14663f1de2ab3ea745753fc373903ee5044b3d000080bf7df230bbb5faea3debc5ec3f3c8693be5835583f9713e73e6e84743fd202933e4b6d943d000080bf193d37bb705df13da911ec3f902596be3c28523fbedefa3e5ede733f48a6963ec20a9e3d000080bfb4e1b0bbd1b2ee3dd2feeb3fc63228bfc3cc233f701bcc3e70af3d3f5d42253f43853d3e000080bff08cb6bb6efdf43d3657eb3fcb3c23bfce66233fcbcfdc3e3ac5403fde6f223fc56d323e000080bf68cb39bb75c6f73d9c6aeb3f4de295be0fe14d3f006a043f13a5733fe12c983e1cbe9c3d000080bffdf936bbf5f5fc3d03edea3feb018abee61c483f10fa0f3f0f7c743f2a7d953ea997543d000080bf77a1b9bb5340fa3d2bdaea3f77cf1abf8861203f6fc6fb3eb921453f6d171e3f710e243e000080bf702bbdbb7172ff3d8179ea3f0aec06bf660a1c3f4c9a173fe1544c3f0a24183fbe09ca3d000080bf3a2435bbbaf7003ee882ea3f46435abef65a413f69a81e3f8d2b763f19818c3ef7ef73bb000080bfa1513abb80db033e9015ea3f51522bbef2da4d3f0c08123f7789773f02b17c3ea49b83bd000080bff148bcbb3fc8023e1217ea3fd24addbe4ae4313feb21133fd4d8583f720e083f6ab9b6bb000080bfd82ac1bb1c27053e809de93f2edfd5be32f3593f6876a23e401f613fb9edee3e7f62c1bd000080bf6ada45bb8017063e9395e93fcea937be72d26e3fa6e59f3e5ddc783f43055e3ebb09b7bd000080bfe90f4dbb5a9b063e8315e93f8e6256bef9e2793f30636dbdebd3793f76c0513e165e9abd000080bf9a44bdbb5bb3053ecb18e93f8813ddbea627663f97d294bd4970653fd550d63e694216be000080bf4cc205bcb62b043e3f1de93f64641cbf0ebd493f51c29bbdd9d5493f36c9183f189318be000080bff01909bc3179033e6897e93f221e22bf6888363f07169a3e06893d3fbee02b3fe93a06bd000080bf48a72ebcf437013e8d81e93f02c33fbf6984193f4d2a903ea95f213f30a2463ffd7dc83c000080bfa7212abc1f0e023e7217e93f26d036bf12e8313f3b72acbd0835333f8e8e353f8930abbd000080bfc4784dbc6ec5fe3d0101e93f472040bff213273fbdf2d4bdc2ef283ffba23f3f4de683bd000080bfccf01fbc7078013e0bb5e83f8de425bf7af6223f3d17d6be8f243e3f4651263fdee625be000080bfa77947bc38a8fd3da7bae83fb00c2bbf6cea1a3f769fddbef678363f34fb2f3fc3910ebe000080bfddd355bc0d23fd3d874ee93fcf6048bf0874123fa3f37a3e9d71183f418a4d3f50abe23c000080bfe38b76bce505f83d7c2ce93fe7fe4ebf055a0c3f14bb5a3e5fb70b3f41a1553f49769bbd000080bf20a07bbc8508f83dbaf3e83fd6464fbf0948153fc5a187bda73b163f9ba44d3faf27d0bd000080bf30487abc31d3f63db8b8e83f59693abf83ae0c3fc9b7d1be91c6243fffee403f795408be000080bfb78567bc7ca3f63d888ae93fb74040bfee82d23ed745043f7ebffb3e71d85e3ff7f5b33c000080bf956588bc7a20f23d8948e93fee7455bf10bfda3e87feb23edb0eda3ec398663f8c23aebd000080bfef5696bca033e93d4a5ee93f7ad160bf0f2a893e2bdfca3e29e6873e8f4d763fe3d97ebd000080bfd47d80bc7aa5ec3db3a1e93f045339bf868a983e934a1f3fe97dba3ee3586e3f616db4bc000080bf7c6047bc1193f03d5400ea3f8abc40bf35fea23ef477133f8f5ce63e9242633fe38fc73d000080bfd17737bce9f1fb3d15cfe93f549e3ebf7422cf3eadeb073ff4640c3ffdff523ff077103e000080bfb00191bc2992ef3d5af2e83fd63668bf9a82d73e6d0398bb50acd53e81d6653fe70610be000080bff8c690bc4325ee3dbfa3e83fe6fe52bfe4d2d53eb1d2c3bebc34003fdc515a3f089017be000080bfadf79bbc881ae53d9d84e83f1a0b64bf5f0b703ec64ec7be5cc7a63efd3c6d3fbad73fbe000080bf49f59dbc20a1e63d04ede83f6e1679bf42da6b3e2084753c60d2663e3252763f41901cbe000080bfb2f4a1bc596dde3dfed6e83f0cdb7fbfbac2cf3c7a42b4bc1e11e53cdcd07d3fa95e02be000080bfac8e9cbc012ddd3dd464e83f6aff65bfeec2253d5bdfdfbea3781d3ef130763f7c6a68be000080bf3a3597bcf239d73d6d4de83ffd0d5fbf0a23b4bd6230f7be2527043d58ae783f6ad970be000080bff25fa0bc36ecd73d1bbfe83f1c3f7dbfab8101be148296bda664fabd7ba07d3f0c8972bd000080bf49649fbca034d43dcbb5e83f75fc78bf96b11e3ebf7131be115b2f3e63517b3f0e5baabd000080bf969691bc8732d43d5e49e83ff6eb5ebf4472773ef239dbbe269abf3e3efe633f745284be000080bf679599bc332dd13d0a2ae83fd78106bfd8a2523f05db5dbe9696593ff7ea043f7f2ab7bd000080bf4c1aa3bca339d23d62d5e83f3a162ebf64783a3f1752abbdbc8c3b3f99a92b3f7513efbd000080bfe31a9fbc0b7bda3d1e19e93f6c3177bf2f43debd68fb713e3d9adfbdaf747e3fb1a9293c000080bfb64b9bbc6171d83d1a39e93fecd673bfd18038bce9d19b3e33cc9ebb9fef7f3f78ccb23c000080bfeded96bca65ed73d0c6ce93ff98265bf4772b03ede818e3efd77ba3eb35c6e3f44daa53c000080bfeed79dbc0e37e03d9a48e93f446b70bf0882cf3c636aaf3e39b7023d90d87f3f45a05e3c000080bf290989bcc40ced3d7a75e83fe9db08bfc6a6c63ea53240bf06cb263f4b49413fb30b97bd000080bfae846ebca858f53d768fe83fd25903bf1e0bdc3ea6343ebf317e3b3f76ac2b3f3067f1bd000080bfcc483dbc92eafb3d5d8be83fd07d0abff86ae13e717237bfad7c3f3f9b32243f3db72ebe000080bf49f85ebc3b54f33d9377e83f9f4581be0e23763eecf06fbffffc483fd4f71d3f75185abd000080bfb72833bc6654f93d1270e83f5e53c6beabe35b3edf8565bf274c473fd8dc183f69f845be000080bf4da008bcfaa2fd3d4856e83f51ebf1be0fb3673ef70e5abf899b423ff1f9173f162987be000080bf4cff12bc386b003ebc77e83f558210bfd9f7eb3ed64e2fbf7c95423fe41d1d3f28a15abe000080bfbac57cbca6f1eb3de15fe83f03f32cbefb7aa63e52326ebf0af9463fa7dc1f3fc1fb9d3d000080bf543882bcac7be43d1330e83f58b471bebc0bcc3e1de262bf9b8e3f3fa90b283f9261c43d000080bf268a90bca285e43df948e83ff02b18bfdbd9943e6ff03fbf56770c3f0507543fe12fe9bd000080bfa8962dbc1eaef53dfe66e83ff4ea72be5e0efc3a24b178bfb7764b3f1e4e133fc29245be000080bfec6907bc2c2ff93d394ce83f9716cfbe4083f13ce9006abfbc45403f43bc143f1390a0be000080bfd5b40bbc7c64f33d0157e83f19c2b7be9e5106be9c926cbf3803373f5811193fe19bb9be000080bf7f7129bc8033f13daa6ce83f56c3febd3ba21ebe85e57abf0e6f4f3f73e10d3f910543be000080bffd6923bcc91fec3daa7de83f6972babd55023bbe069d7abf5f80503f99500d3f300237be000080bf123210bce42cec3d8e74e83f2d53b8bea51218be1eca6bbfd6d0323f8c8e1c3fb645bebe000080bfa79b44bcd0d7ec3d4877e83fc0424a3e906181bd516f7abf69e75e3f4286f03ee0f5143e000080bf4f0732bc904fe83d8388e83f09a2173e088138bc4c297dbf2435623f2fb4e63e0a3c023e000080bfaa6315bc1156e33d168ae83f21ae8ebe897be73e50e958bf7b245d3f92e7003fc8c87cbc000080bf6f7e43bc965fe63d5378e83fbd1be83e68534d3e90555ebf7494573fa057643e976afb3e000080bf6bd358bc1ea7e83d6864e83fd3aee73e30323a3eb07e5fbf59a2543f9e6d8a3e7d41f93e000080bffb3b5bbc3967e43de244e83fc137fe3ee2cb023f9ea433bfcf4d493ff7f19e3db4e61c3f000080bf71723fbc6a68e33d7f6ae83f1cbcd93e8efa073f89993bbffb10533f4266da3dfd450e3f000080bf7097fdbb0894ed3d885ce83ffe090dbfdaf101be032953bf10d9143fd390263fda16fabe000080bf69a7e6bb1ac8f33d483de83f9e9909bf7e9189bd833057bf65d3203fe10f223fb193e7be000080bff4c0c7bba94cf13d9f27e83faa5839bfce000f3c7d9230bf7ef3073fd62a253fdc9d0cbf000080bfaa49f0bb5391ea3d5858e83f5cfe31bf2afe3d3b6dfe37bfa28d083f0c1c2c3fe76703bf000080bf9be3dcbb9f94e93d293ce83f224955bf68c3ec3d0e740abf9789ed3e61ab2d3fb3d611bf000080bf8d84b6bb4ef0ed3d8d0ae83fa87656bf0113ea3db5b108bfa3f0f03e2dab253f348c19bf000080bf68cbb9bb0472e93d55f8e73fc1af5fbfc3cb5b3eb76fdfbe895bea3ed1882a3ff0bd16bf000080bfe789e7bbb136e63d423ee83fff7954bf3b9a743e3f0901bfc404043f1b482c3f2bbe07bf000080bfc042e6bb9e44e43df225e83fedaa55bfd7b2d03ea6aabdbe90880c3f7da62b3fe884ffbe000080bfc3dec4bb2d9fe53d97e7e73f361d5abff2a6c83eb2bab1bed7ac053f94132f3f357102bf000080bfe9f2e6bb1b49e23d9be8e73fd57733bfbf7d293f58a587be9350363fd07f213fb6ac9dbe000080bf2b8801bcff05e23d3f35e83f448624bf5b222d3f8c4eb8be09e2433f451b173f77a583be000080bf5da711bcc6a7e03d0729e83fcb3eb6be8ecf653f13f684beb1af693f2778c93ea751df3d000080bfdb140fbcdbfcdf3d7aeae73f7edad5be985e5d3fbdcd8ebed56b643f9087e53e56d85b3d000080bfba1c2fbc346ddf3d5c00e83fb901f6bc181c6c3fb845c5be8dcf633f92044d3e73ded13e000080bf3f8b25bcf295e03daf44e83f12054cbc9b95683f4fd3d5be8815633f8dac4f3ef859d43e000080bf3a773bbc7383e13db249e83fed6eb33e5f8b4c3f1b30fabe657f4b3f586db53cc2371b3f000080bf1d7d4cbc431ee13df81ce83f4692a43eced0493fdf4b06bf6516503fb3325f3d4e76143f000080bfc09c59bc01cadf3d33f8e73fd340a13cfce9343ff60d35bf64f95e3f6d9fab3ebae6b73e000080bf263534bc6360dd3d3fc7e73f227a86be6035503f20e804bfc607653f2649d03e2d1e3d3e000080bf573e4bbcff3dd83de47ee73f38d210bf102d453f5eca96bec16e4e3fc865173f4cde14bb000080bfa1176ebc4e41de3d29efe73f7356b9be1a8bec3ec6444fbf9aac3b3ff6742d3fa51d713d000080bfacb26fbc9a9ae43d1330e83f5292303e9fe3003fb8bc58bf5fac573faf6dbd3e6d80c83e000080bf92cc6abc747eea3d315be83ffa794a3e5c09803e7aa472bf0cfe543f4edbef3e8a26983e000080bf164e52bc3d81f03d8f70e83f80010a3ce6a3733da2897fbf5e1b563f03f80b3f1a5c223d000080bf7eaa8abc6940dd3d9715e83fcb4325bf1ce23a3e0bd83dbf0c6cde3ed0e9623f26e023be000080bf6da983bceaafd73dd8f1e73f4c3d3abfc45b593ef60627bfcab5ce3ea9bc663f1cb520be000080bf8b3386bc8388d43d73f5e73fb31445bf01d7d43e78f3f7be5c5e103f45614c3f043e58be000080bfe75086bc1c06d33d87bce73fa97617bf7b8d453f2bec6ebe97824d3f922e173fa5e0a8bd000080bf1c959bbcd495cf3d8d5ee73f2796e6be15f2633f43e186bde38b643f6a75e63ef9229fbc000080bf958098bcceaacf3d4cf7e63f749bf7be2d0f603fdc021ebcee11603f149ef73e6c1999b9000080bfef5696bc1d94d03d4487e63fe10f05bf0ad3593f42929c3dc01e593fe951063fbe4e96bd000080bfdf3c55bca65ed73dfcc3e63fa83217bf993f4d3f5053bb3dcc964b3fe3f7183f3aded1bd000080bf871318bc666bdd3de6e5e63f4ddf0fbff8a3523fbdf1ac3dcca2523f1d0b113f8e1137bd000080bf2f690cbc7c98dd3dbf62e73f41e60fbf417f513f0544f5bd429e533f4b810f3fa2694abd000080bfcf320bbc14b3de3ddfb0e73f317e01bf6fb34d3fb9aea0be7fa4593f03a7063fa232c1bc000080bfbb52cfbb7450e23d7aace73f8c6831bf60ae273f2e369abebb8a383ff0a6223fbcc48dbe000080bf1572a5bb71c8e63d8eb1e73f72884dbf7e5ece3eb7e6e0be8110173f9b63243f9188fabe000080bf5bd592bb253dec3d37c3e73f6de94dbff6836a3e625a0cbfdb8e0f3f42fb183fb3b512bf000080bff66654bb435bee3d3d9fe73f177c14bfd139823ed41c46bf4479463fa188ed3e0071dbbe000080bfe06ddebaa491ef3df48ce73f72c185be834d8a3eb23c6dbfd646743f06725e3e039c52be000080bf59c2daba1cedf83d13bce73fb94183be5962aa3e2d5168bf1efd743f0d9a603e277842be000080bfc38451bb8ae5f63d5ccae73f62d40ebf22cc7e3e65ad4abfa7074c3f536ada3e85ebdabe000080bf1e1b81bbb804003ed108e83f0c1fe7be57b2ae3ecf1253bf0c675a3fa425df3e3ecd92be000080bf1c12f7ba7902013e3bfce73fcc1a70beceeef53e705c58bff41e773f6ff75e3eff8413be000080bf50e01dbbea04043ecf48e83f9acb62bed9bc353fa6262bbf603f793fc24d4c3ecfaee2bd000080bf84d899bb3333033e2251e83f0a46cdbe83091e3faf472dbf8df2673f31bbc03eddfd45be000080bfd02edfbb3315023e5662e83f2a6204bf2b2a073fc8742cbf7647523fbc01073fea6a5ebe000080bf3108acbbcae4043e6aa7e83f517bd5be3379503f38b3cebeae94683f43fec53e2d1422be000080bfaf40f4bb3179033e92ade83f5a9210bf0b77373f7c87d1be7b29523fd7de093f0d4e42be000080bf17fbcbbb2eeeff3d4037e83f8464fdbe7dc68b3ec22f53bf5a19493f84e10b3f39b594be000080bfbd943abb1dc9053ee3a4e83f05db5cbe3e49653fbe26c7bedbf5793fbaf34e3e32bd9bbd000080bfe030d1bb072ffa3de02de83f046e03bfe9a1843d680f5bbf13c1373f3833143fe10fc6be000080bf42f4a4bb2336f83d890be83fdaab27bf9472d83d138c3fbf47e4243f948a183f7f95f5be000080bf969691bb04cef23d94e4e73fb0ae44bf43c2213e30cc1ebfa95e133f6021183f4dc90fbf000080bff642413d11e5ab3d4e49ee3ff253e5be3c47c13e907b4f3fcc8dfb3e914727bf706c133f0000803f0398323d4faea93dcb2eee3f18ca70beaf15b83e072c673ff1b7ee3e1e5f5b3f040d61be000080bf9d103a3d8fe3a73d024bee3f7c16c2be4673fe3e9ed4473f1a20f63ef898533f4ce895be000080bff9872d3d4870a33dac56ee3faf9d92becfbf193f361c3f3f8aeece3e763b483f90ccf2be000080bf2e74253ddd7ca33d8c48ee3fdbda25be5e020c3f8c45523f00000000d11555bff5e10d3f0000803fadbd0f3d9a449d3d5875ee3fe3a1d23d7e047e3f49a18ebdc5a27ebf2225d33d000000000000803ffe63213dae61a63da12aee3f4384ffbd914fe03ea0e5633f0000000012b165bfc913e23e0000803f0398323d4faea93dcb2eee3f18ca70beaf15b83e072c673f000000004ed76dbf3565bd3e0000803f93c6283dc26aac3dc80aee3fb2123bbe5e1aa73e526b6d3f00000000b07b71bf9cf6a93e0000803fa1f31a3d7adead3df1f3ed3ff4f1a1bd275e9c3e4aed723f00000000a5b073bfe6db9c3e0000803fa5bc163d90dda53daf25ee3fd1e13fbd1852e63e0f52643f000000004e9264bfe792e63e0000803f07280d3d87f8a73d3c15ee3f5fc2bf3cedb5d03e1cb0693f0000000082c069bf93c4d03e0000803f86040c3d00e2ae3dd1ebed3f60c3e63c99ed963eab84743f00000000859d74bff0fc963e0000803f164cfc3cb403ae3d51f9ed3f3e52db3de1d9a03ec27c713f0000000056e272bf0fc8a13e0000803f97c5043d10fea53d2c28ee3f5663d83dc6dff13e7c01603f00000000484461bf523cf33e0000803f0f7df73c2f19a73db22aee3f4c52493ecbcaf03e983e5c3f00000000e7a060bfce95f53e0000803f164cfc3cb403ae3d51f9ed3f3e52db3de1d9a03ec27c713f0000000056e272bf0fc8a13e0000803f71a7f43c66f7a43d1b45ee3f6a7ad73e27ae3b3f96c3083fba045ebffde6fe3e000000000000803f92ccea3cf146a63d8252ee3f829c283fd9be3e3f6103d73d35ce3fbf628c293f000000000000803f6bb6f23c2afda43d2b6cee3f8e4e123f400d3c3f4343bbbe130d4abfd2321d3f000000000000803fdcbcf13cee3ea73dfd85ee3f3b37f43e1a7beb3e88bc3fbf00000000ea265a3f28f6053f0000803f5604ff3c6e87a63d7c9bee3f5e6eab3e142be13eda5655bf000000005868623f10f6ee3e0000803fa695023dd478a93d52b6ee3f9c4a673ece619d3ecaa46cbf00000000e2eb723f9e8ea13e0000803f228d0a3d8f19a83d70b9ee3ff003e83dba2aa73ef23970bf000000006cc8713f0540a83e0000803f2e53133d56cfa93d3ec6ee3f9240933c48158c3e5f3076bf000000008e3a763f131b8c3e0000803f7d5c1b3df5bda63dfeb5ee3f410216bddf7eac3ef8d970bf000000005c03713f839cac3e0000803fac53253d0ec0a63d53b0ee3f92b2f2bdf6ddaa3ec0686fbf00000000b21b713f6214ac3e0000803f0893223d4e5faf3d73d5ee3f8fa2c8bd1e0a153e7a077cbf00000000573f7d3f8bc2153e0000803fba852e3d5919ad3de7c2ee3fd09245beb08a453e834976bf00000000e7007b3f1d53493e0000803f74eb353dd3d9a93da4a5ee3f05728ebe1e369b3e445369bf0000000071ea723f5697a13e0000803f5793273d3484a33dcc96ee3fce2a46bef009093ff87a52bf000000003589563feaad0b3f0000803f7aab2e3d0760a33d7f83ee3f08eebfbebea1273fc20128bf8c2b5ebf945ffebe000000000000803f74eb353dd3d9a93da4a5ee3f05728ebe1e369b3e445369bf0000000071ea723f5697a13e0000803f03422b3d09c6a13d486dee3f5ef6b4be13136f3f03035e3d2e6d6fbf923ab5be000000000000803fdc9a343d2385b23df46ded3fe5cefc3e856a5b3fb17116be48505e3f6b53f4beb8eb093e000080bfecabab3c5e52b53df129ee3f5e6cec3e0f8c5a3fb08c76be4728583f089701bf77b533be000080bfd884b43c7a8fb33d3c2eee3fab1b1b3f280c4a3f67a2ccbd7e4c393f345919bfe452afbe000080bfdeacc13c624eb03d2236ee3f1068323f2174373f8a82e63c35808c3e01bb6bbea8036fbf000080bf05a6d33cb7d2ab3d0f42ee3f5e64323f6a34363f4f52b53d6caa823eefd405be544075bf000080bf1025da3cc1c8ab3d0f27ee3ff6c6d63ef9cb0e3f7f56373f2ab3273f2c64b83e93092abf000080bf5247c73c20d5b03de315ee3f6832ca3e9c79093f3bd43e3fdb74433f0ad6843eef6517bf000080bf9a96d83c15e5b23d12f8ed3f7092313e4f02a03e52176f3f5a49453fab220c3fc80ba7be000080bf6b10e63ca14aad3db70aee3f2773513ef4a6c03e8755673f5f35003f1cc2403f0f91dabe000080bf92ccea3cf146a63d8252ee3f829c283fd9be3e3f6103d73d9aab333f8cd90ebfddb3e2be000080bf71a7f43c66f7a43d1b45ee3f6a7ad73e27ae3b3f96c3083ff9d4ba3ead01ce3efbf056bf000080bf0f7df73c2f19a73db22aee3f4c52493ecbcaf03e983e5c3f8f4c973e61e84e3f9d6402bf000080bfdcbcf13cee3ea73dfd85ee3f3b37f43e1a7beb3e88bc3fbf9444ae3eecdf61bfbc6ca6be000080bf5604ff3c6e87a63d7c9bee3f5e6eab3e142be13eda5655bf35f80d3faf7f1f3f3c360d3f000080bf4b54ef3ca6cab73de9cbee3f25628f3ef372c53d9b8374bfb23f6f3fe47882be84407e3e000080bf0de2033ddc7eb93d82e1ee3fac71e53dbd60143d20387ebf8c957a3f0e6e34bedeffd43d000080bfa4e1143d5a28b93dd2e4ee3f1483e2bccc835d3cf4e07fbf79c97c3fc2e51ebe48f8f0bc000080bf791f073d9d81b13d73dbee3f2353de3d16da103ebde57bbf002e7c3f09db17be80e9b23d000080bf48c4143d7193b13d7ae1ee3fe20318bc1e54fd3ddb057ebf467d7d3f94d10e3e2329053c000080bf0893223d4e5faf3d73d5ee3f8fa2c8bd1e0a153e7a077cbf77157e3fda586ebda5e3dbbd000080bf8753263d0210b73d40d9ee3f9a310bbe4f43cc3c278b7dbfb9a86f3f92d7a5bef8eb0bbe000080bf4772f93c60e5b03d53cbee3f2ffe853eff0a3d3e098472bffbd7723f74a86bbe816c5e3e000080bf69e4333da67db33d2fc2ee3f8cc36fbe4322943da53178bfdf82573f07abf7be702575be000080bfba852e3d5919ad3de7c2ee3fd09245beb08a453e834976bf886c4b3fed620bbf5d7e89be000080bf74eb353dd3d9a93da4a5ee3f05728ebe1e369b3e445369bf2a85263f688323bfa96ed2be000080bf147a3d3d497faf3d36a5ee3fa1fe9fbe9b42263eee996fbf14fa513f6dd8e6be4942b4be000080bf5dfb423d7423ac3dec87ee3ffc42f6be4e96c43e6ac649bf0452303ff313c8beb1541cbf000080bf44a33b3d08e3a73d8087ee3f8047edbef7bb073faac235bf118bc63e815e19bf575433bf000080bf7aab2e3d0760a33d7f83ee3f08eebfbebea1273fc20128bf6c036b3f0463273e92f8b8be000080bf44a33b3d08e3a73d8087ee3f8047edbef7bb073faac235bfea65623fd8a8673e830dd1be000080bfa695023dd478a93d52b6ee3f9c4a673ece619d3ecaa46cbf3592573fc5bad43e2b16b03e000080bf228d0a3d8f19a83d70b9ee3ff003e83dba2aa73ef23970bf48a37d3f3e9e093d6e74063e000080bf2e53133d56cfa93d3ec6ee3f9240933c48158c3e5f3076bfe7b6723f3af8993e5283d33d000080bf1459eb3c77a0ae3d2aacee3f7f12c93ec2498a3ed80c61bf70ced73e9af64b3fc7bcdd3e000080bff9872d3d4870a33dac56ee3faf9d92becfbf193f361c3f3f24fd123f98373b3fba77bcbe000080bf03422b3d09c6a13d486dee3f5ef6b4be13136f3f03035e3d406c2f3f2488983ee2222abf000080bfaca92c3dc93cb23d90f8ed3fd92a61be10c37f3efc68713f9928703fe60958be3d9c8c3e000080bf93c6283dc26aac3dc80aee3fb2123bbe5e1aa73e526b6d3f0fbd5f3f019cc1bee6479c3e000080bf46097abd6f9f95bdc79ee13f21db3bbf4920ffbeef6bec3eae7b1ebf3638453f4d211cbe000080bf2f368dbde29178bd7a2ee13f33a964bf03b28dbe8d72b53e1815bdbe19b1663f988668be000080bf180f6fbda85a8bbdd6e1e23f5ae73ebf720a09bf9417cb3ee14a20bfae3c443f5b0f12be000080bfe33745bd54249fbd9413e33fc0850fbf3f8c35bfa3e2da3ed0b94dbf262a173ff83c98bd000080bf7c224fbdac34a9bd1ed2e13fbe8d08bf241c2cbfa867033fb2b94ebfdfda153fce6694bd000080bf50e293bdb13c88bd06dedf3f8e7b55bf88c219be48f4073f97caa6be5922693f351282be000080bf0b0a83bd2f299ebda030e03fd80b2cbf4656d5beacb51c3f39dc1dbfaac9453f65b81abe000080bf88661ebd926fb6bdf6d9e13fb8fea3be69694ebf389cfe3eb6706dbf9458bf3e17060c3c000080bff46c16bdc3a0acbdae22e33f2adebebe5ef053bf5b92d63e91616abfb8a5cd3e8aacabbc000080bf7fa7c9bc5ff1b4bda01ee33f62c35abe729f64bf14bfca3e3a8878bf8afe743e8a8c813c000080bfaea1d4bcff85bebdc3cae13f40723abed4525fbfec4ae83eb76e79bf1079633e7be4133d000080bffc7f55bc28abc2bd10b9e13f30328cbda14b67bf619fd83e508e7ebff113c53d13b9363d000080bf444f4abc0937b9bdcb16e33f2ea2b8bd8aec6bbf1b52c13ec96e7ebf374adc3d71b2ce3c000080bf00000000de56babdf911e33f0000000075c16dbfc6d2bd3e5abe7fbf7be8873cf6392a3d000080bf0000000012c2c3bd96afe13f00000000aa9069bf589ad13e47b17fbfc454a43c251e373d000080bf744268bd2dd284bdf302e43f133b44bf63ae1abf7dd35e3e99e622bf11a5423f756e05be000080bf12113ebd6cd398bda328e43f551617bffe8e43bf17a6853e85234dbf08f2173f033199bd000080bf4fcc3abd5d8b96bde95ee53fc30b16bf6b4e4fbf57c3d93c5c304fbfab67153ff38187bd000080bf390965bd513083bdc845e53f58ee3dbf16922bbf0743a2bc47202abfed2b3d3f534be3bd000080bfb6843cbd079598bdf203e73f8b900cbfe3ad52bfc23a15be2b7d53bf3e930f3fae335fbd000080bf711e0ebda4fca4bdb01ee73fab2ec6be34bf69bfb56903be2f3b6bbfbf7cc93e2cf9e8bc000080bf5bee0cbdb08ea3bd5c71e53f14b7cfbe61b569bf2b63363d53f969bf5633cf3e9d31f6bc000080bf6b8012bd492faabdf0fce83fe48abcbe984165bf1dd47fbe0d2d6cbfb241c53e5563adbc000080bfc9e5bfbc800eb3bdb323e93fa73a73be7da06fbf64ed84be45dd77bf88ad7f3e44ca6bbc000080bf3be0babcbf2cadbd2a39e73f958a77be9b3876bf488903be062378bf916b7b3e87f569bc000080bf2d0abbbcd273abbdba7ee53fd07b7abeb5f377bf4e82393d8e3678bf3aa07a3ecd6026bb000080bf944d39bce57cb1bd6e4ee73f69b2e1bde4fe7bbf85c10cbef36f7ebf41fee03d4099253c000080bff6833abc5375afbdb188e53fd0b2ddbd5a4f7ebf01821b3d49627ebfbdc1df3d1faed03c000080bf67d73dbc5dfab7bda242e93f2543e4bd28bb74bfd6f98abeb23e7ebf6b48ef3df1f771bb000080bf00000000da73b9bd2250e93f00000000bf0376bf2f9a8dbecafe7fbf9a1ddcbaf335bf3b000080bf00000000fbacb2bdc557e73f0000000090677dbf057211be7ef47fbf1a6e2ebb8bf3973c000080bf00000000927db0bdd28ce53f00000000fad97fbf83820b3d9ed87fbff7be9a3aafe50d3d000080bff4de18bd4ed4b2bddac7ea3f1d16bbbe837a5fbfe371a5be3d656cbf8876c43e776cf83b000080bfc7da1fbd5c3cbcbd4984ec3f1377c5be8b4f5ebf87929fbe4e366bbfced7c83e4725343d000080bf8be2d5bc1101c7bd29b4ec3fc0c184be22bd68bf48e2a6be03e976bf7bc8853e5a791d3d000080bffef2c9bca7aebcbd3cf5ea3f828376be55a968bf786eaebed96d77bf645f833e35a3c7ba000080bf96d148bc8467c2bd5518eb3f0ab3edbdf3a46dbf4ddeb4be9a2b7ebf8d73f23d6899773c000080bfe35556bcea7bcdbd66d8ec3ff10904be5c036fbf751aabbed8dc7dbf7dc7f73d1ebe363d000080bf000000009ca6cfbd9be7ec3f00000000320871bf8181acbefabe7fbf6bd875bc9fc02b3d000080bf00000000b43bc4bd4e27eb3f000000004b0a6fbfc341b7be67fe7fbf71b423bb4c89d53b000080bfb51626bdaeb9c3bdfc36ee3f7ca2d3be93aa60bfcda278be590f69bf87a9ce3ec233ba3d000080bf501d2bbdc3f5c8bd51f7ef3f0342dfbe222063bf74591abec4d865bf2ec3d53ee6440f3e000080bfd922e9bc1a6ad4bde125f03fc27598bec75c71bfd55119bee12473bf04b88d3e7a72153e000080bf098de0bcb1fbcebdcb66ee3f6e4590be773c6dbf899a7ebe099c75bf14c4893e98e6ac3d000080bf166962bca6efd5bda08bee3fd3a912be312575bf51fb7fbefad67cbfd813fa3d04f1c83d000080bf4f206cbc6490dbbd944af03f7ae91bbe48487abf465914becfa37abfc042043e061d213e000080bf000000000610debd795af03f00000000ff667dbfb08111be63817cbf42aebfbc60e8263e000080bf000000009755d8bd529bee3f00000000bcdf77bffaf37fbecbf47ebfb2b7b8bc0be3b23d000080bf4a7c2ebd309ccbbd83dcf13f97cee7be920c64bf89c11cbddf9660bfd8f1df3ebe4c4a3e000080bf56802fbdfc89cabd7ae2f33f9babecbe7fb761bf1773c13d592f58bf56bef03ee94f833e000080bfbb60f0bcd8f3d5bd4d0ff43fafb99fbe99ca71bf05e2d23d647866bff430a83e7040923e000080bf2dd0eebc6518d7bd280af23f475a9dbe9c7773bfaca105bd83a26ebfc284963eb159583e000080bf168472bcdc2cdebdb62df23f76c21fbeb5c97cbf5b03c8bcd02276bf00a9153e3e6f6e3e000080bf1a3474bc8cd7dcbd6e30f43f4f7220be9d3f7bbf8073e23dc4f36ebf9e263c3e19cd9d3e000080bf00000000fe27dfbd183ef43f000000002a547ebfe4a1e93d3f6371bf829b1b3d5964a93e000080bf00000000499de0bdf33cf23f0000000095f27fbf2ac2a5bc69f578bff26f9abb7a776e3e000080bf577a2dbd999ac4bd0305f63fe87eecbea4225bbfecc26d3e76e14bbfecf8033f5ee3a13e000080bf68b029bd05c3b9bd9819f83f2ce3e7bed34c4fbf9dfebe3e005b3bbfe49d133f17f0b93e000080bf17b6e6bcd3bfc4bdc746f83ff1bd9abec55e5ebf7a02c93e796749bf5772eb3e89d7d23e000080bf0b9cecbc3eeacfbde430f63f76069fbe9d236bbfe28b7a3e6f4f5abf0514c43ed4d2b53e000080bfd5cb6fbcf5a2d6bd2f4ef63faa611ebe7a7e74bf4679813e5f9763bf06197c3ebca5c53e000080bfdc6369bc3e3ccbbd3161f83fa35a18bedcd966bf8cc7cf3e084254bf20c0ac3e1e3ae43e000080bf000000005c5acdbdb669f83f00000000047069bfa02bd23e020d59bf70e05e3eef8cf73e000080bf00000000b6d9d8bd2959f63f00000000a97777bffb15833e405069bf0fcdd73d8eb2cb3e000080bfb16925bd2ff7a9bdaef5f93fa42fdfbe11e13cbf23f0033f508227bfa02a273fca43c33e000080bf91ef52bdc6c39bbdbec1f93fc99c15bf181526bfb38cf93eb30613bffd49413f9cf8a13e000080bf51bd75bd95d489bd7ba4f93f0bac37bf7b6104bfb1f6ee3e5579edbe62c25a3f5b656f3e000080bfa0fd48bdcc248abdcb4cfb3fe2df0dbfd8ed0dbf1cf21e3f91f0f9beb615523f4617983e000080bffa0967bdd0b870bdfb3bfb3f1c5a2ebf9216d7bed887193f7e2cbfbe1460673f9a16563e000080bff2b47cbdc7f143bde734fb3f2baf42bf48a68dbe7964163f109180be15a9753fb7e5013e000080bfc11d88bdd3a068bdd28af93f014b4fbfcf82bebe6a4fe83e3d5cacbe808b6d3fe904243e000080bfe06992bd1fbc36bdc361f93f49a05dbf89b272be50b6e13e95c15abeccb3783f777cd23d000080bfc3b986bd4ab20ebd2f19fb3fda0e4ebf22ba18be0e08133f73cf07bed6167d3f4d1f913d000080bfdcb970bdc30fcebc0c58fc3f6f1432bf930379bd8e40373f907760bdf17c7f3f7d0a013d000080bf4e7e4bbd4c3789bc124efd3f204c10bfc66660391e75533fa00bd23b19fe7f3f25d8863b000080bf9b0344bdf65efcbce25cfd3f667608bf8893d4bdd3f5563fd324e3bd85117e3f8a1b563d000080bf88b964bdcd561ebd616dfc3f55d229bf667a34be9c2c3a3f019d2bbe996f7b3f2c68ae3d000080bf354154bdbc214dbd9068fc3f10801abf144e9ebe7e263c3fc43193bee4b2713ff6fa243e000080bf49db38bd79b130bd5a49fd3f5157fbbef65a65bedc88573f952565becc64773f69a6013e000080bf4d4b2cbda81c53bd691bfd3ffda6e2be2d86aabec720553f862fa5beabe96c3fe7704b3e000080bf4b223bbd645970bd0c73fc3fccf3ffbe4e03dfbedca23f3fe748c6bee5b1623f4a65833e000080bf6e4f10bd833423bd7afdfd3ffabababe4feb4ebeb9af683fdc8c5fbe0eaf773f748e023e000080bf3f1a0ebd024657bd5d88fd3f6baeafbe6c56b3beff1c5f3fead6abbeb48e693f3e28703e000080bf7f4d16bd9ab2d3bc132cfe3f670ecebef8b1a6bdb16c693f86b7acbde5be7e3f4660533d000080bf40c1c5bc4cfdbcbc5cc9fe3f3e828cbed5e2afbd0630753f4adfa9bd61917e3fe6f0853d000080bf7ba4c1bc00c71ebd0680fe3fc70b79be633359beb44d723f5af361be165a763f2ac5223e000080bf3ca2c2bc4aec5abd4aedfd3ff53a66be65aebcbeedea663fb29db7bebb5c643f69d38c3e000080bf396142bcf1811dbd25ccfe3f91f3fabd2e7b66be6773773f92b16ebead06743f5308453e000080bfdcb845bc4e0b5ebd0f29fe3f6953e5bd1dabc4beb09d6a3f207abfbea8e95e3f9176a33e000080bf672a44bc9f8fb2bc0c23ff3fc8c10dbe7422c0bd20657c3f821fabbd33397e3faf7fa93d000080bf000000002b6ab0bcf73eff3f00000000c281c7bd4bc87e3f8db2b2bd8acf7d3ff9bec63d000080bf00000000d6aa1dbd9fe4fe3f00000000074b6cbe4f17793fdf5681be1f03713f1aa1643e000080bf0000000042795fbdb03cfe3f00000000b112c8be30a56b3f9ec5c8beabc5583f850cb83e000080bf5b971abdc93931bccc2afe3f0727e0be8782ae3c2319663ffba8213d49cc7f3fa31292bb000080bfef1ccabc787de6bbd0d5fe3ff3099cbea542c23cfabe733f46366d3db1907f3fc54bcfbb000080bf5fb447bcf65ca6bb9c36ff3f77a91dbe4c01c03c55e07c3ffa00893d6f677f3f0a0359bc000080bf000000001c4295bb7654ff3f000000000e82bc3ca5ee7f3fda369c3dc52f7f3f77f5bbbc000080bfed9d51bcfab78bbde030fd3fe193e7bd60860dbf9059533f05a604bfcde53d3fe8fbd93e000080bf3998cdbcfc1788bd9b04fd3f44846fbe690809bfa7c74f3fc273f9be9b75493f21d7c13e000080bf232d15bd3e7782bd31b6fc3f061fbbbe1a6801bf4117483f136aebbebd00543fce24a43e000080bfbe171fbd38f496bdb685fb3f1107d0be6c6823bf7460273fa42910bf38093d3f80eebd3e000080bfe4a2dabc92959fbdd7c3fb3febc985be94182ebf9a5c2f3f1c1e1bbf28012b3f5632dd3e000080bf94dce1bc4c38b4bdd428fa3f2b8292bee02c4abf07e80a3f863d33bffd150f3f9977e33e000080bf5f0c65bc9450babdc443fa3f239a0dbe460f51bf46720f3f87ed3ebf508fea3ec89cf73e000080bf3b8b5ebc39d3a4bd3fe4fb3ff822ffbdf36f33bfe6c7333fa6e023bf1cf9183f3c38f73e000080bf00000000bb98a6bdffecfb3f00000000f30a35bff4fe343f900a2bbf46ab063f33b4063f000080bf00000000db51bcbd344bfa3f000000000e0853bf72eb103f734849bf0517b33e1f65023f000080bf0000000085078dbd793efd3f00000000d0310fbfb134543fc5960fbfbbae2f3f1619ed3e000080bf8ca11c3dc7d6733d8626df3f8114363fa211833d753433bf22f30d3f6ec429bfd7b4003f000080bff912aa3cfa29ae3d2dffdd3f26aa1c3f4a3ff13e429c22bfb93c483f1975f5be8dc0cb3e000080bf48c4943d98da523df20df13f5b31713f48f2a03e9023ee3d68899e3e00fb72bfb585693d000080bffacf9a3d548c333dcfbfef3ffd7e743fdd39953e7fe25c3d9631933e778574bfde10913d000080bf431ea13da71f143de2cdee3f0df6723f4f3d9f3e29824e3d6e269c3ece6e72bfc38cce3d000080bf4436b0bd6bba9ebcfb76ea3fd17423bf7d3a11bf4a2405bfbe2df3bed37a523f9ea0a0be000080bf4624aabd41b797bcb9c2e93f79896abf0dc206beddd6c1be65d501be10c07d3f22861abd000080bffe64acbdd7a6b1bc7041ea3fd8536ebf94e227bea106a7be638328be326c7c3f4c57d4bc000080bf6c3eaebd896187bc7500ea3f884a19bf42a807bf91bc19bf6b18e0be922e583f70129ebe000080bf349fb3bdefe27dbc800dea3ffc8139bd9fa842bf2fdc25bfc3fb11bf105c0d3f0ab31bbf000080bfa88bb4bd6a8995bc8d7cea3f08c283bd44c350bf434013bffb160cbff0c5023f9abb29bf000080bfe6ccb6bdc977a9bcb306eb3f94c266bdc7aa67bf9cf2d7bead1427bf3cc5b43e8f9c2bbf000080bf1618b2bd2e1ab2bcb709eb3f366c1fbf600028bffe22dabe4a080bbf4529413fb99fbcbe000080bfad84aebdbb62c6bc93e3ea3fd7816ebf9bd369be53ae90be21526bbec90a793f9b01e9bc000080bf70ecb9bddb6d97bc6154ea3fd4c1973e6b424dbf90d704bf2af01dbf540e823ecbb03ebf000080bfe8ddb8bd925c7ebcbceae93f1f828c3efb2a3ebf67521cbf81c616bfe686be3ea0a637bf000080bf1288b7bdd34e4dbc357ce93f0f9b2f3e29c53dbfcd1e26bf82800dbf4017f23e6dac2fbf000080bf562cbebd6ea381bc00c4e93fc0e1843d99a833bfa79c35bf57822bbf6013fe3e935b0dbf000080bf49bcbcbd0bb350bc016be93fbbe195bd07141fbf92b247bf6e8713bfdc2a2a3f766df3be000080bfc284b1bd3cd94dbc4b90e93f99e359bdf1523dbfa4c62bbfecf905bfe3c9173f68ac1cbf000080bf2238aebd02bb1abc321ee93fd502583c647c36bf528233bf1c5288be12672c3f0e8b30bf000080bfd881b3bd7ced19bc6b11e93f1fe2593d951f39bf804b30bf5da199be456c253ff4a333bf000080bf00e2aebd1f4ab4bb228de83f3304f3bbb7621dbf7ce549bf0a861dbd29cc493f46371dbf000080bf9a60b8bdb98c1bbc3412e93f94935dbe6b7211bf56414bbf66388fbe0ab2503fdbd201bf000080bf9291b3bde04db7bb1f9fe83f5542a7be5a4ff0befb0252bf38bf1cbdb3b35f3f4b2cf8be000080bfe831aabd8b1bb7bb499de83fd66a1e3e124726bf7b933ebff4d8ecbcc90d403fe81a29bf000080bf5244a6bd8f39cfba4148e83fd02d9f3e004ab3be983262bfc4d8243e07856f3fd8d8a0be000080bf3a59aabdbb2bbbba9339e83f6400913b03cb68be5b4b79bf2809373ef253753fe44164be000080bfabafaebd7b2fbeba5244e83f7c8ec2be5f83e2bc00b16cbf380b853ea4c3743fc8a30abe000080bf126aa6bd0ce9f03a9e40e83fcca1563dbfe5b73e518a6ebfdd0ac13e185e5b3ff7f8b33e000080bf0309aabd1631ec3a844ae83f4bb69ebeed69033f0ddd4cbfc76ede3ea13e533f41dab83e000080bf3d44a3bd7cb8e43a444fe83fe4aece3eb73a453e39f764bfde27a63ee945623fa772ac3e000080bff33aa2bd1250613bcd77e83f7797ba3e96880e3f81173fbf7e33c43e0b12243f15462a3f000080bf19ada3bd07cf843b8c82e83ff1a01a3dc9a5493f596b1dbf5449d03e1dc90c3febbb3a3f000080bf53b0a6bd5d6a843b938ce83f625a84bec6d7543f72d4fbbed8e7ee3e74a40d3fd9a5303f000080bf8412a6bd4837c2bbf5bbe83f7bc237bd08180cbf1ef555bf34d7503da992553fed8a0cbf000080bf9773a9bdf67e23bc3a24e93f8aa2adbeeacd06bfd99047bf603b28be2e5d593fbf8700bf000080bf7cf1a5bd62f632bc4303e93f914e4fbfcaf2e7bddb5f13bf3cd0033db49c783f06ff71be000080bfe8dba2bdc4edd0bb35b5e83fb2882bbf7d8a21bee2b039bf9362183e0fc46d3f28ceadbe000080bfa20da0bd9faeeebaff75e83f04a206bf47d299bd42e358bf314e583ecf0e743f23d15cbe000080bf21cba2bd5bd1e6ba2b6ae83face98d3e0696afbebec465bf66ac443ec45f6f3ff68e98be000080bfb708acbdbb615bbc2b88e93fef9104bff62304bf89a42ebf4cf5b4be4af55a3f5afac1be000080bf541fa8bde14474bc6155e93f984763bf8c93e4bd9c97e4becd109ebd7e157e3f0cd1c1bd000080bffdc1a0bdbe86e03a9c6be83f65dab63e053a1a3e0dfd6bbfca60993e67936a3fc812883e000080bfaed59ebd71e4013bd671e83f7df716bfe7a9483efb9148bfbec83c3e7f277a3fc359d83d000080bf444e9fbdbaf59a3bbe9de83fb0ec3fbf36da9e3e1aa415bf4db3ec3d7f5c6e3f5223b13e000080bfbb7ba0bdd97a863b7397e83f6922293dd98d223f3a7c45bf31cd983ec09f3a3f1bb41d3f000080bf2029a2bd8bdea93be3c5e83f399283be6e554e3f428208bf64f8ba3ef782173f66f5373f000080bfbd53a1bd81ccce3b68e9e83f55ff4abf5d6fd03ebf17e8be2070313e222d5d3f8211f23e000080bfbc5ca4bd431ceb3bf168e93ffb3c55bf40dbe83e4a5ea1be04a5b93ee1fe603f0eb59e3e000080bffe0ea5bde335af3b13efe83fd4d2cebe019f593f5f02adbe66cfe33e785d013f42473d3f000080bfe2aca8bd4ca59f3b350ce93f587afebe0ae0573f148a51bebead043f3b8bf43efd9b353f000080bf4a5fa8bdd8d7ba3b0f9ae93f621430bf5812313f047b61be66930c3fa2b6313f8043ee3e000080bfa1d8aabd9198a03b34bae93f38ea24bf8b2e403f0df215be0b11233fb3ee213f1e98e13e000080bf431facbd43e3893b9e5ee93f2bfa14bffa504e3f40c3debd8a59063f5addf23e62f1343f000080bfd4f0adbd3291523b12fbe83f641821bfe716423f92fa2ebe11a0103fe9e3183febc0113f000080bf2462aabdd3f9703b71a9e83fa9dff2be2fb14f3fb0f6aebe16ad063fa18e123faffe203f000080bf98f6adbd94a0bf3a1970e83ffbd917bf0182193fca8509bfebc2f73e22804c3f39f7b63e000080bf3ae8b2bd3546ebbaca6ee83f23093abfdb02273ee2d42abf786da13e7736713fd98ae7bd000080bf65dfb5bd2a3bfdbabfd7e83fff9f5fbff35dd13e343187be3c7acd3e8179693ffe7fad3d000080bf3563b1bd503a913a11c5e83f27c43ebfcb691e3fd88a7ebe94c3073fdaa0463f6df0ae3e000080bf7aa6b7bd0c23bdbb41d5e83fcba644bf8b036bbd543e23bf80a4063e78ea753fadb47abe000080bf65fcbbbd25e91abcfd2de93faa343dbf90f2c6bd67a42abf99096bbd41ba7e3f69ada6bd000080bf7a8dbdbd1a860fbcb877e93f6ff96cbf7a8aa93eb9523bbe07088d3e51e26b3f51518c3e000080bf5c00babd9563b2bb7f31e93fa9ac6abffcdda93ebb0a64be8df7ac3e73ee703f9c423c3c000080bf22c2bfbd8f394fbce57ae93f9b7d3ebfc30b4abe1c6523bf2b8289be2a90763fbdc37b3c000080bf4e80c1bd8f8a7fbc5cc8e93f5fbc33bf39c6a5be275c22bf092eb4bed89a6e3faaa3b0bd000080bf62d8c1bd66bf6ebc2ff7e93fe8f373bf5c02903eeaa3e7bdcc9b4f3ec0605e3fad6ee73e000080bf8941c0bdb49341bc95b5e93fa6e974bf1642893e8963e8bd9d71493ec3f7613f7786da3e000080bfe4d6c4bda96997bcd330ea3fcee837bfbddab4be516a19bfadabb0be7cd16d3fe92109be000080bf85cdc0bda4349bbc562cea3f4de2403d811c4bbfee5b1bbf505829bf3465dc3e92351dbf000080bf32e8c4bd8b37b2bc66c1ea3ff901a6bc8cdf64bf8223e5bef1c534bf71cca83ee66a20bf000080bfb246bdbd957fadbc61e1ea3f8b2b7a3e36ed67bf6d06b1be4e0723bf0bb1f33d270343bf000080bf1d57c3bdb8cebfbca59eeb3f2d833b3e2cfe75bfa3a354bef8de48bfd39b7fbc45a71ebf000080bfbd36bbbd588cbabc62bfeb3f03418fbc16a475bf3ee58fbe934158bf8a7f283e375d02bf000080bf81b4bfbd2906c8bc6094ec3f3e05ad3b02d47cbfa69a20bee2fc77bf8ebd0a3dffcd7bbe000080bf3fc7c7bd7a6ccbbc1c79ec3f03ba023ede157cbfc4c3f2bdf2146cbfc64497bddb5bc2be000080bf096fcfbd44c4cdbc475aec3f059a18be3f0b79bf3f7235be4a756dbfdc694c3e75b7a1be000080bffb20cbbd4be7c3bc4e80eb3f1b03cbbdc55b72bf67e69cbe17d54ebf8e3f833e87d407bf000080bf2b18b5bdc713c1bc72c1eb3f56ee0abf501d43bf1cb7b4be31ff3ebf5f65213f495d5bbe000080bfa52eb9bd99f0cbbcc590ec3f6527d7be980361bfc2e366be31e667bfdc83d73e9f0b423d000080bf8e76bcbd6aa2cfbc5168ed3f5bae89be197a76bf8144d9bc9b6e6abf12f87c3ecc35a23e000080bf0d33b4bd9220dcbc7e72ec3f401d5fbf3e43dabea41378be5392f5bedf04583f936d763e000080bfc615b7bd76dddbbc1a4eed3f987650bfd26d12bf9902cabd99760cbf3701343fea8de73e000080bf23a3c3bdb439cebc3b71ed3f4042573d8a9a7fbf694295bc25047fbfa8ef5bbdbeb68d3d000080bf7bbbc5bd5beeccbc083cee3f5082e83d65327cbf3bf1033ea38670bff1a983bdd530ac3e000080bf76e3bdbdd5b1cabc4436ee3fb3b2ccbd60cf7abf75ca313ef5dd5bbf5435313e9ed5f63e000080bf23a2b8bd8482d2bc5f26ee3f34ec35bf1fb231bfbb32eb3d667204bf7a4d203f4a52153f000080bfc6f8b0bdee7bd4bccba1eb3f31ff68bf241a9dbee9858ebe1feda8be3875713fae0e203d000080bfada6cbbd8cd6d1bc855ced3fa9b2c33dbeaf7ebf5f2208bd49dc7dbf19e4bcbd7dc1b8bd000080bfddb3cebdf5f7d2bca92eee3fa6f1973d36fb7dbf76e2ce3dfcc97abf0b625bbd331b463e000080bf4433cfbde318c9bc3604ef3f7fe26e3d6b9272bf94e5a03ef7eb55bffce8003e1be0083f000080bf4e9ac6bd1539c4bc9cfaee3facda3b3e4ea36dbf47a2a53eba4e4fbf40a7333d39c7153f000080bf1955c6bd1cb6adbca7b3ef3f3f7a913e05f53dbf76701b3fec5f14bf913bbe3edbab393f000080bf4c1bcebd342db1bc57d1ef3fc072b43df40045bf78ea213f5fdd1abf371ded3e96d2253f000080bf029ed4bddf8bafbc53ccef3f80f29abedb4c35bf954a233f888706bfc2ab2e3f781b023f000080bf556ad6bd9127c9bc3cf7ee3f9d3d93be7e0a67bfcc25a43ee32b44bf42d2d53eaffbf93e000080bfdb34d6bd3200d4bcad14ee3f813a7cbe70b277bfc6a2653d3e2370bf0e4e813efdfa723e000080bfa1dbcbbdc02580bc0b62f03f7f59033ea3eae0beb59e633f2926b4bed06c513f44ede83e000080bf1ec6c4bd55df79bc793bf03f25f6b43ebbbee6be74da513faca1a5beb36a433f84240f3f000080bfb4e8bdbd39d46fbc070af03f08a7ba3e92a3e0be5843523f380779be4c7b4e3fbdee093f000080bfc2f7bebde19ba6bc3f8fef3f593d863eb8d735bf9539273f72cf0abff32be73e9067353f000080bf7cb7b9bda14ca3bced82ef3f995aa7be87a222bfc91e333f0075b2be43ea443fc01b093f000080bf12c1b8bd03426bbce1f1ef3ff8f93cbe1f82c0be9476683f7e0d0ebe7fb56c3fe596b53e000080bf616cc1bdfeb8fdbb0e84f03fa9eabc3ecd6a42be42eb683f01d9debb39747a3fbae0533e000080bfbb2bbbbd008bfcbba94ff03fe9eedf3e962a51bedf32603f8406403da24b7a3fde89513e000080bf107ab6bd6058febb8c2bf03fd0b1a7bd1522c1bde3fe7d3f109adb3da4287d3fc19ed23d000080bf0f47b7bde5d44ebaee41f03f7549013fd8f1a33d88005c3fb3b99a3e40906a3f10a086be000080bfe657b3bd50fd83ba3f1ef03f99c1c8bc039b763ee362783fb3db983ee8926d3f222664be000080bf527cbcbd7d7816ba9373f03f22fac33e7939063e901c6a3f2e907d3e5169703f6ef773be000080bf12f7b8bda661783b062bf03f6bfacc3e1d7ab63e861e583fc5c2da3e950d3e3fe91a04bf000080bf5664b4bd97e2aa3b46ecef3f6827f53e1c73e13eb76e423f8659d73ea4f1243fa78223bf000080bfd0eeb0bd82aca73b37c7ef3f82c4e5bc4296133f2f0d513feeaee23efe553d3f6fc601bf000080bf6407b5bdb3ef0a3c1d93ef3f674a443e66124c3fba91123f4e4f133f1938c33e883939bf000080bfc6f8b0bd6213193c8940ef3f676680becbab503f76ae053ff89c0e3faf0b103f125c1cbf000080bf1ccdb1bdd7c1413c6075ee3f4af841bffaff253ff3e1963d8c58013f5881273f570a10bf000080bf03b2b7bd12fa193c7c47ef3f63b2a8be4ded693f844b733e1400253f109bcd3e8b8f26bf000080bf8bc6babd72fdbb3b4d15f03f1382c03dd6612c3f0cba3b3fedf6ee3e48ed1e3f864021bf000080bfccb7bebd2a38bc3bcd05f03f2606b6be5844463f99f3053f0216083fedc4203fa87f11bf000080bfafb3c1bd4704e3b9a08bf03f7852993d409a8f3edff9743fc4058c3e90c46a3fb09294be000080bfa2cfc7bd7b32ffbb34a0f03f3993f03dd872d9bd38c57c3f5b5036bdfb217e3f2777e53d000080bff987cdbd1b4902bc889cf03fdd4593bef801403d14e3743fa36f273c92b77f3f90e93bbd000080bfcbdbd1bd121780bcc861f03ffb998dbe853ab6be2685643f06ce87beaccb6b3f70f4913e000080bf69a7c6bd45f215ba6a86f03f9d71a2be3ed6dd3e36f4573f0a7da23e0602633f3014acbe000080bf63eebabdb1a8083ca916ef3fd0f23dbf83c2283fb4e3f9bd64dc193f86cc123ffa850ebf000080bfbfeeb4bda2621c3c7d3cee3f35d15bbf97a7f03ef34a51be526efe3e90712a3f777b0ebf000080bf80f3c2bdaab69b3b08e9ef3fe3e936bfda572e3fcb19243ef8c5093f2c6e2e3f1efffdbe000080bf1d90c4bd3526443b55a1ef3f7bc959bf8673dd3e84e698be8d6f063f0029393ff398e5be000080bfec68bcbd8010c93bf8e1ee3f61a75bbf9f8aac3e1173c6bea175013f5fad2f3fa0d705bf000080bf253bb6bd2026e13b211fee3ff33c6dbfe331143e368eb1bef12ca13e608e4d3fd09101bf000080bfd0d2d5bd44157ebc193af03f0d2950bfabe2c8bd23e2123fd2f726bc20ea7c3f21291e3e000080bfbbb9d8bddc66aabc62a2ef3f97be4fbf8f8ac9beb61edd3e36b156be8ad0623fffc1d33e000080bf4e60dabdf4dcc2bc31d1ee3f5f2d5fbfa69bf0be2cb20d3e2027acbeb887473fd454073f000080bf884cd9bd99f2a1bc3883ef3f272279bff2796a3e9700b63cb312623e5a03673f1778bd3e000080bf7979dabdf702b3bc22e0ee3fe05b71bf9a4ea53e93c2a9bd73077c3e5d8b573f91d1f53e000080bf40bdd9bd1151ccbc44f8ed3fdae864bfabf2dabe94c107be56f9dfbe807e453f2591ec3e000080bf41bad8bd433abcbc0804ee3f026d5dbf4397eb3ec92a4dbe9717a43e274b503f2757f83e000080bf4833d6bd7381cbbc1b2bed3fb34463bf5ac6c7be110b7abe0866e7be75e6563f03809a3e000080bfb8cdd4bd5bcdbabcb939ed3ff8da52bfe02f093fa5fa3dbebd97ca3ecd05473feb51fa3e000080bfadf9d1bd287cb6bc1b64ec3f3ea156bf01a0063f3cc212be981cd53e1398493fd1bce83e000080bf2732d3bdbea3c6bc5050ec3f309f60bfc91ec7be01ca8fbee416debe7caa643fe83ff23d000080bf4433cfbd4068bdbc0f7feb3f5dd051bf3dcec4be778ad9be125fc9be39ac6a3fadaf90bd000080bf2f6fcebd9416aebc8d98eb3fd91458bf718bff3eb2c248be7158ca3ef27c533f25a6cd3e000080bfe318c9bdaca9acbcd2c5ea3fbd1340bfc143c4beb5e209bf3f2db0bea40f6c3fa52d35be000080bf8ee6c8bd36759ebc47e7ea3f188f5dbf3343ea3ed9ea50be695bba3ed7a75a3fc631be3e000080bfa2d0d2bdcd1fd3bc683eed3f33ca3ebeb42c7abf00a2cfbd0abd7abf327e453ed2de71bd000080bf7503c5bd8def8bbc9f59ea3fa3a269bf3006c13ec4c921be3027953ed8f95e3f668bca3e000080bfd11ecfbdb970a0bcf181ed3f0ecf54bff17d083f5fea20bef3e1ef3e2c00533fbad5a23e000080bfa0c5d2bd5b7b9fbcab5cee3f5f3048bfcf27173f62724cbe2fde0c3fcbef4d3f7c2a653e000080bffdc0d5bd433c92bc2252ef3f16ef48bf2f080e3f22428dbeb9c6063f01fa543fae6f333e000080bff339d7bd473a83bca3e6ef3f1c6673bf64b99c3e6f8145bd4aaf983eda35723f8f1e013e000080bf56f5d2bdcb6523bcf434f03f952d6ebfa2a2ae3eef9109be7789b93e013e693fc41e49be000080bf99d7d1bdc05c0bbc857af03fa5fd4ebfea8b653e73460b3feb57433ed179793f74b5f1bd000080bf4a07cbbd8ca19cbaee5ef03f6c1543bf4060023f90bfcc3e75e4c23e7d185a3f421db8be000080bf8465ccbd68252dbbfa08f03ffe6063bfadc2c83e4f3b75be8226ea3e8ffe4d3feddcc1be000080bf0403c8bd3a419bbb645aef3f4b6f58bfb676b23e162bcfbe619dfc3ecbbd4c3ff214afbe000080bf8c82c0bd80996f3a7501ef3fde0752bf8295a63e32b6f0be67c1043fc50d453fcd98bebe000080bf7fc2b9bd836b6e3b0989ee3f7ffe58bfee592f3e7a8f00bf7e39d33e22d24e3f2779d7be000080bff6d2b4bdbd8a8c3b87feed3f451d6cbf946223bdb5cac4be15522c3ed79a5a3f8d20fcbe000080bf15acb1bdd97a863bb64bed3fb3db76bf33420dbe6d8367be100be0bc69a4663f1cbbddbe000080bffe81b2bd8600e03b724ded3fab5179bf0e021d3d771365be35160d3eb012623f3aa2e5be000080bf2f17b1bd2d05243c554ced3faec46fbfabc19a3e018a35be9646b33e8eb5533fa136e1be000080bf68caaebd37fd593ce350ed3febb16dbf051bb63e7693dabd8fb8bb3ea21d553f52add4be000080bf5bb5abbdbe335a3cf914ec3f296875bf594a7d3e255110be0e098f3ea7a0693fedd498be000080bf48a7aebd17f11d3c9066ec3f36b775bf5893773ed0d111bee2c48d3e7bf5653ffab3aebe000080bf8926b0bd9ca6cf3bcf84ec3fa6867dbf9dfdf7ba72010ebecc9e463d6b9c6e3fc6cfb7be000080bf7e55aebdde93073ca3c9eb3f70db76bf740b793eecd2d6bd3334863ecce26e3f78ee7bbe000080bff06cafbd0d39b63b5ef2eb3f7bf57ebf133287bdba237bbdb65641bd5b44763f72bb89be000080bfb43cafbd420a9e3bef8deb3fa15c7abfe60143bea9f1aebde32733be8a9d783f61e825be000080bff19faebd2905dd3b1363eb3f68cf77bfdb024c3e47321cbe9f22643e9c4c763ff4fc20be000080bff030adbd03b6033c2444eb3f725f6bbf7ff6a93e0aeb57be603cba3e7ff16b3f25520abe000080bf616dacbd6edf233cf27deb3f32516fbf2c42a13e47ea27be1b64ad3ed9fe6d3fcb7c14be000080bf44faadbd90a24e3b1008ec3f2b3774bfdfb590be7672cdbdaa1d80be64396f3fa3ae81be000080bf9c34adbd5fec3d3b77a3eb3f5f8d67bf02abd1be70e3f3bd95bbc5be3aab673fb1e836be000080bfbd54acbdc4b0433b8e5aeb3f6da960bf8c2fecbefab105bef2e8e2be9b6b623f838c15be000080bf3865aebdaf07933b4546eb3f59396fbf32129ebe8a9a35bec43f9dbe0a71733f3f1f18bd000080bf603aadbdbff38b3b3717eb3faf6e6ebffb25aebe6fe904be8125a9bed37e703f0fd1babd000080bfae12acbd96ec583ba01aeb3fff1974bf799e95beaf82963d874899be4d48723f5009f8bd000080bf054dabbd836bee3a9b1deb3fdc4c70bf045a223ed5c59c3ea55b013ec3017c3f5dc8fabd000080bf5bb2aabd9626a53a9961eb3f43ad7fbfccc1323d7bc3cb3c80a01f3dce507c3f117128be000080bfc87dabbd89d25e3a86afeb3faa477dbfcf06be3b20c214be0d74fe3c790c7c3f855f30be000080bfd9cdacbde23f5d3ab518ec3fe8ff7abf4f020d3d154b46bedef9993d3fb3793f973d54be000080bf8bc2aebdd313963ae8a3ec3fee8c78bf4572c23d952261be94791e3ed208733f3b028cbe000080bf014eafbde0136b3bc993ec3f159c78bf26e33abeac4a1dbef01dfdbd108b6f3f9529a9be000080bf3e23b1bd9acde33a9353ed3f9e0d75bfe383f83d047686be2e11583e59f4693ff993b1be000080bf7fa5b3bd33341e3bddcfed3fad836ebf4ff3ce3dcfa2b2be56df733ea82b653fd5dec0be000080bfdfdeb5bd726da83acb0fee3f8e3456bf035aa33ea9dee3befc8cee3ee781573f36838bbe000080bfc72cbbbd261aa4bae23eee3fcaf041bfeed3073fd9aac2beb707213f1ebf3f3fcd1c55be000080bffaf2c2bd97c5c4bb855dee3f18a752bf07f0073fff2a4fbe7fcf103fd69f4c3f17a54fbe000080bf36afcabd970252bcb37bee3f16a960bf2643e93e35e218be3759f23e16725f3f434af3bd000080bf0cadcebde0f343bc5490ef3fc9c252bff79edc3e932ebdbeb74b063f2783533f984352be000080bf2190cbbd71af4cbc5a9ced3fc80e6cbf5f82c33e463180bd85c7c33e0c8b6c3fdbbc783b000080bfff5bc9bdf56654bc6edaec3f5ef870bf73b5903ee2113dbeb9b6853ec6c8743f8975073e000080bfa1dbcbbdf4c29dbc93a7ec3f673257bf71bd043fcc5120bed918d73eb87e4e3f76e0d43e000080bf1f49c9bd27dd96bc45d5eb3f493053bf87910b3f8aa118bee3d8de3ebef1473f4a49e53e000080bfd89fc4bdbbd488bc7025eb3fb0df5abf2e8a003f432205be939cc93e41a14a3f0f4bef3e000080bf8e93c2bd007242bce57aeb3f95ea6bbfad919a3eb6027abed81b523ea09a693fba2cb53e000080bfd461c5bdcb2b57bc4f20ec3fdad16dbf58fe8c3ef83b7dbed5e1563e4738713fdc9c853e000080bfb2bec1bd9b7370bc4ca4ea3fc47866bf9426dc3ed1118bbd18dcae3e605d4b3f7696003f000080bfe353c0bd8ecb38bccbf5ea3f07dd6ebf1faaa23e20c22cbe7e3e613ec900603fb6cbdc3e000080bf5d50bfbda08930bc9da1ea3f8baf72bf40c69d3e3342a3bdf88c763e3ea95b3fbb41e83e000080bf7affbfbd30d54cbcb953ea3fb7ff6fbfcc26b23ec203b7bb57b5943eb38b4a3f17c7093f000080bf548dbebd278323bc2029ea3f2e206fbf38c7b63e9b07db3b93e0a43e7d8f553f2630e53e000080bf5931bcbdc1feebbb3601ea3fb74d68bf631fd73ea706a3bbfc47cc3e1e845d3f4e5b9b3e000080bfb2d4babd8e93c2bb8f8bea3feba860bf2277f53ed7fb4dbb8433ec3ee4a0583f9288883e000080bf12a5bdbdc5750cbcbf9bea3f4a6b69bfe556d03e2b6362bdbbacbb3eb3fd5d3f0aa2ac3e000080bfff76b9bd92088dbbe0d6e93fb94267bf9282db3ecf0239bc163bd53e7419623f9fd75c3e000080bf1adcb6bd5776c1ba53b1e93f7eb45fbfbd2ef83e55a11abd1b27e83e562b573f18d9973e000080bf68eab5bdff0582ba5f62ea3fd55058bfbd61063fbd62d13db74a083f01bd4e3f8eeb813e000080bf8d29b8bd55875cbb2e73ea3fc6d660bff0f6f23e6443703dfe55f13e28b2563f19ba8b3e000080bfc495b3bd1de4753ab0ade93fe57c4dbf27fa173f2fe369bd72ca093fd527433ffcffb73e000080bfc1acb0bd3752363b29d0e93ff15538bfdf25313f61a253bd954b213f6ee52e3f7602bd3e000080bfe4dab0bdd6c82e3b9068ea3fb49e47bf20ec1a3f464a243e1ee71f3faef8443f9dc8083e000080bf207db3bd2f16863a3063ea3fc90e4bbf1512173f12f2193e83be1b3f1fcb413fe217743e000080bf382faebdd5ec813b4b00ea3f41e12cbf930f3c3fa84286bdf1d12e3f9c08283faf2da43e000080bf4c51aebdea22853b9277ea3fc06f52bf9278103fe7129c3d3766103fe645533f53fadebc000080bf6ac1abbd5776c13b3195ea3f9f4b66bf4cf3d33e1e820ebee3b0d83e94ab673fe5b633bd000080bf309cabbd3543aa3b711eea3f479841bfef1b233fb97118be98d91f3f1d4f453fb7ce013e000080bff4c3a8bdf931e63bf818ea3fbca658bf16efef3ea1b581bea140f83ecfe45f3f4899feba000080bf029da9bdaa9b0b3c448bea3ff0a468bf1e92ab3e1bab7ebe77f7c03e40396a3f2cda13be000080bf87c2a7bdf0df3c3c7783ea3fa5cd71bf53435f3ed6737bbe1d988a3e09b7703f204a53be000080bf342ca6bd59341d3c87fee93fb42c6cbf8695883eb0bd8ebec957a63e94446d3f81c440be000080bf2cefaabd29771f3c3a07eb3fd7ba6cbfe0959c3ecb0a68befff1ad3ef17e6e3f8b2604be000080bfbfb7a9bd2d78513c772deb3fdb8474bfab5a683e29d242bec8c0873e2d02713f0c4e55be000080bf5c57acbd6e88f13b7ff5ea3f6c3f6cbf2e9e963e959b7ebee24ca93ed7a56f3f7f2ef5bd000080bf73f3adbda7b1bd3b7f16eb3f5f3578bf24e28f3d4c2b70be84f2b63d9e507e3f66da92bd000080bffa26adbd6344a23b60e5ea3f77307ebfdb627a3de371d0bdc19d893d0e007f3f4d996abd000080bfa62aadbd0038763b03d2ea3f358c75bfb8f93d3efd995a3e0df7273e6cd37a3f0d7ceabd000080bfd731aebd5e63173be1cfea3ff3fd4fbfed49d33efdd9d23e367bd93ea420673f7a9988bd000080bfe3a4b0bd1399393a7cd5ea3fd2222ebf84641b3f5863d23e06ec2b3fc8a03d3f37478f3c000080bf4183adbd0f7ba1386727eb3f45942abf0b041c3ff2fadb3e1e65213f69a4443fc103e5bd000080bfad8ab0bda8a78fba6729eb3f51e807bf2a23383fff6be53e81364c3f46461a3f4657b6bc000080bf46b6b3bd121354badee7ea3f335c2fbf1a60263f2792a83eee52373f620b2f3fc08a0f3e000080bf9d9dacbd0d6f56ba336feb3f976c41bf289e213f6102333e19ff1e3f2875463f270fecbd000080bf4819b1bd520c10bb0f62eb3fe8530cbfba324b3fd8f9863eb28f513f72e4123fda18d1bc000080bf2502b5bd969265bbaebbeb3f309701bff8c55c3f94fe98bb23785c3f3f7b013f24cf4c3d000080bfad4badbd4014ccbab9c2eb3f1ee841bfd7bf263fe30137bd10f2263fd660403fb9ddccbd000080bf03edaebd240ed9bab533ec3fbe2c45bf29f61d3f2e3a25bee877223f113e443f51a0c8bd000080bfb037b1bdf437a1ba8bc2ec3fb4124cbff059103ffd025dbede66183f4c2d4b3ff04c00be000080bfad68b3bd5ea0a4b9b56eed3f39e151bfcd57fc3e4f3a95be79690d3f5b96503f983834be000080bf179eb7bde1f082bb55dcec3fc0c100bff95c5b3f6183e7bdb2b75c3fdcaf013f0920833b000080bff4a8b8bdebe14bbb478ded3f121022bf7de43e3fdfda54be71b2443f5451233fe2d052bd000080bf8979b6bd707b82bb8542ec3fb626e1becde4643fea81adbd1c5d653fe2f5e23e1873e33c000080bf28b9c3bd3a77bbbb6d38ec3ffc7a39bfc650293f319b46be1888273fdb993f3f0149dc3d000080bff4febfbd75c8cdbb57b0eb3fc01c3dbf5f84223f3fe367bed91c193f99b6453f22295b3e000080bfea58c5bd368fc3bb20d1ec3fc5503bbf92f02b3f8b13eebd5c982c3fcefc3c3f751cb13c000080bf28d2bdbd65fcfbbbdf17eb3f2c7f58bfe067023f82f222be7cceea3e479e583f5bfb8a3e000080bf732ab9bd65c39abb651ceb3fb7543bbf857a2e3f65fb17bbf89c283f5b41353fa46a823e000080bf8122b6bd73301bbbe604eb3f872e39bf4ece273ffd2a5e3e41ae303f211e323ffeb94b3e000080bf7b82c4bda9c0c9bbce89ed3ff98e3dbfb2982b3f5f4349bdb3022c3fda903c3f2b409ebd000080bffdbbbebd52eebebcafecee3f5f72b53d326f6abfbd9ec83e4f733abf02ce553e1614273f000080bf9963b9bd3d9cc0bc97e6ee3fdbef07bf9a4a41bfadeec43e2fcff3beb32f243fc0011a3f000080bf4697b7bdc2a0ccbc02f5ee3f989177bf7f3368be5fc3ec3d294b19be7bc25f3f52a2ec3e000080bf560cb7bd50a5e6bcb422ee3f961c7cbfba0130be3641c9bc971e28beca34603f6363e83e000080bff2cdb6bddeb203bd0042ee3ffe6d7ebf5903d1bdea822ebdc233e1bd4bf9733f0081903e000080bfc956b7bd7458e1bc0c1fef3f827b7fbf920379bda6c2973c037d4dbd66b96e3fb91ab73e000080bf94a5b6bd9df7ffbc8d7fef3f3c397ebffa22e5bd6261143d3f2ed0bd29b6783fb3235b3e000080bf3b2fb5bd5e441bbd3d9eee3fdc057abf66535bbef30188bc0b8d5bbe578b773fcb250d3e000080bfc046b2bdf0e629bd3672ed3f913a74bf778191bedf31c3bda55b95be0511743f0f1c9e3d000080bf72ddb4bd61df0ebdb83ded3f20e57bbfb73103be0823febd709e19bea385783fbebe3f3e000080bf84d7aebd17782ebdb326ec3f15ef70bf07fa9abee8011abef9009ebe3977733fc3078c3c000080bff7c9b1bd04a312bddc2aec3f4da07abf0094eebdd2422bbe5c7809be5b697c3f46e7ca3d000080bf1adbabbdf5d72bbdabedea3f92ce6fbf930597be00f240be016997bed577743f909acabc000080bf6c0bafbd892610bd8923eb3faa197bbf9d42bebd803a2fbe30dbcbbda79b7e3fb4c9fa3c000080bf76c5acbde8bf07bdcb2eea3fe9187bbfd4d18abd20fa3abe892294bd44497f3f4c65963c000080bf4241a9bd9e0822bd0cc9e93ff7e16fbf463e86beea336cbe1ec483bef606773fef7052bd000080bf0ab5a6bd0c1f11bdf0c0e83f3f9471bfe8c146be433589be790145be91137b3f43bc06bd000080bf6267aabd8d7bf3bcde57e93f9d537abfbe42e2bc1b8354be15eb15bdbfa07f3f250c223d000080bfcb849fbd2a1d2cbdee22e83f598361bfd302bebe396296bef35eb3bef6b66d3f1cfbfabd000080bfaf089ebdf41910bd4e0ee73fdbc66cbf8bc580bec5f991be52986dbea2ac773f2f55cebd000080bfeacc9dbdcc25d5bc8943e63fea1778bfda92c3bdb0d368bedb8799bdcd0f7e3f9740c7bd000080bf3d47a4bd359ff3bc3feae73f23e674bfafd3d5bd593a8bbe9816e0bd27767e3f5d3f573b000080bf62f5a7bda0e1cdbc9fb0e83f34b679bf0284d53cbbfb5fbee144be3b66e47e3fe5f2bd3d000080bff165a2bd5b5eb9bc0b5de73f460878bfa680993c66c27cbea380103cbcc57f3f5edd283d000080bf66109fbdec176cbc960de73f92e277bf6be1113e351a52be9ff10f3e75627d3fd04fc33c000080bfc5579bbdb345d2bbb6f2e63ff89d79bf6a5a203e750221beb924343e2d347a3f86c6f0bd000080bffb5ba2bd2d405bbcf0fde73f11ec74bfb1793b3e069a67be42683b3ec69d7b3f77b4af3c000080bf2c499ebd7dceddbbaccfe73f1d2675bf3b6b433ec2f35cbe5ee65c3ee0b4783fcfffc8bd000080bf60e69bbd118a2dba9cc1e73f31737abf94b18d3d76e247beca12d13de42e7b3f74cf27be000080bf469d99bda8aa503a26fce63f13627dbf86021a3c42b911be098c1f3dea4a7a3fb04953be000080bf5682a5bde389a0bc3042e83f344b78bfb972cf3dddc262be77cc9e3d24927d3f0763e83d000080bf2c6b9bbd9248db3ba839e73fee9c79bfe97127beebb919be3b69e4bd0313723fd8789cbe000080bf7a8a9cbde73a8d3bdbe5e73f73ca7abfec71bebdd22136be968c88bddd947c3fc42b18be000080bf59a39ebde6e7063c4434e83f543c78bfc16931be9e8930be1c4a11bea92d793f527838be000080bfa9bf9ebd83a53a3c809fe73ffed878bf3a2a40bede6110be0bebf9bda3ca6a3f503fc2be000080bf006fa1bd2c0d7c3cb81fe83f5dfa7cbfbc61cfbd1b72ebbd56bf2dbda7e4663ff20edcbe000080bfcc29a1bd226f393c90a4e83f8c727abf78210abeb2f920be4de5c1bd5b57773f39a175be000080bf75c7a2bd52f26a3c1920e93f873a7ebff6600dbd44e2e5bd78c1643b0f5d723f76dda4be000080bf6cd1a2bd679b9b3c7eaae83f0e5b7fbf4283273cb1b18fbd0ca4223def7e663f8cd9ddbe000080bfefc6a2bda41db73cfa49e93fb4567ebf9c41b13db92197bd6175d83d1136713f67bda2be000080bf4565a3bdb60e8e3c849ee93ffe157ebf30420e3dd0a3efbd3190953dafe66f3fb0beaebe000080bf1406a5bd18609f3cd157ea3f10ab7bbf1b12ae3d0e2a26be9572003e0c3a753f183184be000080bf28efa3bd2121ca3cdb34ea3ff7a07bbf91890d3e15c3f8bd4031243eec9b773f19a049be000080bfd9e3a5bd9d40d83c0e60eb3fb14979bfec2a4c3e5e53e0bdd0a15e3e8916753f79bb42be000080bfdcbea7bd98e2aa3c5454eb3f19047bbf50ba0e3e55a20dbe366e2b3e9325763feb1a5fbe000080bf0952a9bd37ffaf3c9e67ec3ffe7c7abf4b52423e2132a6bd68b0523efb836d3f43599fbe000080bf5588a7bd2c62d83c469aec3f26b978bfe21a6c3e40c35bbdb969723e9343723fef4261be000080bf8f1ca9bdcf4bc53ce7c3ed3fc0c478bfc2aa713ea10b18ba63c8643e344d6b3f321ba6be000080bf1e19abbde4f8a13c2e8ded3f43da78bf36526f3e2c82abbc3d11633ee5c2623fcdbcd0be000080bfb089acbd76db853cec9cee3fd60378bfca4b793ed9823d3d9ccb543e685c663f2e5dc4be000080bfbfbaaabd546ea23c2cd8ee3f827179bf41bb643e9383d43cc6ad493e3a44673ff608c3be000080bfde54a4bdd7a2053d7de8ec3f832475bf92fd923e3d41c9bc3829933ed91a723fa4491bbe000080bf6d1ba6bd7ec7f03ce528ee3fa2a375bf10768f3e3303e73c9a828a3ecbe7713ff1873cbe000080bfbc3da8bda8e2c63c2a3bef3f749d76bfedb1873ea0a22a3d6c2d7d3e04f36f3f56877bbe000080bff67ba2bd2f85073da777eb3f958375bf04628a3e8eb2adbde2f88e3e79cd733f0335fbbd000080bfd7aa9dbde54b283d259deb3f307374bff081953e12c35dbd2ac8973e56b8723f8f16ebbd000080bfc7d79ebd04ca263d3062ed3f1aeb72bffe89a13e2d02dc3b3e6ea03e26ca713f6145cabd000080bf07b795bd79af5a3d0002ee3f9c0c71bfd839ac3e0d837e3c3bbfaa3e561b703f2952c3bd000080bfbe2d98bd8ec74c3d5a6ceb3f14aa75bf6b628f3eb042d7bc19d98f3ec028733f83a80cbe000080bf96b2acbdfc566b3c4dbaef3f107d7bbf43523f3ee804ab3b563f333ea4f06d3f4a48a6be000080bfb8adadbdfd2a403c5473ef3f5fd57abfc49a453e4483553d02ee2b3e9ca06f3fed549ebe000080bf4433afbd6adac53b0f0ef03f7ab27cbf8369233e670256bc2bbb223e276b773f567e4ebe000080bf780cafbdf12f023c6c5df03fd6757cbf7cb2233eb6e232bd2eab293ec3b5743fd45078be000080bfd7dcb1bdf6462d3a9cbef03fa6547cbfbc09213e21237abdc56c273e33cd7a3f71acedbd000080bf49bbb1bda8212aba7469f03f720f7cbf526a2d3e3ec230bd88d3303e85127b3f1babbabd000080bfa88bb4bd1a6ceabb02d8f03fba857dbf27820b3e0f03d9bcc0640a3eaa737d3f47e7203d000080bf8879b6bd6c0979bc51a5f03f2e5a7fbf18d18c3d5a01943c30fd903d5fe07b3fe015283e000080bf7b67b4bd1893febb467df03f0e077dbf036a1b3e80ffedbbc6221b3e07ef7c3fbb32f03c000080bfc268b6bd427b75bc8c4cf03f22037fbf0032a03dde01233d17f6ab3d8a3a7b3f8600313e000080bfbc1fb7bdf04ebebc0f2bf03feebc7fbf3c81a6bc6e82253d36ef18bc8b7d773f32d3823e000080bf4256b7bd39afb1bcedd3ef3f7ab07fbf30820fbc8881463dfc81c23bd299743f150d973e000080bfeaafb7bd562aa8bce09cef3f53776ebffc7256be1342983e6dbdbebda07c6d3f431fb93e000080bfc8b4b6bd48136fbcb20bf03fbe7866bfe4418cbd9e1adc3ec5a39e3ce2f27a3fd570493e000080bf40a3b4bdfaec00bce63df03f935261bf92e2e53db822ec3e0f1a143e8c257d3fbfc6103d000080bfe3ddb1bd92088dba882ef03fa0fc5ebf90d5853e88eed43eb1056b3e9312773f24ee00be000080bf0e85afbd5c21ac3bcbd5ef3f1abf5abf9c86b93eae96be3e59248c3e134e6c3fab5c8abe000080bf39d1aebd08e3273c073fef3f36875bbf573be03e002e8a3e4552a73e9a725e3fe14dbebe000080bf8676aebd5af3633cd270ee3f884069bf30e6cd3ef651b83dba46a93ef7fd573f2884d8be000080bf71e5acbdbaf6853ccb67ed3fbe3d74bf5f3e973e5ca34cbdf30b943e33425d3f6cb9d2be000080bfcd90aabd651d8e3cff41ec3fcc8279bf32da443e6c62eabd0686603ed2256c3fb6b8a2be000080bfefada8bdc078863cc845eb3f789679bfa4f9173e90a129bed6bd403e9885723fea9f84be000080bfd844a6bd2e01783c5472ea3fc85078bf0e73fd3d465a56bef092373ea00e723f011d8bbe000080bf8578a4bd5c1f563c1ad9e93f485379bf5e82c13dbd3253be0e6d173e4230743fe4c985be000080bf062aa3bd388a2c3c705de93f3cf578bfd202423d1a8b69be22d5aa3d57287c3fdebd1abe000080bf2711a1bd93fc083c7ee0e83fdf2276bf802230bd9b058bbeec282fbd88c27f3f7db3debb000080bf39b69ebd5932c73ba67ee83fff1076bffc819ebdb99187beea29b8bd02cd7e3f546b113d000080bfda8a9dbda8c7363b8c46e83f9de475bf7903ed3b7e658ebe7720d93cc65b7f3f115786bd000080bf4e0b9ebdb5c4cabaa83ee83f0e6770bfe822de3d0ffea6be7324303ed146783f3be330be000080bf5dbfa0bd2633debbe466e83fd0c06ebf06ba273ee29da4bebef1643ea131763f966922be000080bf1023a4bd6ff346bc9da1e83f400773bf2362203ed4818bbe42942b3ea9577c3f6fbb8cbc000080bf0bb5a6bd5c548bbc2de9e83f94ff77bf66f3e23d5b4363be0cb9c93d57327e3fbbe0863d000080bf62f8a8bd473eafbc3452e93f62227abfa2919f3de0d14abeb6276c3d98207e3f883fd93d000080bf643fabbda8cccdbcbedce93fb0527bbfb241383d04523dbe1106ff3cbc1c7f3f88089e3d000080bf075eadbdf859e5bc6892ea3f92227cbfb805c03bb52931be81b14ebbc3a77f3ff416543d000080bf4294afbd5e4ff4bc1465eb3f565f7bbf2483f3bc8d6a3fbe572e4bbd24557e3fa917d23d000080bfb070b2bd1f31fabcb249ec3fee427abfbeb19dbd42aa48be6bb9eebdf316793fdef44b3e000080bf545cb5bd9203f6bc2738ed3f246a7bbf312103be1a890dbe4d3b2cbef72b6d3fc969ac3e000080bf5ebd8abd5dc08b3d3d9bef3f90b962bfb4afed3ec68136bc9c2aed3ec2aa613fcc58bbbd000080bf7a5692bd9e95743ddd28f03f11436fbf3cf6b13ede519a3de5a9af3ee8db6f3fa90d88bd000080bfabce8abdb000863d9834ee3f7ac462bf8b6aed3ee64092bc9d29ed3e1699613f92abc0bd000080bf435782bde524943daf44ee3fc0604dbf02ec173fded184bdb1d2183f0cf94b3fc208c0bd000080bff91781bd435f9a3d324bef3fc13e52bfe2850f3fbfc2d8bde6da113fe5cf503f787ecdbd000080bf444d74bd02bfa63ded2cf03fec1e54bffc510f3f070c98ba59e00e3fd16b533fe39ea4bd000080bf630b81bd16da993d5ebbf03f7c065cbfdebefe3eac22f03d3faffb3e400d5e3f668a9ebd000080bf346587bdf6d1893d4776f13f754a63bf4aded63ef331413ee0bbd43e9b4b683f7d3b81bd000080bf263574bd967ea23dda1eef3f2c0c39bff507263ff63274bebd7d2e3fb6d7393f4ed9bbbd000080bf1d416abd71e5ac3d3dd1ef3f6d443ebf14b4233fa56a49be3b73293fc8df3e3f4bee9dbd000080bfb70761bdb988af3d478fef3f804824bf9e242f3fa872b1bebf713e3f52472a3f4ffa83bd000080bf364069bd80d4a63d4702ef3f34c221bf6ff4313f5a86afbed822413fe22a273f2f1c88bd000080bf3bc269bd5438a23d876cee3fc4b31cbf37ca423f94725cbec973493fd9e91c3f2b9391bd000080bf7fab75bd26fa9c3d575aee3f4b7a31bf6818353fd9f90cbe4b52383fd327303fb950b8bd000080bf2cd06ebd29419f3dfd9fed3f283824bf9316443f11622d3dc8c1423fa16c243f8f0fbfbd000080bf7a7162bd2fa4a33d2bdded3ff20715bfa618503fda0195bc4ea44f3f5a3b143f705da9bd000080bfc8a354bdebcda83d3650ed3f382806bf9c8f583f6e43ca3dae39573fd848083fad7acabd000080bfb45a60bd9a3fa63daef0ec3f5f5f10bff51f503f4569143e644d4f3fae2e143fe091c4bd000080bf18937ebdad4c983df147ed3fcd6f3fbf94e9283f4c11973dfc6b273f814e403f0b25b7bd000080bfe84b6fbdbd56a23ddc64ec3fdf3728bf22083e3f9f41063e17b73c3f124d2b3fac6bc0bd000080bfa96c58bda839b93d9755f03fafdc33bf9f2a333ff1c103be66c8353f1c89333f9d7e80bd000080bf8e3f51bdee62ba3d6404f03fbaf618bf5ff33a3f008fa9be9aa5483f497e1e3f234a48bd000080bfc7293abd2928c53d2a57f03f5f1bf6bec4c44d3f767ab3be63515d3f5a55003fc87013bd000080bf53ee3ebd5d6dc53d00aef03fffc115bfc2704e3f1542b1bd569c4f3f8139153fbc074ebd000080bf9fb044bd5918c23d1523f13f0b7227bf40fa3b3f35023a3e21623d3f56cb2b3f2d4748bd000080bf902c60bd0c94b43db9c3f03f496347bf9f521e3fa6d3d53dafb61d3f0f1c493f54e26bbd000080bf12156abd5cafa93d4c71f13f10074fbf26dc0d3ffa0a4a3ea1070e3ff47b543fa20f6abd000080bf462d4dbdde1db93df8e4f13f3c2032bf25f02a3fbb75873e1ab12e3f0ac13a3fd7753ebd000080bf22e828bd5724c63d213cf23f72a10ebf097a473f88fd923eb1354e3f9b55173fb9e728bd000080bf448c57bd72e5ac3d40dff23f69143ebf0abe203f02eb6e3ee9d4223fae26453fdb1946bd000080bfbf1333bd22abbb3d9854f33f323c1dbfa66a3f3fcd31813e2395433f0dbc243fbe5041bd000080bfacde21bd9f75cd3d9a5ff13fd9a500bf160f583fd002403e2fe45a3f156b043f4f1316bd000080bfc80afebc97add53d2578f13f4f8eb4be1f076e3f96f2d73d51486f3f58f2b53e81c5f7bb000080bf52d203bdbb2ad03d726ff23f31a7dcbe34c55c3ff101883e90cc633f2bfae83e51a009bd000080bfb8740cbd0777c73de8a2f33f9f62fdbe3b4c553fbaa27c3e7d785a3fa8fe043f4e822ebd000080bfc8d974bde8859b3dc24df23f10ba56bf370f013ff199523e5a45013f3e8e5c3febce56bd000080bf24f3c8bc919ad63d6877f23ff5f99bbeeb0c6d3fe16a643ee1dc723fe0b6a13e02307ebc000080bf0bebc6bc8bc3d93d806bf13fae3b6bbede1d793fbf8189bc4d26793fbf4b6b3e41dbea3a000080bfb158c3bc5cecd63ddfb3f03f433a26be1609653fe416d5bea7717a3f0acc4d3e26a44e3d000080bff78e9abc15aadb3d4e42f13fc5ea59be0861783fd3c2ecbd850e7a3f205e5b3e386737b9000080bfc61597bc8dbad63d5b7af03f986d83be9e62533f9b9500bfb086743f1590973ed706c6ba000080bf884b8ebc22ffcc3dcac4ef3fdc4d98be147c2c3f142a2dbf29d2693f0c73d03e9e1f7d3b000080bf0a9ec2bc4ab8d03d942ff03f437903befa23423fb89923bf3477783f08f5693e31ea9b3d000080bf1c18f9bcd707d23d9d71f03fd20a41befeb8513ff6a50abf018f773f2f84803e7a74303d000080bf19aff9bca8c4d53d16dff03f55e285be12ec6d3f456285be4eea753f72c68d3e35aec13c000080bf77f695bc4c8bda3d744cf23fd8424bbe951d773f67ca2d3e27a67a3f1102503ed07e27bc000080bf942ad1bc32e9cf3dfcbef33f822ebdbef922663f15db703e5c046c3facc9c53ec1ace6bc000080bfe0d65dbce414dd3d08e7f13f355908be590a7c3f6a32e93d30b77d3f5e2c083eeb99153c000080bf4ee534bc7c5cdb3dbcaff23f1a53e7bd5a677a3f4cca323e31597e3fdb65e73ddf09203c000080bf672703bc157add3df50ff23f626366bd41257d3fec310d3e3f987f3f7ef5633db6a0053c000080bfd68b21bcc080de3db877f13fa4e2b9bd9e4b7e3f5352913dacea7e3fa348b73d091cab3c000080bf59466abcce53dd3d4b05f13f7a437ebe3de3743f113a1cbefee8773f63ea7e3e6a6b79bc000080bf249b2bbc7885de3db0c9f03f0e6356be8a9f773f1cc212bee2397a3ff53c583e37cc2dbb000080bf74efe1bbbf17df3d3c2ff13fa6412abdd0907f3f1f02273dc0bb7f3fdeef263d0205a83c000080bf6a34b9bb488cde3d24a3f13f3783c6bc55997e3fe522d03db7ec7f3f8e99c43c03aa663b000080bf9c5088bbcae2de3d1261f13fd9ff94bb6a597f3fe6a1913deffe7f3ff5978c3bd866763b000080bf6f4f90bb4138df3d0d0af13fdd835ebc2fe57f3f0943ce3c55f67f3f58185a3c75c9313c000080bf5a820cbb8a3edf3da304f13fe801c3bbb0e37f3f83c3eb3cc9fe7f3fc6afc13be0b3c23a000080bfaef119bb13dede3d5c71f13fabfc0fbbf9457f3f98229a3de4fe7f3ffd2c2a3bd8caaabb000080bfee5696bbf226df3dfb93f03f876367bda4fd7e3fff118cbd30887f3f88d46c3d1d30903c000080bffb0711bbc843df3dbd94f03f5b83e7bc01c27f3f9d6207bd64e37f3f58b6e93c769cfb3b000080bff6e0eebb5804df3dc4a4f03f7362eabddacc7c3f67f2ddbddd2d7e3f2e3df03dabc8a63c000080bfcafa4dbb8a3bde3d94dcf13f528265bc8a607e3f3672e43deff77f3f0a00713cad25b3bb000080bf503a91bb2e1bdd3db260f23f740226bd15697d3fb2390b3e99c67f3f42432a3dbd789dbb000080bf30bc12bb34d6de3d0c20f03fb771a9bd54407e3f9681a8bdb4177f3ff76cab3df132093c000080bf684213bbbc3fde3d64afef3f99d91fbe94d47b3fd981b6bd1ace7c3fb11d213ef2a5e43b000080bf0e6c95bb0022dd3dc5b2ef3f1b4e8fbe9803723f972a2bbe114e753ff651923e0ffe403c000080bfa62897bb384ade3d6820f03f99da1abe450c7a3fc39a1bbedadd7c3f41fc1e3e195f753c000080bf94aaedbb0879dd3d9427f03fc3a277be93a86f3f61a582bee7ca773fa496803e8466853b000080bf943229bc22e1db3d7a37f03fd109b9be36805b3fd791bbbeb1416d3f3e32bf3e8af524bd000080bfdac61fbc6b31d83daabaef3f043604bfe5e83c3f6a6fdebe5f83553f33670c3fdb5275bd000080bf4260e5bb645adb3d1cb6ef3fee9acdbe21475e3f212295be55b6683f5448d53ec2553cbc000080bfad5365bc8f01d93dfd51f03fa66bc8bec2b54b3f579cecbeca30683f863bd63e33ba43bd000080bffae854bc15f0d23db4c1ef3fe89901bf6be8243f26c812bf5c74513f5ea3113f6e85aabd000080bff947dfbb7e8cd93da04eef3fda8511bf98264c3fb2224fbe439b503f4762143fac009fbb000080bfc6a695bb292ddc3d804eef3fee66d0be4fa7683fa4b2bbbd4e82693fb9c4d13e916a3e3c000080bf0a9a16bc8b15d53d984cef3f143d2fbfeab6253f04a7abbeb932343f9cdf343f438a95bd000080bfb4fc40bcf9f3cd3dec48ef3f800e2cbf11f60f3f88a3f6bedd522d3f01ea3a3f0cfbbcbd000080bfae0f6bbccf4ec63d1a35ef3f1c0005bf7e781d3f65d217bf33b2463f8946213faa33d9bc000080bf377689bc994dc03d9d02ef3f2faaafbe3886333ffff91fbfaf54633fae01eb3e0892e13c000080bf88a155bcb4ccc23dd4b5ee3f0fd947bf46fe153f4eab5ebe81d61a3fe5bf4b3fb324dcbc000080bfc3eb7abcd613bd3dc095ee3f2d6223bf7236373fee4191be96c73c3fc1942c3fb2da2a3d000080bf2fffa1bc1911c53dfb62ef3fb5ea29bed3562d3ff28837bf5921753f30a2913e3194403d000080bfe418c9bca0cac93d94bdef3faf13d3bd28ed333f292f34bf6175793f31715a3eea07903d000080bf3eeaafbcc9e5bf3ddd1fef3f870103bee5cf303f003636bf7a86793fa56f613e5b691d3d000080bfc6c5d1bc9ac2c33ded67ef3fde91a9bdc0572d3fe72f3bbf2b6a7c3f2524263ec4181e3d000080bf1339fdbcb50bc63d199aef3f2fb3c7bdb7fe353fac4c32bff7e37b3f2123323ee311233d000080bfb2d4fabc880fcc3d1efdef3f8bd90dbee5df403fa78d24bf529c793fc6ae5e3e0c59373d000080bfb1c619bd8d7dc93d420cf03fd8aa7dbe38bc4b3f8a710dbfcee4733f607f9b3e84dc283c000080bfa60c1cbd5e9bcd3d2c7df03f66fea9beffee563f1d23dcbed5956e3f3382b93e896e47bc000080bf73a734bdf953c33d03f0ef3f4846c9be4e144c3fa99aeabe8716663fc16ae03ebbab0bbc000080bfb7b32fbd0dd9c03d0992ef3f6ae699be1d894a3f245c08bf808a6d3fe855be3ea4c0e93c000080bfa6bf17bdb6ddc43d84a6ef3f79e22cbef370433f69981fbff577783fc0aa743e4cb2f33c000080bfb8291ebd1570cf3d77dcf03f358fdbbe47d3643fd11106beb31e673fc2bfdb3e80c8dbbc000080bf801049bda5d3ba3d6cadef3f668f07bff32d3f3f1702cebea237523fa2fc113f847cb6bc000080bf4ce141bdb29eba3d4e61ef3f9542e7be2e6a433faf76ecbe1c545b3ffff9033fba53683c000080bf2b314fbd255db33d851cef3fd5f30abf6156363fecdee3bef18a4c3f0ce9193f8c2749bc000080bf476157bda3cdb13d7650ef3fd4bb18bf32f8323f83c6c9be1d51453fa5cc223f39b81ebd000080bf17f75fbd7f13aa3d1ee5ee3f6db319bfaa73333fbe11c5be4644453fc4c5223fbd4734bd000080bf428f58bd7c44ac3de2cbee3f2d580bbfcb3c363f7a3be3be95334d3f35ee183f44ebcbbc000080bfc3b85bbda0c4a73d7a71ee3fde370cbfa85e483ff45997bee472533f9ce80f3f811c2cbd000080bfc59f61bdbea0a53d2472ee3f869a17bf39bb423f4e1e88be77904b3fffe41a3fb82724bd000080bf11285bbdd76fa63d44feed3f469613bf32f34f3fbdd2b4bd132c513f3c95123fc9bd89bd000080bff46c56bd904fa83d6f0fee3f77e60ebf8d99523f8503ddbd7567543f05ad0d3fd75495bd000080bf6efc49bdb01dac3d93aaed3fb7890dbf98da543f132360bd97c3543f45a90b3fb5dddcbd000080bf2f034ebd89a0aa3df588ed3f4a340abf877b573fa407d93b0262563fbdb1093fad99c6bd000080bf50a43bbd9352b03da411ed3ff695efbee683613f3d01913dc51f603f012ef23eeaa4cabd000080bf269d41bd0a6faf3d99c1ec3fa0f2e7be84e05f3ffb51313e2b4b603f13fdf13e4d1dc2bd000080bf57052abdd47fb63d9f59ec3f1ad7d2be58595f3f0eba863e578d653fa1f9e03e589a5bbd000080bf035b25bdb326b63dccbbec3f06a2c6be6d64673ff799383e4ad8693fad67ce3e3a4c63bd000080bf32aa0cbd6b0fbb3da9acec3f15a6a6bed0d2603f496ab33eb15d703fb21bb03e7350253c000080bfd2e121bd2671b63d1003ed3f190eb4bebdf26e3f8061923de7976e3f1367b63ef89788bd000080bfaed90abd529eb93d98f9ec3f70b377be3b2d6f3fd619863e2b19783f65c77b3e084c933c000080bfbd70e7bcd602bb3dcd1fed3fc44a56bee558593f5e67f83ea8397a3f6bca483ea9b4a03d000080bf36cbe5bc865bbe3d4ed6ec3f080e9bbebb5c4c3fc845053f3f20723f8d4aa33ec1727a3d000080bf5408e4bc49a3c23d0a6eec3fd67db9be1470503f6246e83e7eae6b3ffff6c63eb6a71a3d000080bfd1e80ebd4889bd3dee43ec3fee2ac3be4b195a3fc3ceb73e6db9693f11e4d03e24a09d3a000080bfedd6b2bc1c76bf3d9d28ed3f0f12ccbeac4f2b3f918d203f02b1653f8a36da3ea474ec3d000080bf5bcdbabc4775ba3dad68ed3f141691bea80e353f72ce253f58d1743f7795843ed1e30a3e000080bf863b97bc603bb83dc4cded3fa8ce07bf7a03323fe238f83e416e553fb50a083f60ac193e000080bfa4888cbcd1cdbe3d1d97ed3ff27b1ebfb2450c3fc105103f70f53a3f0e442a3f18991f3e000080bf1ae082bcc3bcc73d7e54ed3fe4262dbf63460d3f34c4f93ebf332a3fa1123e3f64baa73d000080bf13f3acbc3529c53dadc6ec3fea46f0be30c6343fa6bb073fcdb75b3f4687013fa8b5af3d000080bf66fb10bddd9ec03d7dbdeb3f5462d3be760e5c3fbb259a3e142f663f13ecdf3e485b80bc000080bf0993e2bcf792c63d16e4eb3fe96ad3be0a6d563f841eb73eb844663f1992df3eb3ea813c000080bf1d38e7bc24f6c93dc233eb3feebfe6beb6875c3f12b46f3e6b27623f3fa9ef3e023ab2bc000080bf424214bdc0cdc23d840feb3f4e46e2be4190603ff621403e32c3633f8822e93ea60608bd000080bf06fc1abd0cd4c23d7034ea3fc54ff1be8733613fd9a1813dbca0603f9c2bf33e137d89bd000080bfaa90f2bca624cb3d4650ea3fa96be9be9acb623fe402af3d2d0a633faca7eb3ec87324bd000080bf1b1237bde3fdb83d4433eb3f2628fcbe9a855a3fe5d22d3e59d15b3f0f25023f928185bd000080bf4f1c40bde430b83da25cea3f831d0abf5e20573f0022573dd631563f79c40a3ff40ba0bd000080bfbd8f63bd4d12ab3db2d6ea3feb2723bf48b0443ff382723d3a25433fe5cc233f40cbc7bd000080bfe89a49bdc4ceb43dbe66e93f175e17bfc9b24d3fbf518dbd5d2d4e3fe478153fff61d1bd000080bfa5306fbd7e32a63d72dce93fb0f934bfb14f343f31e183bd9ed1343f03c5323f1696edbd000080bf99a086bd61fc943d4ab2ea3fbc0856bfc46b0c3f85822dbcebb40b3ffc5b543f96dbf2bd000080bf31987fbd75749c3d4ca7eb3f0c5141bf9984263f5922a73da7c1243f485f423f21b5c5bd000080bfa27b56bdbdc3ad3dacaceb3f742d0fbf2890503f80d91c3e4d3c503f2d31133fc363b4bd000080bff0d724bdfc55c03de337e93fa33d02bfaf1a5c3ff8a134bde0d75b3fa2d1003f0cb0c5bd000080bf035dfbbc8eb6ca3dd82ae93f345fdbbe7101673fa3423ebd07b5663fa89bd83ef8bdc0bd000080bfdfdd4abdb8e6ae3d784dec3f38dff7bed8c6593fcfba513e57015b3fbc63023f7335bfbd000080bf4cc02fbdd2e3b73dbad9eb3f4636e4be324a5b3f4b15853e8afe603fb4a2f23ea5c05fbd000080bfbc0788bd21cc8d3d45d6ec3f416358bf0550073f5d92a03dee8c053f1a1a593f577ebebd000080bfdc4a8fbdca8d823d5c04ec3fdafc69bf92dece3eb541153dbbd5cb3e9e1d693fd31be3bd000080bf16ba92bdd0be723d978bea3fca4672bff241a43ef2411abd004ca53eb3846f3f433712be000080bf54258abdbe548c3d1c80e93f769f5fbfb09bf23ebb43e4bdb3cff83ed4b55c3f35c312be000080bfae7176bdcc819e3dcecee83f30c540bfab10223f1bc337be9a06283f5cf33d3f7ad50bbe000080bfe4e052bdac79ae3ded62e83fc3e425bf1a273d3f3c2b3dbe60e7423f7a8f223f660506be000080bf221932bdb027ba3d4a27e83f121212bfeac84e3f30c217be9e35523fade90e3f4e2bf3bd000080bfd2c912bd95b7c33daef5e73f91faf9be4f405d3f9612f8bd8c455f3f72def43e03fdd2bd000080bf7773f1bc3640c93d34a5e73f66eebbbe0c256b3fea6116beb81e6e3f2fc8b83ec8478abd000080bf4d8dd0bc10ebcd3daf82e83f1f2baabe4b366f3f521a03be7171713f7bfca83e60b121bd000080bf9432a9bcee75d23d662de93f2ee400bfba6d5c3f4c4292bde9135d3f6e74ff3e19e194bd000080bf9337c0bc73d4d13dbce4e93f318ed3be6ffe683f9fc2f9bc115b683f3659d13ee256c2bd000080bf1b6492bc93a5d63d85cee93fe54535bfe7e3303fa8e9143e5653333f809d363fb25faf3c000080bf095394bc8df0d63db268ea3f36240abf6397563f83b2a03dae1d573fe6c00a3fe5953bbc000080bf5f5f6bbc6cf3df3dce33ea3fdbaa4ebf07fbdf3ed1ceca3ee8b1fd3eddf55d3f953e563d000080bf92af84bca529e23decd7e93f8df74cbf05b46c3e73800d3f655e943ee1f6743f8a6ca03c000080bf86c693bc61cde13d2595e93fa12650bf6a72ac3dd875133f8eee003eead27d3fdd51063d000080bf618d33bc1a0eeb3dd872ea3f963354bf0487b03ed987e13e2048df3e7a37643f38a5fb3d000080bf542209bcdf39f43dceafea3f66534ebf99abd83e8aefd33ed203093f2fd7513fdcfd503e000080bf2d7a27bc8412e63d9df4ea3f88be5abf9946df3eb68d903e82cafb3ebaa95a3f8e1a2d3e000080bf72c204bcdbdeee3d9b30eb3f1af155bf4707e13e6e96a83eb124053f7970533fadca5e3e000080bf3b8f0abccafef93d724eea3f48d33cbf9a67d03e66ec093fe491133fc28b4b3f3401413e000080bf57b00dbc09a8003e2b02ea3fb7142bbf0ffa013f2f300b3f4177273fabc43f3f2316d63d000080bf770dfabbd7b6e83df9d6eb3f18f852bf7506f83e8051963e03340d3f5de34d3f408c623e000080bf8c6926bc654ce13db0a5eb3f0c374abf2b9c113f8cb36a3eedc61b3ffaf8453fc744363e000080bf04e360bc3febda3df772eb3ff97e26bf65b33c3f6feb3b3ed15a423f2985233f5aecff3d000080bf49d661bcf744d73db228ec3f705422bfca62383f380a903e0bb6453f779d1b3f01e73c3e000080bf405d5dbcdf00d33d74d9ec3f53cd2cbf313f273f608baf3e0bf6383f42f12d3fe9ce023e000080bfe29950bcb08fce3dbf87ed3fc4ac3ebf0c440d3fdd12c03e7a2b1e3ff85c483f867c9a3d000080bfdd0e8dbc4ce5cd3d8797ec3fb66419bf2243303fb72bd13e8697423f0643263f1946a63c000080bfefe192bc4888d23d33e1eb3f899f0bbf32da473fcd359c3e526f533f4605103feb40173d000080bf6de43abcb630cb3d8c2dee3f9eca56bf05abfd3eb442663ec740013fb7ed5c3fadde8fbc000080bf2f405bbc0eacc33d3116ee3f8ed254bf098ff63ebf0d8e3e5b2c013f5dfe5c3f60955e3c000080bfc3c334bcb0e4ca3d00cbee3f918657bf8ceb033f050a24be3e49083f5c78573f81fdb8bd000080bf651e79bceb35bd3d3016ee3f2c8f46bf6d84163fda1b6b3e27581f3f8ad9453f0c17fd3d000080bf94be90bc4911b93dd575ee3fa787d8bea20d563ff8d6b2be451b603f3ffff33eafa0a53d000080bf95869abc9561bc3dafd1ee3f50c36ebec1ee403f46521dbf330b733fc95aa03ede8bc33c000080bffcdea6bc80fbba3d94c2ee3f0534f9bd77d74e3f7f9613bf7c367b3fc3a53d3eeecc563d000080bfa3409fbc9142b93d118fee3f16fa00be7ce55a3f15c400bf46f5773ff6c25c3e58d7fd3d000080bfcdcea2bcee26b83d1870ee3f86f2e1bdb33a603fdc7ef0bedd4a793f1c60423ebd3e003e000080bf5b069cbcb66ab73d0951ee3f400e84befa5f683fea72a9bec32f733fe1fb993e452aad3d000080bf0fb999bc6ccdb63d5b25ee3f3bdbcebe9e37683fb8d3f1bd0971663f649cd53eab14003e000080bf9d9d8cbcb5a3b83d7120ee3fe4bd24bf46ac423f1fa2b23d165a433faee4203fee3e1a3e000080bf22179cbc0f44b63d7efced3fa47be5be922b633f3b23dd3df77b643fc1f7df3ed0efe03d000080bfadbfa5bcbebeb63da245ee3ffef587be2abf603fe1fecbbe99ba6f3faa92aa3edc2de13d000080bfa7cea3bc162fb63d9527ee3f4e7ea4be582d693fe0a984be0bbd6d3fde93b63e8d0ad13d000080bf05c4a4bc10adb53d700bee3f5bc6b5be123d6d3f6823fcbd51a66d3f29e4ba3efb90903d000080bfe351aabc3855b73d8d5fee3f486b53be2cdb513f13c208bfb555723f24689c3ee5c2d23d000080bf3293a8bc83a2b93d069dee3fdfa10ebd4918603f7ee2f6bef58e7d3f0db7c13db92dcd3d000080bf145cacbc6c09b93d0d8cee3f896352bd4efb5b3ffd4502bf70257d3f95a9eb3dc187c13d000080bf7804b7bc7022ba3d6caeee3f5703b93c3eb55f3fa2a7f8beb5e47f3f7f33e9bc113f9bbb000080bfdae1afbcb7b4ba3d7bbeee3fca0109bd5ca55b3ffa3703bfadd87e3fc1d3973d4c32723d000080bf2ec6c0bc5246bc3ddaecee3f01018d3be6aa553ff5ff0cbfbefd7f3f623aaa397f0f083c000080bf5a9bc6bc2eacbb3dd8d5ee3f8eb9033e81de663f4632d3be053c7d3ffdad15be46b135bc000080bf5053cbbcde59bb3d12bfee3fa68b673e8a67663fddc6bebe7e8b753f3a7f8bbeb4b69bbd000080bfd846bcbc2c65b93dd099ee3f7343673d75bb563f3aa00abfcd647d3f23abf1bda5fba2bd000080bff8a8bfbc5e9cb83d1688ee3fcbb3d8bdd4702a3f23153dbf088c7c3f3679bcbc7ff425be000080bfe413b2bc9e0ab83d8179ee3fedc2d6bd941c4c3fe62918bf153d7e3f401aec3d7c7ca8bc000080bf8c15b5bc5becb63d3869ee3fe68986be6860283fa3b834bfb306743fbc98943e3ae1acbd000080bf5309cfbc4b22bb3da3adee3fc883703d9fde3c3f64282cbfc57a763fa41761be22db20be000080bfd238d4bcb090b93d5aa5ee3f9dd194bed0cd9e3e8cb867bf8766713f88ab813e68345dbe000080bf54aac4bcd7c0b63d7c7eee3f9a46c0beb936c23efa7a58bfdbc34f3fe13f133f71b9d1bd000080bf1ee7b6bc0fd5b43d4453ee3f0fbe02bf400c123f99a824bf2eba253f895a3f3fed89183e000080bf5af3e3bc5216be3dbfd3ee3f6b6a1b3e421d5c3fbd9bf9be19a5773fb0006cbe44b1d7bd000080bf67d5e7bca7aebc3d10c9ee3f8cd237be162e9b3e4e976fbf26d77b3f7d5c6d3dee002ebe000080bf897a01bdaccabe3dd2e0ee3f7a219bbd8811a13e463a72bf91fa7e3f79d18c3d1bf568bd000080bf698a00bd8020c03d94eeee3f05d28b3d6663723f50faa0bea30c7f3f4e73a6bdcccde8bc000080bf0c9414bd82eabf3d1ff2ee3f4863d4bdb631743f373a90be65b37d3ff030fc3df291553d000080bf778714bdd097be3dd6e3ee3fc00339bc8a769a3e200e74bfba077c3fb55a2e3eefee2c3d000080bf01f827bd4850bc3d0ed7ee3f5a82913cfd5d963e2dab74bf7900703f8499a73e3db0f13d000080bf7fda28bd4d9fbd3d76e4ee3f97018ebe9e86663f007eabbe97f46f3fca09a93ea63be43d000080bf855c29bd4512bd3dbefaee3f7986b7be247d6a3f61a2383ef7e66e3ff757b13e9acdc33d000080bfead114bde450bf3d7409ef3f278903be5c2e753f51c5833e3bc97d3fa591ef3d7ea3733d000080bfd65200bd0ea0bf3d7405ef3f3922e33d96667a3ff231343e54467e3f75b3ebbd38b5603c000080bfc82338bde469b93d8ecbee3fc80ed9be7eb6483fec22e8be1340553f63b6083f2e0e143e000080bf7cae36bdbe2db83d5cbfee3ff8c13c3d83f1903e7c3e75bf31b65a3fb7baf83e5e163d3e000080bfe2fd38bdcc06b93d21e0ee3f2e2210bf3e83533f44839cbcb60f523ffbc50f3f6c8ad93d000080bfd90844bd6404b43d62beee3f2abe2abf4e7e323fb08186be8c6e353fbad5333f585d853d000080bfd6c442bdf25bb43d79adee3f32acfabed26a273f73a413bfd7013d3fffad293fe7a2ff3d000080bf72e140bd245db33d48a3ee3f7e928e3d8c92983efcb773bf1543513f1ead073f5b14673e000080bfbb0e15bd7afcbe3d9223ef3f5ab901beca627d3f6ad185bdd1457d3f1bfb053ec0b8823d000080bfa4e029bd62bebc3d1613ef3ff011a2bee7be713ff6e1b7bde707713f8c0aa63eb739bb3d000080bfc4d02abd2e1bbd3dad30ef3f952377be50835d3f4af3e0be43bf723f0ff79c3e7dc4a93d000080bfed7e15bd5185bf3da242ef3f0b13ddbd08c55e3f6d23f6bef9677c3fe0671f3e5b5b773d000080bfd31100bd946abf3d2220ef3f2cc24c3d19377d3fa0a90dbe84a57f3f479641bd82dcbb3c000080bffb7dffbc5a12c03da33eef3f0043b0bc80aa583f993d08bf4fae7f3f14c22c3d6cb1da3c000080bfa61349bdad87af3d3690ee3f41e0f4bec1a81f3fbf481ebf6757413f5fc1263f332f953d000080bf4cc546bdf20baf3d4c89ee3f565a213e5403e23e512362bf442f6a3fae188b3e920e993e000080bf56d24abd19e4ae3d149aee3fd12024bfcd26213fecbfe0bee570313f6073383feb44ab3c000080bf3a954cbdf60dac3de76fee3fbcd426bffd4a353f3c168bbefb523f3fcf20293f6c9b90bd000080bf1aa24abd3b01ad3deb6eee3f60280abf7d534c3f4a1a89bef194563f9fff093f4726a9bd000080bf1a3048bdc6e1ac3df46cee3f637eef3e42fa613fbf0137bd40f95e3f774ee7bedeb5453e000080bf360447bdc2dcae3dc044ee3f866bebbe32ad553f44369b3e24f6523f313c073fd47b51be000080bfd2f544bd4d87ae3dc349ee3f4b6c713e867a0b3fcd014e3fdba7763fceda74bee78ef6bd000080bff64241bd11e5ab3d4e49ee3f785ae53efa4dc13e32784f3f8386373f637d31bf390c96bd000080bfdb873cbd5248b23db41eee3f9183ef3d9e0ff73e3e375e3f3aeb713f4fe95b3ef69f7cbe000080bf1b8439bd7ae1ae3d8124ee3f48ba993e103e873e84a36a3f3a09743fb9abefbddb9d8ebe000080bf039832bd4faea93dcb2eee3f23cc703e3d1fb83efd29673f9c0d773f80ab49bea00831be000080bf9d103abd8fe3a73d024bee3f0e1ac23eae7efe3e1dd0473ff4bb463fea4021bf9944c53c000080bf18b53bbd51a5a63d6668ee3f113a1a3fb8944a3f1153d53dfbb1263fdd1010bf265c023f000080bfcf4844bd2e8eaa3d8369ee3f4bbe3f3f0292283f06a2963da8b21d3f9da13bbf1bcf933e000080bf6ced3dbd4414b33d4012ee3f3aa3e7be129b573f1426963eaa15503f9053063f848281be000080bf30112fbdb6a0b73d06d8ed3ff009b7be709a673f9a526d3ed3a1623fe88bd03e03d165be000080bf41d73ebd5e49b23d8201ee3fe5732bbfeacb303f98c18bbe090e3e3f8e92213fe21c66be000080bf68972fbdeeedb63d6ac1ed3f99a905bf4ef6423f5692c4be183f5a3f0730f53e3b7c56be000080bfb4e51cbdc895ba3d9a93ed3f2f2e92be332b5a3f3b77e0be9037753fd176893e5fb1d0bd000080bfb1a41cbd8b32bb3d54aded3f33ca5abe7e8c743f1f62513ea900773f95de743e342adfbd000080bf6e891cbd0fb9b93d8bc3ed3fcdfcff3af542fd3ea17c5e3f70887a3f72f6353ed3a2d3bd000080bf71542ebda070b63db3eaed3f21e2943dc257fd3e3aaf5d3f5c13713f46fc803edb5b64be000080bf50e108bdcc7bbc3d5da9ed3fee41febc9226773f5d81843e66a97f3ff7749e3c2105433d000080bf9c5309bde3d8ba3d1ebfed3f9ba245bdcfb6ee3eb722623f5da77f3ffa17b03ba7d0533d000080bf2e8e0abd5ebeb53d31d2ed3fb64114bdc222713ed3a0783f43ce7f3fa139b3bbf8f71d3d000080bf0a0beebc3ee8b93d62d0ed3f620238bd49f3e13e506f653f035a6e3f61049dbe316c4a3e000080bf504bf3bcc504b53d48e0ed3f1892dcbd58327b3e41a4763f9ec1663f0bf9c4bed07c4b3e000080bf164cfcbcb403ae3d51f9ed3f5162dbbdbfd9a03e8f7c713f6a5b713f95cc89be4f6b493e000080bf86040cbd00e2ae3dc8ebed3f60c3e6bc99ed963eab84743f1adc7f3f74f907bc7e39033d000080bfa1f31abd7adead3df1f3ed3f94f1a13db9619c3ebaec723ffd997c3f384be43d4ee0f1bd000080bf2b6e1cbd2ae2b43d23d7ed3ff5d2bb3df3a3763e035a773fe0477c3f634ff03dc378fbbd000080bf700decbc7291bb3d06bded3fb03a1a3e0c786b3f3683b93e311c743f7f716dbe9de0443e000080bf4696ccbc9275b83d0bd9ed3f80237e3edb88573f3f4ff53ea8b35b3fc64bd7befeb7963e000080bf0683ebbc0a48bb3d80a5ed3f0d14743ee2236f3f2d0288bead39773f95cf4bbe069f2a3e000080bf1aa5cbbc9e76b83da0c4ed3f5b32ba3ef2726e3f8a03523c774a663f2b9fb5bee477823e000080bf8693b4bceeb4b53d32e3ed3f595a473eb0c26f3fb439953e3f716d3fb67d8bbe7f09833e000080bf7041b6bcfd5fb53dedf2ed3f64c2d43d70005b3f73df013f5e7d5f3fd847a5be9e2dbb3e000080bf7904b7bcc021b43d0f0aee3f42ee8dbe1add473f405e0f3f2fe2573f232da7bdbffd073f000080bff1d8cfbca5f2b63d4feaed3f00e214bd796af13e5190613faae54a3f1d0006bf6f28a03e000080bf2121cabc6a31b83db0aded3f968e9a3ef9ed733fb2c3fcbc0ddc6e3fc7c893be92e45b3e000080bf85b5b1bc48fdb53dead0ed3ff8a1af3db624723fd341a03ef3dd783f3cca17bea0f4393e000080bf7dd0b3bc04afb63d5abbed3fa331a03d65746c3fed15c03e462d7a3f6bf014be290b1e3e000080bf4030c7bc6210b83d2098ed3f92291b3eb03c793fdce92e3e13dc773f5f5539be42da303e000080bf34d7e9bcc0a7b93dde6aed3f2403db3d896b7c3ff5e102be1b057d3f2a40bbbd7909f93d000080bffdbfeabc3869ba3d4889ed3f132b553e4c536a3f8d7eb0becba6793f752c2bbef887143e000080bfeb42acbca9c1b43d6600ee3f72b23abefd186f3fec599d3eb597773f4496e93d0099683e000080bf5a49abbc14ebb43dce10ee3f3c33c7bece936b3f75a22e3d29a6673f3d04bf3e13df513e000080bf4dd6a8bc9336b53d51f7ed3f745b4ebe04e6763ff3122f3e99f2793f6f453c3e7ecce83d000080bfa837a3bc71aab53dc1e5ed3fdbd995bed5826a3fa4618c3ef69e743fd4008a3ebeabf43d000080bfa984a7bc3b93b63d48c3ed3fd98a60bebb0a4e3fd82d0d3faf9a793fc3284e3e5d3ac03d000080bfd9ec08bdecc3ba3df070ed3f3841afbcca045d3f9e0f01bf939c7f3f2e64343d4f5f073d000080bf12dc08bd9600bc3dac8fed3f058002bc8884693f42c6d1beafab7f3fb68ce33c60c72d3d000080bf2a711dbdee29b93d7d75ed3f9c5a99be68a54c3f365405bf6696733f62ab943ecbebcfbd000080bf999e30bdae79b53da0a7ed3fa95308bf4734393fb8f2e0bef0ab573faccb003fd65145be000080bff3591ebdc5acb73d8654ed3ff449a2bebe2a603f398ebabe72ad723f1afe9b3e1459bdbd000080bf074232bd10d2b33d8b8bed3fe75105bfd7304a3f5ae6a5be4f705a3f939efc3e81ce2cbe000080bf7fbd42bdc448af3d8cdaed3f56121fbfd0da413f02034ebec491483f6f10193ff1662dbe000080bf926240bdacebb03dddeeed3f08b229bf2716313fcab192be8d563f3f1850223f7e2f4bbe000080bf8aab4abd98bdac3dc232ee3fe0c32abf1cb43c3f6672ddbd94693e3ff78f263f86c51cbe000080bf618c48bda2ecad3d5c3cee3f5cba37bf40c22f3f4783eebd1dec313fd71d323fa3a639be000080bf08034fbdf12aab3d4370ee3f293a10bfed1a453f506a99be0c80513f3ce3113f484f98bd000080bf80f14cbd2f6fae3d55a4ee3fa9b909bf1e2e2b3f956503bf6a30463f9b01223fe0a9543c000080bf1d3952bd9640aa3d7670ee3f4facfabe8915503fc896a1be063b5d3f5623003fb9dc52bd000080bf3eb44fbd0800ae3d3fafee3fb58bf0beb988313f2ad40bbf3208533feee5103f8cf61c3c000080bf925b53bd3c6dad3d2cbbee3fbb0ff5bec9f0353ffcfb03bf6a8e553fa11f0d3fde246ebc000080bf0f9847bd05dcb33d9fe4ee3f8870fdbe40e1373f7f54fabe03704e3f32dd163f751e4a3d000080bff15d4abd1fdeb33d43fbee3fe0f3f8beda60373f051e00bf8537513fba54133fda77f33c000080bf8faf3dbdf2d6b93d9430ef3fc26bc2beda97453f918c02bfdb42613fe768f13eee526f3d000080bfcc962cbdae9fbe3d9f56ef3f0ae466be75eb483f92c413bf123c723fd38da23ec2347e3d000080bf7f673bbdaa0eb93d8810ef3f558eccbe505e4f3f6dc2dbbe77e15f3f5d51f43e1133b13d000080bf1f8656bd4c37a93de370ee3ff892f9be737a503fe241a1be2fdf5d3ffa7afd3ea5db7abd000080bf7bbf51bdd8efa93def1cee3f9d2d0bbf73cc553f2fc2aabd20ab563fa749093f85dcc4bd000080bfe7a64dbd0b63ab3d3528ee3f324617bf08734d3f4a52a8bdff074e3fe953143f57d103be000080bf2f1646bd32adad3dcac4ed3f014412bfd678503ff1e2d0bdb0b0513f21dc0e3f641008be000080bf5af539bdaad8b83d74f6ee3f6887fbbe0263583fd64257bed6ae593f8888043fb280c13d000080bff78f45bd43e1b33d89d0ee3fec9d13bf66da373f9c6ec7be88bf423fb855253f0150843d000080bfdd9a34bd2385b23df46ded3f95d3fcbe26695b3f257216be65475e3f8318f43e5e6c0cbe000080bfbbb637bd7368b13db647ed3f6086f5be2f88603f7e02e4bc85895f3f9594f23ec508eabd000080bfd5b01fbda0dcb63d2f32ed3f28faa7be0e57703fbf72d6bd0290713f4416a43e6928aabd000080bf00c809bd8c2cb93d802bed3f6f121ebec3d57c3f3f84df3c43eb7c3f0fb91d3e9b9c683c000080bf0e3209bda38fb93df54eed3fe06195bd3c57723f18baa0be9a0d7f3f8c00ab3d2743a63c000080bfdecce8bc79acb93da14ced3f3ec275bdab94773fa01a7d3ef34d7e3faa63093d0211e13d000080bf7ee5c1bc5470b83db487ed3f5662bcbd9c665b3f91c9013fa8c77d3f1690fc3c60cf023e000080bf4cc15abdc79c873d75ade33fa40949bf7bdc093fca629cbefe761a3f55b7463f57203bbe000080bf12f542bdb66a973d1789e33fa0a647bfef9d103fc0018abe05dd1f3f9b483b3fa3108cbe000080bf38d344bdd4a29e3ddfc6e43fb2923fbf2a1c1c3fe5a585be224c293fb569373fee7963be000080bf30ba3cbd823e913d5e43e23f96d74cbf46d0023fc4caa0be6798183fdc503c3fbac6a4be000080bfc8d332bdb6308b3d2afde03fb99b53bfe273dc3e3e8fb9bee22c0e3f55723a3faf85cdbe000080bfae631cbda3c89a3df19de03ff0754dbf8176023f0bc39ebe36af183f0928323fd6c7ccbe000080bf9ab429bda2b8833d09e1df3f6e5e53bf8ecd8d3eeda6fbbe6ae8043f51c5363f618df0be000080bffe9c42bd9a0fa83d8cf3e53f635433bf45be293fe01d87beb913363f57d32d3f36463abe000080bf326e2abd5b41b33dd0cee53f003526bf622b3a3f401c64be3bb5423f8dd71e3f44b743be000080bf890a15bdc421bb3d1db2e53f7fb210bf8aad4d3f28a33fbeb3f6523ffe1f0a3fc7b730be000080bf591521bd47e4bb3defe1e63fd30d12bf906c4c3f589244be3d3e523faa980d3f53590fbe000080bf471e08bdd11ac33df6b1e63f7cc2e6be789e5f3f2d623cbec085643f1c59e13e64e2c6bd000080bfc45a3cbd3599b13d2b12e73f01e223bf54be3b3fd24a6abe2d75443f3ece1f3f25cd15be000080bffdc7c2bc6fa1cb3d7763e73f0e3faebe23726e3f430204be69a7703f222fae3eebb9c1bc000080bff0a530bdb5c01e3da9a1df3f06b91fbf8cb4ed3dc2d745bfb5a51b3f3182313f0fffc5be000080bf446a1abd48533d3d6c2adf3ffeb90fbfea837e3cfece53bf0075203fa729293fe968d3be000080bf99292dbd440e513d1da4df3fbef530bfbf21a13dd1e337bfb4060a3fc3ce373f6062e1be000080bfe59d03bd0b962a3daabdde3f60ebecbe05ba0c3e233360bfecf43e3f251d183ff70c9abe000080bfab1cdabcae484c3d0266de3f2fe7b9be5633babdfd636dbf062d453f6fe0073f000eb5be000080bfb03907bdb0415f3d53b6de3f04c806bf9ad29ebd39bd58bfced4263f4b4c1a3f09c2ebbe000080bf8ca11cbdbbd5733d8626df3f671236bfd621833d6b3633bff80c0e3fdf9b293fcdcd00bf000080bf97a347bc2bbe213d3a0fdd3f57b297be64f15e3f10cbc8bea87f743f83e98b3eb9f4eabd000080bfcfc048bc7ee4163d5eecdb3fc2ab73bead5b723f7c435ebea290783f4393673e84f39fbd000080bf114b4abc56b30e3df585da3f1a334dbe9a95763fc65237bea2557a3f3fe13d3e596ec6bd000080bf4c7240bc00e4043dc843d93fd5e22ebee5f97b3f1d2338bdff1f7b3ff38b293eb4f0cfbd000080bf0000000023be133d326eda3f1e09283a6eee7a3ff7c14abefcff7f3f8edd2cba5f6de3b7000080bf124b4a3c57b30e3df685da3fb34a4c3e159f763f408a37beb9627a3fc5083dbeba87c53d000080bf00000000868e1d3df0e0db3f000000003d67773fbf9183be0000803f87d04cb81e9140b9000080bfcfc0483c7ee4163d5eecdb3fc2ab733ead5b723f7c435ebe5b91783f09ae67be56109f3d000080bff3e75b3c41bb033d5249d93f5ce2323e54cf7b3f13e234bd40f37a3f629a2dbe710ed03d000080bf98a3473c2bbe213d410fdd3f56b2973e64f15e3f10cbc8be6b7f743fe8028cbebc11ea3d000080bf0000000006802a3d38f2dc3f000000000844633f25aeebbe0000803fb1d79db8ff3418b9000080bf8a9210bc9eebbb3d5fd3dd3f226353bed0a2393f8b2c28bfc96b7a3fb9452c3e6837f9bd000080bfa27f82bc5113bd3df27ade3f3527e7bec3e0453f293be4be456c643f691cc73e06de6abe000080bfaa100fbcfa25c23df163de3f100365beca36583f3913f9be8783793fbe6e443e1898ebbd000080bfb49080bc249cb63dfbe5dd3fbd07e0beb8ea213fbf9e23bf9ff5653fe2cbad3e1de08ebe000080bf2f1771bc7501af3d0c78dd3ff9dabcbe2c43cd3e54ad56bf75f26b3f148e8c3e1c5f8cbe000080bf367609bc2635b43d1766dd3fbd1a24be0690f93e96bb5bbf6e2c7c3fabd6093e311ddcbd000080bf145e02bc5a32c73de702df3f7a4b62be75b1693f95c2afbef5a4793f7f904e3ed115bbbd000080bfc68cf0bb0e6bca3d22a9df3f1daa56be5730763fc9f934be40307a3fcd374d3eecc18cbd000080bfa7e7ddbb3066cb3d1b49e03fdcaa37be01d67b3fb48020bc7d8d7b3fd6f2363ea5bf4dbd000080bff28d68bcea25c63d62d2df3f3e93ccbebee5663fbaca27be9c766a3f8731c53ec416e8bd000080bf405159bc3ab1c73d7a6fe03fce52acbef9cf703f4b6330bd9fb5703f789eaa3e847d8ebd000080bf479476bc0f7ec23d1024df3f345fddbe18f3593f3a1698be59cd663fff27ce3eee0c22be000080bf46b49dbc0072c23d1cade03f0b43f3bece625f3fd4f2e7bd2c28613f6f23ef3edc83babd000080bfb169a5bc21b7bf3d420ce03fe8e10dbfc614503f8aa237be150a553fe75f093f69050fbe000080bf1bd8aabc917ebb3dec4edf3ff3071bbf60803f3fc7f98abe5dac4b3facda0f3f4ed567be000080bf8a59afbc3885b53d6c97de3f83b622bf8f32253f64fbd8bee485453f92b40c3fd6fba3be000080bff912aabcfa29ae3d2dffdd3f26aa1cbf4a3ff13e429c22bfeb44483fe60cf53ea41dccbe000080bfedf99abc2515a63dc691dd3f969f00bf0d636d3eab3c55bf2ddf543f107ac93e83bbc8be000080bf6e1885bc3cbe9d3d695ddd3fcc19a8be8e076e3b9dce71bfea68683f2efb8d3e9f05a1be000080bfaa505dbc5c3aa63d3d44dd3f581585be5d59063e8ae874bf3a65743fa0283c3e06ce6fbe000080bf88be3bbca3409f3d2a39dd3f8cc929bedb409fbc4a687cbfb736793f1743203e82cc2abe000080bf0cf74abc0b67973d8f45dd3fe23148bebc41c0bd3de879bf4f44773f47a41d3e3c3d55be000080bff775e0bbf949953d272edd3f0003d1bd5512abbd91c37dbf4e1a7d3f1623d03d9901e2bd000080bf5aa5f4bbc025a03dff25dd3f99f1abbd7b05fc3bae167fbfeb337e3f8390ac3dc503aabd000080bf50de47bc05508c3dc05edd3ff7194cbe89f117be82f877bf0f38733f3e015a3ef79569be000080bf67f2cdbbb5c1893da741dd3f85e3fabd173215beb0517bbf13d37b3f2157e83d12f00ebe000080bf2b3490bce57f923df279dd3fdc819dbe0372b1bdce9272bfc432633ff179aa3eb31ca3be000080bf647701bceeb3aa3d7232dd3f8b12d3bd874a473e09b779bfaba07d3fe2c3db3d4888aabd000080bf95a556bc39dbdc3d83b5ea3fc5173cbf8ce3243f09f2593eca432b3f226c3d3f3de58f3d000080bf804a95bc67b4d53d0c23eb3fabff00bfcc4c593f20c2233eb9b85c3f8a64013fc9090b3d000080bfee7cbfbc0875d13d38beea3f937bedbe6a55603f0b52053e844f613facf6f13eba9539bd000080bfa251babcaaa4ce3d068beb3f8c0ff7be0579533f3512953e9a9e5a3f2380043f91b059bd000080bf4c5db2bce37cca3dcf3dec3f2d12f5bececd453fde7dd53e907c593fbb09073f1ad612bb000080bf54a3d7bc713fc03db538ef3f9ea37cbd7688323f8dca36bf03b67e3faff2cb3d8c69393c000080bff8a5febc2b2ac23de860ef3f43e286bdff54353ff7ea33bfee4d7e3f196fe73d4968aa3c000080bf85b3dbbc0987be3dc91cef3f6781cf3c2e1a543f82330fbfc9e07f3f4bccfcbcefb5e9b9000080bf3eb2b9bc4953bd3d01ffee3f6ec2bfbd4c7a3d3f08782abf10af7d3f9a17093e9a201b3c000080bf61fadebccadfbd3df800ef3fc029283e9558723f7af18dbeb1467c3f0dfc2dbee09e693b000080bf3faae1bcb1ddbd3dcde7ee3f11768e3e97f3743f9bc2abbdb256753fa29790be3ef62dbd000080bf2d5c16bded82c13dd068ef3f9212e7bd2346403fd18726bf6af77a3fe964433e93ee4d3d000080bf68cacebc89ceb23d6282ee3f8b18fdbea4fa933ec9df51bfce3c1cbf92620e3f4367103f000080bf1288d7bcbaddab3d3963ee3f1a4a24bfc9930b3fc5110abf02743e3dacc83a3ff2a82e3f000080bf5ce1ddbc2e6cad3d9b88ee3ffae901bfc6daba3efcd247bfd48d11bfe4f1093f61201f3f000080bf68cacebc89ceb23d6282ee3f8b18fdbea4fa933ec9df51bf6fd8e23ec02a653f8268463d000080bf3013c5bcb30cb13dea59ee3fe8141fbf92c0f73eecbe1dbfda038d3ef8065f3f9912d03e000080bf575fddbc3c2fb53d2aaaee3fac76cfbe51f2343ef5a065bfac44483f5122133fe6ee75be000080bf1459ebbc77a0ae3d2aacee3f5d16c9be90458a3ea00c61bf1d7a583fe5aff63e184a6bbe000080bf4c54efbca7cab73deacbee3f26628fbef372c53d9c8374bf1c316f3f82f8823ea5157ebe000080bf4772f9bc60e5b03d53cbee3ffefd85beda123d3eaf8372bfe9236d3ff2b1a53e637445be000080bf791f07bd2382b13d73dbee3f3363debdf6d9103e85e57bbf17207c3f156b193e797ab2bd000080bf0de203bddc7eb93d82e1ee3f8683e5bdc761143ddf377ebf10827a3f6126363ededfd4bd000080bfa5e114bd5b28b93dd3e4ee3f2442e23cd6015d3c08e17fbf8dcd7a3f77034b3e2bb0f33c000080bf48c414bd7193b13d7ae1ee3fb981173c9f63fd3da1057ebf31977a3f276f4e3e32530c3d000080bf875326bd0210b73d40d9ee3fa1310b3e5502cc3c318b7dbf8227703f29eda23e62090c3e000080bf089322bd4e5faf3d73d5ee3ff992c83d3a0a153eaa077cbfae5b703fb403a13e52400f3e000080bf69e433bda67db33d2fc2ee3f3bcb6f3efc21943d2e3178bf45205e3fcc56de3e13c9773e000080bfba852ebd5919ad3de7c2ee3f569a453e3692453ec34876bf9e1b603fae66d13e9ae6833e000080bf147a3dbd497faf3d36a5ee3f1602a03e1b4a263e07996fbfef95583f4a03cd3e3936b43e000080bf74eb35bdd3d9a93da4a5ee3f6e7a8e3e91369b3ee95169bf34294a3ff395ef3e3924cb3e000080bf5dfb42bd7423ac3dec87ee3fde3ff63e0f97c43e30c749bf75de4d3f44e3283e6e30123f000080bf44a33bbd08e3a73d8087ee3f0643ed3ebabb073f4fc435bf25844a3fcb86e83db6e0193f000080bfac5325bd0ec0a63d53b0ee3f92b2f23df6ddaa3ec0686fbfb5523e3f1831183fa1da9c3e000080bf7d5c1bbdf5bda63dfeb5ee3ffdc1153d7482ac3e7cd970bf03be6d3fb927ac3e6943203e000080bf579327bd3484a33dcc96ee3fce2a463ef009093ff87a52bfdad5153f470d1c3f86de083f000080bf7aab2ebd0760a33d7f83ee3f82eabf3e3fa0273f420428bf93a1683fe535f4bd9acfcc3e000080bf2e5313bd56cfa93d3ec6ee3fad0193bc4e158c3e683076bf490c7c3fdf76303ee821fb3c000080bf228d0abd8f19a83d70b9ee3f7813e8bd952aa73ebc3970bf53a27d3fbf280abd528806be000080bfa69502bdd478a93d52b6ee3fab5b67be5b629d3ea6a36cbfcd2e5f3f4a6ff93e213b51bd000080bff9872dbd4870a33dac56ee3f34a6923e5ac4193fed163f3f511b463fd7b81abffcf0413e000080bf03422bbd09c6a13d486dee3f71f6b43e2d136f3f9ae25d3d326d2f3fe68598be67222a3f000080bf2e7425bddd7ca33d8c48ee3fd1d9253e76070c3f3442523f1fc9433fc0abe93eb5d6e8be000080bfaca92cbd423cb23d86f8ed3f5532613ea1c27f3e9368713f679e753f4772f43d8cbf82be000080bf93c628bd3c6aac3dc80aee3f39123b3ee11da73eb96a6d3fa0cd773ff8fad73d0d4369be000080bffe6321bdae61a63da12aee3f4274ff3dc657e03ee1e3633f80dd6b3fd945903eae1c89be000080bf039832bd4faea93dcb2eee3f23cc703e3d1fb83efd29673f13b6043f0a4d3d3f23e6dbbe000080bfa5bc16bd90dda53da725ee3f13c23f3df156e63ef050643f850b7a3f866b2a3e94770abe000080bf07280dbd87f8a73d3315ee3f0002c0bca2bad03e04af693fd1b87f3f0516dfbca7df1a3d000080bf97c504bd10fea53d2428ee3f3263d8bd9ce7f13e60ff5f3f7f80793f597600bef3e03d3e000080bf0f7df7bc2f19a73daa2aee3f8a4349be56d0f03eea3d5c3fb0ca153f75d625bf29c5f93e000080bf6b10e6bca14aad3db70aee3f9e6b51be41a7c03ee455673f70b0483ffccffabe8046c33e000080bf9a96d8bc8fe4b23d0af8ed3f709231be4f02a03e52176f3f0d63483fde2108bfaf84a53e000080bf5247c7bc20d5b03ddb15ee3fd13ecabef279093fb2d03e3ffd10433f01ff85be44a5173f000080bf1025dabcc1c8ab3d0f27ee3f08cfd6befdcd0e3f8f52373f0754273f9039b9be4d2d2a3f000080bfdeacc1bc624eb03d2236ee3f486c32bf5a70373ff682e53c9e5b1c3f0a9c123f63fa0b3f000080bf05a6d3bcb7d2ab3d0f42ee3f056932bf1631363f4803b53d60772e3f526d1e3fdcfbc73e000080bfd884b4bc7a8fb33d3c2eee3f9b1c1bbf6a0b4a3fa6a3ccbd09c5383f9622193f4f47b23e000080bfecababbc5e52b53df329ee3fd473ecbe88895a3ffe9376be8f0c583f83a6013fb916353e000080bfc8ecacbc59deb53dfe43ee3fd046e0be68e0403f1e13fbbe4269573fed1d093fc1fb913d000080bf6894aebc407eb63d3a57ee3f48aab4be471a353ff4c51cbf686f613f2cd2f13e5f761c3d000080bf92cceabcf146a63d8252ee3f30a028bf74bc3e3fbad2d63dfe853d3f26ed1d3fb8c3883e000080bf71a7f4bc66f7a43d1b45ee3fea7bd7be6cb13b3f81be083fbdb7ba3e2409cebe8df5563f000080bf68cacebc89ceb23d6282ee3f8b18fdbea4fa933ec9df51bf0635473ff9e48bbe7fc610bf0000803f5ce1ddbc2e6cad3d9b88ee3ffae901bfc6daba3efcd247bf5fe7403fe6b780be76811bbf0000803f1459ebbc77a0ae3d2aacee3f5d16c9be90458a3ea00c61bff199543f0fea9cbe592beebe0000803fdeacc1bc624eb03d2236ee3f486c32bf5a70373ff682e53c78c4edbeb1abd7be496f47bf0000803f05a6d3bcb7d2ab3d0f42ee3f056932bf1631363f4803b53de7e100bf5fa4cbbe835c44bf0000803f1288d7bcbaddab3d3963ee3f1a4a24bfc9930b3fc5110abf1311b9bdb88a40bf3f1e27bf0000803f3b3040bd753ab03d878bf43f5e2c2cbf81a2353f1873573e457e373fc1fc313f67a55abd000080bfeebb62bd28d89f3decfcf33f5eeb4abf7606143f58eb453ef1c3143f48fc4f3f2fed41bd000080bfeb211abd7ecebd3d8ef0f43f0eaa0dbffc004e3f2e2b5c3e8be7503f7e54133f25d55bbd000080bf381529bd93c4b23d8a3bf63f5d3e1bbfe8f6403ff49d813e4c23443f089b233fcc5d8abd000080bfa5f74dbdb399a33d8bc3f53f4c583abf103a263fe292613ed398273f1ef0403f49806ebd000080bf65506dbd76df913d081ef53fe4b655bfce79053f6cf2343e09b9053f38ff593fe18137bd000080bf184de7bcb827c83dab29f53f413adabe68a4603f5012613ed2a3643fdac3e43e3b8554bd000080bf13ef00bdc4ccbe3d6d91f63fe7f7f2be7371553f627e903ee2155b3f5b14033f2de296bd000080bfce897dbd59198d3df243f33fe6f95ebf054ce93e2c133c3e9e35e93e319a633f77f33abd000080bf01348abdc842743d2251f23fcc7367bf3287c53e211b3c3e81b0c33edf206c3f278665bd000080bf30d782bde6b07b3d7043f43fe36f63bfd717de3ebdba193edc21dd3e5a95663f01f23ebd000080bf2dd08ebd48c4543ddd42f33f351168bfdcaecb3ef4b9103e0e65c93ed4de6a3f67a973bd000080bf71ac0bbd774eb33d31d0f73ffbef01bf06cb443f013fc73e97924e3f8f1b153f7de7c8bd000080bfe38835bd63efa53d0267f73f41d024bf64e42f3f5372ac3eb212353ff3c8333fce1aa5bd000080bf73d5bcbcc427bd3dd61cf83fd822b5be41e3543f6c33db3ed3a0633f61cfe13efca6f9bd000080bf03245abd4791953d37dff63fd90645bf1b52143ff25d893ef02c163fbebb4e3fbd3f7abd000080bf01a777bd61a5823db727f63fd7625dbf14bfec3e897a483e58f1ec3e8a9f623f9ff73ebd000080bf1f1088bd0a815c3d4339f53f69b166bff8aacc3e7aca2b3e62ffcb3eb38b6a3fd7ae2fbd000080bf40a093bddf6f343d7429f43f8aad69bfe236c13e81e21f3e9e43bf3e9e0f6d3f5e0a5ebd000080bfa7b19dbd6423103da801f33f1b2d6fbf3efaae3ea612d03d498cac3eaf83703f2cc17abd000080bf41bba3bd48dce33cb7d2f13f924473bfb8059d3eee215e3d4d3f9b3eea66733fb77b82bd000080bff7069fbddf33123db4e9f03fcfbe72bfe0d59f3ed5626f3d8ed19d3e90eb723f835c8abd000080bf058a98bd5245313d4818f23ffecf6ebffef2b13efe02c23d5e61af3ee1ed6f3f8ef685bd000080bfc11da8bdfb90b73c5fcef03ffe0175bf565a923ef582453d1e708e3e0cd3733fccaffebd000080bfd312abbd569a943c581af03f496878bf2f2a763e0081d03cdcd7673eaece703f6b6f81be000080bf7b4ca4bde410f13cd0edef3f1a9873bf93b29a3eb4a36a3d9610973ed610733ff912dbbd000080bf48c494bd98da523dfb0df13f5b3171bf48f2a03e9023ee3da05e9e3edcf7723f79d273bd000080bffacf9abd548c333dcfbfef3ffd7e74bfdd39953e7fe25c3d391b933e407d743f16de95bd000080bf431ea1bda71f143dd9cdee3f0df672bf4f3d9f3e29824e3ddd0d9c3e3762723ffa58d3bd000080bf6134ab3ce048c03d224fe43f12d2a0be26e2a4bd0a2b72bf00000000ee137f3f54acadbd0000803fbf28c13c0246b73d643ee43fa0dd77bfb3037fbe07c2ba3cac147f3e1fee77bf000000000000803ff646ad3c191ebb3de259e43f0be2c7beaba11abe5c7e68bf0000000069887c3fabf527be0000803f77fbac3c3fccbe3dc236e43f83c2413df6ff2e3ce5b27f3f0000000042fc7fbf2c322f3c0000803ff646ad3c191ebb3d3434e43fdd42ebbc2f0068baf2e47f3f00000000f9ff7fbfb11868ba0000803f5870bfbc6e86bb3d1a36e43fca7f773f4643dcbdc2636d3e514112befcc87abffa8c103e000080bf76fbacbc3fccbe3dc236e43f406241bd29002f3c2eb37f3fd88c0fbe54787dbf3bd1813b000080bfbf28c1bc0246b73d6c3ee43fb6de773fcef27ebe5ec1ba3cf3fe7fbe9c8876bf1abacd3d0000803f6234abbce048c03d224fe43ff8d1a03ec5f1a4bde22a72bf8ce9dc3d81a67cbfd96ff53d000080bfbf28c1bc0246b73d6c3ee43fb6de773fcef27ebe5ec1ba3ccb2c7ebe014572bf5ccc533e000080bf76fbacbc3fccbe3dc236e43f406241bd29002f3c2eb37f3f81404b3ff83b1bbf4147343d000080bf76fbacbc3fccbe3dc236e43f406241bd29002f3c2eb37f3f9290583fe53a083f2e7a0c3d000080bf88f887bc07d2c53d3643e43f98c379bd6303d6bca56f7f3fd6c95b3fbc2c023f5fb8863d000080bf679c86bc0f48c23dec38e43f61034e3c20e2e4bd38607e3f16a9533fc75e0f3f5026573d000080bff646adbc191ebb3d3434e43fde42eb3ce62260baf4e47f3fb87e4d3f4c8f183ff9bfb8bc000080bfb11449bcf94ecc3d864de43f3c23c9bdc111873dc9337e3f2c955d3f0700ff3e5829573d000080bf2f3b44bc0164c83d284ae43f35c131bd64d183bd3c3a7f3f54ae593f4881053f17c1903d000080bf16a504bcc764d13ddf52e43f5b63c6bd3dfb4b3e08a4793f3efe6c3fc873c13e7823723c000080bf98defebbf0facc3dd65ae43fa89195bd5081923da6a87e3fd8346c3f9f55c43ef282243d000080bf68ce7abbc894cf3dd05de43f7e01d1bc187a253e038d7c3f218d7a3f5df9513ee19d07bc000080bf6234abbce048c03d224fe43ff8d1a03ec5f1a4bde22a72bf00000000c0137f3fc5bcadbd0000803ff646adbc191ebb3de259e43f42e3c73e77aa1abebb7d68bf0000000003887c3f69ff27be0000803fbf28c1bc0246b73d6c3ee43fb6de773fcef27ebe5ec1ba3cc5037f3e35ef773f000000000000803f76fbacbc3fccbe3dc236e43f406241bd29002f3c2eb37f3f0000000041fc7fbf2c322f3c0000803ff646adbc191ebb3d3434e43fde42eb3ce62260baf4e47f3f00000000faff7fbf913a60ba0000803f7aab2e3d0760a33d7f83ee3f08eebfbebea1273fc20128bf33750e3f20a1393ff0afcf3e0000803f18b53b3d51a5a63d6668ee3f0c3c1abfb0924a3ffa72d53dbe22383fbba2f63ebc26003f0000803f03422b3d09c6a13d486dee3f5ef6b4be13136f3f03035e3dae304e3f83758c3e397f063f0000803f74eb353dd3d9a93da4a5ee3f05728ebe1e369b3e445369bf6feddf3e0c82623f17a5243e0000803f44a33b3d08e3a73d8087ee3f8047edbef7bb073faac235bfd1caf73ed697523f91ca983e0000803f92ccea3cf146a63d8252ee3f829c283fd9be3e3f6103d73d58aa153f943518bf6f4f0d3f0000803f1288d73cbaddab3d3963ee3f3c48243fe6950b3fda110abf6eaa433f3d19cbbe0a26023f0000803f6bb6f23c2afda43d2b6cee3f8e4e123f400d3c3f4343bbbefc12483f47e9b3be9df6033f0000803f6bb6f23c2afda43d2b6cee3f8e4e123f400d3c3f4343bbbeb9f7963ecd8a19bfae6d3ebf000080bffe6321bdae61a63da12aee3f4274ff3dc657e03ee1e3633f0000000016af65bfd61be23e0000803fadbd0fbd9a449d3d5875ee3f74b3d2bd1d047e3f6eb28ebd8aa27ebfdd36d3bd000000000000803fa5bc16bd90dda53da725ee3f13c23f3df156e63ef050643f00000000199164bfac97e63e0000803f2e7425bddd7ca33d8c48ee3fd1d9253e76070c3f3442523f00000000651255bf19e70d3f0000803f07280dbd87f8a73d3315ee3f0002c0bca2bad03e04af693f0000000073bf69bf51c9d03e0000803f97c504bd10fea53d2428ee3f3263d8bd9ce7f13e60ff5f3f00000000284261bf3344f33e0000803f0f7df7bc2f19a73daa2aee3f8a4349be56d0f03eea3d5c3f000000008f9f60bfc09af53e0000803f71a7f4bc66f7a43d1b45ee3fea7bd7be6cb13b3f81be083f4f055ebffbe4febe000000000000803f92cceabcf146a63d8252ee3f30a028bf74bc3e3fbad2d63d50cb3fbfa78f29bf000000000000803f6bb6f2bc2afda43d2b6cee3f264e12bfba0c3c3fac46bbbe120d4abfd1321dbf000000000000803f1288d7bcbaddab3d3963ee3f1a4a24bfc9930b3fc5110abf27c025bfc51843bf000000000000803ff9872dbd4870a33dac56ee3f34a6923e5ac4193fed163f3f000000001c7247bfb97d203f0000803f03422bbd09c6a13d486dee3f71f6b43e2d136f3f9ae25d3d2d6d6fbf913ab53e000000000000803f7aab2ebd0760a33d7f83ee3f82eabf3e3fa0273f420428bf112c5ebfc55dfe3e000000000000803f579327bd3484a33dcc96ee3fce2a463ef009093ff87a52bf000000003589563feaad0b3f0000803fac5325bd0ec0a63d53b0ee3f92b2f23df6ddaa3ec0686fbf00000000b21b713f6214ac3e0000803f7d5c1bbdf5bda63dfeb5ee3ffdc1153d7482ac3e7cd970bf00000000bc02713fff9fac3e0000803f2e5313bd56cfa93d3ec6ee3fad0193bc4e158c3e683076bf000000008f3a763f151b8c3e0000803f228d0abd8f19a83d70b9ee3f7813e8bd952aa73ebc3970bf000000006ec8713f0640a83e0000803fa69502bdd478a93d52b6ee3fab5b67be5b629d3ea6a36cbf00000000afeb723fd48fa13e0000803f5604ffbc6e87a63d7c9bee3fe56eabbeb22fe13e8a5555bf000000000767623f0dfbee3e0000803f1459ebbc77a0ae3d2aacee3f5d16c9be90458a3ea00c61bf000000008bb6743f6f5a963e0000803fdcbcf1bcee3ea73dfd85ee3f3b37f4be1a7beb3e88bc3fbf00000000ea265a3f28f6053f0000803f1288d7bcbaddab3d3963ee3f1a4a24bfc9930b3fc5110abf27c025bfc51843bf000000000000803f5ce1ddbc2e6cad3d9b88ee3ffae901bfc6daba3efcd247bf0000000090e7673f4fdad83e0000803fadbd0fbd9a449d3d5875ee3f74b3d2bd1d047e3f6eb28ebd8aa27ebfdd36d3bd000000000000803f7aab2ebd0760a33d7f83ee3f82eabf3e3fa0273f420428bf5e4d113fcec938bf23bfcabe0000803f03422bbd09c6a13d486dee3f71f6b43e2d136f3f9ae25d3dfe2f4e3f34778cbed77f06bf0000803f18b53bbd51a5a63d6668ee3f113a1a3fb8944a3f1153d53dbe22383f92a1f6be4a2700bf0000803f8b33863c8388d43d73f5e73fb314453f01d7d43e78f3f7bea43a103f29954cbfb7a8563e000080bfbdb160bd636e773cba72de3f2fd13fbfc9d8263f2194f0bd2c9a283f9dfa363f77ee70be000080bf19ce95bd7e923bbdd86fe03f4e3e79bf546276bd3e72613e6b7cfbbda780733f1cf990be000080bfa3ea97bd38ba4abdb1fdde3f82776ebf4dc34f3db766b83ed2da88bdb012733ff9f49cbe000080bf43a591bdd4f198bc9e16dd3f0a216fbf46deae3eeff2d43dddb78e3e2732613fd549c5be000080bf892610bd4238a6bd4039e43f3ecfcdbe931f60bf2a56893e036669bfebd4d13e35bdeabc000080bf768bc0bc4050aebd923de43f31eb71be1eab6fbfc039853e112478bf4fbd7b3e1414923b000080bfcbbd40bc7f6cb2bd6c3ee43f2d63d1bdb87576bff731803e1a517ebf9b11e53d340ac83c000080bf00000000077bb3bdf73de43f000000005b2078bf5a027c3e2bc47fbfd8412c3c6d9a293d000080bf46b45dbdc16eb8bd9693e03fa3f7ecbe60aa19bf94fc263f0c9551bfda55123f64b960bd000080bfb68527bdf8e4c1bd4278e03f15e46bbe746149bf80a4123f462b72bf5f5ca33ee87d6c3d000080bf6882e1bc6575cbbda45ce03f45ba04bebe0f59bf4c9a033ffec97abf8f33423e1ac1863d000080bf02b257bc988acdbd043fe03fdc610bbd49a563bf578fe93e698d7ebfa6c89b3d97c4973d000080bf00000000c173cfbde223e03f6affd03bc01666bfa46ee03ede087fbf9ef8033dfefba43d000080bf0b0a83bd2f299ebda030e03fd80b2cbf4656d5beacb51c3f811521bf02d5413fc4a533be000080bf02b257bc988acdbd043fe03fdc610bbd49a563bf578fe93ec75f7ebfe5f7a13d23eea33d000080bf00000000c173cfbde223e03f6affd03bc01666bfa46ee03ef5687fbff5b810bd6a476dbd000080bfdb511c3d1749bb3dde77ee3f87ca533ef3767a3f00000000f3767a3f87ca53bea9700c37000080bf070b273d425cb93d2ac7ee3f8f32d13ec89a653f104a2d3ef505693faafed3beae6857bb000080bf7104293d425cb93dde77ee3f7473e23e8199653f000000008099653f7373e2be00000000000080bfcff83e3d4206b23dde77ee3f7b06383f6bf6313f000000006bf6313f7c0638bfcf07c9b4000080bff4501b3d1749bb3d4da0ee3f06b2433e88767a3fa521a23d22417b3f954044be067a42ba000080bf0074183d1749bb3d8bc2ee3fecb9153e46777a3f0dc2153e982c7d3f45b517be735a1b3b000080bf4b1e0f3dd0efbb3dde77ee3f000000000000803f000000000000803f000000002f1a4fb1000080bf302b143d1749bb3d73d9ee3fe521a23dea767a3f31aa433ede2b7f3fde9fa4bdaeceb5ba000080bf4b1e0f3d1749bb3d82e1ee3f0000000023767a3fd5d9533e0000803f935943b5fbf36636000080bf5a100a3d1749bb3d73d9ee3fe521a2bdea767a3f31aa433edf2b7f3f8a9fa43d533ab63a000080bf4b1e0f3d425cb93d0f47ef3f000000008199653f7473e23e0000803f8b6241b6e812c436000080bfcd06193d425cb93d4c37ef3fc04a2d3ea999653f5237d13e73577b3f253542be883f1e3c000080bf7a6e213d425cb93d5f0aef3f6a22a03e5f99653f591ea03e736c713f3d38aabee3b1283c000080bfa0543b3d4206b23d5f0aef3f3b042a3f61f6313fe3d98c3e8279383f307831bf842a473c000080bf95f4303d4206b23d9086ef3ff61f023fb0f6313ff61f023fd5124f3f148416bf05759cbb000080bf7a6e213d4206b23d90d9ef3fe3d98c3e61f6313f3b042a3f8eb16f3f1a7eb3be1c1babbc000080bfcfa44d3d130ca73dde77ee3fd7616d3f26afbf3e0000000098a6bf3e3e576dbf83f5983c000080bf8ac7053d1749bb3d8bc2ee3fbfc915befd767a3fc0b9153ee02f7d3f8462173ef5025639000080bfbd34053d425cb93d4c37ef3fa5522dbe5a99653f0a37d13e1c9a7b3fb7fb3c3e3b5f053b000080bfa2eb023d1749bb3d4da0ee3f31aa43beea767a3fe521a23d113f7b3f6869443e0861d7ba000080bfafe9013d1749bb3dde77ee3fd5d953be23767a3f0000000022767a3fd5d9533e00000000000080bfa2eb023d1749bb3d6e4fee3f31aa43beea767a3fe521a2bd113f7b3f6169443e4a2fd73a000080bf4c70ea3c425cb93dde77ee3f686be2be7c9b653f000000007d9b653f6a6be23ede8987b6000080bf0761ee3c425cb93d2ac7ee3f7f33d1bec899653fd45a2d3e37de683fb8aad43ed1b0a5bb000080bf399cf93c425cb93d5f0aef3f6a22a0be5f99653f591ea03e4094713faa65a93e2383a6bb000080bf399cf93c4206b23d90d9ef3fc0d18cbe34f6313f18062a3fb43e6f3f8a06b63e760e743c000080bf4b1e0f3d4206b23db2f6ef3f000000006bf6313f7b06383f11c47f3f9ecbfb3cff7ff3bc000080bfeecfc53c4206b23d5f0aef3f3b042abf61f6313fe3d98c3e7e79383f3578313fd82f47bc000080bfeb8dda3c4206b23d9086ef3f7c2002bf67f7313f741e023f135e4d3f44cc183fb3b666bc000080bf0761ee3c130ca73dfe45f03f13aeb5be35aebf3e74505b3fb4a1553f6b3c0a3f099ee03d000080bfeecfc53c990ca73d90d9ef3f45d827bf99b2bf3e45dc273f28400e3f08c5533faa87aa3d000080bf7785be3c4206b23dde77ee3f690a38bf5cf2313f000000005cf2313f6a0a383fff09c934000080bf0761ee3c425cb93d9128ee3fc433d1be149a653f31532dbe46de683f81aad43e6c5fa53b000080bf399cf93c425cb93d5ce5ed3f6a1aa0be5f99653f5826a0bef798713fa24ba93e917e973b000080bfeecfc53c4206b23d5ce5ed3ff3052abf05f4313f8fdd8cbe4a77383f7c7a313ff052473c000080bf902fa13c130ca73dde77ee3f1c626dbfc8adbf3e260602b8c8adbf3e1c626d3f11de2db6000080bf74b4aa3c990ca73d4c37ef3f4b4f5bbfd8b2bf3ebeaeb53e6c58d23eba44693fb0f8f83c000080bf4b1e0f3d130ca73d126cf03f0000000088b2bf3e28616d3f9f9c7f3f341551bda1d8a83c000080bf4b1e0f3d01199a3d4a95f03f00000000000000000000803f5b767f3fcbaa843d00000000000080bf4c70ea3c01199a3d126cf03fe5eec3be0000000068836c3fae52283ff6d6333f56718b3e000080bf0761ee3c74268d3dfe45f03f6b2cc0be9fcf47be34f7673f7c3f103f91693a3f13cac73e000080bf4b1e0f3d74268d3d126cf03fa18c3837ded447befd137b3f50317b3f26b741bed4381abd000080bf7785be3c01199a3db2f6ef3ff20635bf00000000f302353fd627a13e843c653f642ba13e000080bf902fa13c01199a3d0f47ef3f68836cbf00000000e5eec33e6c9bbc3dfc79783f81ab633e000080bfeecfc53c74268d3d90d9ef3f618a31bf3ed247beca89313f50b9603d7d0d723fae4ea43e000080bf58e1963c01199a3dde77ee3f000080bf000000000000000000000000e8d47f3f4e84143d000080bf74b4aa3c130ca73d78b8ed3f11515bbfbeaebf3e85aab5be38b8d53e4845683fedf94ebd000080bfeecfc53c130ca73d2b16ed3fe1db27bf37aebf3ee9d927bf800f113fe462513fbe16ccbd000080bf74b4aa3c74268d3d4c37ef3f1cf767bf3fcc47bec32dc03e5cfb18beaa4a7a3f501f173e000080bfeb8dda3c4206b23d2b69ed3f6a2102bffdf5313f741f02bfc9114f3f8485163f4d839cbb000080bf0761ee3c130ca73dbda9ec3f44afb5be76afbf3eed4f5bbfdd35503ff654133f4adcaebd000080bf7785be3c01199a3d09f9ec3ff20635bf00000000f30235bf1ae7a13e14f9643fadeaa1be000080bf902fa13c87199a3daca8ed3f68836cbf00000000e5eec3bef6ef813d04757c3f53d91cbe000080bf902fa13c74268d3dde77ee3ff7137bbf6cd547bea153c9b7b45a47be567a7a3f63868dbd000080bf399cf93c4206b23d2b16ed3f21d68cbec4f6313f99042abfad5e6d3fefb3bf3e6c17013c000080bf4b1e0f3d4206b23d09f9ec3f000000006bf6313f7b0638bf69e17f3f68e6b33c23f9ad3c000080bfbd34053d425cb93d78b8ed3fa5522dbe5a99653f0a37d1becd947b3fd16e3d3e5f0888ba000080bf8ac7053d1749bb3d302dee3f92c915beb2767a3fb5c115beea2f7d3f7d61173e600b72b9000080bf5a100a3d1749bb3d4816ee3f4211a2bd52767a3fb8b943be732b7f3f5dcda43d13fe4bba000080bf4b1e0f3d1749bb3d410eee3f00000000f3767a3f87ca53beccff7f3fe0f0063aef941f3b000080bf302b143d1749bb3d4816ee3f7f11a23db0767a3f25b243bedf287f3f71c5a5bd0ea2d9ba000080bf4b1e0f3d425cb93daca8ed3f00000000b398653fb976e2be11ff7f3f047d1abb1da09cbb000080bfcd06193d425cb93d78b8ed3fa5522d3e5a99653f0a37d1be3f657b3f173241be2e1ff0bb000080bf0074183d1749bb3d302dee3fe0c1153efb767a3fe0c115be982c7d3f0db617be5de90ebb000080bff4501b3d1749bb3d6e4fee3f13bb433e15767a3fa122a2bdb3407b3f734944be8950453a000080bf070b273d425cb93d9128ee3f4732d13e799a653ff4512dbe0206693f70fed3bea213583b000080bf7a6e213d425cb93d5ce5ed3f6a1aa03e5f99653f5826a0be51b4713f46b3a8be67e164ba000080bfa0543b3d4206b23d5ce5ed3f3b042a3f61f6313fe3d98cbe41b9383f3a3a31bf1118f3bb000080bf95f4303d4206b23d2b69ed3f741f023ffdf5313f6a2102bf64104d3fe32e19bf22e98dbc000080bf7a6e213d4206b23d2b16ed3f3dde8c3ee9f6313fc6022abf56356e3f6489bbbead57083b000080bf070b273d130ca73dbda9ec3f44afb53e76afbf3eed4f5bbf6595483fce761ebff1555d3d000080bfa0543b3d130ca73d2b16ed3fc2da273f2fafbf3ec2da27bfba41123f345350bff173da3d000080bf5de2483d130ca73d78b8ed3f74505b3f35aebf3e13aeb5bedceada3ee17366bf0a05a93d000080bfcfa44d3d01199a3daca8ed3fff816c3f00000000b7f5c3be508a3a3d622e7ebfa123e13d000080bfcff83e3d01199a3d09f9ec3ff304353f00000000f30435bf1c2e8f3e12216bbf1d2e8f3e000080bf7104293d01199a3da983ec3f1cf7c33e00000000b5816cbfed3c3d3f898d19bf9dcc9c3e000080bf070b273d74268d3dbda9ec3f542dc03e2fd147beeef667bfcd92ed3ea1844ebf4c5cbb3e000080bf5de2483d74268d3d78b8ed3f94f7673f30d047be7e2ac0be8588babd31d974bf1e028e3e000080bfa0543b3d74268d3d2b16ed3fc88a313f7dbc47beea8a31bf5644cf3d063e6dbf1244b93e000080bfcfa44d3d74268d3dde77ee3fd5137b3f0bd847be34629fb7665d47be307a7abf2e888d3d000080bf4b1e0f3d130ca73da983ec3f0000000088b2bf3e28616dbfdcb27e3fa73cbfbd466f1abd000080bf4b1e0f3d01199a3d715aec3f0000000000000000000080bf79237d3ffcac183e00000000000080bf4b1e0f3d74268d3da983ec3f1df0c037ded447befd137bbf8d317b3fd6b141be32411a3d000080bf4c70ea3c01199a3da983ec3fe5eec3be0000000068836cbfe9692f3f98b72b3f1d5191be000080bf0761ee3c74268d3dbda9ec3f952cc0bea6cf47be2cf767bf0440103f0f693a3f6fcac7be000080bfeecfc53c74268d3d2b16ed3f738b31bf3dd747be5e8831bfbd6c603d770e723f8d4aa4be000080bfeacb523d01199a3dde77ee3f0000803f0000000000000000000000003f8e7fbf013b71bd000080bf5de2483d74268d3d4c37ef3f1cf7673f3fcc47bec32dc03e5cfb18beaa4a7abf511f17be000080bf50e1483d990ca73d4c37ef3fb34e5b3f53b2bf3e2fb2b53eba58d23ea54469bfb701f9bc000080bf93533b3d990ca73d90d9ef3f45d8273f99b2bf3e45dc273fc3cb0b3f7db955bfddf68dbd000080bfcfa44d3d01199a3d0f47ef3fb7826c3f7b06023840f2c33e32b2bc3d967978bfd1ad63be000080bfa0543b3d74268d3d90d9ef3ffb87313fdebe47be8d8d313f9a2e613d7a0d72bf444ca4be000080bfcff83e3d01199a3db2f6ef3fef03353f00000000f705353f8594aa3e0cce61bf9b92aabe000080bf070b273d74268d3dfe45f03f872bc03e39d147be4df7673fe892ed3ed8844ebf3b5bbbbe000080bf070b273d990ca73dfe45f03fbeaeb53ed8b2bf3e4b4f5b3f4c894c3f54e818bf4f268fbd000080bf7104293d01199a3d126cf03fb7f5c33e00000000ff816c3f2684353ff41c24bf716596be000080bf74b4aa3c74268d3d78b8ed3f3af867bfc0d147bef326c0be122dfebd8e88783ff80d52be000080bf070b27bd425cb93d2ac7ee3f8f32d1bec89a653f104a2d3ef505693fa8fed33e9069573b000080bfdb511cbd1749bb3dde77ee3f87ca53bef3767a3f00000000f1767a3f85ca533e49700cb7000080bf710429bd425cb93dde77ee3f7473e2be8199653f000000008199653f7373e23e00000000000080bf070b27bd425cb93d9128ee3f4732d1be799a653ff4512dbe0106693f70fed33ed21458bb000080bff4501bbd1749bb3d4da0ee3f06b243be88767a3fa521a23d22417b3f9640443e5e7a423a000080bf4b1e0fbdd0efbb3dde77ee3f000000000000803f000000000000803f00000000c7f03a31000080bf007418bd1749bb3d8bc2ee3fc0b915befd767a3fbfc9153e982c7d3f4fb5173e3b621bbb000080bf7a6e21bd425cb93d5f0aef3f6a22a0be5f99653f591ea03e736c713f3d38aa3edfb128bc000080bfcd0619bd425cb93d4c37ef3fc04a2dbea999653f5237d13e74577b3f2235423ef13e1ebc000080bf302b14bd1749bb3d73d9ee3fe521a2bdea767a3f31aa433ede2b7f3fdd9fa43d71ceb53a000080bf4b1e0fbd425cb93d0f47ef3f000000008199653f7473e23e0000803fea933d36ba36c0b6000080bf4b1e0fbd1749bb3d82e1ee3f0000000023767a3fd5d9533e0000803fe83d3a354e2f5cb6000080bf5a100abd1749bb3d73d9ee3fe521a23dea767a3f31aa433ede2b7f3f839fa4bd7942b6ba000080bfbd3405bd425cb93d4c37ef3fa5522d3e5a99653f0a37d13e1c9a7b3fb9fb3cbe515e05bb000080bf8ac705bd1749bb3d8bc2ee3fbfc9153efd767a3fc0b9153ee02f7d3f846217be06f855b9000080bf399cf9bc425cb93d5f0aef3f6a22a03e5f99653f591ea03e4094713faa65a9be2483a63b000080bfa2eb02bd1749bb3d4da0ee3f31aa433eea767a3fe521a23d103f7b3f676944be3b62d73a000080bfafe901bd1749bb3dde77ee3fd5d9533e23767a3f0000000023767a3fd5d953be00000000000080bfa2eb02bd1749bb3d6e4fee3f31aa433eea767a3fe521a2bd113f7b3f616944be8030d7ba000080bf8ac705bd1749bb3d302dee3f92c9153eb2767a3fb5c115beea2f7d3f7e6117be91ff7139000080bf5a100abd1749bb3d4816ee3f4211a23d52767a3fb8b943be732b7f3f55cda4bd57124c3a000080bf4b1e0fbd1749bb3d410eee3f00000000f3767a3f87ca53beccff7f3f05f206ba4b961fbb000080bf0761eebc425cb93d2ac7ee3fc433d13e149a653f31532d3e3ade683fafaad4be39a9a53b000080bf4c70eabc425cb93dde77ee3f686be23e7c9b653f000000007d9b653f696be2bece898736000080bf0761eebc425cb93d9128ee3fc433d13e149a653f31532dbe46de683f80aad4bee45ea5bb000080bf399cf9bc425cb93d5ce5ed3f6a1aa03e5f99653f5826a0bef898713fa24ba9bea97e97bb000080bfbd3405bd425cb93d78b8ed3fa5522d3e5a99653f0a37d1becd947b3fca6e3dbe830e883a000080bf4b1e0fbd425cb93daca8ed3f00000000b398653fb976e2be12ff7f3fe57c1a3bfe9f9c3b000080bfeecfc5bc4206b23d5ce5ed3ff3052a3f05f4313f8fdd8cbe4977383f7e7a31bff15347bc000080bfeb8ddabc4206b23d2b69ed3f6a21023ffdf5313f741f02bfc8114f3f868516bfe4829c3b000080bf7785bebc4206b23dde77ee3f690a383f5cf2313f000000005df2313f6a0a38bfae09c9b4000080bf399cf9bc4206b23d2b16ed3f21d68c3ec4f6313f99042abfad5e6d3ff1b3bfbeb51701bc000080bfeecfc5bc4206b23d5f0aef3f3b042a3f61f6313fe3d98c3e7d79383f367831bfd930473c000080bf4b1e0fbd4206b23d09f9ec3f000000006bf6313f7b0638bf69e17f3f6fe6b3bc2bf9adbc000080bfeecfc5bc130ca73d2b16ed3fe1db273f37aebf3ee9d927bf800f113fe56251bfaf16cc3d000080bf74b4aabc130ca73d78b8ed3f11515b3fbeaebf3e85aab5be3fb8d53e464568bf9efa4e3d000080bf0761eebc130ca73dbda9ec3f44afb53e76afbf3eed4f5bbfdc35503ff45413bf4edcae3d000080bf4b1e0fbd130ca73da983ec3f0000000088b2bf3e28616dbfdcb27e3f9a3cbf3d3c6f1a3d000080bf902fa1bc130ca73dde77ee3f1c626d3fc8adbf3e260602b8c8adbf3e1c626dbf4fdf2d36000080bf74b4aabc990ca73d4c37ef3f4b4f5b3fd8b2bf3ebeaeb53e7058d23eb84469bf7df9f8bc000080bfeecfc5bc990ca73d90d9ef3f45d8273f99b2bf3e45dc273f2c400e3f04c553bfe287aabd000080bf4b1e0fbd01199a3d715aec3f0000000000000000000080bf79237d3f03ad18be00000000000080bf4c70eabc01199a3da983ec3fe5eec33e0000000068836cbfe9692f3f97b72bbf1d51913e000080bf710429bd01199a3da983ec3f1cf7c3be00000000b5816cbff03c3d3f848d193f9fcc9cbe000080bf7785bebc01199a3d09f9ec3ff206353f00000000f30235bf2ce7a13e0ff964bfbfeaa13e000080bf902fa1bc87199a3daca8ed3f68836c3f00000000e5eec3bebaef813d08757cbf0bd91c3e000080bf58e196bc01199a3dde77ee3f0000803f000000000000000000000000e7d47fbf0a8514bd000080bf902fa1bc01199a3d0f47ef3f68836c3f00000000e5eec33e649bbc3dfe7978bf76ab63be000080bf7785bebc01199a3db2f6ef3ff206353f00000000f302353fdc27a13e813c65bf6a2ba1be000080bf4c70eabc01199a3d126cf03fe5eec33e0000000068836c3fae52283ff5d633bf55718bbe000080bf0761eebc74268d3dfe45f03f6b2cc03e9fcf47be34f7673f7d3f103f90693abf14cac7be000080bfeecfc5bc74268d3d90d9ef3f688a313f46d247bec189313f5fb8603d800d72bfa04ea4be000080bf74b4aabc74268d3d4c37ef3f24f7673f38cc47be9a2dc03e5efb18beaa4a7abf4b1f17be000080bf902fa1bc74268d3dde77ee3ff7137b3f6cd547bea153c9b7b45a47be567a7abf60868d3d000080bf74b4aabc74268d3d78b8ed3f33f8673fbad147be0e27c0befc2cfebd8e8878bff20d523e000080bfeecfc5bc74268d3d2b16ed3f838b313f3dd747be4d8831bfbe6b603d7b0e72bf814aa43e000080bf0761eebc74268d3dbda9ec3f952cc03ea6cf47be2cf767bf0540103f0e693abf6fcac73e000080bf4b1e0fbd74268d3da983ec3f1df0c0b7ded447befd137bbf90317b3f8ab1413ef5401abd000080bf070b27bd74268d3dbda9ec3f542dc0be2fd147beeef667bfac92ed3ead844e3f445cbbbe000080bf4b1e0fbd01199a3d4a95f03f00000000000000000000803f59767f3fd7aa84bd00000000000080bf4b1e0fbd74268d3d126cf03fa18c38b7ded447befd137b3f54317b3fdeb6413e9c381a3d000080bf0761eebc130ca73dfe45f03f13aeb53e35aebf3e74505b3fb3a1553f6b3c0abf0a9ee0bd000080bf4b1e0fbd130ca73d126cf03f0000000088b2bf3e28616d3f9f9c7f3f1515513d8ad8a8bc000080bf4b1e0fbd4206b23db2f6ef3f000000006bf6313f7b06383f11c47f3fa6cbfbbc0580f33c000080bf070b27bd990ca73dfe45f03fbeaeb5bed8b2bf3e4b4f5b3f4c894c3f55e8183f48268f3d000080bf710429bd01199a3d126cf03fb7f5c3be00000000ff816c3f2984353ff11c243f7265963e000080bf070b27bd74268d3dfe45f03f842bc0be79d147be4af7673fc092ed3ee0844e3f4b5bbb3e000080bf7a6e21bd4206b23d90d9ef3fe3d98cbe61f6313f3b042a3f91b16f3f0f7eb33ef51bab3c000080bf399cf9bc4206b23d90d9ef3fc0d18c3e34f6313f18062a3fb33e6f3f8a06b6be550e74bc000080bfcff83ebd01199a3db2f6ef3fef0335bf00000000f705353f7b94aa3e10ce613f9192aa3e000080bfa0543bbd74268d3d90d9ef3f088831bf1ebf47be798d313f382f613d6c0d723f8f4ca43e000080bfeb8ddabc4206b23d9086ef3f7c20023f67f7313f741e023f135e4d3f45cc18bfc0b6663c000080bfcfa44dbd01199a3d0f47ef3fb7826cbf7b06023840f2c33e58b2bc3d9379783ffead633e000080bf93533bbd990ca73d90d9ef3f45d827bf99b2bf3e45dc273fc1cb0b3f7fb9553fc8f68d3d000080bf5de248bd74268d3d4c37ef3f27f767bff7cb47be9d2dc03e34fb18beae4a7a3f0c1f173e000080bf95f430bd4206b23d9086ef3ff61f02bfb0f6313ff61f023fd2124f3f1a84163f1d6f9c3b000080bf50e148bd990ca73d4c37ef3fb34e5bbf53b2bf3e2fb2b53eb758d23ea544693f3f01f93c000080bfa0543bbd4206b23d5f0aef3f3b042abf61f6313fe3d98c3e8279383f3278313f662b47bc000080bfcfa44dbd130ca73dde77ee3fd7616dbf26afbf3e0000000097a6bf3e3e576d3f49f698bc000080bfeacb52bd01199a3dde77ee3f000080bf0000000000000000000000003f8e7f3f2f3a713d000080bfcfa44dbd01199a3daca8ed3fff816cbf00000000b7f5c3bea68a3a3d602e7e3f0824e1bd000080bfcfa44dbd74268d3dde77ee3fdb137bbfbfd747be2d629fb7185d47be347a7a3fe5878dbd000080bf5de248bd74268d3d78b8ed3f94f767bf64d047be712ac0beb988babd2bd9743f45028ebe000080bfcff83ebd01199a3d09f9ec3ff30435bf00000000f30435bf212e8f3e10216b3f212e8fbe000080bfa0543bbd74268d3d2b16ed3fdc8a31bf3dbc47bedc8a31bf9744cf3d053e6d3f0c44b9be000080bf5de248bd130ca73d78b8ed3f74505bbf35aebf3e13aeb5bed7eada3ee273663fd504a9bd000080bfa0543bbd4206b23d5ce5ed3f3b042abf61f6313fe3d98cbe41b9383f393a313f3518f33b000080bfcff83ebd4206b23dde77ee3f7b0638bf6bf6313f000000006cf6313f7c06383f8807c934000080bf070b27bd130ca73dbda9ec3f44afb5be76afbf3eed4f5bbf6595483fcf761e3fe5555dbd000080bf7a6e21bd4206b23d2b16ed3f3dde8cbee9f6313fc6022abf58356e3f5889bb3e5a5e08bb000080bf95f430bd4206b23d2b69ed3f741f02bffdf5313f6a2102bf62104d3fe52e193f9de98d3c000080bfa0543bbd130ca73d2b16ed3fc2da27bf2fafbf3ec2da27bfbc41123f3253503f0774dabd000080bfcd0619bd425cb93d78b8ed3fa5522dbe5a99653f0a37d1be40657b3f1232413ee11df03b000080bf7a6e21bd425cb93d5ce5ed3f6a1aa0be5f99653f5826a0be52b4713f46b3a83e9ddf643a000080bf007418bd1749bb3d302dee3fe0c115befb767a3fe0c115be982c7d3f0cb6173e42e90e3b000080bf302b14bd1749bb3d4816ee3f7f11a2bdb0767a3f25b243bedf287f3f71c5a53d28a2d93a000080bff4501bbd1749bb3d6e4fee3f13bb43be15767a3fa122a2bdb3407b3f7349443e0e5145ba000080bf49da8dbb7539853d5d87e63fb709193e2602bfbea96a6abfb1b4a23c46526d3f2db7bfbe000080bf73be58bce1b3953dd367e53fe0d3183f821ed0be231031bfee06e63c31485f3f2e09fabe000080bfbfd2f9bb20b79f3da587e53fb476ad3e5a77dbbe4e6956bfa86decbb3b94633f4d70eabe000080bf0000000086ae843dd690e63f000000009fd2babe62596ebfaa7e8b3462596e3f9ed2babe000080bf826f1abcae2e873de351e63fcc86b83e7033e3be390b52bfb9667c3d8b95633fbc50e8be000080bf38f66cbc6dc6693d4148e63f42f6143fd32232be0d614bbf1d06eebce1c6783ff4b06fbe000080bf124da0bb6ff25b3d6fd6e63ffe9b7c3e3bfa0ebeef7f75bfaa9cccbca1027d3f4cee19be000080bf000000008fdf5b3dd9ece63f0000000007c212be735b7dbf44acc8b5745b7d3f08c212be000080bf79b0c5bb53d02d3d8deee63f9d99823e5592c93df33e76bf302569bdb49e7e3f7083b13d000080bf97e480bc3e3d363dde58e63fdbb9173f0f221e3d89f44dbf2620b2bdeffe7e3fb85285bc000080bf9198a0bc4b3c803dc85ce53ff007523f487d8ebe4fb6ffbe253b663dcf97683f29f0d3be000080bfff91e9bb6518f73c1078e63fac018e3e7cbace3eaf2e5fbfe518b0bdcc086a3f46c6ca3e000080bfd924bfbc147a3d3d8253e53fe2c25a3f35e242bdbf6704bf2cc782bda0867a3fcd3848be000080bf0dc773bcd658023ddc0fe63f343cf63ea9fa9c3e8b4752bfe5acfcbd4a82733fffcc903e000080bfd15ca7bc3cf5883dd063e43f3e61463f311c7ebe74d014bf5ae562bb91036b3f8f03cbbe000080bf145ad6bc60b1463d8049e43ffbc71c3f0732a2be516a39bf21da673c22a26b3f84ffc7be000080bfa470bdbcf3748e3d7b14e43f0d92e53df08191bc8d587ebf5ac342bee9207b3fb1ba1fbd000080bf4bad77bc6a32a33d8c82e43f04392f3fd5aea9bed13c26bf2ff580bc503f623f936eefbe000080bf08ad87bc6e16af3d751fe43f1a3a2f3eb742d4bd1ad37abf47ab3dbe8f2c793fca8e0abe000080bfff09aebc5a100a3de4a3e53fa3b5043fcef2dc3db02a59bf08bcdabd9e0e7e3f97a0793d000080bf3b5192bc3a1eb33d7429e43fc0cf0bbfd176e43e407e35bf7a628bbd16e4513f0287113f000080bfd34cf7bcc0cb4c3d69fde33f860220be327b52bec75177bf97f905bea24a793f6b7d3ebe000080bf68aed3bc5fb2913d713de43fcefb27bf88a9903ef71f33bfbecb3dbd3611693fa979d23e000080bf1e70ddbc2dea133dfb3fe53f32441a3fc2a2bcbde7ee4abfc11e8abdf7df7b3f1c9029be000080bfbec197bc60ffb53d07c7e43f4a3c3dbf085a283fe3c914bedfe3563e491ddc3e18ce603f000080bfe92807bdaa60543d5743e43fc31457bf64d2ac3dc52509bfd2b842bda7f9783f3a36693e000080bf8600e0bc043d943d25cce43f7c0a5bbf47eac83eeecdacbe5325023e4e994a3f7912193f000080bff1d6f9bc1d041d3d65a6e43f4cb7fe3e1aa234bde7c85dbf6770f2bdc6647c3ff9fff1bd000080bf3cf508bd1632573d50c8e43f5ac16dbfd662413e5d5aa3be8b5e633dbff26b3f9398c43e000080bf46240abd3aea283d0797e43fcfb3dbbec2f3dd3d069065bf5c5ab9bd0e8d7b3f27f4253e000080bf0ea40bbdd314013d5f5ce43f795c323f33f81e3f84deb7beee5f02bfc5df473fee59b93e000080bf8c9df0bcca6ee63cbb5ee43fb0b3253fe45f3b3f56fa59be03be13bffd2a273f3e1afb3e000080bfe867eabc40329d3dafcee53fb02a403ef5e4bf39a6737bbfb573763e0f31783f58d33d3d000080bfc8ea16bd41d8693d0cc9e53fd3258c3e2162163d180b76bf20c7bb3db5647e3f1f39833d000080bfd8ef89bc2106ba3dd13ee63f6b5a293ea8625e3d81177cbf081ff73eaec45d3f71ea033e000080bf6ea216bc404fc33da86ee63f760a513e98c18e3d10f979bfa3af0a3f65a0523fab1e303e000080bf68cefabbbef9cd3d689ce43fb7fd8c3ebc3716bf44f042bf377b8b3d40514d3f14e917bf000080bfb34211bdd7312e3d51f8e43f438137bf2734e63e6c6e08bfffbbf33d29fe543f06b70a3f000080bf371c16bdecdf353d6b9ae53fff820bbc48c6c53eaa1e6cbf03fc413b3b216c3fdac4c53e000080bf8b7013bd5ea10f3dbc5ee43f6ea2483f8a4b003f5cdabbbe0e3284be0ad64c3ff6980a3f000080bfea7a22bde814643d2b34e43f86917d3fdfc90bbee2c086bc52b8093e809c7c3fc392b9bd000080bf57b30ebd6a6d9a3d2d26e43fc9fe683f8c56d3be250212bd56c0b63e9d2b533f2f71e0be000080bf81ea1fbd6287313dbb5ee43f61b37b3f378a263e7192a9bd636fe7bd7e17663fb0dbd83e000080bfad881abd454b1e3dbc5ee43faa8c623fb4aee03ee4891fbec8a808be1f3e0f3f9767513f000080bf7008d5bcec6db33dc635e43fc9f7333fd3b935bff6a1313d0db2133f4a98083fd5501ebf000080bf948785bccecec23df77de43fae41073f38e7f9be42d831bfd12fd23de254593f7cb604bf000080bf0000000005a3d23d3387e43f00000000460a13bf3e8f51bf46e79dba348f513f3e0a13bf000080bf00000000965fc63d2976e63f00000000a8225e3d8e9f7fbf792343bb439f7f3f6f225e3d000080bf6ea2163c404fc33da86ee63f760a51be98c18e3d10f979bf26fb0abf126c523fdf4e303e000080bfcbf536bcd13cc03d2fdbe43faa52d4bed2b8663f899100bec214e73dd659403e42c7793f000080bf000000008928c63d46ede43f00000000698e7e3f2732d9bd000000002732d93d698e7e3f000080bfcbf5363cd13cc03d2fdbe43faa52d43ed2b8663f899100be5612e7bd4f59403e51c7793f000080bfbec1973c60ffb53d07c7e43f4a3c3d3f085a283fe3c914be38e356bef91cdc3e34ce603f000080bf3b51923c3a1eb33d7429e43fc0cf0b3fd176e43e407e35bfbf758b3d0de3513f3788113f000080bf00000000dc46c33d8318e43f00000000add2ac3ea8f970bf5ba1e7b2a8f9703faed2ac3e000080bf73d627bc0951be3d3a21e43ff0ea32be0720e93ed27d5fbf9efba7bcc980623f265eee3e000080bfbbd31dbcf417ba3d0e4ee43f0dcbbb3e3e1606bf3dd344bf39a9a9bc4757523fe5d211bf000080bf000000004792c03dcd5ce43f00000000efb748bf81e51ebf9bce05b380e51e3feeb748bf000080bf793d18bcca6fb13de9d1e43f6290fd3e4d1c05bf0f2b32bf838add3ce4584f3fe5fb15bf000080bf000000004628b63d6804e53f00000000dacb1bbf5d224bbf99a864335d224b3fdacb1bbf000080bf793d183cca6fb13de9d1e43f5893fdbecb1b05bf612a32bf6089ddbceb584f3fdefb15bf000080bfbfd2f93b20b79f3da587e53f1d73adbef277dbbee36956bfe16dec3b3d94633f4670eabe000080bf73be583ce1b3953dd367e53f59d418bf391bd0beb01031bfb1dae5bcc4485f3f4807fabe000080bf49da8d3b7539853d5d87e63f060219be5e02bfbeed6a6abff6a4a2bc3d526d3f66b7bfbe000080bf00000000779fa33dfe9be53f000000008b5ae6be80a064bf0000000081a0643f8c5ae6be000080bf826f1a3cae2e873de351e63fcc86b8be7033e3be390b52bf48547cbd6695633f9751e8be000080bf124da03b6ff25b3d6fd6e63ffe9b7cbe3bfa0ebeef7f75bf14a4cc3c9d027d3f87ee19be000080bf38f66c3c6dc6693d4148e63f42f614bfd32232be0d614bbf270eee3cd4c6783fa5b16fbe000080bf9198a03c4b3c803dc85ce53ff00752bf487d8ebe4fb6ffbea03766bdb097683fbff0d3be000080bf4bad773c6a32a33d8c82e43f103a2fbff2ada9bef13b26bfcbeb803c6d3f623f2c6eefbe000080bfbbd31d3cf417ba3d0e4ee43f0dcbbbbe3e1606bf3dd344bf64a0a93c5957523fced211bf000080bf97e4803c3e3d363dde58e63f1dbc17bf4a221e3ddff24dbf061cb23dfcfe7e3fc94e85bc000080bfd924bf3c147a3d3d8253e53fe2c25abf35e242bdbf6704bf3cc6823dac867a3f0c3848be000080bf79b0c53b53d02d3d8deee63f9d9982be5592c93df33e76bf6618693dbb9e7e3f2885b13d000080bfd15ca73c3cf5883dd063e43f3e6146bf311c7ebe74d014bff9cf623b9c036b3f5e03cbbe000080bf08ad873c6e16af3d751fe43f1a3a2fbeb742d4bd1ad37abf32b23d3e312c793fd88f0abe000080bf73d6273c0951be3d3a21e43ff0ea323e0720e93ed27d5fbf4f4ba83c8a80623fe45eee3e000080bf000000007b112d3d76fbe63f000000005912f23d96347ebf3cc497b396347e3f5912f23d000080bf000000002eaef13c3b8fe63f000000006d9fdc3e8b0367bf9aa62db38c03673f6d9fdc3e000080bfff91e93b6518f73c1078e63fac018ebe7cbace3eaf2e5fbfd516b03dca086a3f6fc6ca3e000080bf0dc7733cd658023ddc0fe63f343cf6bea9fa9c3e8b4752bf5fa9fc3d4782733f81cd903e000080bfff09ae3c5a100a3de4a3e53fa3b504bfcef2dc3db02a59bfb6b6da3da90e7e3f31a7793d000080bf611bf13bf9beb83c44c0e53fccea60be8bea4f3fb05d0abfdb5d293e68b6133f05c14c3f000080bfb3eb5e3cb649c53ccd8fe53f12cbbdbe0b553c3f4f2011bf3457893e364f2b3f5b68313f000080bf00000000e8a1b63c9fe5e53f0000000059fe523f94f910bf679f4eb395f9103f59fe523f000080bf611bf1bbf9beb83c44c0e53fccea603e8bea4f3fb05d0abf6c5e29be6cb6133ffbc04c3f000080bf16c3553c6459b03cbb5ee43fe18993be10d7743fae4242bd7d77b83e0ce01d3ef6856b3f000080bfdd07a03ceba9d53cef59e53f5957dbbea72c2a3f69ae1cbf6932973ec33e3e3f80b6193f000080bf1e70dd3c2dea133dfb3fe53f32441abfc2a2bcbde7ee4abf4c148a3d38e07b3f428c29be000080bf145ad63c60b1463d8049e43ffbc71cbf0732a2be516a39bf55eb67bc35a26b3f21ffc7be000080bfb3eb5ebcb649c53ccd8fe53f12cbbd3e0b553c3f4f2011bff35889be504f2b3feb67313f000080bf16c355bc6459b03cbb5ee43fe189933e10d7743fae4242bd3679b8be05e11d3e95856b3f000080bfdd07a0bceba9d53cef59e53f5957db3ea72c2a3f69ae1cbf703597bee63e3e3f97b5193f000080bfabb099bcd652c03cbb5ee43faa1eaf3ea23f703f7de343bd3b3f05bf2f236d3e7465523f000080bf0e32c9bce4d9e53c2425e53fa50bfc3e03840f3f70762abf3865a8be54fc533f7674e83e000080bf01fbe8bc1155f83c9aefe43fc2f42b3f6683583eefc235bfa1272dbebd137a3fa813063e000080bf28efe3bb2e74a53cbb5ee43f9a82f23da5307e3f430108bcf65a123da123863b9ad57f3f000080bfc6f7c5bca12ed23cbb5ee43fbca2c83e29e5693ff252ddbd695e10bf2ea6a93e27a5413f000080bfd34cf73cc0cb4c3d69fde33f8602203e327b52bec75177bfb8f9053ea14a793f657d3ebe000080bff1d6f93c1d041d3d65a6e43f4cb7febe1aa234bde7c85dbf9a68f23df5647c3f91fbf1bd000080bfa470bd3cf3748e3d7b14e43f8682e5bd118291bcc6587ebfe5c8423ea6207b3f19b71fbd000080bf68aed33c5fb2913d713de43fbdfc273f57aa903eee1e33bf37c83d3dd610693f587bd23e000080bfe928073daa60543d5743e43fc314573f64d2ac3dc52509bfe0ba423d9af9783f0137693e000080bf46240a3d3aea283d0797e43f1fb7db3e01f3dd3d3e8f65bf8e57b93d148d7b3f50f4253e000080bf0ea40b3dd314013d5f5ce43f795c32bf33f81e3f84deb7be455f023faedf473f305cb93e000080bf8c9df03cca6ee63cbb5ee43fb0b325bfe45f3b3f56fa59beddbc133f8a2a273f231efb3e000080bf8600e03c043d943d25cce43f7c0a5b3f47eac83eeecdacbe662402be16994a3fcf12193f000080bf3cf5083d1632573d50c8e43f5ac16d3fd662413e5d5aa3becb5863bd6af26b3f449ac43e000080bfe867ea3c40329d3dafcee53fb02a40bef5e4bf39a6737bbf937076be4131783ff3d03d3d000080bfb342113dd7312e3d51f8e43f4381373f2734e63e6c6e08bf9fbaf3bd15fe543f30b70a3f000080bfc8ea163d41d8693d0cc9e53fd3258cbe2162163d180b76bf56c6bbbdb9647e3fe638833d000080bf8b70133d5ea10f3dbc5ee43f6ea248bf8a4b003f5cdabbbeda30843eb1d54c3fc3990a3f000080bfd8ef893c2106ba3dd13ee63f595a29be11835e3d66177cbfc11cf7be11c55d3fe9f0033e000080bf9487853ccecec23df77de43f344207bf22e4f9bef3d831bfcd1dd2bd6755593f16b604bf000080bf68cefa3bbef9cd3d689ce43f98fa8cbec63616bf90f142bf72af8bbde5524d3f1ae617bf000080bf371c163decdf353d6b9ae53fff820b3c48c6c53eaa1e6cbf04b241bb3b216c3fdbc4c53e000080bf81ea1f3d6287313dbb5ee43f61b37bbf378a263e7192a9bdf36fe73db017663fd3dad83e000080bfad881a3d454b1e3dbc5ee43faa8c62bfb4aee03ee4891fbef8a7083ecd3d0f3fd767513f000080bfea7a223de814643d2b34e43f86917dbfdfc90bbee2c086bc1db809be589c7c3f30a1b9bd000080bf57b30e3d6a6d9a3d2d26e43fc9fe68bf8c56d3be250212bd25bfb6be852a533f4376e0be000080bf7008d53cec6db33dc635e43fc1f633bfd6ba35bff3a2313df6b113bf7296083f80521ebf000080bf740a72bca9f59e3d30bae23fcaf63a3f7a37ecbef4f5003f1a9918bef6c953bf7aa80abf000080bf5b4494bcc4b16e3d6611e23f392f343f0ffc62be18c52c3f74f013bdddc275bf76278ebe000080bfaa7c4fbc8351893d4a0ae23f0e4a933eaa723dbe768f703fec8d963d5b5879bf4c695bbe000080bffca9f1bb2601aa3de080e23fd54ab83e878223bfb8182e3f719f04beed8d41bf5c3c24bf000080bffc6fa5bc3be07a3d272ee33f2f036f3f7fba38be29729e3e58fb49bd5ca16bbf6e8bc6be000080bf61c17dbc2d99a33dd5aee33f851e443f2b57fbbec06ad43e2bd8e3bdafad3cbf4ea92abf000080bf08ad07bcf965b03d438ce33f404fef3ea95643bf2193e43e926398bdfc8209bf071757bf000080bf000000002193ac3d9561e23f000000005c6824bfd23a443f68ac55b4d23a44bf5c6824bf000080bf00000000d49e923d8bfde13f00000000020e86bec911773fe508c5b4ca1177bf030e86be000080bffca9f13b2601aa3de080e23fd54ab8be878223bfb8182e3fb69b043ec88d41bfb83c24bf000080bf3333b3bc118f843dbde0e33fc0d63b3f056b47be74a2263f356d6e3d73be6fbf1d0db1be000080bf749a85bc6d1ea73d0802e43f00c3fa3e2d9ab4be721c4c3f674e9e3d52b164bfdfa9e2be000080bf2cb90abc39b8b43df1f3e33fe126b63e94a01fbfd736323f0ab14b3ba87c3ebfd0062bbf000080bf00000000bb28ba3dd4eee33f00000000706757bf3c560a3f486337b33d560abf716757bf000080bf00000000c632bd3dda38e43f0000000050923d3e2b937b3fbd8a03332a937bbf50923d3e000080bf2cb90a3c39b8b43df1f3e33fe126b6be94a01fbfd736323f69fd4abbd57c3ebf9d062bbf000080bfc8ebc1bc8d47893dca17e43fe5836f3e3173c5bd01ac773f9d3b333ee38179bf06ca0ebe000080bf172994bc145cac3d2827e43fe2daa7be8b52983eed8b653f4c482c3dbd8e71bf9f2aa83e000080bfd9cd0cbcc1adbb3ddb34e43f01035abee0b2d03e3153633fb5281abcffdd68bfbea1d43e000080bff25cdfbc80998f3dae12e43fa24320bf24d24d3efbe1403fc437313d44ad74bf5df3943e000080bf601f9dbc3047af3d9ab4e33f5e1730bf41e92a3fc4d6913ed3355bbeccc20fbf4d9c4c3f000080bfae2910bc8f51be3d56bae33ffe3ec6be8c85673fbeaa373eb79119be1be881bee4a0743f000080bf00000000215cc13dacaae33f000000005d8b793f0183643ed57a84b3008364be5c8b793f000080bf14aec7bc6ee04e3d910de43f6b79003f865a58be66b8563f3c3c033ededa70bfd19aa0be000080bf9e29f4bc7d09553d3c15e43fd0cff5be668348bc728b603fca50263ee3dd7bbf29f4993d000080bf1e34bbbcdba24c3d64b1e33f9e8c503f559244bec0190c3f980f193b334a71bfca0dabbe000080bfadf6b0bce065463da35be33fb30b723f89e352bd88a2a43ea918b53c639979bf756c62be000080bfd2c2e5bc51a3903dc4b0e33f97a85ebf0e42b23e230eb33ec4411fbeb4af5dbf185cf33e000080bffe9901bd98e0543d8eade33fa71e60bf6a82bf3deec2f23ef8cf633da18074bf6605953e000080bf7e1ea3bc0742b23df88ae23fccf10f3e404103bd47537d3f32cdcfbe55db69bffef8e53c000080bf6891edbb5227c03dec53e23f5ba11e3d2711973d2c1c7f3f870aeabe10b062bf5d9eaa3d000080bf68cefabbbef9cd3da661e43f701a203e69bfd5bea027653f346b6fbd499a68bf87bcd3be000080bf00000000849dc23dea57e23f000000009531a83d9e227f3f00dd0d3b77227fbf7c31a83d000080bf000000005930d13dfb59e43f000000005bc2cebeab326a3fd523a43a9f326abf4bc2cebe000080bf0a3117bdffb1503d185be23f78d90e3e8b91a8bd9b9e7c3f04fb88bd62bb7ebf089d96bd000080bf7f4e01bdfec0953d0e88e23f10c22e3e4122cebdc5ec7a3f7c7365bee30079bfe34e79bd000080bf948785bccccec23da032e43f0ff3bf3e72ba15bff822383f6da125be1a244ebfe60912bf000080bfabd1abbce02b3a3d282de23f6f20623f0ab2b73d9b96eb3ef867e23d00637ebf4dae97bc000080bf31d28bbc12f5023da65fe23fc9122f3f2c1bc73e82081e3f9183543e3b336abfc55ab13e000080bf8fe307bca515df3c90a3e13f7fa6ad3e547a1f3f9f74343f0bda183eb18446bf0f0e1d3f000080bf611bf1bbf9beb83c3bfde23fcbf1203ec75a6b3f31aab83e7a57413eb0dcc5be721c673f000080bf4eb42bbcd769243d9a40e13f0a36cf3ee671db3d437c683f5cee3b3d7e867ebf9f5fc63d000080bf000000004b5bdc3c2d97e13f000000006a302a3fb83c3f3fcb4cafb6b93c3fbf6b302a3f000080bf00000000ac6f203dd7f6e03f0000000016b2e03d5d747e3fde6ef8325e747ebf17b2e03d000080bf00000000e8a1b63c53ece23f000000001647733ffe659f3e3f514836ff659fbe1747733f000080bf92ae19bc33315d3d317de13fef836f3e91835bbef8c5723fefc19c3bc6a179bf76ec62be000080bf0ebf9bbbd49e923d8bfde13f8952c03d008289be836b753f6bac1f3dfb1076bf3ad38bbe000080bf00000000e76e573db760e13f00000000904b74beae9b783f00000000ac9b78bf8e4b74be000080bf956673bc0951be3ce811e33f81baaa3e03254d3fcf47fe3e638f743e46d714bfd51b473f000080bf5855afbccfc0083d31eee23f9546303f7a73e63da964373f41c4c13d654e7ebf4650853d000080bf87e1a3bc8db4d43c3738e33fa3c2d13e2d682a3f08ae1f3f0e11883e38bf3dbf03cf1d3f000080bfe34fd4bc2bc20d3df373e33fb841993e5d3903be9f0c723f13ea843c0a787dbfc3ac0ebe000080bffb5801bdb1170a3d6479e33f87e5143ffff1c13d21d44e3fde79223eb7c17cbf7b06c53a000080bf6a86d4bc2367e13cf241e33f2f92873e24b4063f3edf4e3fde443d3e28a459bf576cfc3e000080bfabb099bcd652c03cbb5ee43faa1eaf3ea23f703f7de343bd5b1bf23e2ffb02be5d2e5f3f000080bf16c355bc6459b03cbb5ee43fe189933e10d7743fae4242bd604fc13ed62f8bbdba696c3f000080bf8d7a08bdfcc6173d32abe33ff1eda93e1b6ec03e827e5d3f87c4143e3a376dbf218eb13e000080bf357f0cbd96b4223db81ee33f014ba9be2a63363fbb721e3f3297183dfe3c25bf544c433f000080bf8b7013bd5ea10f3dbc5ee43f6ea2483f8a4b003f5cdabbbe38fc1e3f191a24bfd6e9e63e000080bf4c551abdaa99353d6459e23fe51b7f3eaadab33e680b673f45a7443d856b6fbfa496b33e000080bfad881abd454b1e3dbc5ee43faa8c623fb4aee03ee4891fbeeed5cd3e19170dbfd92e3b3f000080bf81ea1fbd6287313dbb5ee43f61b37b3f378a263e7192a9bd6d5a383ea43c4abf560a163f000080bfea7a22bde814643d2b34e43f86917d3fdfc90bbee2c086bcf8920cbec1137dbf4b6f7ebd000080bf57b30ebd6a6d9a3d2d26e43fc9fe683f8c56d3be250212bd6362c6beea4b51bf8519dabe000080bf7008d5bcec6db33dc635e43fc9f7333fd3b935bff6a1313ddeda00bf8e290abfbfc02cbf000080bf0ea40bbdd314013d5f5ce43f795c323f33f81e3f84deb7be9e62353f0e7d04bf879ef53e000080bf8c9df0bcca6ee63cbb5ee43fb0b3253fe45f3b3f56fa59bef585233fd0a3bcbe75ea2c3f000080bf1840f8bc1d91ef3cde55e33f5d3c233f019fcb3e7ce4283fff28b73d058c63bf7914e63e000080bfc6f7c5bca12ed23cbb5ee43fbca2c83e29e5693ff252ddbdaf0d0e3f376710beade3513f000080bf0000000029eca23cbb5ee43f0000000016ff7f3f9b04ad3b000000009b04adbb17ff7f3f000080bf28efe33b2e74a53cbb5ee43f9a82f2bda5307e3f430108bc965812bde525863b9cd57f3f000080bf611bf13bf9beb83c3bfde23fcbf120bec75a6b3f31aab83e085641bea1dcc5be861c673f000080bf8fe3073ca515df3c90a3e13f04a3adbebe7a1f3f1775343f76db18be898446bf2a0e1d3f000080bf31d28b3c12f5023da65fe23fc9122fbf2c1bc73e82081e3fbf8454be48336abf2e5ab13e000080bfabd1ab3ce02b3a3d282de23f6f2062bf0ab2b73d9b96eb3eda67e2bd00637ebf6dad97bc000080bfadf6b03ce065463da35be33fb30b72bf89e352bd88a2a43e1a1ab5bc5b9979bff86c62be000080bf9566733c0951be3ce811e33f81baaabe03254d3fcf47fe3efc8f74be4dd714bfc51b473f000080bffc6fa53c3be07a3d272ee33f2f036fbf7fba38be29729e3ea2fb493d61a16bbf588bc6be000080bf3333b33c118f843dbde0e33fd0d53bbf066a47be96a3263fca706ebdb3be6fbfaf0bb1be000080bf61c17d3c2d99a33dd5aee33f851e44bf2b57fbbec06ad43e94dbe33d00ae3cbfe3a82abf000080bf5b44943cc4b16e3d6611e23f392f34bf0ffc62be18c52c3f60f7133df8c275bfa2268ebe000080bf740a723ca9f59e3d30bae23fcaf63abf7a37ecbef4f5003f6997183ec3c953bfe8a80abf000080bf4eb42b3cd769243d9a40e13f0a36cfbee671db3d437c683fcdf63bbd7e867ebfbe5dc63d000080bfaa7c4f3c8351893d4a0ae23ffe4d93bea46a3dbe418f703f749496bda45879bf03635bbe000080bf749a853c6d1ea73d0802e43f00c3fabe2d9ab4be721c4c3f87439ebdc1b164bf96a8e2be000080bfc8ebc13c8d47893dca17e43f538b6fbed672c5bd8eab773f413833be048279bfb0ca0ebe000080bf1e34bb3cdba24c3d64b1e33ff08b50bf9b9344bea71a0c3fa13919bb204a71bf370eabbe000080bf1729943c145cac3d2827e43f7ddaa73e3f56983e638b653fe3492cbd0e8e71bf832ea83e000080bff25cdf3c80998f3dae12e43f6f42203f20d34d3ee8e2403f434131bd23ad74bf0df4943e000080bf14aec73c6ee04e3d910de43f6b7900bf865a58be66b8563f2b3903be1bdb70bf059aa0be000080bffb58013db1170a3d6479e33f2ee414bfe5f2c13d15d54e3f3f7a22beb3c17cbf69aec53a000080bf9e29f43c7d09553d3c15e43fd0cff53e668348bc728b603f475326bec2dd7bbfe7f6993d000080bfd2c2e53c51a3903dc4b0e33f7ba75e3fda46b23ee10eb33e44471f3ea8ae5dbf055ff33e000080bf601f9d3c3047af3d9ab4e33f5e17303f41e92a3fc4d6913e82305b3edcc10fbf519d4c3f000080bf8d7a083dfcc6173d32abe33f9af2a9beee6ec03e6d7d5d3f42c214be13376dbf668fb13e000080bffe99013d98e0543d8eade33fa71e603f6a82bf3deec2f23e88d563bd6d8074bf9b06953e000080bf357f0c3d96b4223db81ee33f014ba93e2a63363fbb721e3f559d18bde23c25bf684c433f000080bf8b70133d5ea10f3dbc5ee43f6ea248bf8a4b003f5cdabbbe37fc1ebff41924bf40eae63e000080bf0ea40b3dd314013d5f5ce43f795c32bf33f81e3f84deb7bea76235bf3e7d04bf039ef53e000080bf8c9df03cca6ee63cbb5ee43fb0b325bfe45f3b3f56fa59be098623bf09a4bcbe51ea2c3f000080bf0a31173dffb1503d185be23f78d90ebe8b91a8bd9b9e7c3f98fc883d5fbb7ebfcd9c96bd000080bf7f4e013dfec0953d0e88e23f2cba2ebe8922cebd1eed7a3fe673653ed50079bff35579bd000080bf4c551a3daa99353d6459e23fe51b7fbeaadab33e680b673f88a144bd816b6fbfd396b33e000080bf57b30e3d6a6d9a3d2d26e43fc9fe68bf8c56d3be250212bd4562c63ec14b51bf3e1adabe000080bf7008d53cec6db33dc635e43fc1f633bfd6ba35bff3a2313de4da003f32280abfd0c12cbf000080bf7e1ea33c0742b23df88ae23fccf10fbe404103bd47537d3f3acccf3e8cdb69bf94f6e53c000080bf9487853ccccec23da032e43fdbe6bfbe32bc15bfbb24383f5fa7253e64234ebf790a12bf000080bfad881a3d454b1e3dbc5ee43faa8c62bfb4aee03ee4891fbecad5cdbee3160dbf0b2f3b3f000080bf81ea1f3d6287313dbb5ee43f61b37bbf378a263e7192a9bd605a38be623c4abfb00a163f000080bfea7a223de814643d2b34e43f86917dbfdfc90bbee2c086bcf8920c3ec1137dbf1b707ebd000080bf68cefa3bbef9cd3da661e43f701a20be69bfd5bea027653fd470703d7e9a68bf02b7d3be000080bf6891ed3b5227c03dec53e23f9ca21ebd5912973d271c7f3f8bacea3e268662bf1da0aa3d000080bfae29103c8f51be3d56bae33ffe3ec63e8c85673fbeaa373e008f193e98e781be12a1743f000080bfd9cd0c3cc1adbb3ddb34e43f4c025a3e43b6d03e7552633f2e381a3c3cdd68bf17a5d43e000080bf08ad073cf965b03d438ce33f404fefbea95643bf2193e43e8163983dfb8209bf091757bf000080bf0ebf9b3bd49e923d8bfde13f8952c0bd008289be836b753f47a21fbd061176bf1fd38bbe000080bf92ae193c33315d3d317de13fef836fbe91835bbef8c5723fd8789cbbcea179bfedeb62be000080bf00000000cc28b63d9984e33f00000000f9a85ebf67a7fc3e0000000067a7fcbef8a85ebf000080bf5855af3ccfc0083d31eee23f954630bf7a73e63da964373ff2c7c1bd604e7ebfb24c853d000080bfe34fd43c2bc20d3df373e33fb84199be5d3903be9f0c723f88ec84bc0b787dbfdcac0ebe000080bf87e1a33c8db4d43c3738e33fa3c2d1be2d682a3f08ae1f3f1c1088be2bbf3dbf45cf1d3f000080bf6a86d43c2367e13cf241e33f2f9287be24b4063f3edf4e3f024b3dbe21a459bf4d6bfc3e000080bfabb0993cd652c03cbb5ee43faa1eafbea23f703f7de343bdbf1af2beb3fa02be8e2e5f3f000080bf16c3553c6459b03cbb5ee43fe18993be10d7743fae4242bd614dc1be422d8bbd296a6c3f000080bf1840f83c1d91ef3cde55e33f5d3c23bf019fcb3e7ce4283f8339b7bda28c63bf3a11e63e000080bfc6f7c53ca12ed23cbb5ee43fbca2c8be29e5693ff252ddbdd10d0ebf7d6710be93e3513f000080bfabb0993cd652c03cbb5ee43faa1eafbea23f703f7de343bd133e053fad216d3e4a66523f000080bf0e32c93ce4d9e53c2425e53fa50bfcbe03840f3f70762abf1962a83e53fc533fc276e83e000080bf01fbe83c1155f83c9aefe43fc2f42bbf6683583eefc235bf47232d3eca137a3fd517063e000080bfc6f7c53ca12ed23cbb5ee43fbca2c8be29e5693ff252ddbd955c103ffea4a93ec8a6413f000080bffa9ae53b317aae3d116fe33f4732813e1a1c693f069ba73e4d3d9abe0274ca3e46215ebf000080bf4f5a383c3c14a53d50a8e33f5442403ef73da33ed8d46d3f687a0b3d7973713fff3fa9be000080bf54e14f3c15e4a73d3179e33f1360243f60c63b3ff34a643e71a9debe5e86163f85982ebf000080bf433c923cf5db973d459be33fddcd4a3f1ca2e73ee7b1d13e0c8679be278d593f9a4cefbe000080bf919be13b84b7a73d1fa0e33f0a8250bc031a8a3e777d763f1d26ae3c1979763fbcf289be000080bfe9f2663c037c973d90bee33fded90e3eb5f2443e4aab783f44c3653d16547a3ffe824ebe000080bf2a39a73c9581833d83dae33ff4dd363f1aca443ee1432c3f9c8b73bde488793f086d5cbe000080bf000000007637af3d5e63e33f00000000f86d683fb697d63e823df934b597d63ef86d68bf000080bfdae3053cc4af983d94bde33f4fc2e1bcf8f2ff3d1ae57d3f4ecece3cc3ee7d3fef8cfebd000080bf8bfc7a3c6344823d0dfde33ff9c25c3dccf1993d10e77e3f29ef193dbe0d7f3fb1339ebd000080bf0000000050aba83dda8ce33f00000000ed7d843eb847773fae9f59b5b847773fed7d84be000080bf365a8e3c9f01953d0131e33fd24a3b3f56769f3e573e1bbf27b929bf123e083feec906bf000080bfae64473c9ad0a43da511e33f4f460f3f1694fd3ebe182abfb0823fbf1e4630bd1f8629bf000080bf7940d93ba54fab3d5ef7e23f72898b3ec1b5233fee0738bfd88904bf4c4408bf8b772bbf000080bf9679ab3ce223823d1b4ae33fe066613fb8ca533ed26adabe4382babe5afc5e3f6db9a8be000080bf00000000e945ad3dc8ece23f00000000ee1e353ff5ea34bf30b5ddb5f5ea34bfed1e35bf000080bf747e0a3c7896803d50e4e33f5342bdbd4642203d2ab57e3f5a20813cf2c87f3fa6f01abd000080bf00000000b570993db3b2e33f00000000f2b2f63dca227e3f1b0592b4cb227e3ff3b2f6bd000080bf00000000d8bb7f3d0ccde33f0000000052a20f3db2d77f3f00000000b2d77f3f53a20fbd000080bf1042c03cdcc4493d4e42e33f9238773f4662543d534182becc3391bd9cca7e3fd4bc87bd000080bf00e2ae3cf2604b3d58e2e33f5c1e193fc602203c1c254d3fcdea26bce9fb7f3f862896bb000080bf7d23ba3cc4060b3dfa62e33f84317a3f100358be7c4299bc1cca553e0fe5713f0818813e000080bf4fe8753c8a3c493dbef9e33ffe00c93b468021bc96fb7f3f2137813cbaf47f3f18e61f3c000080bf3048fa3ba632453df6dbe33f7cb1a3bd8cda7f39522e7f3f23470d3c8ffd7f3fb72cea39000080bf0000000082fe423d96d0e33f00000000c803163c42fd7f3fad3f293440fd7f3fc80316bc000080bf21576a3cb2640e3d4be9e33feb013b3c28a13cbd31b67f3f34adc2bc26a77f3fcdb23d3d000080bf2afeef3bdba50d3d4cdde33f23c232bd1a4342bdbd777f3fb32337bc88b37f3ffa6f403d000080bf00000000711b0d3d12dbe33f00000000698378bd43877f3f3faa063644877f3f6983783d000080bf0f2bdc3bfd14c73cacc5e33fe771b9bd92d187bed5bc753fa9ef2abd15cb763ff462863e000080bf0000000086e6ba3c3ba9e33f000000006382c1befd026d3fe6ab1ab6fd026d3f6482c13e000080bf747e0abc7896803d50e4e33f5342bd3d4642203d2ab57e3f7f2081bcf3c87f3fa5f01abd000080bfdae305bcc4af983d94bde33f4fc2e13cf8f2ff3d1ae57d3f02d1cebcc2ee7d3fe98cfebd000080bf00000000ea219a3cca4ee33f00000000715573bf420e9f3e90874435420e9f3e7255733f000080bfc64fe33b76719b3c0263e33fed44e73c36c26bbf9703c73eb5b2fdbd8ae8c33e01626a3f000080bf5b41533c5185bf3c46d3e33f2d490f3eee3dd2be0ea8663fa7f4913dd069693f8616cf3e000080bfef02a53c72870d3db1dbe33f236ffe3e8a9100beaed05b3f850bc0bb1d2d7d3ff38d173e000080bf3fa88b3cf9d9c83ce8bfe33ff65fef3ea42a1ebfb0d8213fa93c863e54a9473fa17c113f000080bfad13973c77bcc93ce563e33f17c74a3f598419bfd033e93d2265b13e2c66183fc696393f000080bf0f2bdcbbfd14c73cacc5e33fe771b93d92d187bed5bc753ffaea2a3d16cb763f0363863e000080bf2afeefbbdba50d3d4cdde33f23c2323d1a4342bdbd777f3f5417373c89b37f3f1e70403d000080bf3048fabba632453df6dbe33f7cb1a33d8cda7f39522e7f3f6d2f0dbc8ffd7f3fe1efe939000080bf8bfc7abc6344823d0dfde33ff9c25cbdccf1993d10e77e3fd8eb19bdc00d7f3f9b339ebd000080bfe9f266bc037c973d90bee33fded90ebeb5f2443e4aab783fd5bb65bd20547a3fc1824ebe000080bf9c6e593cca6ba53cb476e33fa996c13e07ff5dbf50f2a53e242959be71f2843e2c2f713f000080bf6f4b643cf27ab03c90bfe23f5c5bd43e62d81abfaf062ebf894e04be115647bf452f1d3f000080bfad13973c77bcc93ce563e33f17c74a3f598419bfd033e93d384f04bf6b460fbfb2d6253f000080bfc9c7ee3bea7aa23c18b4e23feea2c63d982c36bf8a2232bf97385bbc863333bf8ac9363f000080bf0000000099d6a63c82ade23f00000000e93723bf573845bf86d6d232583845bfe937233f000080bfc64fe3bb76719b3c0263e33fed44e7bc36c26bbf9703c73e30b5fd3d7fe8c33ef9616a3f000080bf5b4153bc5185bf3c46d3e33f2b520fbe333fd2be6aa7663f23ed91bd8b69693f1318cf3e000080bf21576abcb2640e3d4be9e33feb013bbc28a13cbd31b67f3ff59cc23c29a77f3fb8b23d3d000080bf4fe875bc8a3c493dbef9e33ffe00c9bb468021bc96fb7f3f4b3081bcbaf47f3f2de61f3c000080bf2a39a7bc9581833d83dae33ff4dd36bf1aca443ee1432c3fea91733df488793f6f6b5cbe000080bf433c92bcf5db973d459be33f21cd4abf85a3e73e2eb3d13ed588793e168d593f1a4cefbe000080bf00000000edd5073de17ee23f00000000c4a24dbd5dad7fbf1d91f4355dad7fbfc2a24d3d000080bf15c8ec3b2043073d508ae23f5f41a63d6242b1bc4e187fbfd6d5143dc9c07fbf91f7c93c000080bf32ff683c08ad073d389fe23ff3825f3e0904eebc6eb779bfc3ffac3d36c87ebf27d8463d000080bf68e89f3c07250c3dc1e2e23feda3173fb3d2d2bd93904cbf4e8a7e3daaa67bbfb5d8303e000080bfc9c7eebbea7aa23c18b4e23feea2c6bd982c36bf8a2232bf60375b3c843333bf8ac9363f000080bf00000000302f403d6b7ee23f00000000d881a63d0a277fbfb5c6afb50a277fbfd881a6bd000080bf6798da3b8f8d403d86aee23f46b1023ee771ad3da6fa7cbfd6f1323dbbf07ebfe33ba3bd000080bf7a6ccb3bff59733da1d6e23f5143f83dbc02493d26cd7dbf5933093cd8b07fbf2b5046bd000080bf0a125b3c5b23423d28b8e23fd972bd3de801923d853f7ebf959c643d5c097fbf48d087bd000080bf5c04463cfa27783d84d9e23f8561a83da5215d3d38c27ebf9b60a73c00987fbf2df156bd000080bf79909e3cc3b6453dfed6e23fdac6d03ec863733d274169bf41907b3df3557fbf28d919bd000080bf40178d3cf4f87d3d3cf5e23f1e53b43e5503d33d09246ebf67c7273d75a27ebfdaddc1bd000080bf1042c03cdcc4493d4e42e33f9238773f4662543d534182be60de733df87a7fbf1f29b93c000080bf9679ab3ce223823d1b4ae33fe066613fb8ca533ed26adabe9181183e549579bf534229be000080bf15c8ecbb2043073d508ae23f5f41a6bd6242b1bc4e187fbf0ed514bdc9c07fbf71f7c93c000080bf32ff68bc08ad073d389fe23ff3825fbe0904eebc6eb779bfb103adbd2bc87ebfe3d9463d000080bf6798dabb8f8d403d86aee23f89a902be1372ad3de5fa7cbfd0f532bdb7f07ebf503ca3bd000080bf7a6ccbbbff59733da1d6e23f5143f8bdbc02493d26cd7dbf7b3209bcd8b07fbf315046bd000080bf00000000adf6703d09a4e23f00000000eb518d3dca637fbfef2ac533ca637fbfea518dbd000080bf7d23ba3cc4060b3dfa62e33f84317a3f100358be7c4299bcc61345be01eb6bbf22a4ac3e000080bf224f923c9f03cb3c410be33f8a6c423f0b4be6be25a3f0be74ad5dbeae245bbf3c57f03e000080bf365a8e3c9f01953d0131e33fd24a3b3f56769f3e573e1bbf3016393e474272bfb33189be000080bfa4c76f3c5725913d6bf2e23f92e2b23e6083dd3d60436ebffbc7e33ca87b7ebf4337d7bd000080bfae64473c9ad0a43da511e33f4f460f3f1694fd3ebe182abf65b96a3ed1ed5cbfd080e6be000080bf5f5c2a3c605b9f3d58e1e23fe4398d3e66ca2c3e503f72bfb05af43ca7497cbf810c2bbe000080bf8274313cbc908e3dcbd8e23f7e22f43d7d81323cc8287ebff555253b10fc7fbf2ad32ebc000080bf7940d93ba54fab3d5ef7e23f72898b3ec1b5233fee0738bf78a51e3e033e44bf63891fbf000080bfc901bb3b5308a43d4ed2e23f90f3ec3d7dfa2c3e9b937abfb98c943c17527cbfd1fc2bbe000080bf249bab3bebc99c3d7dcbe23f70a1833dfa80a73cc36a7fbfdce6013b48f27fbf12cea6bc000080bfd157103cd9439b3d7cd3e23fb293ff3d9de3673dbf957dbf968cc73bdc967fbf5c9466bd000080bf000000005377a53d92cae23f000000001bb22e3e3f3f7cbfd94889b5403f7cbf1cb22ebe000080bf00000000e945ad3dc8ece23f00000000ee1e353ff5ea34bf00000000f4ea34bfee1e35bf000080bf7940d9bba54fab3d5ef7e23fd0858bbe1ab6233f520838bfdba21ebec53d44bfd8891fbf000080bf04adc03b9b018e3d07d3e23f6922683dac05063b88967fbf29d57dbad3ff7fbf0bd709bb000080bf00000000d6749d3ddbc3e23f0000000038015c3c18fa7fbf83f1be3417fa7fbf38015cbc000080bf00000000b9e38d3d19cbe23f00000000fc202f3d12c47fbf0000000012c47fbffc202fbd000080bf04adc0bb9b018e3d07d3e23fc44168bd9d05063b6c967fbf45ef7d3ad3ff7fbfe6d709bb000080bf249babbbebc99c3d7dcbe23f70a183bdfa80a73cc36a7fbf7bef01bb48f27fbf00cea6bc000080bfc901bbbb5308a43d4ed2e23f90f3ecbd7dfa2c3e9b937abf579194bc16527cbfbffc2bbe000080bf5f5c2abc605b9f3d58e1e23fe4398dbe66ca2c3e503f72bf8f5bf4bca7497cbf7a0c2bbe000080bfae6447bc9ad0a43da511e33f4f460fbf1694fd3ebe182abffab96abed5ed5cbf9680e6be000080bfa4c76fbc5725913d6bf2e23f92e2b2be6083dd3d60436ebf0fc7e3bca87b7ebf5937d7bd000080bf365a8ebc9f01953d0131e33fd24a3bbf56769f3e573e1bbf701639be494272bf8e3189be000080bf40178dbcf4f87d3d3cf5e23f9156b4bec402d33d65236ebfb7c827bd78a27ebfeddcc1bd000080bfd15710bcd9439b3d7cd3e23f3884ffbdd7e3673dfe957dbfc794c7bbdc967fbf6c9466bd000080bf827431bcbc908e3dcbd8e23f7e22f4bd7d81323cc8287ebf835725bb10fc7fbf1ed32ebc000080bf5c0446bcfa27783d84d9e23f8561a8bda5215d3d38c27ebf9d5ea7bc01987fbf44f156bd000080bf0a125bbc5b23423d28b8e23fd972bdbde801923d853f7ebf079f64bd59097fbf29d087bd000080bf79909ebcc3b6453dfed6e23f23cad0be0663733d6d4069bfd4977bbdef557fbfa1d319bd000080bf9679abbce223823d1b4ae33fe06661bfb8ca533ed26adabe418218be5b9579bff74029be000080bf1042c0bcdcc4493d4e42e33f923877bf4662543d534182beaadf73bdf57a7fbf0433b93c000080bf68e89fbc07250c3dc1e2e23feda317bfb3d2d2bd93904cbf928e7ebd9da67bbf78d9303e000080bf6f4b64bcf27ab03c90bfe23f5c5bd4be62d81abfaf062ebffa4c043eff5547bf712f1d3f000080bf9c6e59bcca6ba53cb476e33fa996c1be07ff5dbf50f2a53eb42b593ed7f1843e1d2f713f000080bfad1397bc77bcc93ce563e33f17c74abf598419bfd033e93dc465b1be8366183f5896393f000080bf3fa88bbcf9d9c83ce8bfe33f5664efbed82a1ebfded6213f033d86beefa8473f187d113f000080bf7d23babcc4060b3dfa62e33f84317abf100358be7c4299bc11ca55befae4713fa118813e000080bfef02a5bc72870d3db1dbe33f236ffebe8a9100beaed05b3fa54bc03b112d7d3f148f173e000080bfad1397bc77bcc93ce563e33f17c74abf598419bfd033e93d224f043f43460fbfe6d6253f000080bf224f92bc9f03cb3c410be33f3f6d42bfe24be6be16a0f0be32b05d3e41245bbf2558f03e000080bf7d23babcc4060b3dfa62e33f84317abf100358be7c4299bcba13453ef6ea6bbf5ea4ac3e000080bf00e2aebcf2604b3d58e2e33f5c1e19bfc602203c1c254d3f46e8263ceafb7f3f492c96bb000080bf1042c0bcdcc4493d4e42e33f923877bf4662543d534182be0233913da5ca7e3fc7b987bd000080bf9679abbce223823d1b4ae33fe06661bfb8ca533ed26adabe4282ba3e5afc5e3f68b9a8be000080bf365a8ebc9f01953d0131e33fd24a3bbf56769f3e573e1bbf3bb9293fab3d083f3bca06bf000080bf54e14fbc15e4a73d3179e33f5e6024bfb5c63b3f3a43643e40acde3ea185163f42982ebf000080bf4f5a38bc3c14a53d50a8e33f544240bef73da33ed8d46d3fec630bbd9c73713f853fa9be000080bffa9ae5bb317aae3d116fe33f143681bea21b693fb09aa73ee53d9a3e3e75ca3ee4205ebf000080bfae6447bc9ad0a43da511e33f4f460fbf1694fd3ebe182abfa5823f3fae4730bd288629bf000080bf919be1bb84b7a73d1fa0e33f0a82503c031a8a3e777d763ff725aebc1979763fbdf289be000080bf7940d9bba54fab3d5ef7e23fd0858bbe1ab6233f520838bf8a89043f594508bff2762bbf000080bf5af3e33c5016be3dc8d3ee3f0e621bbee21e5c3f4a97f9be0bfe7c3fa19ffb3d002dbabd000080bf698a003d7e8dc43d2444ef3f0a8056bcc22f453f753923bf62fa7f3f0399243cc98b09bc000080bf698a003d8020c03d94eeee3fd8c18bbd8663723f65faa0be9d657f3f6c18803da0d2e6bc000080bf5af3e33cd383c23d5629ef3f5892bfbd8456443f168622bfa7e07e3fa98c933d115e74bd000080bf5309cf3ccd8fbf3d3203ef3fea890abe8264433f1ebc21bf73a57d3fc261d53db0bfb0bd000080bf5309cf3c4b22bb3da3adee3fc88370bd9fde3c3f64282cbfbd8d7f3f8650423dbcd80fbd000080bff8a8bf3c5e9cb83d1688ee3fcbb3d83dd4702a3f23153dbf678c7e3fa3e480bdac8baf3d000080bff8a8bf3c5b09bd3da6ddee3f2ec2bdbd5b5a443ff48922bf13e67e3f0b7a923db84571bd000080bf8c15b53cde59bb3dc6beee3f9d424a3d85f6443f0c0a23bf0db07f3f44041cbd93b7003d000080bf8c15b53c5becb63d3869ee3f1892863ea860283fe0b634bfe8f9763fb8b641be3f563b3e000080bf6894ae3c407eb63d3a57ee3f20abb43e211b353fb8c41cbf3c876f3f1d8b8abed7fc673e000080bf6894ae3c3eebba3dc9acee3fc90a6c3e52e43f3ff1d71ebf1d1b793fd00436be9448163e000080bf0c94143d82eabf3d1ff2ee3f4552d43dd630743fb24190be8d827e3fe370babd23fd6b3d000080bf0c94143d7e57c43dae47ef3f6e82933dfcb0443f7cd022bfc9557f3f877d63bd75d73b3d000080bf7fda283d4a0cc23d043aef3f96823b3eacde413f377a20bfe1ab7b3f3c6f10be8727ef3d000080bf7fda283d4d9fbd3d76e4ee3f52018e3e3488663fad75abbe0369753fcad471beffb5223e000080bfc823383de469b93d8ecbee3ff70ed93eb2b8483f221be8beb66a673feec7abbea5b8873e000080bfc823383de0d6bd3d2621ef3f750eac3eaabc393f38be19bfc01c713f448484bea67a5b3e000080bfd6c4423defc8b83d0803ef3f0404ff3eb9002b3f3f8c0dbf66fc5d3f6f78c4be9394a23e000080bfd6c4423df25bb43d79adee3fc0aafa3eda6d273fa0a113bf35305f3f8dc3c1be7b359f3e000080bfa613493dad87af3d3690ee3f15dff43ef5a91f3ffe471ebf0a74603f5b49c2be9a42973e000080bfa613493daaf4b33dc5e5ee3f9928213f7538193f0facfdbe23e8463fd152f8bef87bcd3e000080bf4696cc3c9275b83d0bd9ed3fc93b7ebe3789573fab47f53e521974bf6e3500be12598cbe000080bfc8d3f23cdc2fbf3dd469ed3fe7c195bdf26a543f00a60d3f5ed07bbfc83f013d1a9235be000080bf9e5cd33c7713bc3dcf85ed3f4b837abedcde543f7557ff3e4b9874bfd4fff3bd0f438abe000080bf700dec3cf891bb3d0ebded3faa491abe78786b3ff07db93ec4b078bf87fd8ebd303168be000080bfaf05bd3ce2fdb83db29fed3f6a0270be320a553f54a5003f4bdb75bf29b9f1bd9a4481be000080bf7041b63cfd5fb53dedf2ed3feff2d4bdc2005b3fabdd013fcc787bbf31c70abcc08c3fbe000080bf50e1083d527cbc3d5da9ed3f7542fe3c1427773f937d843ed8077dbf54938b3d0bf90abe000080bf70430c3d371ac03d2a56ed3f6ee2543d67d44f3fbce1143ff5bf7bbf7c6c123e49cfe4bd000080bfdd07203d70d0be3d205aed3fe8f2e53d635a4c3fc97d173fa17179bfa422523e2d4abcbd000080bfb1a41c3d8b32bb3d54aded3f02d35a3e418d743fa94a513e67de77bf4c8d703e825cafbd000080bf30112f3db6a0b73d0ed8ed3fa716b73e6799673f7f3b6d3ed0a56cbf4e9cc13e0e084cbd000080bf5c74323d9a3ebb3dd384ed3f36da1d3ece72493f1ef6183f47d976bfc2e2803e1b7ba9bd000080bf9850413d29b2b63d0ebfed3faf235a3e60ab443fa48a1a3f112773bf41899d3e65fa66bd000080bf6ced3d3d4414b33d4012ee3fb7bee73e8a96573fb915963e8c9f61bf54e7f13ea629673b000080bf3604473dc2dcae3dbf44ee3fb686eb3e82a6553fda319b3e21e360bf4f73f43e878f983c000080bf62674a3da77ab23d84f1ed3f41ba8a3e26253f3f8c861b3f04fe6ebf301fb73e9a1ebebc000080bfea42ac3ca8c1b43d6400ee3ffba23a3eaa196f3f5d5a9d3e595779bfe4705b3eb2cc96bd000080bf4109b33c8c5fb83d31aded3ff68344bc339d523f417e113fdf8f7dbfbfa58b3d50f6f4bd000080bf5af3e3bc5016be3dc8d3ee3f6b6a1b3e421d5c3fbc9bf9bec1fd7cbfe5b3fb3d652ababd0000803f698a00bd7e8dc43d2444ef3f0c02573cbe2f453f723923bf5bfa7fbf51a1253c5d1809bc0000803f5af3e3bc4c83c23d5629ef3f5892bf3d8456443f168622bfa6e07ebf80a2933d4a2974bd0000803f698a00bd8020c03d94eeee3f05d28b3d6663723f50faa0be79657fbfc427803d06e7e6bc0000803f5309cfbccd8fbf3d3203ef3fa3910a3e4f64433ff4bb21bf30a57dbf1164d53d19d5b0bd0000803f5309cfbc4b22bb3da3adee3fc883703d9fde3c3f64282cbfbd8d7fbf8650423dbcd80fbd0000803ff8a8bfbc5e9cb83d1688ee3fcbb3d8bdd4702a3f23153dbf678c7ebfa3e480bdac8baf3d0000803ff8a8bfbc5b09bd3da6ddee3f2ec2bd3d5b5a443ff48922bf13e67ebf0b7a923db84571bd0000803f8c15b5bcde59bb3dc6beee3f9d424abd85f6443f0c0a23bf0db07fbf44041cbd93b7003d0000803f8c15b5bc5becb63d3869ee3fe68986be6860283fa3b834bf05fb76bfe6aa41bef44a3b3e0000803f6894aebc407eb63d3a57ee3f48aab4be471a353ff4c51cbf65876fbf3b8a8abe54fc673e0000803f6894aebc3eebba3dc9acee3f32f46bbe5ae53f3fcbd81ebf731c79bf69f335be2d3a163e0000803f0c9414bd82eabf3d1ff2ee3f4863d4bdb631743f373a90be53827ebf5d82babd49056c3d0000803f0c9414bd7e57c43dae47ef3f6e8293bdfcb0443f7cd022bfc9557fbf877d63bd75d73b3d0000803f7fda28bd4a0cc23d043aef3f96823bbeacde413f377a20bfe1ab7bbf3c6f10be8727ef3d0000803f7fda28bd4d9fbd3d76e4ee3f97018ebe9e86663f007eabbe086975bfa6d371be42b7223e0000803fc82338bde469b93d8ecbee3fc80ed9be7eb6483fed22e8bedd6a67bf09c7abbecbb8873e0000803fc82338bde0d6bd3d2621ef3f750eacbeaabc393f38be19bfc01c71bf448484bea67a5b3e0000803fd6c442bdefc8b83d0803ef3f0404ffbeb9002b3f3f8c0dbf66fc5dbf6f78c4be9394a23e0000803fd6c442bdf25bb43d79adee3f32acfabed26a273f73a413bfc42f5fbf12c5c1be21369f3e0000803fa61349bdad87af3d3690ee3f41e0f4bec1a81f3fbf481ebfac7360bf9e4ac2be2a43973e0000803fa61349bdaaf4b33dc5e5ee3f992821bf7538193f0facfdbe23e846bfd152f8bef87bcd3e0000803f4696ccbc9275b83d0bd9ed3f80237e3edb88573f3f4ff53e1a1c743f1e2c00bed4478cbe0000803fc8d3f2bcdc2fbf3dd469ed3fe7c1953df26a543f00a60d3fa3d07b3f4231013dcb8c35be0000803f700decbcf891bb3d06bded3fb03a1a3e0c786b3f3683b93ec6b2783fcdf58ebde70f68be0000803f9e5cd3bc7713bc3dcf85ed3f4b837a3edcde543f7557ff3e4b98743fd4fff3bd0f438abe0000803faf05bdbce2fdb83db29fed3ffcfa6f3e940a553f90a5003fbddb753fadacf1bdab4281be0000803f7041b6bcfd5fb53dedf2ed3f64c2d43d70005b3f73df013f73797b3f2c7009bcd37f3fbe0000803f50e108bdcc7bbc3d5da9ed3fee41febc9226773f5d81843e71077d3fd19a8b3df2020bbe0000803f70430cbd371ac03d2a56ed3f6ee254bd67d44f3fbce1143f83bf7b3f4472123ebfdfe4bd0000803fdd0720bd70d0be3d205aed3fe8f2e5bd635a4c3fc97d173ff471793fe11e523e893fbcbd0000803fb1a41cbd8b32bb3d54aded3f33ca5abe7e8c743f1f62513ee6de773fbf86703eec53afbd0000803f30112fbdb6a0b73d0ed8ed3fef09b7be709a673f99526d3e0fa86c3f2691c13e4d114cbd0000803f5c7432bd9a3ebb3dd384ed3f47d21dbe0c73493f4df6183f96d9763faedf803e7c84a9bd0000803f985041bd29b2b63d0ebfed3faf235abe60ab443fa48a1a3f1127733f41899d3e65fa66bd0000803f6ced3dbd4414b33d4012ee3f3aa3e7be129b573f1426963e36a6613f7fcef13eeb67643b0000803f360447bdc2dcae3dbf44ee3f856bebbe32ad553f44369b3e25ea603fd259f43ee204983c0000803f62674abda77ab23d84f1ed3f9eb68abe8d253f3fe0861b3f84fe6e3f721cb73e4d42bebc0000803fea42acbca8c1b43d6400ee3f71b23abefb186f3feb599d3ea156793f8b7f5b3ec2c396bd0000803f4109b3bc8c5fb83d31aded3ff683443c339d523f417e113fdf8f7d3fbfa58b3d50f6f4bd0000803f8f93b03e05601c3ff5cbb63e960f1f3f5ca8b83e71221d3f6eeaaf3e01041e3f17eea73ebf111c3fc062b53ea66f203f4a2ebd3ee1e2203f6cdbbf3e5b1f1f3f1a14b93e58241b3f1f52b13e2e4d1a3f99d4c13e3e10243fdbeda73e621b1a3f1829ba3e6216223f39b7b13e0307183fa0eda73ebdf1173f22efb13e969b153faf72b93e74b2183f005ec03ebbad1c3f5303c83ed8d9213ff3c7be3ebccf243ff1899e3e5b4d1a3ff8489f3e27601c3f8434973eb4221d3f4511993eb80f1f3f45c8c73eda6f1e3f2227c03e61eb193f8539ba3e2cf5153f5410c13e93c6163f37d1c63e615a1b3f54a6cf3ed0ce1e3f67b5d13e64a6213f97fbd43ef6da243f0d63c73e971c183f02d3cd3efb1e1c3f5a04cc3e18d0253f65b1c53e3acf263f3639c13e5d8c273f781dbb3eab49133f0206c33e7608143f756aca3e7e90153f1e0eb23e8d14133feab6cc3ef775193f12c2d03e0f11183fcb8acd3eb87a133fae13c53e5ba0113faa06bc3e6786103fe978b13ea969103fb1eca73ef772103f48e6b13ef3c00d3f36ccbc3e74e20d3fade6bd3e99fd0a3f8457c73ef9170f3f8e95ca3ef75d0c3f653ad13ef581113fcefdd43ec62b163fec41d43e7b411b3f5fb2d63ed4031e3fe7e7d93e5d64193f99d7d93eec4f143fe8ccd53e61f60e3fba7bb23eccd30a3f75eca73e6ad00d3ffeeba73eaf100b3fd366bf3e19bb083f9f59b33ec124083fa4eba73e9210083ff328cd3ebf1f0a3f62e3da3ebc480c3f15e3cd3ed96a073fbf5fc03ecf21063f54dab33e6674053fa5d3c03efb5e033f9419b43ec7c2023f7f56b43e7addff3ee67d9c3e0425083f3b2cec3ec0880f3f88cddc3ef444093f3d8fce3e1c79043f662cc13e4f73003fa3a6b43e9798f93ef393c13eef95fa3e88f3ce3e1452013fc6f6b43e10aef23ea771dd3e4cf4053fa673ed3e4a770b3ff99aff3eb57e0f3f3a81ff3e3fae113fb542073fe97f123facc2053f59ad133ff36f093f32c9163f0f310c3f2f6a153f067f063fb81a193f1509103f7826143fe3240c3fdc7a193f66160f3f9582183fbeeb083f372d1b3f30b8053f32b31d3f3d13113fc6801b3f91e5123ff1ac173fa672143f5a4b1b3f6741153f4a101f3fd49b0a3fbbca1c3fcd490e3f2b811b3fc2790f3f47e81e3fc881073f66a31f3f740d063f4448223f2648123f20ed1e3f1122153f7205233f40fd113faf73223f4845193f680e1f3f62c5183fd3e21a3ffbc1173f99cb163f2767133fd85f263fae41173fb8e6253f997c0c3f61f51e3fcc250b3ff52c213f4cda093fde8f233fced90d3fe6e9243f44000f3f5b10223f1f25113fd5b3253f5c581d3f3b021b3fd1e31c3f0561163fd6391d3f0c311f3fb128213f0ce41f3fdb6c183f39fb223f07ea1b3fca20233fa0e61a3f85f4253facca1f3f3f8d233f46801e3fc360263f150a223fa3b71b3f378f223fb9ca163fd2f21b3f872c123f649a153fe3e1123f86a5223f71d8113f13b9123f6d5e0f3f19c31a3fe4b10e3f8139113fbcc40b3f8846223f0a3c0e3f8d9f193fae060b3fc16a103fe70c083f55b0213fb96f0a3f479b183f8b57073fbb6a0f3f883e043fb974093f557f0c3f5d3d0a3f7026103f2e74083f03d7083f4750073fcfd7043f9569ff3e464c0c3fced1fe3e4e9c083fc4b6fd3e617b043f429bed3e0eaa073fdb3bed3ec5ab033f68caec3e3dbbff3eb977fc3ea394003fe240063ff5d0003f87bedd3edcd5fd3e4ee0dd3e5fb0f63ec16cec3e254df83ebd73fb3ecca9f93e4780053f5b51fa3ec0f1fa3ed048f23e336fec3e30e9f03ef7d8ec3ebccbe93efdf0de3e3926e83e014bde3edd62ef3e870fe03e23d5e03e85710e3fb1a0003ff6a60d3f2f3ffa3ebc23053f9817f33e6d6ffb3e682ceb3eef35fd3e31e5e33e6674053fa2f4eb3e315b0d3fbcf6eb3ebdb8063fbfb3e33e1d75ff3eef5cdb3ebdb4163feb27003fa3e5153ffaa9f93ee7a0173f4aa2033f64470d3f263bf33ed5fe143f148eeb3e971c153fac45e33e24f61b3fa6cfe23ed3f31e3f23b1fe3e75eb1f3f0ec6023faa61153fd4cbda3eaf42153ffdc3f23e02081e3fb338f83eecd1073ff5c9db3e99a40e3fcaede23e777f0f3f2553db3ed86b1c3f7281ea3ee9261d3fb184f13ef35e1b3f51b2da3ecee2203f0d8e063f64eda73e1b9b153f0aeda73ee916133f14cc9d3ed114133fc3eb9d3ed99b153fb5609e3eec69103f85f29d3e37c10d3f5f249e3e3b07183f0769963ed9b2183f7fa1953eb2f5153fd9bc943e314a133ff4d2933ef886103f790c933e05e30d3f4ff1913e2afe0a3f4ec8963eb2241b3f29b58f3efdeb193f09cb8e3e46c7163f8ad48c3e4009143f0dc68a3e3ba1113f6681883ee3180f3f6e42853eed5e0c3f1d7f8f3e40ae1c3f6302903eb51f1f3fffdb873e69da213fc515883e98701e3f8c547c3e65a7213f32cb753ef7db243f310b8e3e6a10243f9733633eec4e243fa90b893e2a5b1b3fc778883e821d183f1038803ed0cf1e3fac70853e8a91153fa34f823ee67b133fab3e7d3e4f83113f5317743eddf70e3f550a823e07201c3fd6dc833e9ed0253f06308a3e72cf263f70a88e3e5d8c273f0b58723e2f051e3fc86d6b3e98e7203f9d36773ed6421b3fbf337e3e5e12183f7f25833e0f77193f1ebb753e422d163f7be96b3e0666193f22066c3eac51143f50c9603e9047173f88e75d3ed90a123f32fc503ef6e4143fa20a653ed45b1c3fd4ca5b3e098d1f3f220c4b3e8afd1d3f5b90513e5076233f48ec573ee10c1a3f31393b3e0c6f1c3f5f1c3e3efd4d223f017e493ef648173f52343c3ee2d7123f6e982f3e3908213f0f9d383eeaad133f8457473e6b8b0f3fbfad203e7cb2113fc476203eb9820f3f3ec4443ebd790b3f2272213e5a36123ff9a5083e54b3133fe0a1023ece85123f24e3f33dd7d0163ff261ed3d3f2c103f96d5203edb4f0c3f0272443e27ac073f11cfdd3dc871153f8f3cde3dc583193fd601bf3d4a2e143f8967923d24ea123f002f813d62d5163fc220a83d4ab6173f9a25303d546b163fc5a5c63d9f8b183fc6bc9b3d24561b3fd2c1b63d208b1b3f9135723d02ee1a3fb2ee283d120e1b3f147fbb3c4dc41b3fcc14cd3d208b1b3f1a92ea3d8fd41c3f3a13f83d36361b3fd8b9013ec1ad1f3fc09ac33d97f31e3fdd8cdb3d4d001f3f0e4de63d7238213fe970c73db81c223fdaaed03d2ef7243fc9b3f03d0e9c233f2c20ad3dc9f81e3f374e953d6e1c1f3f2281af3d9d80223fa952963dfc12233ff24bb63de6c1253f05486a3d141b1f3f9036a43d7a6e263f4d55853da9f5253f1ae5773d3309233f9de92a3d3d3e1f3fd6fe3f3d342f233f0546503dda03263ffce0013d3a9c233f1698163d9e70263f40d8d73cfbf11f3f1dacaa3ce8d5163fa6263f3d6f35123f98b5a73c0de2113fce19523d9fb90e3faf70a93d54650f3f9368b53d80ca0b3f4749643d310d0b3f2a7bb33c78440e3f12d8bb3d9f11083f3c2bc63cf9760a3f5a84743df65c073f0fd4c33d4a42043fa79ef33d45840c3f829cfb3d1edb083f4a5b023efeda043f0497063e3bd3003f6701223e529f083f7834243ec87d043faeb0263e6296003f04b7283e12acf93e6ac9463e8b4ef83e470f463e98bdff3e792e453e6ead033f0498093e6a54fa3e789acb3d88a3003f9cecd13d1d43fa3e7c6f893d3d2b003ff7e58f3dc7aef93e5bc80e3d8fb8fe3e86a7fe3cd1ca023ff910823d9da6033f12ba293ec649f23e07090b3e4119f33e63e6d43d823df33ebffb943de0c6f23ec6bd283e242ceb3e37c5093ed0f4eb3e98ef453e20cbe93ea545d43d41f7eb3e2519973df28eeb3e1130253e9ee3e33e584e433e9aa8e23eabae3e3e010fdb3e3bb2043e2cb2e33e3eb1203eb359db3e97c3463ea0e9f03e47c3613e6f25e83e32865f3e63d3e03e4f165c3ea841d93e99647b3ef0c0de3ea8867d3e7969e63ee6cc783e47ead63e7b0f633edd62ef3e29247f3e97dded3e93e5633e28b1f63e0226803e8620f53e102a643e5ad7fd3e1b92803e720cfc3e6f39643eba75023fa9e1803ebc52013f5b418e3e5f96fa3e44c98d3e1cc0f33ee0518d3ef370ec3e21bd8c3eceb5e43ed80b8c3eed9cdc3e41a98e3ea873003f042f9b3ec498f93ec3de9a3e10aef23e7aa39a3eb23beb3e0d6a9a3eb240e33e0d359a3efcdbda3e86119a3ee422d23e817f9b3ebeddff3ed4eaa73e793df93ed4eaa73ebb3ff23ed4eaa73e54b3ea3e10eba73e1496e23e69eba73e0c1ada3e1ceca73eb03ad13ea7a1b53eb0dcda3ef46bb53e2241e33e2e32b53ede3beb3ecf0bc23ef0bff33ef2eaa73e508aff3e3383c23e3571ec3e3faecf3e1620f53e1018c33e81b6e43eedc9c33e279edc3eb310d13e426ae63ef241d03ec4dded3e57c6b53ef123d23e8142cf3e920bfc3e8ab7dd3eae74023f3122d23e83c2de3eeb80c43e8552d43e826ed33ebaecd63ed3c7e13e7444d93e7b29ee3e42aae23e3279f03ee311db3ec828da3e32e6203fcbf9e13e348b1f3f8247de3e7b4d243fe518e73e6474233fcb58ea3e50fb1d3f6bd2f03e8b4b223fcb41f23e6d6c1c3f9313f83e6e05213f7e58dd3e205a1c3ff8e6e33ec90a1a3f4b1deb3e6246173f4977df3e9845173fcd5ce73e83e2143fdae5e03ec008123f75bff13ebdd4123fe68bf33ea3aa133fd91fff3e1e32123f5626043fe439173faa1a033f87a01b3fa3c6003ffacc193f288ffd3ee8aa1e3f3c4df83eb77b1c3fd172023f29c2203f57a6573f28c2723eb742533f8097833e4243593f85a47f3e82cd513f6e617a3ef8d04d3fa0b4873ede2f543fceaf8a3ed56f5a3f2779843e6c194e3f563a8e3ebc09483f0ac78f3e0d344c3fa7d0803e306d473fa5388a3e79e4403fc37d913e1136463fa24c833ef766403f4f968c3ec376393f2197953e0c803f3f1e93863e431a453f71d27b3e582f4a3f8008753e9ee8483f97196c3e3dde4f3f50726d3edd334e3ff28a633eed1d383f1259913eb8894c3ff0b8583eea30543fbe685d3e72d7553fbb14663eaed6433f9cdc703e4e753e3fef58813ee17d373fd9ad8b3e593b313ff875943ed2aa313f2128993e508f423f2c62653eb0873d3f34c3773e9842373f201d853eb3a8303f0b7e8e3e57722a3f6fc08e3e66ca2a3f4db6933e578c2b3f3f98983e32dc243fdca58c3e30e3243f9972933e6825253f1360983ecdfe363f83d57d3ee402303fa736873e515d2a3fcabb873ea8df2f3f4b35813ea0e0243f73ca853e755f363fb984703ef1883c3f9975693e51c53b3ff6255e3e35b8243f01c8803e399b2a3f956a813ecf8f2f3f7f6b773ee331353f6fc4633ef0d2243f4c42763e1f302f3f03fb6b3e370f2a3f9d0b6c3e66a72a3f1ae5773e90c3243f2da46b3e8e60293f3015633ed29d2e3f62d0613e395e2e3ff7bf523e53ba343fbee3583e33c4333f16bc4e3e94d73a3f15a7543e625c393f785e4d3e59d6323f5138453e420e2e3f29d1463e65852d3f9c463c3ea92c293f8c5c523e9ab1233f3a955f3e6a45293f689d473e5d4a293f47bd3b3e0dfc3d3ffa4d4a3e68793f3f85b8503ed7df373fc3ad443e2b38323fb1a53b3e98c12c3f03a1303e4015293f549c2f3eed67233ffb012c3ef410433f50ca423e6375443f17c44a3eb743473fe0da393ea0ec453f76da313e415e3c3fdda5403ee198363f3c733a3e1ba0313f0847303eb0712c3f08aa233e2713293f63dc223e5582243fa57f213edd6d413f327e593e3311463f6b26563e6b67473f81bc603e08c44a3f90484f3e8143523f93b4533e11eb483fde79443ea770503ff9bd4a3ed9a44e3f6a7e3f3efeae4c3f5348333e61ca4a3fb7e0283e1123483f0f8a1e3ebe51443f7902283e3551413fc7a9393ed69a3f3f4ffe303e833c3b3fa7de363ef94c353fa925303e760a3a3f75d72d3ef7ec3d3f06ce283e3887423fb6331f3e9e54453f6ff7143eafd3303f178a223e0e7d343f24b2213e140b393fbb61223eb44e3c3f35d91e3e33bf403f7965163e0d1f433f94110d3eb5c82f3f26ec173e6b632c3f53bd173e0d23293fc297173ea15c283f0fa9083e677a2b3fb0cb073ee0c9253ffb95093e8677253fe46a163ed7ca333fd189163e02332e3fbb05073ee5bc373f03a3153ed4de313f975b053e8bfe353ff4dc033e342c3b3f28f7123e67c93e3f04740b3e09d83c3fee81fa3d5b48413fdf1f043e30e73f3f201bf23d6285393f276c013ece8d383fe9b6db3d1d1a3c3f8313d73d3eca3f3fa6f6d73db1d3333ff2ffe03d48602f3fdf29e63d10872c3f9f55e93d1b432a3f086dee3da4e3263fc6a2f53d59cd243f4d23f83d9f1c233fa4e3513e4ebb223fd9ff453e989e223fa8dc383e2deba73e1997023fc6bc9b3ef4c2023f69eba73e4848053f9bfc9b3eaa74053ff5768f3e5522063f7670903eaabb083f56ae823ec0200a3f605c9d3e0fd40a3f09e8693e4f4a0c3f2e11663e7046093f63f3813ec56b073f8846813ef079043f13c7643e9bf5053f7b028f3e6a5f033f35eea73e682a1f3f35eea73e9bd31d3f5a7aae3e36841f3f36f29f3e18041e3f8762a13e42841f3f977a9a3ea66f203f2fb5953e5716223fdfaf923e0de3203f1318913eb1cf243f3791073e5c53223fbfdf083e8bbc1d3f90fe153e13cc203fc956133eb2a81b3f80bc053ea022193f7c1f0f3ebf40173f22a71c3e24d4193f9cad243e77b31e3fed312f3e03831c3f1f37283f95cd133ff9542c3f4a09193f37f52d3f9be1153ffe0f303f11b5123ffd6e263f60f9163f10382b3fc18d1c3f2223253f8443193fd5a9313ff5401b3f1c75333fe6db173f5935313ff9801e3f28a4353fc6c5143ffe08373f3994123f20a13a3fc89e163ffb60393f6847193f37fb373f52b31c3f5539373f25751f3f02ff3f3f881d1b3f8def3e3f4f171e3f06513e3f7386203fc0093c3f97eb133ffc2c413f2d89183f05783d3f6b17113fa43f423f6bd5153f126f433f894a123feeb1483fe18b173fcd43483f01a21a3fb9db473f7be71d3f3e15473f54b7203ffb9f453f22cb223fe1df4d3f1b7a223f2e9b4e3fbc831f3f70504d3fe8ce243fab724f3f54e61b3f14bf4f3fcae7183f8a12553f72541c3f68cd543fc3d41f3f7353543f114c223f5070533f3ab6243fd27e493f723d143f5f59443f2d7d0f3f02c23e3fbb270e3fb86f5a3f11f31e3f143a5a3fd157223f24d6593f8bcb243f779a5a3fa0861b3f4ee55a3fad07193f3100553f252b193fb5f15a3f8d34163fe4d74a3f5517113faa34503f612b163fb319553fc86f163fb5da553f177f133fd6255b3f8d8e133f9b67453f25250d3f39d4403fc6050c3f80ed3b3f45620a3fabbb503f0453133fe8744b3f87630e3f306d3d3fd56e083f6b67423fef760a3f9efb463fe05e0b3ff98d4c3fb1e10b3fe970513f99cd103f2ea8563f8e47113f8e9c4d3f8788093f4c26443fd519083ff995483f9f3e093fe05b4e3f3e29073f1d004a3f62ba063fa2e4513f820c0d3f1316573f521c0d3ff25d523f0a140a3fc622573f896c0a3f710b533f4076073f4a47573f2975073f28fb5d3fd0f1063f52615c3f4b94103fd3255d3fa92d0d3f7eb05d3fb0380a3fc269453f28b1053f274c3f3f8134063f6720413f2d17043f00893c3f92b3013f1bcc3a3ffd1c043f1a723e3ffb1bff3e77d8383f716ffe3e560d363fd0b8013f67c83b3fcfd1f93ec0193e3fa601f63e8759393fa712063ff604343f2b44043fd68d373f79ad083fd72a3a3f192e0d3f0190353fb0520b3fb0b0383ff6c80f3f5ae5313f9442073f66aa333fefa00d3f43022e3f40340c3f48f32f3faa040a3f3df42b3f4f920e3fafdb313f6048103f96302a3f77b0103fadf6c93d20ece23e6c1dc33d914fdb3ebb28963d4744e33ecc4c003e8cc6db3e13983e3d84cee23e9f3f373dab82ea3e6a902b3d0388f13e49fe933d11c8da3ea6811d3d1f3ef83e210b483d8faeda3eac558b3eaf50d43e6d1b4f3fc756043faa6f4b3f9a31043fc8f7533f8993043fcea6573f696f043fd717503f66ee003fe6714c3f959b003f1d75543ffb58013fafd5573f4140013f2c6a5c3f5e0d013f81ed573f8cdefc3e42ad543f9cbdfc3ec1e8583f0075f53ee847513f4c9ffc3e324b4d3fccaefb3e88ce553f9bd4f43e0319533f6346f43e9840573f609eec3ec805553f9e34eb3e3f5f5d3fe7b5033f5b9c5b3fa482fc3eb9775b3f9b14f63ef4925a3fb6a1ee3e6d734f3f2237f33ecf5c493f75fdfa3e3fe2473fb5a3003f6232523fb13cea3e6b594b3ffe36f23e58f7453f8b71f93e5fab443f2250ff3e1ec84d3fb6abe83e8017493f470fe73e07bb463ff878033f93ea423f6218023fd058403fe7d0fa3ed174423f7277f53ef40f403f3da6f13eec97443f5f7dee3e0798413fb533ec3edee2413f16aee53ec193453ff6aee53e8cdb473f1fc7f03e86c9df3c0894063f78a45c3f4d63ef3e0159e43ea02f923caac9e03e06676b3c996ee13e833e9b3c41dce33ecb816a3ce10fe03ee4db2b3c1374e63e20a49d3c9cedde3eff242a3c2677de3e62505f3c3f79de3e53332f3cb16ee03edbcd0a3c6e34df3e7b8a923c9f87db3e3fe91a3c007fdb3e5aaa063ca0ced93e9ec1233cee04db3ee9316b3cd82fd83e7663683c5906dc3e4377973c1f4bd93e741d923c4154d63e85a29e3cb964d83e23a9e93c7fdfd33e30bba73c1299d53e6d6e7d3cd002d53e61cf383cbdb1d93eaed2073c37fcdb3ebbd5e33b286ed83e07882b3c3efcd73e2a1a2f3c3c4ad63e34ee313cff38d63ecea5153c49b7d73e78df063c5a49d83ef516093cfb4ad83ecafdb03bfaa6d73e999ebe3be60bda3ece77c33bba9bd43e05fa1a3c17b1d63e37ace13b734dd43e9e35e03baae3d23ebbf6233cf97ad33e8237433c401cd23e6640123cb128d13e7e4f1a3c0d8cd13e2604343c0b60d23e57f15e3c8304d33e647e893c5adecf3ecb13543c2287d03e1fba683c2449cf3e6f1b813cd94bd03e1a449b3cc403d13e8082b83cbcadcd3e82a99e3c8d0cce3ed174883cc40fcc3ebf919e3c32c6cd3e4df3ba3cb0b9cb3eb614b53c859cc93eceb8b93cfb48d23e6c00fb3ca33ece3e0af8fa3c19a7c83edf1cf23c7660d53eadd52e3d0487d53e8330eb3cee97db3e46d1253dd941db3e450bce3c2567e13ecb411c3daec6dd3e5360cf3c493fe03e825bbe3c6d00e73ed80b0c3d48eee23ee04dc33cae69e53e32d1b63c3fafdc3e89d16d3d101cd43efcd6673d1426ed3e3308383d4e68eb3e4ba5ee3cb5d7e83ec22fc03cb045ea3e2eb8a83cb060ee3e515dd03c61a2f33e2a5b113d816ef13e660fad3ce830e83ee213913c665be73e87db763ccd78e93ea124753cba31e83ebea4563cd4e7e53e4602813cbe63e53e0ec4463ca67ce43e6281443c6d5de43e35353a3c5cffe53e824e2c3c8693e13ee4db2b3c818ae43e131b243c70bfe13ee07b153ce6afe43e7bb10c3c3e4ee23e9514073c6a05e13eb76ee13b5948df3efa12083c9776df3e3951db3b4383de3ef357133cfc9ede3e7ee3f83bb532e53e4dd0053c28e8e43e42bb203c1368e63e7d8d113c85c5e73e23322e3c0c15e73ebc5a3b3ce3a9e63e1627483cbb27e93e38213c3c254dea3ec24f4e3cf028eb3eb6968d3cc7d7eb3e02cc703c18c6f63e3e8af73c81f9f83e547a413de926fd3e66ae1e3d0618f43e9521803d7d94003f4f74613de014023f58c7333de120fe3e1bf38e3d331b063f6c41713d1e64063f917f463dccfd083fbfd4753d6a24043f5543983d6623033fb132bc3d5173063f49c0bf3dc7f5fd3ebc9bb63d0a13f53ef9e1b13d7f69073f0a7e9d3d81b9093fc19dc23d8dab0a3f9627a13d41a80b3f07f27c3d0ef90c3f7367c63dab0a0e3f1125a83d83510f3f5e2b853d8144093f650f4b3dc8870c3fa7b2533de6e00f3f84ef603d320eed3e5c11b63d5b78ea3eba34913da20ae53e43a7bb3de50ae13e1e919c3d2c4dd73ece479f3d892dde3e4026c23df03dd83eaa91cd3da333e53e3f435b3db33bd23e7ec0b93dc2fdcd3ef8e1ca3d25aad33efce0d73df4bfc53eecc6c43d7652ca3eff17ac3d9969cd3e09518c3da49fcd3eb1f4583df13ec73e800a553dee88cd3eda99263dd220c93e04c3233d56a9c43e9a535d3d914acb3eead6f83c0afec53ea7ac233d9eedbb3ef0d5623d27d4c23e6d32833d213fc53ea2fb853d43cfc23e1607a63dce09c13eb2e4bd3d53b0bf3eb6c09f3d318cbe3e5e07ad3d1008b73efafb993df164b43e424a863dc644b33eca07a13d36b2c53e86e5e13cef89c13e4023253df7c5c33e6a6cd83c1640c13e145bd43c51d3bc3eccbc263d3638be3e5c4bcf3c83f2bb3e5cb9d13c0fe0be3e8fc7a83c7babc13ef83ca93c7474c43efb96ad3ca8f7c63e3ad3b33c16fcb73e2bbf283d6d13ba3e668dd43c4e2abc3e7c5cac3c47feb63ea9b8db3cb3b1b93e7a15b83c7201b33eea112b3d9849b53e379ce43cce3eb73ef402c73c72b1b33e123eed3cac6ab53ec02fd43c1126b03eca0d2e3db123b33eed8b653dc0dab63ec882b03c9720b53eb6b9c23c6ca3b63e92f48c3cba62b93ee73c9c3cff33b83ec126873c7320b93ee4bd7e3c0308ba3e176b3d3c9908b53e23d1953c23afb43e7e2bb33c2a60b43ed0bbb83ce564bc3e69e1323cf01fbc3e92868a3ca028bf3e4653883cc33fb33ea59fb93cf367b33e875dcf3c1075b13ec895d43cd480b13ea5f6e63ccba0b33e9dbadf3c8f01c23e6c73883ca50bc53e064b8e3c8580c23e4b62173c39efbf3e79f5293cab18bf3e60614a3c7f56be3e394e483ce0b6b13e6216c13c7184b13ef843013dac43c53ec4d7383c08edc53e693f4c3c2841c73e1ad23f3c47f5c93e83884a3cf2e2c73e4cea953c0983ca3e12e1993c4ececb3e52de763c940dcd3e83dd823c3874ce3efd92683cd106cd3ed2123e3c3cc1cf3e0913293c2c66bc3effc9cb3d98fbbb3e18a2b43df35cb63ede7ecb3d1200b93e476cb43d8d75b73ed305ac3dd1d8b33ede7ebc3d60f4b13e90ee893d4b3eb03e0d9d603d34895e3eb94a663c3268573e828c8f3c8a3c5d3e90ad983c0664583e2641653c1bff5f3ec6ca263c2031533ed3f59a3ca443623edb21253c772e633ed5525a3c232c633ec5352a3ca4425f3e25b7053c58b1613e1d06903cdb0f693e0910163c23816c3e2ef91e3c35126a3eb358663c090d683eab03953cc921693e24d1013c13bc6c3ed40f033c0819633e665a0e3c49e2623e63e8ee3b548f613e090d033c5a165e3e1c36d73b0234613ec13fd13b0e28683e2018da3bef086c3e1df2b93b9d416f3e5dd0263c658c6f3ee364043cfd8a6f3ed2a4a73b25bc6f3e01a9633cba836d3ed7b78f3c3625703e4b652a3c86b0703efc32023cfe88733ee74c2d3c2aac733e4d07113c89d2703ed150b53b2317763e0e3c343c86e8743eedcf783c7ae6763e4a6c163c4c70733e474c9c3c7a107a3e523a873ce158783e8771a53cf00e7e3e0644b63cee4a6f3e5146e73c8b92693e789acb3ceede683e9299243d1d06753e45dae83c40817b3e8fb9f83cb144823e67c1b83cee4c753e41ab2d3ddaca813e8cc0f83c3351843e99ecb23cb4fb833e076b9c3c32415d3e6bfb1a3ddf88643ef1e2cc3cd6985f3e26d0bb3c4110523ecbb60a3d5f3a5a3e8bb4c03c4644553ee329b43c5fa8663e3b9b6c3d5ed0773ec1b0663dede85d3eebf49b3d777e823ece7e253d5e42493ea1e0eb3c0e674e3e4576bd3c7e8c4b3eeaf4a53c7753433e7b86cd3c8ec9383ef7e50f3d78393d3e9923aa3c26b84f3e665a8e3cff294d3ee4a06f3c8cb94f3efb2e513c0765513e276e713cb44b543ebeaa7c3c7256553ed76f413c11f4513e28f0353cecc9523ee6c4423cb3ce4d3eaf9a363cf1824b3e0bbe483c15c8493e0fcb8a3cd06b483eba266b3ca324573e5a383f3c8963573ef8ee343c2420543eb5f4263cd493503e2bbf283cd1f75c3e34b7263ceba05c3e2f57103c4f0a573e0bd21e3c3bc0563ea765073c3f4f563ea36c1b3c15bb553ee27e003c02845b3e4dea013ce04f533e4b2b0c3cee9e9a3eef47d23c702f993efa93ae3c08cb983e2614c53cc8bf9a3e65b4e23c5de99a3e80d0c03cb3689c3efed6dd3ccf579c3e715aeb3cd4059d3e81212a3d18e19f3e45222d3d370b993e40cbd93c5e58963eaf1fb63c93a7963e81489a3c300b983ec4c7273d2df6953e9b97d23ce2df933e8062aa3cb7ea933e958c883cfa16943ef9bdcf3c212a913e94c6a63c25e2903e4b52863c58a6933e6fed2e3c3903963e7f7f393c52ea963ee4d77a3cc6d6973e2735853cf633933eb4bd253d65d1913e614acd3c86c98e3eb751d23cd35e8e3e9b33a73c36098e3eda6c863c4c8b8d3ebf5a133c5cff8a3e123c8c3cf8958b3ea286ab3c4a28883ef4d2933c1f17863ed359463c5288853ef1bf973ce212893ee2bbb13c47578a3e2ecedf3ca3438c3e0f5cd63c767d8e3e2c1d243d5a098a3ee29e223d5417943ef2d8613d2862873ebffbef3c216e863eae97b73cb6fe823ecbb6803cbcff813e8248863c9bc3803e10d37d3cb0e6863ea8af223dcebe843e9baaf63cd85b8b3ea0485c3d652f8d3eb0ae823d78c6883e55fb533da698813e2a3d643cdd3d843edd9e723c8406833e91d0393cea4c803e6bba243c182f803ecbb24f3c2b0c7f3ebb50643cda5d823ecd7b9c3c2e807f3e370b993cd05a7b3e2c775a3c32047d3ef6972f3c1e26793e2bb23e3caa557a3e927c1f3c9dcb7d3ee6e8153cf6e47b3e6bd10d3c3084773e8430d73b9ebd723e9e69d83b3c67993ec4058b3cf1019b3e86e6933c0c5b9b3e4742b13c06aa9b3efed3b63c8bca9c3e06bcb73ce4a19c3ee879cd3cc6949e3ec1b7d23c50539e3e8f35bf3caa889e3e031ae53c78849e3ea655003d41e19c3ee99c643de2c69f3e3bb25f3d9b9e9b3eb3d1853dd30e9e3ec177893daebc9c3e4790a03ddbf9983e0682993d0251903e77409f3d7e318d3e6584a53d6ff58e3e1a64bd3d97ad853e6a90ab3dc998823e42c58b3d5474913e2b88ac3d338b983e858bab3dc6269c3e0307bc3db43e8a3e8843c43dae857b3e5f34b93dc365713eb1b49e3d047d6f3ecb03cd3d959d633e1692c13d38e2553ec40bbb3dff0d4b3eb28d903db3d9453ec46cb53d86a0553eadf8593d35be453e43a7363d8965823ea6d9573d1600823e085aca3d0fa5783e4e57d73d0fd0373ed8d97e3deacd353ef433b13d0304243eede3b53dda132e3ebdfc3f3d3b84323e7a89f43c8abc253e70211d3dd8ae1d3e3fe55f3d11b8233e50348e3d4f5d133ecc71bb3d58620f3e0279973de38e073ece976f3deb19063e5af7be3d484a023e53ab9c3ddcfaf13dbfcbc13d5104f83dc11b743d0b71063e42ce443daab2173e9b29323d227dea3d234ca03d12f6d73d018cc53d8babe23d0f2b7b3dcf7bcf3d8940a73d9259c53d193e843d20eac03dfd0d5f3dcedaf53db64e493dfdbadb3de5e1513da0b4913edb51443c74f2903e3662463c3f1c903e50f6253c08c88a3e72bf343cab1e8a3e4a24483ce5ca883e66b13b3c12c48a3e2576853d4098933ee54ccb3d5704943ea524b43d97a1993e9c05cb3dfcff963eeef0b33d1dc0263f49760b3de3d0263fcbc6113d1117273fb249073ded4b263f2e47093d58ec273f687a083dc381273f4fd3043d2169273f600cfe3c8a28273fd1771b3d1183283ff523113da13a263f1f33123df770263f709c1d3deb04283ffaee2a3dac54293f7936203d51f7283feea6093d7228283f3cdd003d8860283f74cf313d8b45273fde542f3d72b6263f7e2f023de4f4293f2be3193d30ae293f16c3263d1e3c2a3f4e3d563d2244293f1bd85b3d208a2b3f2d5d4a3d15562c3fc3d7423d76b22a3fec2a613de5ad293fac70653d0e1e2c3faf59543d06fe2b3ff2d98e3d28cb2a3f26ba843d44622a3fc2f8203d9d4d303f6461843d4549313fb2fb973d6e472d3f67cb9e3d707d2e3fc383b23d2ad02a3fb927b63d1360353f811e973dc2a8353f8ad8ac3d690e323f3b5bad3d2f7e353f9654c13d7794393f819fc23d8d97393f25cdad3df281393f12769b3dce8d383fe9b6db3deb153c3f9a30ad3d9eed3b3f6a28c03d1d1a3c3f8313d73d97c23e3f7753b93dc39f3e3f9cd8aa3d806e413f9255aa3d2592413f3d4e913dff5b353fc049d03db1d3333ff2ffe03d4501333f672fd43d7368323fcb03c33d199c2f3f7c79c53d9ce0303f28afd33d48602f3fdf29e63de1312d3fd9a9cb3dd5232a3fabc8ce3d10872c3f9f55e93d21b5273f2babd73d1b432a3f086dee3d5989253f01c0c73d5baa273feeccbd3dba7a253fd85bdc3d465f243f8baacb3da4e3263fc6a2f53d724e243f69e1bc3dc25b233f9be8c03d67e7253f93b6b33d7db3243fec8cab3da754233fd7e7b33d0b89223f1d5db83d445c253f2917a63d1e56263fbb98ad3d5d48283fd5bab63dfb8d293f92fabc3d9469293f73e9b23d6c50293f23d4a83d33862a3f222fa53d7880293f13939b3da4ad283fa85ea03d1a08223fc2b7b43db4d9223fad87b03d50df203f3f71ad3d36c8213f4512ab3dd470203fa193a43dcc12213f1f36a53d067d213fed07a23d202b233fa31ea23dbddd203fcdcc9e3dd2dd213f19279b3debfc213f34eb9e3dd726243f481ba83d1b8b233fe0e99c3d62cf243f65b8a23de1b15a3fd1d20d3d5ed95a3f337ffd3c64385a3fafd5063d966e593f56531f3db46d5b3fd098033d17995b3f52f8f23c0d1c5b3f33c0f33c91dc5a3fb637ea3c0c0e5a3f2641e53ccc2a593f42baee3ce8a4583f4c1ddc3c92845a3fa79be03c1ea65a3f6986d43c0bfc563f773fed3cee565b3f0f1be03cc1cd593f0d66d53c499c583fb8d0173d9d61573f385c023df3da583f2917263dac4d563fda10f63c1000573fb54f053d5639533f1218253d6ee9523fba1a153db60b523f89b8193ddf9e543f5ac03d3da2c4553f67eb453d3247583f79d81a3daeca523f9974273d7654553f86674e3d8f42543f1a06423d0a6b4a3fd7da3a3db81d4b3fe47a1d3dec1e453f98bc093d705d463fe9aa003d64e4443fc81b063d2eea453fe112f33c8f52443f74b2a23cbc53423f0242113d0e3c433f7075ad3ca22c413f88bbc03c6f0a433fc16da33c790d413f08b5b73c7512403f771ccc3c08c4403f3b7f0f3d0a70423fb90a183defac413fa757573d11ff3f3fa54b333d38583d3ffdb63b3dfe7b403f6c598c3c3413423fc6277a3c9646403fe1396d3c2fa13f3f01ad943c3691413f73df563c4cd7423f17dc663cc4e5433f8ae2923c48ef3f3f95bcbb3c1bb7403f7147473c3a47403fe7d7523c82bb3f3f879e453c7034413f716b423c6456413f80f7263c657a3f3f5fd2733c8d2b423f3a0d3e3c9370403f3c1a283c2acd383fbfb80e3d65a2373f046f133d9ad0383f1772153d39d3383fe68d233de059393f8720143da13d393f3cc60d3d18de373f54d20c3d896d383f4a42093db1fd363f25760f3d7fd5383f46c10a3df926393fcb4b073d9cfc373fbfdf083d45d2373ff633043de99d373f7c9d223dab69373fd2ef083de48a383f5b3f033d36a8393f94f70b3dbbdd393fd336113d008e393ff068083d12df393f510d053da178393f2638223d40713a3fd773063dd3ca3a3f83650b3d41ae3b3ff1f3193d493f3a3fac71033d443b3a3fb6bffc3c2386393f5e89003d37c73a3f83ea003df5443b3f8678073d8f453c3fc2ce133dc6483a3f8d3c213d6dd6383fbfc8293d2399373f061a293dfc5b373f94c9433df473363f0974413d58c8363f623a283dc0da363f17a9203dac21393fc2c4463ddd1c3a3f3817473d578f393f5419293dc5513b3f2b7e463dc0683a3f2b95253d651d3d3f2b98383df9db3b3f9cae1d3d8da43c3f615e193dc3ae3d3fe73f2f3dc22a393fdeb8503d7638373f80c64b3dc9ba393faaf3833d02493a3f3d09513df67e3b3f4b854c3d44af3c3fe687823d130b3e3f25cd323d615b3b3f0ae6833df3183c3fe39e983dbb043e3f0a3a943db877353f764c7f3dc0d4313f647a4e3db4c0333f99ff4c3dc5e4313f99fc433d369a333f4618423d784b333fccc91a3d78ab343fdbf03f3d13cd343fd442493d2bc0303f1af9433dd8bf313fedea1c3dfbb7313f085e143ddf85353f8254663dc646343fb0531a3def36343fe9fb113d7ebd303f8fd41c3d82c1303f2855133daac9303f7e41fe3ca5aa313fdf78023d8c49333f7dfb133dc11e313ffb24e63c09d0313fb49fee3c24a8313f931ad53c33fa313f5a58e13c257b323fd7a9df3c2d28333f8591ef3c00f9323f2cc8e13c423d333f2531d43c234f333f39d7023d7d22343f512ffe3c71cf333f18dfe53cd36b323f7298ce3c32e85e3f19e39b3dfebd5f3f7b059d3d28615f3f626e9b3d97765f3fd6fb983d93085f3ff151953d4e4a5e3f206d9c3d86775f3fea5c963d24de5f3f6413953d99295f3fd25d9f3d52665e3f94eda03dc4695c3fdb14a23d0d5a5f3f7107923d2b9e5e3f97d68f3d3c745e3f4722943d2fbb5c3fe71f8d3d09435c3f86479d3d4a765c3f89ec913dd7fb5f3ff137993d40e15b3fd4469d3d06215c3f9fb4913d565c583f59b79d3d1986583f5aada33d44a55b3fd75ca23d57015c3ff9568c3d06a8573f8b6da43deb18593fa63b893d26c7583f495c8f3d4fc6573f7eba9d3dad4f523f4177ab3d4c60583fdd9c873db6b3513ff746a33d9a674f3fdfc2ac3dc337583fd3e58e3d97fb543fe325793d3b68513f19a5b33d6b2b4e3fba03bb3dcd23513f7ad1bd3df6e5493f0c36b63d5f394d3ff240c83d95b8503f9991c53d1627483fb9dcc53dfa59453fac8ad73de465443f384bbf3d2f00433fba2dd23dedc34d3f7822d93d4d0d413fa7dce03d00b0453faacbe13d85c3483f8ca0e53d4ec0403f8b49cc3d3eca3f3fa6f6d73d9a35413f901eb83d72dc3e3fc6a6c43d2d2c493f0e4fdd3dad6e4b3fe170e43d53db4a3f5094ea3dd2154c3f8ffdf23d4ed64c3fe5caed3d48854e3f3a3ae33d77b94e3fceffe43ddd1f4d3f3f7def3db5b94c3f52def63d02604e3fc2ddfc3d2ac24f3f54b7ed3d4db84e3f07fff53ddc03503f2ddeff3d5743503ffad3f73d17be4f3fe90afb3df8a8503f65e1f33db310513f6bb9fc3dac88513f7f1af53dc4da503fa561ea3d11c64f3fcb16e23d37654f3faae5dd3db95b4f3ff549d43d6766203f56355e3d9715213f7d3b623de7d8203f97505e3db808213f67255a3d26b1213f5d0d583d8f4d213fe1cb563d7d1f213f821a523d5c67213f6d78683d20da203fc8f36d3dcddb223fa461743d7bc3233fdb3a653d597d203f7d21663d83c7213fa588503de984223fea8f523dba4a223f248c5a3d885e223fc61d7b3dc90e243f71b55d3d1299203fffbf563d1e72233f7732793dd3f6223fe92f803d1e57243f6191693d8aa8243f100e623d6d9b263f945a7b3d1cde263f1495723d9c4a273f034f803d0bbf253f943b863d0e2b253f86278a3de665263f872a893d9388273f6f13773d2dcf253f72828d3de3d4463f4efd913db088453fcfdfae3d0c1d4c3fe89da03d1ee1503f50d6833d6eef2c3f5ce04b3d37c52f3f0e0e6c3d9aac303f98844c3d0058363f2eae473d68e95b3f65a4c23e20965b3f7f19c23e28d35b3f6a6dc33e845f5c3f9665c23eccbf5a3f9132c23e862d5b3f3bc4c13e3a4b5b3ffd0bc13e1e735b3f379ec43e81215a3f963ec33e478a5a3f403bc13e11695c3f2084c33ed4285c3ff8edc43e58895a3fa77fc63eda42593f3d14c53e1cfb5b3f297cc13ed6b3593fcc47c23e0da8583ff33fc43eef445b3f0218c73ecb275a3f3656c73ea1e3583f65e0c53e8034583f191cc53e5523563f023ac93ee1e8563f2d37ca3ec12c583f75c7cb3e0620593fd789cc3e8ce45a3f2e0cc83e09ad573f171ecd3efdad583f9eb6cd3e554c563fd46dcb3e2e82553fe951ca3e3bef513f95bad13e2c2d563ffd9bd43ea171573f3626d23eb1c45a3f550cd03e90d1503f4f92d63eeec7543fc884d83e8e6f533f7160dd3e807e573f3949da3ee416573f8783de3ec32f523f940ce23e9a674f3f3643e13e53e74f3f7cdedb3eca4d4c3f7785db3efbbb4c3f3c1bd63ee5544c3f19a7e03ec2cc4c3f563bd03e5a9a503f1359ca3e843c483ff7b9e03e6d5d483f8d85db3e8a92483f2ff1d63e8017493f470fe73e0082483f000dd13e258f543feebee33ee597573f1eb7e43e6232523fb13cea3ec805553f9e34eb3eeef6593fb416e73e9840573f609eec3ef4925a3fb6a1ee3e313f5c3f3f3ee33ea82f5a3f259fe03e314d583f6a4ce03e0f295c3f9b66e83e0e9e593f67d0de3e5b83583ff9c9dd3e39ae583f9b45db3e61d2503f2986e53e1ec84d3fb6abe83ed9b04e3fad84e53efe5c4c3f4f66e43e65625d3fd84be43eaa8d5d3f149ae03e3f795e3f57abe13e825b5f3f9395df3ec3975e3f276bde3eb8475d3fcb3ddc3ed6045c3f4035de3e7da85c3f43d5da3ea9da5d3ff269db3eaa3b5d3f2106da3ed68a5e3faea6d83ee5a05b3f73a6dc3e8de15e3f6dfad93eca3b603f3e51d83ef0185f3fb59add3e26e35f3f45b4de3e6519613f40f5dc3ee015603f8640d93e4b90603f0110da3ea034603f7c4edc3ed2f4603fa0e2da3e1f98613f50c4da3e9535613f444bd93e56d5273f03f1bd3e3ff0273f63d6bf3ebb6f283f8efdbe3e6125293fef19c23eb13c273fb083be3eb019273f0d3dbd3e8e96273ff850bd3e2bda273ff0bbbc3e05ab283faa78bc3e9a8a293fc71dbd3e6b182a3f91fbbb3e4f36283f2927bc3ed419283fa663bb3ed463273fb712bc3e13f2283f617ebb3e17fe293fa935c13efe4a2b3f0299be3e95ba2b3f1f27bd3e9ab3293f3cfbc23ecb502a3fb29bc13eb2dc2d3f5430c63e28aa2b3f4bfdbe3e57652c3f9bbebd3e10b02c3f9624c73e4d192d3fa83ac83ef7562f3fff2fc33e62b42f3fe034c13e428e303fe1d5c13eb3c32f3f3482c33e83352e3f77bec63eb278373f01b7c23ebe12383f4f6dc63eb0873d3fa399c03ebcb8403fff80ca3e9a5c313f84a5cf3e5f503b3febc6d33eed93403f42ebd33eff8c403fc02eda3ea64e2d3f5797cd3e6df4293ff7fad13e7955303f4f74d73e925a433fab7ada3e381c443fa3dcd43ecb8f453f8b84d03e0d1f433fda16de3e3625453ff54ec73e2e85423fd418c63e7d00463f5f13d63e68e1463f84f0d03e47e0453fcd37db3ee9e7453fc4f7df3ec193453ff6aee53e3341493f672fca3ede374b3fe6aec93e191b4b3f02adc83ebdf1423faae9e03e2f01413fd4b4e23edee2413f16aee53e3f91403f95d3e73ed0b73e3f310be43e5eae403ff9a3dd3e85553c3f5a3ee53e42ee3b3fecc8e73eead4383f7e8fe83e4a7a383f4475e63e2591343f49f5e03e6d723d3f213edf3eb1a6393f1ba9e03e86b5333f2e98dd3ed5b8303f891ede3e0117313f9914e03e8685303fdd8fdb3e6491323fb5f5d93ee1ab2f3ff276d93e7e02383faaa5dc3e986b3c3f9612db3efcef353fb31ed73e2f4d2a3ffdb5d53e3a602a3f3c64d73e46b7293f60acd53e8e83293fe926d73e5734263f7b5bd53e8464293f4910d23ef607263f5074d23e77b2253f4f7dd23ec467263fdea3d63ebad2253fce55d53ed6b1233fdeecd23e8c75253fbf46d13e7030263f411fd13ef01c293fd883d03e118f233f1cd8d13ecf1b233ff62fd33efbcf223f0e59d23e1e47223feb13d33e68ab223f106cd33ef8a7223f9e13d43e4c31233f62d5d43e53b9223f21b1d43efc59223f4f11d53ee8cd233ffa00d53e30ea223fc8afd53e70aa233fd11ed63e23a4253f4086d63e9a22223fdf1ad43e92fd4a3f259dc23ed2d6493f8bf4c13e9ecd493f73cbc23e0fbf493fd68ec43e1d67493f80cfc13e77c74a3ffbc5c13e0d3b4a3f804bc13e98a54b3fbb27c23ecfd1493f2c75c13e4d83493f9701c13e44ac4a3fe845c13e83da4a3fe1b2c03e2ff54a3f3783c43e8bf44a3f0b53c53e183f4b3f9150c13eb5224a3f6389c03e8345493f2099c23ec31a493f3f5ac43e9db6493f1b56c53e1cfe483f618fc13e1ac4483f0d34c23e581b493f1f1fc13e21cd483fc7aec03e6d4b483f642ec43ec839483fdbd2c03ef5db473fa66bc13e8ae8473f891cc03e20ec463fd32fc33e506e483f8f75c03e9576483fadd3bf3ee729493fb223c03e39fe483f1535c53eba27483f8cb7c43e3465473fc6e6c03e0f5a463f2d62c23eb122473ff4c6c83e3157483f9becc83ebb52493f53f1c83eb662453f9aeec63e34bb463f89a4c33e4bf6453f5d0ec33e44d9443fa8bac53e3a054c3f0870c83e17c64b3f7f43c53e09ba4b3f3250c43e8b22483f5328ca3e51f0463f2385c93ed079443fe526c63eff1b4c3f3939c93e18d44c3f1e1bcd3e2aa64d3fa783c93e72af4e3fac0bca3e70df4e3fdbb0c83eeccf4d3f3e5bc83e7b504f3f27cbc33e7b93503f4d08c93e7ada503faa27c43ed9e9503f5116c33e69554e3f03adc33e32b8513faf19c93e10dd513faf34c43e5ee1513f6804c33eecea513fe57cc03ee906513f32dac03e60a0513fb3f5be3e30eb503f7172bf3eb8614f3f0accc03e58584f3f5cf1c23e786c4e3fbda2c23e74914e3ffd46c03e47ef4e3fb2c6be3e69924f3f546cbf3e8c46503f5578be3eb3c74f3f7592be3e53894f3fa5b4bd3ed9c6503f479bbe3e621e513f65dcbd3e605d503ff267bd3e7d4a613fa9d2cd3e3bfd613f1c5ccd3e7e8a613fcb58cd3e0f5e613f6dd0cc3e34b7603f7683cc3ef41b613f2161cc3efc4d613f7dcdcb3e6bf3603fbd95ce3e3a7c613fb84dcf3e8d745f3f4ffdcf3e96df613f7f58ce3e20a7603f6291cb3eede75f3f49c7cb3e771b603f65cacc3e65995e3f650ace3e61545e3f0115cd3e07025e3f908cce3e0ada5e3fad8ed03e4aae5b3f8ea3d03ee6b65d3f1497cd3e5aec5f3f83dcd03e744f5f3ff27bd13e3a7c5c3fd7d4d23eb1095d3f00d9d33e2fd05b3fb586d33e81fa5a3f9741d13e01735b3fc386cf3e935f5c3f1fa6d43e1f95583f95f1d73edb5f593fac31d93e43a0423ffb12b73e7033433fe7ddb53efaa4423fbe3fb63e6e37423fdbdcb53e1e5a413f1c4db63ee8d0403f0860b73ea710403f7cbab63e6ff53e3f64a2b83e07bb413fbaaeb53e9c9e413f2ed1b43e2b6b433f5d53b73e8d39433f82fdb83e0162423fca6bb83e03ca3f3f95b7b93ee0be413f6419bb3e7edb423f4a6abb3e9eb1423f726ebc3ecac4403fb77db53e4e84423f5fe7b43e2d823e3f1899b93e50943f3f4555ba3e21c53d3f0729c03ea44c403f11b4c13ef9dd413ff692c13ebf2a403fad8bc23efd9b413f0da8bb3ec4c93c3f9f87be3ebe503c3fe864bf3e96e1413fbbbdc23e7f68343f45c4ea3ea1c9313fdf2aea3e57c5323f424cec3e6337313fe8a9ec3e1cb7313f807fed3e3e69313f0bb0ee3e84d8303f69a7eb3ee161303fdcd6ed3ee4f62f3f52e8eb3edab6303fd944e93efc11333fec08ee3ee4e0323ff90ce83e69d9313f0043e73ee8b4343f245cea3e30c2343f65a2ec3e896c353ffdb3eb3e162c363f4d1be83e4aea333fc124e53e02b5363f8cace93e0b18333fd09ee73e4141323f923ce63ef05a323fb0d6e33e10d8293fce26d03e4fc4513f6f2cca3e7190523f072cce3e3c9f273f9121373dadb8403f69ce183dadd0613f216acc3eeb80c43e8552d43e4cadb53eaaefc83e57c6b53ef123d23eb2d7c43ef024cc3e826ed33ebaecd63edc6ab33eea7bbe3edbeda73e8f8abf3ef0e6aa3ebd74b23eb8efa73ea135b33e9ff8a43edd73b23eda709c3e417abe3e0aeda73e3d06c83e1ceca73eb03ad13e86119a3ee422d23e332c9a3e44eec83eac558b3eaf50d43e2d008b3e6822cc3ee6cc783e47ead63ea704d43ead4ecf3ed3c7e13e7444d93efb5ae43ee293d13e2cd3d43e653ac83e73e2f33e05a6d23e3b21e53e999dc93ee425e53e41e9bf3e04b5f83ef656c83e8b33013f09ead33e1d75ff3eef5cdb3eeed6023f406dca3e173b053f9409c53e1fad0a3fb1dfca3e5994093f95e5d33eecd1073ff5c9db3e3279f03ee311db3e8a33103f63b2d33e777f0f3f2553db3e7fb9103fe253cb3e3aa50b3f3a6bc33e2d9a043f77dcc03e50cdf63e4debbe3eb264f53e7dbeb43e385f153fcbdcd23eaa61153fd4cbda3ee1ea153f4612cb3efadd113feb69c33e242f0c3f9912bd3e7cdc033f446fbb3ea0e9023fdb97b23e573e023f7f05a93e7a7a1a3f7679d23ef35e1b3f51b2da3e3e14143f0bf3ba3e6b96173fdd66c33e09450c3f69eab73e5bf00b3fe343b03e90540b3f87b9a73ed98d0a3f48ba9e3e39c0193f12efca3ebe80193f75ddc43eb4271c3f1877bc3ed27e143f985cae3e74af143fe141b53e46a7133f73aaa63e7d72123f8b5c9e3ed3bd1b3f3590ac3e6db01b3f75fdb23eec671b3ff319ba3e151d1b3fa565a53edc011a3fc64e9d3ec85c223f6d33ac3efe12223f45c9a43e5db41f3f7188b83e4687213f4967b23e4803113f6f84953e5abd093fc779953e924e183f4e57943e4f0e213f4f499c3e1cb0083f2bc28c3e42fb0e3f38538c3e0dc8153f94918a3e8cba013f97ac8c3ec592013f1b0c963ed7dd013fb3989f3ea29df43e5359aa3e93f8f33e7caaa03e0d41e63e9471ab3e309ef33e27c0963ef56af43ed68d8c3e88aa013f0e6f833e4076073f72ba833e6c0f0d3fe022833e7431133fc261813ed1d51b3f9d19883ea0011f3f0396923e6243e63ef724a13e51aee63e5bf5963ed731e83e24d18b3e9906f63ecbe1823e04b2e53e084fb63ee028d93ea2f8b53e9717d73efed7be3e9f35cc3ea58fb23e7679ce3e7028a93e0b1cc93e1292ba3e218fbf3e9e92ad3eeea3c23e19f7a53eb0c6c43eeb899d3e531abb3e5b99b43e2512c43e9e99c33e2e09b03eab8aad3ef45db43e144da83e2c2cb73e0929a23ec916b93e38e39a3e55dcb93e976b913efa0fd03e7f899f3e0165da3ee024ab3e023cc63e17a5933e5406db3e57a7a03e5083d13e3a44953e6918c83e0757883ef8d3ba3eda5b853e8be1db3e104e963e9725d33e2b0a8a3e489cdd3e8a168b3ed85ade3e25a2813e5040d53ed036803e3ca8e03e9342733e60b3ca3e36687b3e0425bf3e1385753e9c84eb3ef2ac743e7faee93e754d823e7b7cec3e9535663e688bf73e7641753e8817f83e2bb3673efd12013f5e03683e991c013fb1a1763ee23a063f08a9763e8ae1053f097a673e8d380b3f709b753e1e440a3f8db3663e3ac2103f0e57723efc210f3fd753653eb8d1153fb3826e3ea898183f938e7d3e48a9053fafba583e8fd1093fefdc583e10470e3f0488583e00d7003f5e76583e54b0003f853d4b3eb7d0f73e671d593e3a2eed3e2bc5583e6d0ce23e2e39633e7874e33e04af573edb55ee3ec9f34a3e7537e43e218b4a3ecdb0f73eeb9c4b3ee958053f3dcf4b3e3eb9003f52503e3e2817053f26583f3e3be3f73ea8dc3d3ef093ee3e699d3d3e6bebe43e8f863c3e107ad93e39e3493ed55fd83e5a50563edc56d83e4308633e8017ce3e97ca533e8af8ce3ed75a473eb024c53e9d37453eed6cd03edbd6393e6dc7da3e73f63a3eb5d6e53e9c1c2f3e4139dc3e04b12d3eddacee3e3a97303ebcf7f73e5e68313e5420d23e2d642c3e6c70c63ec655383eed0dcd3ed2595f3edfbad63e3700723e4a4ac43e68b2503e12f7cb3e33c56b3e8f6dc33ec0f35a3e7feac13eadd9653e8bbae63e5932233e1712ef3eed29243ef77bef3ed3fa173ed118f83e5f17253e97f4f73e6d42193e5679e73e018b173ed3c9dd3e5499213e431af03eba2c0b3e7d22f83e93670c3eb409003f7ff91a3e4652003fee68263e5a75f03e8849f93d6871043f512d273eaa34043f05141c3ee71e003f67770e3e1f35f83e6da2fa3de3c4ef3e4a17d93dbbb4043f5700333e228f003f5539323e5a45083f0832273ee0d0073fd8711c3e949e083f81a9323e9325093ffd213f3e84320c3fdaae253eb7970b3f66c81a3e2ac50c3f95e3303e3d5c0d3f65143e3ee7b80d3fd85d4b3ecd06123f1bda3b3e2013113f81a92d3e73de0f3f3d00223e9fe80e3fb638173e73ea0a3f318c0e3eb2130e3f348a0b3e9881093f75d04b3ef9ce123f0d3c573e62ee133f81fb623e185f123f541f4a3e59570d3fa20dfd3dff320a3f9c30003e87ab093f9461e23d7436063f41b4e13d5173063f49c0bf3d06a8063f32d5003eb64a033f2d94df3d6623033fb132bc3da2d3033f2e73003e5152073fea25103eb219043f10e80f3ebd29003f4fd8fd3d4e50ff3ee06ddb3dc7f5fd3ebc9bb63d583af73e428dd83d0a13f53ef9e1b13d320eed3e5c11b63da20ae53e43a7bb3dd725e83e4ef9db3d90d4e83e409af93d2c51e83eec010b3e9ce0e03e36080b3ec066df3e9888163ea1c3e13e223bfb3ded6fd93e111a0a3e07ecd63ee7eb143ebe71e13e0d66df3d7f41db3e365efc3d3552d33e34f0073ed644cf3e1027123e892dde3e4026c23da450db3e34a3e43d0ffed53e5a0dfb3de349d63e724de83d25aad33efce0d73d4d1ecb3ea1aa1c3e5032d43ee5cb1f3edcd9c73e33f3293ef03dd83eaa91cd3d1ce80c3f8567e23d81b9093fc19dc23d0ef90c3f7367c63d3ea2773e5c4bcf3e4f165c3ea841d93e74f0563edd8fd13ed606763e0736c83e2bdc373e79a1d23e5b65553e4498c93e3dc78b3e4d96c33e63be863e188dba3e5d5e553e44e2bf3ecb362e3e3c50c83e0fcd1a3e3ce5d33edb7f713e23d2be3e17a6833e0189b23e483f143e2d66ca3e4e84f23d2ae0d33e79ad0a3e1a01c53ea3bde93d02d8ca3e547cbd3d9facd33ec1fde13d8861c33e6c1dc33d914fdb3e49fe933d11c8da3ecc4c003e8cc6db3e3eb1203eb359db3ea54db93dac4bcb3e4013943d80d6d23eba2ab03d595fc33e210b483d8faeda3ec9b0dd3d3c07bd3e0d799e3dade5ba3ec6320d3e1ed3c03e632b103eb264bb3efe08323ed4e2be3e18fa133e748bb23e6404dd3da8ddb73e2ba2993dd932b53e562c9b3de84bae3ef7aedf3d4c35b03ec4eea13d1b98a63e4752423d997dac3e3720433d29ecb23e619a473d390aba3e3159823d3e5bc33ed293e43d04a9a73e10d0ea3dc3a79e3e7daa163efff6a83e80dd343e01b4b43e6649cb3c6a54b23e9ba0b03c831fac3e68684c3da451a53e879cab3d8a489e3e845bf13d2965953e8b5f193e52f9953efd285e3d1c399d3e131eb73d826e953eebccf93da1ab8c3eb1c3183e89978c3e0507193ebb57833ef1de363e717a8c3e3a75383e34af963ef4bc373eb99ba03eefe6b93cf4b3a43e9867c73d5e3b8c3e786c793de43f943e13d2013ecfa1833eb4421b3e076f763e2193da3c6c329c3e33f4903d27788a3e12d0d63dee08833e36c4063ebe73763e5b240e3d347d923e2a2d533ec617a13e192e533e9266ab3ecd5a523ecee5963e77f9673ea53f963e5b6f363ea94caa3ead48543e4c46b63e9e5f6d3e1ff1b53e18eb6a3e2e1bab3ec463813ecb1fa93e2bac693e499ba03e3a9e7f3e947e9f3e8c1b8b3e0c809d3e0cbb7c3eaf36953edca7893e6d98933e8e3c8d3e96efa53ed94f903e1d8dad3e29b8983ebf22a23e2ecf963e4fda9a3e600b963e895f913eca14953ef34b853e41c3943e9a95b43ea2849b3ecc48a83ee4d79f3e3888ad3ebccc873e3747883e8479793ed5f9893e7932853edd437b3e29c3903e4161753eccfd8d3ef0b3653ea446753e3524803ed2ef833e699e6b3e4087643e54058b3e3c574f3ef8be8b3e260d633ed68e813eb4745e3e1f18733e0eb7483ede7f743e94ca463e0105663eedaa333eddcb823ef4604c3eed38823edea3303e3d11753e698e2f3ea07f673e1c6a453e7391583e92af5b3e3a0b633e9d53723e08d8713e2b6c1b3edacc673e0320303e31e6583e50601c3eaa3b583e9263303e36624b3eb9fe1c3e52ff4a3e9a11093e2f7d583ed62c083eba40673ecf3aed3df977663ee38fe53db363753ed036b93d2c1c723e0bdf1c3e480e3e3ed0560a3ee48d4b3ebbd6f03d289d583eaa40c63d7715653e39b3a53d3d46813ebede743d92547d3eb3f6403db5fe873e951ecd3df945583ef65cf33d7e8c4b3ed5d19f3ddbba623e2cb0903d05456e3e8d610b3e22133f3e0945f63dd4d93e3e6f8b1d3e9ff3313eaeef0c3e7bb7323e4d831e3ee51f263e68010e3e9de0263e76aa1f3e25ad1a3e75ed2f3ebef9183ee385fa3d535d323e9d83d43d17c93d3ee196d13d6e174b3e35d3a83dbcf7563e2721af3df58a3b3e47c9b63dc3542d3e08972f3e0c1b0c3e0bf90e3effc31b3ecb5a1f3e35270e3e0b782f3e5601fa3dc8fb3e3e20b0f83d94a02f3e02d2243e11e4403efcb5173e22ac3f3e38e40a3ec0ed503e024a173eeb66523ed9f4223e2ab3413e95e8233e2f79423e6059303e652a543e6de22e3e51de2f3e8026313e60a6423eb4623d3ee402303e489e3d3e5a1e433e66bc4a3e0ee2583e717e573e6f1e6f3e47dd623ecf5f573ec3574a3e4ffc553ede4f3c3ee6d9823ea3315f3e6f7b8c3e7ccd5a3ed7d1813e01a1533ec20f6f3e7223563ecade6c3e0db4493eaaf2803edb2f473ede9f8b3e518c503e90c78a3e8611453ef3486a3e4ec43a3eea017f3ec7a9393edc7e893ea32e383ef0a07b3e20342c3e316a673e617b2d3e784d643e0560213e1782773e7a971f3e8019883ecbc9293e33d8843e747b1c3e9717613e9d4b163e2912723ef2b2143e6bb3803e20f2113e81424f3e42bd0a3ed4275e3e37c70a3ed90d6d3ebedc093e6c4e793e53b5073e336e693e20dafb3d37665c3ec1b0fa3d15414e3ee108f93dcff8733e1c8dfa3d94a44f3e4c61db3d1c0f5d3e08d5de3db563403e3e77d83d6853693e7a18e43d0463733e90c6e73d0fa5783e4e57d73d38e2553ec40bbb3d959d633e1692c13d047d6f3ecb03cd3dff75313ed4e4d73db3d9453ec46cb53d73361f3ed42efd3d6745213e5dbcda3deacd353ef433b13d436a0f3e06940f3ef889103ec51a003ebeb6123ef9dade3d0304243eede3b53db034053e4b79003e0b04073e10f4e03d5b83023e61ce0f3e4f5d133ecc71bb3dbf08ee3da19fff3d9457f23df397e13d523ce83df12f0e3eeb19063e5af7be3d67dfd43dea41fc3d60ebce3db6280b3e2bc5e23d57701a3e1483003e271e1c3e09e4dd3da35a253e8735c83d69db163e036bd83d1b94e13ddcfaf13dbfcbc13d8858fd3dd6e1263e8745d93d6293303ec47ac03d22a7213e12f6d73d018cc53df9b58f3d7409cb3ee102623dd0e5ca3e0a02663deed1c43e4f973b3da267bc3e6657563de972d23e20d5023dec75b83e25c5eb3c1139b73ec42f183e1a889f3e3c83203f544bb73eabae3e3e010fdb3e5d57ac3df2d5493ebcb6053f30e92e3fc1ed113f21e92c3fde45053f21e92c3fe221123fcc532f3f2740233f21e92c3ff8ad223f09e52f3fe315333f21e92c3f7684323fae58303fa927063f3ee9303fe1890c3ffb58313fc424f63e9ecc2e3fc6c4003fadcc303fb005f73e89b9303fab15013fe33d333fdfa3f73e4f29333f2c47f83ec277353feb6b013fc68c353ff3cc013f0697373f1fc7063f6bcd353f1406073f14d2373fb83b073f17a0393fa748023fdf72393fdeee023f8b363b3fe459073f89503b3f2b700b3f39a23b3fcadc0b3f470d3a3ffae0103f11d83a3f639e0f3f75593c3f6551143f0ca43d3f0f8e0e3f43603d3f44be103fdc963e3f64910c3f57b93e3fcc770b3f27283d3fca73133f81c9403fe9880d3ff175403fadbd083fe346403fe836083f008e3e3feb1a043f46973e3f1580043f0a52403f6bce043f0d30423fecbc083fce39423fc97d083fd245443f0701053fdd1d443f3313053f1e08463f36d0013fab2e443fb80c023f3700463f40fb013feae1473fa9f6043f0800483f349d043fe5164a3f398e013f54e9493f2ce9003fb7df4b3f9413043f361c4c3fb211083f8253483f05c8073f17704a3f82bb0a3f62f34a3f601b0b3f1fd5483f7ffe0d3f626c493f1b7b0d3f74804b3f83230d3f4ce04d3fcd5d0a3fc33a4d3f645c073f5c8b4c3f130a103ffbf64b3f01b90f3fda314e3fdea5103fbe004a3fdd90113fe31d483f86fb123f618d4a3f09f4133fd9e7483f5e56153f856b473f58e4123f0f4d463f4cdc0f3f9b4c453ff3c10e3f825d473fc2b9143fed8c443f6e64113f8332433fb075173fb10c433fb67c1b3f80fb413f8fd3193f5c18453f28491d3fbf7a443f8867213f1e70443fa1b3203f91a8413fe996183f0b843f3fe19b1e3f49303e3f703c173fd41c463ff5960b3f9cbe463f7e400c3f21a5443f7d49083fe549463f362a0d3f0d7e423f40fd163f291e3c3f7d74183f60423a3f7f1c203fc68d3b3f8dde203f1f0b393f0237193fd8ff373f64ba113fca1a393f3143123f7107373f0fc5193fac45353f1e85213f5a10363f0894123fd583343fba460c3ffce7333f04410c3fcc4b363fc48c063f0379333f1d200c3f054f383fbe54063fc1fc303fce3e0c3fda53313feac8123f1cc8313f6c7f293fc1c6363fbefb283f60ff393f8a16313f2cb03a3f2063313f934b373f9080283fe5c43c3fd5e4273f6e723f3f5dff263f2a63423f0df9253fab24453f9c282a3f1c92463f77ce2c3fb926443f998f303fb5ee463f2a212d3f34b2483f9d042f3f93354b3fa5be323fb12a4a3fb5d7333f474a4d3fccf42f3fcecc4d3fa70e303f9e78503f4f11343f665c503f03a2333f0770533f146f2f3fb039533f24c22d3f3a47563f8cf1323f3e89563fb585383fa159503f2d51383f8ea3533fe5c8373f24e4563fd114373f5458493f8130383f9cf24c3fe8e43c3fcb18543f83733c3fa576573fa6fe3c3fbba6503f8fd2413fa829513fdbb4413fd8bc543f1042413fdd34583fdead3c3fd0ff4c3faee13b3f0e17493f7f34413f8631493fad9d413fdd4f4d3f4e893a3f6bdf443fe7f5343fa174453f4801313fc82c413f9448393f9bee403fb63f403f48cd403f2fb5403f9fd0443f41e5463fd4e9443fcaaf463f1acc403f7ea04c3fe3e2403fedd84c3fb316453f2d184d3f1cbd493f591c473f7472493fe94f523fea42453fbf19523f8409413f3f57573f0b38413f7688573fd36e453f18ff573f02234a3feca6523fcef4493fe94d473fbdc04d3f2d414d3f0c324e3ff7384d3f5a63523ffc57473f4bc8513f60fa523f84834e3f6796583f08c54e3ff608593f5442533f981f533f8fdb523fcb18473fc37c553f93e44c3fd83e563ffb344c3f9ffe593f6385463fe112593f0dec523f77e9563f5911593f5288573f6f8d583f2ccb5b3f4848523ffae55a3fd292453f68bf5c3f8277403f1ebd5b3f47bd3b3fe4e05a3f03373f3fb2545f3ff3a03a3f6b5a5e3fb130363fbf8c5d3f0723373f182f5a3f0afd383f08e6613f1f623d3fa1fa623f19f63a3fbb76663f4bcd363f5356653f76c5323f9575643f0fc3343f6005613f9367323f20ac593f4eb5313f8fe65c3fb0562d3f39805c3f43d92d3ff479593f0c8c303f7b46603fecb62e3fc5af633fe88b2a3f1414633f3f572c3feebd5f3f79c6293f93ba593f0496293f5085573fad3c293f20725c3f535c253f0b845c3f7610263fc91d5a3f8727263fc432583fe723283f47805f3fbf2e263fb7b1623fb4cb213f3359623f1403243f8b5a5f3f9898223f68535a3f53f4223f5d99583febaa213fc27d5c3ffa331e3f884e5c3f765e1f3fe54f5a3fb6611c3fb3075a3f39031b3fa0e55b3febed183f7e1a5e3f820e183fe8385b3fb5de153fb8475d3fd118133f00665f3f522e163fc765603f3ba2193f3d35613f1f4a1c3fb7b25e3fb29c193f1b74593f72ac1a3ffafd573f44381d3ffd81583f8bfa1f3f1ab5583fc905203fba195f3f1a8f1d3f08db613f9ad0123ff186623f16c80f3f2e59613f1f2b0c3fdc13633f6a1a0f3f4972643f6e72123f04b4653fb23d163fc58e633f3f510b3f241c663f2d80083fae88643f54960e3f9499673f8e930a3f566e693f945b073fe1a8673f1aad043fc7d5653f887f123f01fd683fd0940e3ff81d6b3f9c39133f74a66c3f88f2163ff33d6a3fc5d41b3fe6536b3f525c183f64f66d3f0eb11d3f76f86e3fe0db203f7c336c3fe6ad1a3fd5e0673f32671f3f01c0683f7a39243fcf7d693f4855163fdcda663fde0f233f1ed3653fc1a5273fad63663f7a7d1e3ff237653fab2c1a3f7975643ffe002c3f5506673f1923303f08ba673fed322d3f16b56a3feedc283fad1f6a3f950d343fcb7d683ff9ef373fd290693f48be343f04476c3ff21c313f8c4d6b3f4cbd253f4cd16c3fe74b2a3f27496d3fd4de273ff2f06f3fa5eb223f57976f3f7f5a2e3fc6b66d3f91cf313f79976e3f49952f3fb645703f035d2c3f3023703f65bb2b3f8bfc723f368d303f2829723fa502323f67e5743f230a2c3fc61e763f7a99253fa9a3763fa45c263f4727733fc8dd2c3fd265793fabe7333fadf1773f8b04363ff9257b3fe0f32d3f43bf7c3fd382253f83967d3f5f69253faa1d7a3f97b1203fe7ed723f46071f3f0c87763f3a6b183f11c8753f04dd1a3f7d40723f9201153f100f713f0bdd113fcc65743f6e070f3f84c2773f77b60b3f1777723f2226083f328f753f10ab043f87b0783f4e590c3f33227b3f149a143f78cd7c3f3967163fc34b793fe723023fd1c7723f69ecfb3eb68d753ff312f13e580b723f4c80fa3e18b76f3f9b74f33eb3a76c3f93e0013f76776d3f5e2efd3e5ae36a3fe81f033fd73c693f5554063f14616b3f865ff83e185c683f9497003f5d19673fbe66e93ef97a6e3f4647e33e43ad6c3f62cbee3e99a6693f2f7e0a3fc27f6d3f4e51063fdd12703f40710f3f84716f3f692bec3ebcc0663fc6c9f43e48e7653f53fbf13e296d633ffaa9ea3e8cf1633f7f5ce93e7e34613f6e43e33eee2c643faf41e33e6664613f1a41e33e750c5f3f9e2ae83e91da5e3f593fed3eef155e3f6082ef3e0ad6603fe3fbe63ec1345d3fc2f2e93ede8e5c3f1561eb3e97565b3fb61be83ea4905b3f1d3ce93e54a35a3f34b4e93e3190593f54edeb3ef4ef593fe77fee3e5b515a3f272cee3e74f75b3fcfdcf13eda365c3f7929f33ef4365e3f72caf83eeef85d3fd675f63e0c205c3fcff9fb3e5dbe5b3f3f04ff3e45655d3f1db9023fb6925c3f3de8003f68225b3f621ff53ec3a85a3f16ebf93eb3775a3f8f19ff3eb60a5a3f84b0033fd05c5a3fd0d7053fff975b3fd6a1083ffe2b5a3f6226063f0d2e593f6e1a083fa756573f9cda0a3f9205583fe38e0c3f3bbb543f94c1083fa940553ffb14043f0675583f85c0053f170a573f5665063fb079553f8736043f26e0563f87b7043f2bb2553f348f033f5bdc553f232c033f2ac3563f09d8023f6efd573f1307023fc9a5573f30f4033fd0a9543fe16d053f3014543fc075033fd5e9523f4961023f06c3533f7289013f5a5a543f79e1023f3212553f0803013fb3d3583fa26e003f5963583f4e0bfd3edcec583ffeb6fd3e9467593f1bf8013f326a593fcd33023f8a48553ffe00013f7ab2543f4513ff3e5023543f27dbff3e68aa533f379e003faee6543f8274fe3e1776543f1979fb3e872d543f6ae0fb3e1bc1533fb9aef83ee4b1533f2f4ffc3e632f533ff7a2f83e4a16533f211cf53e564a533fc4a9f53e49e4533f8da8f83e3928543f141df63ebb56543fbffcf23edd46543fcd00f23eceb6533f6024ef3e0059543fa41ff13e88c5543f1ef1f33e7ca9543f1d74f23ec019553ffc6bf83e6956523f4dadfc3ea873523f3028fd3edc85513fb94bf83e1369513ffa83f83e2845503f8d06f43e35a1513f04eaf33e2e83503f9eb3f33e10104f3ff248f93e45f14e3f4dfefe3e93074f3fedecfd3ef85d503f78d9013f7dd7503fa318013fec0a523f53b4043f17cc513f25a4023fa16e4f3fb9e0053f565d503f9673003fc4f9523fa150073f2556533f4802093faf0a523fbde8093fb0cc4f3f9fe30c3f78d2503f1dae0f3f9ee2503fc105123f1f504e3f2753123fa9574c3f461e123f2b80503fe0cc123f5ea4523f8459103f9589533f0d0a143f172e503f6da0143f8ff6513f08ca153fa391533fc941143f4179543fdd32163f52fb553f6c61173fc5f2543f583c183fcd30543f04eb163f28e4523f43ff153fcc6f513f588d153fd9e44f3fb287153f7e554e3f4cf1133fc65b4e3fea40143f31a34c3f75e9143f660d4b3f7584163f0c714b3fb0e0153ff8d34c3fbcdb153f83a3493f0830173f166d483f5b8d183f2741493ff95e173f8c3d4a3fa2fe183fad71473f84551b3fd8c2463fa8421e3f2372463fde8c213fe895463f0062213f2e36483f02b21e3fdbf3473fc2391c3f8e10483fc6fa243f6f44473f5d19283f3676483f9a752a3f9e234a3f0a87263f22ea493f7a6b283f0e4c4b3fe5b9293f82e94c3f000c2c3f67204c3f7a16243f35e0483f1fd92c3f3c404e3f0feb2c3fd577503f06502c3ffbbb523f477e2a3ffa6f503f76022a3ffb35523fd0e8283fdbc9533f36e32a3fb1b1543f71682a3f00a64e3fec7f283f18fe553f8ea9253f03ce563f8de3223f4b4e573fcef7243ff4d9553fdba1223f3468563f6e40203f2ba3563f3639203f627c573fb7b51d3fbc55573fe3f01d3faa85563f1fc91b3f8910563f95601b3f26db563f6141193f640d563fda55183ffc26573fe209173f688e583f4d95143f2e4d573fcc99123fb0ec583fc44b153f3d3e5a3fda09133f17315c3f5c51103f2fde5a3fc0a40d3fd2d65c3f2b47103f2f2f5e3fcd060d3fb600603fab7c0a3fac8b5e3fca19083f30085d3fc51c0b3f54725b3f7f11073ffefa5f3fa1ca043f933f5e3fbf6b013ff03f5f3f6f9b033f0423613fc21b003f8c10623fd92afc3e7401603f21c0f53e427c603f0d27f93e61d0623f2be4fc3efafc643f6b48023f28fd633ff5f2053f1be3623f2e82093fec96613f61d0403f455f303f9fb54e3f21e92c3f0d4f413f21e92c3f29164e3f564e303ff0ee5b3f21e92c3fafe85a3f0344303fb651403f6ad5333f123e473f90c3333f765f4d3f2eb5333f89ac533f32a9333fc203533f2b79373f7af44c3fb174373fdca44c3fbde83a3fbc78523fecfb3a3f2f1f583f371a3b3f45f0583fe384373f999f463fbb7e373f3076463fd1eb3a3f56d83f3f3ef43a3fb5f33f3f1888373f1029523f46e43d3f0d8c4c3fdfc53d3f2590573f380e3e3f2d83463f85be3d3fe2f33f3f8ec73d3f8fc3383f4dda3d3ffab6383f13f13a3f6ef2303fbaa03d3f66df383f8681373fecc3313ff3ac333f5a072a3f9054333ff11d223f85d9323fe6381a3fae4f323f6022393fd2ce333f5b921a3f1e56323f0256123f71be313ffbf2313f36c8333f22dc383f8fce333f25e4463f75c4333f60ab0a3e765d303f4b7fa63d21e92c3f566fab3df450303f9cb8083e21e92c3f243ff33c21e92c3f8f640a3da161303f1bb8433e9656303fa179413e21e92c3ff673813ebae32f3f0a52803e21e92c3f6577a23e19532f3fffdfa23e21e92c3ff23fbb3ee7e82e3f8520bc3e21e92c3f73d7673ee948333f5af6453e0ac4333f957dd03e88cc2e3fed1cd13e21e92c3f3f44e33eb8d52e3fa240e33e21e92c3fc785f53e21e92c3f8ac5ed3e82b8303f304ae33ebfbd303f2537ae3edf52313fcd0ea23e11bd313fc267c43e2ece303f7d5fba3ea7e8303f9d9bcf3e57b9303f4222da3eabb9303fd626ae3e59e6333fcd29a13eabc6313f6592a13e9581343fe832a23e7404373fca31ae3e9e49363faf20b93ed8cb353f6695b93ee677333f3805ba3e1ffc303fa77dc43e2b3d333fdd1ec53e4ecc303f3ffece3eea28333fc15bce3e2b77353fbbd1c33ebf8b353f4210c33ebc95373fa7a2b83e28d0373fe7aecd3ec582373fdb6ccd3e2693393f6f19c23e4d71393f5acdc03e9f343b3f2437b83ede9d393f57fab73efb4d3b3f09d1af3e0f9f3b3f9ef8ae3e600a3a3f0b79b73ed1ed3c3f14c1af3e9e243d3f048ead3e3db53e3fe496a93e285c3d3fdf37a53e0f923e3fb73fb63ea98a3e3fc874be3e97943e3f9931b53e1743403fa4a9bd3efc4e403f0b0cbd3ea02c423fd431b53e9e35423ff41bc53e4587403fdcffc33ee954423ff504c33e8c2b443f8aa5bc3e161a443fcd7fbc3efe03463f59aeb53e4341443f5115b63efc44463f977caf3ec3b8463f2883b63e3a4e483faa71b03ef2ce483f0f2fb13ed6ec4a3f6814b73e816a4a3f73e9b73e89854c3f08e8b13edd334d3f015eac3e5ad84d3f7fb1ab3efd784b3f0cadaa3e4565493f2d68bd3e45124a3f5379be3e74174c3f48ccc43ee5db4b3f2884c33e8de5493f3eb7bc3ea0fb473f34acc23e45de473f1395a63e9fee4b3fc534a73e03294e3f069da23e7f464e3f6e04a23e7e4e4c3f04b6a03e90844a3fd25fa53ec2f8493f638ca33e2916483f9628a93eb356473f74f6a63e1a46453f1be8a03e8245463f54c79e3e45df483f1c059c3e0863473f30409d3e8185443f1be9a33e402c433fe13b983e4614463fc810933e850f453f0fcc973e2405433f8ec28f3e7df3413fdfcd9f3e91c3403f3a8d953e907d3f3f468a893e21293e3f315a853e8e9f413fdff0833ec665443f6f298c3e5171443f825aac3ee678423f9d2bae3ea19f443fdc9eab3e3a71403f59159e3ef09e3d3fbf77a73e7c553c3f6df4a43e45d43a3f04c1983e0e193c3f37d5953ea43d3a3f3d43a33e4c17393f2752943ec8fb373f1a0b853eb005393fa78c863e5b873b3f0938933e9242353f5752923eb24d323faf91823ee1d6323fa6c0833e3a0c363fd0996b3e6dbc3c3fb0b2693e48f8393f3259493e44a73a3f45e4493e0e963d3f0ba3493e4120413f28036e3ece683f3f0892713e6d58423f695f5a3ecd19443f5e5e4b3e7adf463fbcd1393eeb64453fdc91233e76ce443ffc53313e1b46493f682c1e3ea703493f3af71a3e30ea4c3f31ee083eba1c493f5744073ed7384d3ffd6a063e5c10513f49ae193e088f503f900d1a3e21ff533fe0d9063e64a1543f7d9b083e5b17583f0dca1b3e205b573f59692e3e74ca563f8a512c3e878b533fc5023f3e9859533f52bb413e5971563f4c6d563e2f31563fbbc44f3eab24533fdd862b3e5843503f814d3d3e6d47503f574e4d3ecd64503f7e393e3ef1364d3f22bb4d3e5eba4d3f82e12c3e3ade4c3f05a1423e41194a3fe37e513ea9244b3fa7d9433eb392593f55f6303ec5135a3f91971e3e8fc35a3f60b90b3ea09d5b3f55b3343ed56f5d3f9afb223e683b5e3feaac103e64335f3f677b293e8fc5613f00ef173ec7d7623f2e5b3a3e05e7603f4641423e1d56643fe828323eb734653f398c213ec452663f9097463ea0cb5c3f8a2f4b3e272a603fef08583e1b675c3f6d08563e3b62593f96fa5b3e80a35f3f4419633e9af8623fa974523e5492633f8e49663e2fa4593f3311673e1970573fdac1743e731e583f8318753e98085a3face0773ef06d5c3fe367683e945a5c3f57bf6c3e98675f3f7a3a7d3e90435f3fff04833ea141623fc085743e3498623f0978813e6b3f5a3f60c3803e0786583fcab3863ed5a2583f0be9873e203d5a3f19e08d3e2df6593f0b3a8a3e483b5c3f3a99903ecbd35b3f7abe943e88085e3f65088e3e249f5e3fe551933e8d21613fd9379a3ee753603fe780963e8a285b3f63db9a3e5a375d3faf61a03eda555f3fc7358c3ed070583fcb4b913ef5ed573f4268933ee363593f1b94863e6d045f3f6e4f833e12695c3fd47a8b3e6ec5613fe1eca03e8675623f36fda63e9949613f5231ae3e1605633fd852a83e9761643fc1a3a13e4ba1653f17149a3e707b633f40dfaf3e620c663fbd81b53ee37a643f6822bd3e1fc9653f87c4b73e259a673f5654b13e505d693f6e55a93ea987673ff483a13ec0e8683facdf993eeec5663fa730913e92c9673fef9f983e2a276a3f23de8e3e793a6b3f34c1873e52a6683f47407c3eae61693f4fd3843e77176c3f05218b3e7bdc6e3f1fc7953e35dd6d3f360aa03e21906c3f6752a93e650a6b3f5c78803e52b9653fdea06e3eb347663fa699893e5b20653f3f38923e0b60643fff739c3edaf5703f40c0903e2e24723f829a953ebcaa753ff8b3a23e334c743f3956a83e0ba8773fda98993e502c793f5b299d3e6cab7c3fbda9ad3ea3067b3f7effae3e4a61723fc317b63eb279753fde05bd3e679b783f231ac23eb4b5723f646bca3ed67b753fffc8b93e6c00703fdaabc23e2f686d3f04e5cb3e3ba86f3fdbffd23e669d6c3f6a43c93e22d76a3f7735c03e392f693f6217ce3ea552683fa247c53ef30d673fadcbb93e04516b3fc0b7d73e82a0693f8913dd3eda726e3f904ad53eb9fc713fdc77b13ed06c6d3f8992a73e745b6f3fd259da3ecebc663fcf46e33e4428673f3ad8db3eb0ee633f0225dd3e8232613f9680d43ec667633fcdfcd63e2dd2603fe643d93e61135e3f9557de3e3cd95e3f9887df3edc335d3f3741e33ede625d3f4442e33e8c365c3f44f1e53e6d115c3fd52be53e103f5b3f22b4e63ef7e25a3fa57de73eb72c5a3f2bd2e53e61795a3fb4ffe53eb6ee593f549ce43e4ee5593fc229e63e9b31593fc1ace43ed830593f5d44e33e1638593ffe45e33eb5ed593fe045e33e559f5a3f89b6e43eae935a3fa6cfe73e0e51593f3f44e33e80565b3f59b7e43e3c73583fdf41e63ed575583f9353e63ecdc0573facc0e43eccb9573ffc40e33efb74583fd73de33e49b6573fa9f1e73ed984583fcd00e83ef6c7573f89f7e93eaac9573ff1e5e93ef89d583fb23dec3eecbe583f05d2ee3eb4fc583f8d7bf13e5b6c593fd470f13e78955a3f77b9f43efcc4593fd5f8f43e6a1c593fda01f23e838d583f4d5aef3e46b4573fa20af93eb2bd593f8eddf83e6033593f80e8f83ed07b583f3d92f53ecc56583fcd38f63ea0a3573f0d0af93e9aca573f1e0afc3eb6b4573fc678fc3e714e583f0b08f33ee8ca573fa819f43e7535573fc4b4f23ef7ab563f8e63f13ecf14573fc0b0ff3e2de3573f7c39013fa24c573f3651023f7f9d563f5dc3023f8aea553f0430023f1beb553ffca5013f1d79563f168e003fa2fe563f70b9013ffe63553fdbb5fe3e476c573f6422fe3ed217573fae23003f72c8563f6ebfff3e7ca0563f84c9fd3ee9da563ffca1fb3e04fc563fb4c9fb3e1e48573fcf2a013f0560563faacf003f084d563f5e45013f1eee553ffeb0013f7bec553fc340013fbd7b553f4f37003f3e12553f94aaff3e5f39553fb3d1003f3c91553f647efd3ea8aa563fe84eff3e277d563f40ecfe3e025e563f7a3afd3e4282563f27f7fc3ed55c563f6f8dfe3e8e42563f661bfe3ec924563f72b0fc3e5435563fe816fb3e353d563f0634fb3eb66a563fea34f93ea66b563f1d5afb3e5696563f4335f93e4999563f4f37f73eaa85563f005cf73e695a563f4aa3f73e5f2f563f0a4bf93ecb3c563fbf33f93eb5c8563ff20ff73e41b3563fb8dff63e67ea563f932df93e8603573fc27dfb3ec6c3563f7e0bf63ecb31563f1276f63e5710563f51cbf53e1656563fcfddf43e651f563f6530f53e9102563f9bb7f43e83dd553f2bb0f53e85eb553fb83ef53ec5cc553f46def43ed0aa553fc870f43e99c1553f3910f43e48d5553f965bf43e8bf6553f76ecf33ea90f563f7495f33e1fe9553f8940f33e29f9553fda6df33ef220563fd97bf43e903e563f0009f43e1d5d563f232ff63e8ecc553ff299f63ebbdd553f49aff73ee0d6553f87f6f53e9fbc553f5c1bf73e9bce553fd244f73e93d2553f49aff73ee0d6553faf37f33e8ac3553f31c7f33e71b5553fb39ff33e5d96553f0cf0f23e0b9d553faadbf23e9f73553ff491f33eb079553f41a9f33e7560553fff06f33e5f4f553fa4e7f13e9266553f8710f23e1bbe553fe7cff23ef3e3553f032bf43ecead553f1e32f43e0698553f9e7ef33e5938553f02f1f33ec54b553f7b48f43e7756553f223cf43e9e67553f4698f43e5540553fb7dbf43e4e55553f24e2f53e2861553fc516f53e7671553fb23df63e3483553f4781f73eb292553f593ff73e556c553f0514f73ea33f553f88a9f53eb93f553f90d6f83e0f69553f4af7f83e4493553f7439f93ed6b5553f8ef8f73eb8b4553f0f8cfa3e4493553ffb93fa3ed0b5553fa8a2fa3e95d4553f468cf93e95d4553ff2eaf83e95d4553f6bc7f83ed035553f81a6fa3e0e36553fa891fa3e3669553f7d5afc3e9e7e553fa92bfc3e03a1553f1abefd3e68b7553f021ffe3ed7a0553f327cfe3ed083553fcb93fc3e3754553ff0ccff3e7dc7553f092bff3e66d1553f5528fe3eacd4553f332dfd3e99c7553f1fe4ff3ebfed553f13a0fe3e03e3553f452cfd3e35d8553fd903fd3e9bd4553f321ffc3e95d4553f4d26003f7ab8553f659e003f95f0553f4a56003f21f1553f0203003f681c563f245bff3e3b0b563f6e42003f9d2a563f6b84003f073b563ff8eb003f89ef553f1c74003feda5553f4402ff3e4960553fa5eefc3ea520553fbb61fd3e84e9543f3fccfa3e34f8543fd1fcfa3ee8b6543f60baf83e1ef8543f3db0f83eb6b6543fb8a9f83e4b78543fcfa7f63e1bd3543f2c6cf63eba9e543fee31fb3e6379543fa6e0f63eab0a553f8e66f53e0e1a553f8c0ff53e43f6543f6e47f43e8c28553f5c37f43e0612553f9c85f33ef214553f7c9af43e5ada543f158af03e2f4c553f4fc7ee3e0841553fbca3ec3eae61553f659cec3ee98a543fdb56ec3e5cb4533f0293ee3e4d73533fb330ee3eec96523f1ffceb3e31d6523ff3f6e93e21f3523f534cea3e8fd6533fb533e83eadef533f5cf2e73e3008533f3819e63e4f16533f4941e63e2d00543f745fe63e87e0543fe959e83e7cd0543f3454e83e72a5553ff473e63e49af553f6f79e63e756c563fe637e83e356a563fef32ea3eab59563fd765ea3ee08d553fe67cea3ed6b4543f1bcae43e4cb2553fa7d3e43e6d6a563f7d3de33e5568563f893ee33e0fb2553fd23fe33eeee8543f19b9e43ea4e7543f41a9e43e9408543f3741e33ebd0a543f7f42e33e1d21533f1697e43e7e1e533fdd7ee43ec032523fc743e33ea735523ff244e33e7768513fed60e43e7965513f663de43ec4d6503f43abe53ebf5d513f0565e53e3cce503fc345e33e9bd9503fec46e33e876c503f4f17e43e2c6a503f3014e53ea361503f44f2e33e4003503fe848e33eab04503fa74ae33ecba94f3f0dd3e33e18a94f3fe7bee33ed8624f3f5a4be33ec2634f3f784be33e76284f3fa6b4e33ed9264f3f99b3e33e66eb4e3f964be33ec2ed4e3fd14be33e799f4e3f8bb9e33edb9c4e3fd944e43e93974e3f4925e43e63e84e3fa8aae43eb7e84e3fa928e43eb9224f3f94b2e43eca1c4f3f4dcee43e53b64e3ffb74e53ee2bf4e3f0460e53e05e94e3fe761e63eece54e3f5c6ce53ee4154f3fff6fe63ed20e4f3f697be63e3e3e4f3fce86e53e964d4f3fb0a2e73e5cfd4e3f0c9ce73ee52c4f3fc79fe73eb5564f3f12d2e63e61714f3f11e8e53e628e4f3f23c2e73e57a54f3f84c8e63e99d64f3f7a50e83e4b25503ff041e93e4bc04f3f2e7fe83eb8644f3fb7d9e93e556b4f3f93d9e83efb1b4f3fd52bea3ee3034f3f8e2fea3e37a04e3fc4e9e83e4dd74e3f8e8aeb3e04dd4e3f676aeb3e82554f3fd277ec3ebb244f3f5cbdec3eecb84e3fa58bed3e19a94e3f4ffdec3ed04f4f3f5060ed3ecb8d4f3f304cee3efbcd4e3f0352ee3e33bc4d3f3530ed3e17fa4d3f5e64ec3ec61d4e3f495eeb3ec15b4e3f38c8e83edba24e3f0adce93ea6564e3fee65e93ee5264e3fd291e83ea7794e3f347be73e15aa4e3f968fe73ebdd24e3f6565e63ea3be4e3fa18ee63e1a944e3f1d7ee73e60804e3f1587e73e45544e3f81cae63ea6674e3fc905e73eab3a4e3f9a2de63ea6624e3ff4b4e63eae2c4e3f6f5ee73e06e34d3fde84e73e74244e3f65fae73e051a4e3f4a34e83ea8374e3f7f25e83e2ff64d3fe49ce83e60054e3fcf53e63ee3244e3fd064e63e71004e3f3742e63e31e14d3f2a8ee63e66c24d3f39b1e63e60a04d3f1224e73e759a4d3ff094e73e34904d3f5cf2e73e56ad4d3f554de83e3b814d3f79a0e73e7a614d3fcadce63ee3654d3f7940e63e3f804d3f7ee0e53e49b14d3f629fe53ecae94d3fe0a2e53e97204e3f53c2e53ec84c4e3f2044e83e87cd4d3fadabe83e6ebf4d3f1536e53ecf7f4e3fa3f2e43efa514e3f40bee53e68934e3f911ae93ecba74d3fa401e93eb3104e3f9463e83ebc564e3ff9b3e93e49ab4d3fe0dae93e8ee94c3f94a9e83efe494d3f4c9bea3e91ee4d3f1749eb3e169a4d3fe8a9e73e38254d3f63c0e73efdc24c3f2cf3e73e3c224c3f7ffde53eacdb4c3f1e2fe63ed82d4c3fcdade43e95274c3fec47e63e5a8d4b3fe2b6e43e11874b3f03bce43e2c0b4b3fc04ce33ece7b4b3f844ce33e99fd4a3f494ce33e43a24a3f13bbe43e79b04a3f39b2e43e84734a3f0d4ce33eaf664a3fd14be33e84304a3f63a2e43e363b4a3fb88ce43e75ee493f0f1de63edd354a3ff7f1e53e73e7493f3ea0e73e19ae493f06c3e53ea88b493fc05be73ed558493fa41ee93ea20a493f1586e93ef753493fa891eb3e99ea483f6bebe93ec799493f4639ec3e5a21493fd70aee3e4ba7483f8528ed3ea485483fc9ebea3e81b1483ffc4fec3ee85f483fdfafed3eb038483f67a0ee3e2241483f47f7ed3ec5d8473f5518ed3e43ec473f62d8ec3e6e28483f8b41ec3e2df2473fc015e73eb203493f02aee83ee0c7483fc948e83ecc86483ffce0e63ea5ad483fc677e53e12c2483f2095e53e2428493fe65de43eb52d493fba74e43ec692493f5a4be33e6b8b493f014be33ecc28493fa74ae33ee6c2483fbc50e43e74c5483f964be33e60e5493f4c2cea3e367c483f605beb3eb139483fe805ec3e6419483f8b41ec3e2df2473f3b3eea3ecd07483f9851eb3e25f5473f6a03ea3ea5c3473f09b0ea3e7cab473f8652eb3eda88473f66c7e83e256a473fa928e93ee62f473ff364e73ee502473f2e2be73ed343473f96c5e53e172f473f9ae7e53eb6ef463f9190e43e41e4463f9a2de63ed896463fdbb3e43e1f8a463f194de33e6986463f844ce33e64e0463fb980e43e7422473ffa72e43ef358473f0d4ce33e221e473f964be33eef54473f18aae53e4164473f5797e53e5095473f3169e43e0b8d473f1e4be33efd89473fd8fbe43ed8ff453f084ee33ecefa453fd84ee33ec45f453f1e4ae53ed565453f4780e53e7fdc443f5949e73edc82453fe7b5e73e4cf8443f8b4fe33e85d7443f0350e33e5851443f83a9e53e6d55443fae0ce83e266d443f12b5e63e2015463f21f6e93efb37453fc851e93ee3c1453fb586eb3ec327463fe95cec3ec9a1453fe383ea3e47a4443f5330ed3eb507453f0e86e83efd40463f22cee73e54ae463fd0b7e93e34e7463f6193ea3eb291463f1ed1e53e34c2433fd95fe83e13d9433f6997e83ee939433f7dece53e0f28433f5c50e33ea8bc433fd350e33e6822433f62f1e53e318c423f5e9be83e6a8d423f3b80e83e10df413f2de8e53ea8f1413f09d9e53e825b413fd85ae83e613a413f9750e33e17f7413f7f4ee33ed263413f664ce33e10cd403fdbcde53e7dc5403f6031e83eea9b403f0f51e33e958b423f4859eb3ec48e423f7319eb3e15bd413f1cf6ed3e2994413f8383ee3e559f423f4172f23e14ce423f7d58f13ebf6c413f0784f03ed134403f2097f53e4136413f9490f43e03bf3f3f0b72f33e0f653e3f7386ef3eb3153f3fdaa3ec3e4fb73f3f916aed3e1e9e403f811ef73e6ce3423f3d41f83e19db443ff2e8f23ed813443f30d4f13e0af9443f98b0ee3eb39a433f441bee3e6861443f4e0af53eb2d9453f16c3f23e7677463f4e33f03e3aa4453f5491f63e5a0e473fcf15f43eec7e473fe654f23ef8d8473ff93ef13e70fc463fdf1df03edd64473f48fdf03e4d18483f1a88f03eb1ec483fa169f23e95ca483fb941f43e4fb1483f139ff13e51ca493f51e6ef3e6ab1493fab06ef3e9c584a3fc5e1ef3ef4b64a3f145df33e4e054a3fb923f13e81824b3fa9bdef3eaa38483faf1cef3e54c1483fa8fdec3ea44f493f3a56ea3e0ad2493f779cea3e631a4a3f527ded3e5e94493fb61be83efa364a3f1fe1e73e01fb493f6d3fe63e34714a3fec53e63eb1b14a3f9041e83e937c4a3fff56ed3e6d0e4a3fc894ea3e69904a3f5264ea3e8b2d4b3f190ced3e0ab14a3f7155e63e840f4b3fa943e83e5be64a3fb627e83e40734b3f9a30ea3e3deb4b3f9f1eed3e636f4b3feb5eed3efe264c3fb39ded3e65b54c3f5d53ec3eaa324d3feeeeef3ef4be4c3f32b2f23ebe094d3f5cd8f03e1b464e3f1b56ef3efa474f3f463cf03ed30b503f05dced3e26b3503fe1a8ed3ec003503f374eeb3ecb6d503f9d37eb3eb1f94f3fec47eb3e54a84f3f277deb3e3a0f513f8642e93e443b513f7cdce83eefa2503fb8e9e63e01c0503f6067e63e8851503f12b8e53e22f14f3fc0b8e43e45fd4f3f3169e43ea5a54f3f3b3ce43e4f5f4f3f99cde43e69584f3f981ae53e459e4f3fd34ee73e9352513f88a6e73e381f523f5de7e53efb2a523f799fe93eaf0a523f4db5eb3e98e8513f7ffeed3e8a9d513f6b91f03e330e513f83c3f03ee01a523f9b40f13e9bfd523f877ef43ecb8b523fa337f63efe594d3f0422f83e3fbb4b3f7f87f43e229e4b3f3cfcf53e950e4a3f507cf93e5cfd493fc3c3f63ec37d483f7e26fa3e143e483fc100fa3e2b9b463f829dfe3e2d39463f43e3fd3e8c79443fec80fc3ebca7423f5853013fb457423fb4c5003fb689403f3957003f18d33e3fd784ff3e88253d3f9797033f85ea3c3f6b9a073fb8f03c3f3b08fb3e2ee0403ffa83fd3eb6723b3f0f38f93e1794393f80f4f83e8383373f9dccf63e71233c3f93dbf83eb0b13d3fb0a2f13ec60f3d3f37f1ed3ecafe3d3fd064eb3ee2d93e3fd6a9e93e708a3f3f0674e93e16293e3fe560e83e27fe3e3f4115e63e46b83e3f4d98e63e25c83d3ff449e33e93ab3d3fa74ae33edba63e3f3c4be33ebf7a3f3f6fe6e53e77803f3f2786e73e83813f3f6a55ea3ea23d403f5b0ae83e4900403f89d0e53e532b403f784be33e182e403f13abe73e67a53c3f2d6feb3e121f3d3f0b7eee3ee9ff3b3fc25fe93e2e763b3fa3c8eb3e89603a3f2dccf23e72eb3a3f3448e33eb7523b3f8247e33e3d463a3fbd47e33e7816393fcfc1ed3e4823393f0549e33e01823c3f4dceda3e09603a3f3ed5d83ede22393fa4d6d33e82ea3a3f8b24d83ef9fe3b3ffe37dd3ea8753b3f7fedde3e03a53c3fd232db3e541e3d3fb2b3d83ee5fd3d3f4703d53e9e0e3d3f5733d33ecb633e3fe21dd73eb2143f3f9b1fd63eba33403faaffd93e91b63f3f4038d93e4f9d403fe4abd83e4a93413f374ad53e926b413fbd0cd13eba34413f1914d23ea3bd3f3f842fd43ebacc423f8e1dd83e549e423f6eefd73ea199433fc6b7d33e5c12443f40cbd43e9af7443f9783d83e5660443f5e6dd93ea906453f9e6ad63eeba2453ff3dad33edf75463f4195d13ee8d7453f2f60ce3e0cd9443fa50dd03e580c473fbc9fcc3ecf98463fb778cc3e973b483f2adacf3eaa7b483fe087d23e277d473fbe47d43e65d7473f095bd23e7faf483f5032d43efdc8483fad12d63e5ceb483f6d9ed53ee216483f045ed53efffa463f2f7ed63e9363473ff0fbd43edac8493f853ed33e9a034a3f3e76d53e11814b3f14b8d63ec6b54a3ff292d73e95574a3fe2b3d63e3cb0493f3cddd63e7237483f657dd73e2cc0483fe99ad93ee64e493f991bd93e8f93493fd1fadb3e0a1a4a3fd340dc3ec2d1493f6c8ed83e4fa6483f985eda3eb820493fa105db3e13ea483f0c70d93ed584483f0048da3e515f483f08abdb3e1db1483fe476dd3e810a493fec0fdd3ec453493f0dabdc3e8a99493f65e9d83edc37483f2fc0d93ec627483fe956da3e9bf1473fef80d93e7feb473fcfa2d83ed0d7473faef9d73e1640483f11f5de3e13ae493fa7b4de3ef6fa493fb678e03ee3354a3f75a3e03e7ee7493feed1e03eb48b493f3439df3ed558493fbe7edf3eb703493f3effe03e3528493f3f1ce13e28c2483f0bb3df3eaaad483ff04bde3ebb86483f10e7dd3ecac7483f6937e23ec52d493f2921e23ed192493fdf43e23e85c5483fc009e23e80ee493f8df4e13e3b3b4a3f0fe5e13e84734a3fb356e03e34714a3f697ade3ee9364a3f8c42e03eacb14a3fe754de3e777c4a3f8edce13e73b04a3ff9dbe13e210b4b3f4441e03e6d0f4b3f024fe03e338d4b3f73e1e13e00874b3f0a53de3e28e64a3f1d6fde3efd724b3f1433dc3e162d4b3fbd02dc3e05904a3feb41d93eaa0d4a3f958cd93e4cb04a3f00ebe13e79274c3fd267e03ea12d4c3f7099e03e69db4c3f980de23e22c64c3f8c5ee23e763c4d3fb686e13e65464d3f194de33e61c24c3fde4ce33e4e3b4d3f043ae43e923c4d3f664ce33eeea84d3f5de8e33e5ca84d3f8788e43e24a84d3f3b10e53e97464d3f538be43e3ec64c3ffb4ce33ef71f4c3f41c4e33e77274e3f0d4ce33e6d294e3f604be43e4a1c4e3f3cb9e53ebb5f4d3f5a32e53ed3a94d3f358ae63ebd2f4d3fc7f0e43e9a024e3f6394243fd76a4d3fe766243f63d94b3ff68d233f0e7a4c3f17a9253f6fe64c3fef85263f92104e3f9a40253fb06c4e3f9f19243f85bb4e3f4f94233f82d94d3f62bf223f75fd4c3fb399223f244a4e3f50ed213f127a4d3f87f8203f9c984c3fe941213fb1e14d3fd288203ffe054d3f27a01f3fe63b4c3f04d11f3f51cd4b3f468c1e3fb43f4b3fb4841e3f66aa4b3f1e531d3faf4b4b3f233f1d3faae74a3f1b311d3fa9874a3f7ba01e3f06d44a3ff417203fc1584b3fc086213f8f1c4c3f2efe1b3f16bd4a3fd2271c3fe7194b3f1f191b3f33184b3f15ee1a3fb1b64a3f60171b3f717c4a3f98da1b3f0e6d4a3f22c31e3f05694a3f3076203f2ce44a3f7c221d3f9a2a4a3f0c021d3f99b3493f43df1e3fefdd493fedd6203f204c4a3fd01e223f849b4b3f2cbd223f46f84a3fe4b01b3f78294a3f86a41a3faf604a3f26371a3ffe344a3ff26a1b3f11d3493f6c331a3f35cb4a3fc583193f09d24a3f533d1a3fa7494b3f8b30193f29bb4b3fd8a11a3f94bc4b3fbaf7193fc43a4c3ff06b1b3fc6844b3f67631c3fe1834b3fd6aa1b3f23144c3f42831c3fb9134c3f93711d3fb83f4c3f9d731d3fcab44b3fe7871e3f5e124c3f68611e3fbf944c3fb53f1f3fb40f4d3f24841f3f809e4c3f324c203f0a5b4d3f8df91f3f8ead4d3f098b203fe0584e3f59e7203f38264e3fd15c213f4ede4e3f8fce213ffca74e3fe82c223f67614f3f8a07233fff144f3fad40233faee64f3f185b223f7416503f3d64223f23c6503f9d4c233f7db6503f7763243f3eae4f3fb574243f8ba2503ffea0253f737e4f3f0eb8253fda92503f2e88253fab9c513f8f1a273f1a85503fbdd9263f59ba513f5b3e263f8edf523f7c11253f1397523f3bf4233f285e523f4e50243f3989513fe3ff263f01494f3fdf32233f957b513f4ef0223f3a32523fb581223fa6d6523ffd24223fad0e523f15d5213f22a0523f5652213fe026533f80d4213f416c533fab5e233f2f1d533f2c7c223f1bc7533f1cd6203f7cf6533f5939213fc15c543f5cb3213f91e5543f01bb1f3feac8543f93eb1f3f174a553fd119203fc7c8553fe223223f8570553feeee233f7ecc543f603b233f8345543fb7131e3fa15f553f89021e3f71c6553f10211c3fe964553f3f841c3f3d28553fd1181d3f6af6543fd4251e3f6af6543f94951b3feea5543faec21c3f78b5543f19b61c3f9a5c543fb93a1b3f190e543f749d193fb96f533f8fb81a3f9f9f543f412a1e3f31a1543f98971f3f6e63543f4f7f1f3f4d0f543f638b203f00a6533f392d1e3f9254543fa3661b3f2d96533f832a1a3fddcf523fe1c11a3fb86d523fe2bd1b3ff721533f57f61c3fa38b533ffcd81c3fcb02543f0b5b203f865e533fa703213fe5e8523fda70213f0e70523fb1ca203f66c3523fa404213f005d523f0a35213fe0dc513fcab1213ff7ee513f7ed5213f9060513f7753223f736f513ff9df213feec8503f15d5213f2b2c503f875c213f85c3503f0853213f6730503fbb30213ffd984f3f42ac213f09894f3f7352213f5c53513f6ff0203f3ffc4e3faa63203f4a4c513f9876203f8cba503fa64b1f3f84b2503f38301f3fe54b513f5c4d203f33e2513f5140203f857d523f7c211f3f1ff5513f89391f3ffcb1523f16061e3fb0da523f5ed81d3fc60b523fd45c1f3f6059533f5c371e3f3a92533ff83a1e3f3705543fef6f1f3f38c2533fd142203fce04533fedd81c3fc0da523fe6e41b3f4f95523f8cb21c3f1a12523f9cf01b3f02f4513fe5811b3f71c1513fb5361b3f3511523febda1a3f5355513f5d6a1b3f2639513f14581b3f3d8c503fcdb71a3ff995503f7eb31a3f7b07503f61511b3f7405503f91011a3fd3a7503f890a1a3feb07503f0747193fa8f64f3f8421193fbdb3503f136b193f43c0513f5110183f8a8b503f1c94183f8a07523f38361a3f6387513ff3b5183f3fa94f3f4634193fac474f3f9297193f446b4f3f4c281a3f2a944f3f5bb51a3f4f9d4f3fd1a41a3ff24a4f3fe6461b3f009c4f3f40291b3f1b474f3fc8171b3f3ce84e3f29941a3fbff04e3f15321a3f1d394f3f6e441a3f3eef4e3f12a4183f33f54e3fa256193fa4c44e3ff5d4193fdd074e3fe6e9183ff3074e3f2160193fda0e4d3f22331a3fa3204d3f2d691a3f99854c3fd0fc1a3f6f444c3f8f67183f24ef4c3f6bee173f5f204e3f40c4173f5a4f4f3ff2e91a3fa0014d3fffaf1a3fecc84d3f3d9a1b3f0dde4c3f9d591c3f22e24c3ff6631b3f56b24d3fc50f1c3fbcb94d3ff0ae1c3fabdb4d3fd31d1d3f38094d3faddc1d3f994e4d3f1a3d1d3fbd144e3f75d51d3f9e544e3f88951e3f0aaa4d3fbf471f3f5d134e3f61931e3f0c8b4e3f483b1f3f9fb94e3f92da1f3fe58a4e3f3035203ff5104f3fd6441f3f94194f3f7965203f569e4f3f3779203fb62b503fe1571f3faf9e4f3f83591f3f3b25503fae051e3f1824503f4a151e3fa59f4f3f37f91d3ff7af503f5cc51c3f39aa503f40ca1c3f5120503f89bf1c3fdd944f3f94f31b3fea11503fe6e41b3f89a54f3f24f61b3fa898503fbcf51b3fe741513fc2b41c3fb553513f33c11b3f624b4f3f44531c3fb12b4f3f84ad1b3f48e94e3f10cf1b3f18654e3f7d1f1c3f83e14e3f985b1c3f88814e3fee311b3fdc604e3f9d951a3f016f4e3f12161a3fe59b4e3ff5ce193fd3f34e3ff953243f5d7d533f3949253f8deb533f3026263f1f5c543fa873243f0841553f0b25273f82fd543f5671273f253a533fa46a223f2fdd553f0136203fe226563f1c44283fc8e6513f03a0283ff076503f8186283f8bff4e3f19f3273f388f4d3f5fe1263f97344c3f1358253ff9044b3f255e233fac154a3f6e25213f316d493fe8df1e3ffd11493f8bbe1c3fdb05493f73f21a3f8f4a493f8d2c1a3f9183483f3c8a193f26d7493fa394183f9da24a3f50e1173f80a84b3ffd3f173f67e44c3fd4d4163ff73d4e3f0ec4163fea9c4f3f3214173fb5ff503fe2cb173fd164523ff3de183fa2b2533f3a411a3f97cf543f08df193f9744553f06f61b3f11a3553fac001e3f8114563f11df1d3faf52513fdf381e3f3a134f3f454f1d3f7cf64e3ff1c51c3ff4bb4e3f371b4b3fb0dc5d3f8878493f1ad6613fad23443fbb80603fde1c513fe7095f3f265b573f163f603f8b52553f30d3643f1b474f3f684c633fa91a423f3d55643f2b2e473feae7653f6223443fa4cd693f78673f3f91fb673f38a44c3fb0a4673f9a4b523f8b76693f5c5a4e3ff7f86d3fc42b493fc6d56b3fd9f93b3f5b326b3f7a3f403fd3426d3f89d23b3faf49703f493a383f68ff6d3f31d5443fb0a26f3fea92493f402a723fdfec433f66da753f43c83f3fd6f8723f7f91343f9168703f852c373f73e4723fd22c3a3f94c5753fca5f3d3f51d9783fd5e41d3fe4147a3f6a061d3f159d7d3f91ffee3ef8ac473f4401ed3e7e15473f020dec3e0e58473f300bee3e65b9463f1806ef3efe3b463fd20beb3ecc07443fc961eb3e1959433f2101e73e3776473fba31e83e82b6473f4875e83e3994473fc1e5e63ef3a1473f2f58e93e91d6473f5bbae83e88e9473f7efce73e62d9473f5bbae83e88e9473f7bcee73e8afc473f0d23e83e8afc473fe5d7e63eeece473fcbd0e63e8afc473fa18ce53e8afc473f4d8fe53e6dc8473f5965e43e15c4473f6b64e43e96fc473f304ae33e9bfc473fa74ae33e72c2473f602fe23e0ac4473f762ce23ef48c473f9c23e23ed158473fae16e23e4d22473f9dfde03e2495473fadebe03efe63473f1ed1e03ec92e473fe307e23e15e4463fc2e5e13ef389463f09b0e03e63ef463f326be03e7996463f679fe13ea6ff453f03e5df3eb514463f2252df3e6782453fc352e13e9d65453fc31de13e41dc443fbce6de3ed2f7443f0291de3eab6c443f75f5e03e3055443f29a6dc3e3d37453f9219dc3e89a3443f9d3fda3ecda0453fc514db3ed326463f5a49dd3e2bc1453fca13de3e5640463fef06dc3ed290463f55e1dc3e6ae6463f8ccade3ebdad463f9032df3e5f02473f526fdd3e3e2f473fa7cfdd3e9469473f686bdf3e6343473f8794df3edd75473ff420de3ecf93473fd063de3e44b6473f33afdf3eb6a1473f2846db3e1c88473fb98cda3e2e57473f6699d93e7714473f909bd73ed6ab473fa390d83e3db8463fc996d73ec53a463fd5e7db3ef1aa473f8693dc3e46c3473f0b46db3ed1f4473f1e58dc3eb107483fd13ddd3e5fd6473ff791da3ef518483fe93bdb3e5839483fe956da3e9bf1473fd369dc3ef97b483f052add3e064c483f61d3dd3ea522483fc690de3e7142483fd1c3df3e9b55483fa8c5de3e8afc473fe2c2df3e8afc473fd006e13e8afc473f7419e13eb45e483f5371de3e8afc473f2a3ee23e4c60483f602fe23e96fc473f304ae33e9bfc473f4d4ae33e355f483ffa55e43e4160483f397ae53ea95e483ff9cfe63e9555483f9a03e83e7742483fa18ce53e8afc473fcbd0e63e8afc473f7bcee73e8afc473f93c1e83eab22483f0d23e83e8afc473f856be93e224c483f4b01e93e5201483f5bbae83e88e9473f0d23e83e8afc473f93c1e83eab22483f0d23e83e8afc473f6b64e43e96fc473f6ca0fe3e5c00483fbcdcfd3edee8493fd185fc3e41c84b3f09cffa3e01744d3f722f003f4d8e4d3fab66033f7ddf4d3fadbe063f1d914e3ff8c1f43e07de563fdb2bf53e9ca9563f01a0f63e5632573fdc83f33e2878563f8382f53e277d563f4b20f93e5553573fb4e3f23e7922563f4512f23eff32563f27bef03e3171563f1e9ef03ec3da553f32d8ee3ed200563f61e3ee3e97bb563ffe7dec3e9ff0563fee66ec3e3cc0573fc20fea3e3f10573f151ae83e651a573f4a6ae63efe17573f6c8eec3ed530563f5dcde43ee811573f063de33ee40d573f52b3e13eb511573ff7ade13e466a563f43b9e13e2bb2553f1712e03e216c563fbb18e03efbae553fa13bde3ef1a4553f832ee03e3ee0543ff836de3e01d0543f5414dc3e1db4543f582adc3e228d553f325cdc3ee758563f0057de3eaa69563f395ede3e3def533ff64de03efbff533fd545dc3ee7d5533f249cdc3e8af2523f9ea0de3ed707533f3177e03e2e16533f2fdee13e7d08543f40cce13e82e7543f92f2e13e731e533fc70ce23ebb32523f72aae03eda2a523f7be7e03ea45d513f762ce23e6e65513f6351e23eb9d6503f6b2ee13e15ce503fb97fe13e7c61503fe078e23e1b6a503fb5a0e23e2903503ff9dbe13e18fd4f3f3b2ce23e78a54f3f41c2e23efca84f3f74d7e23ec7624f3f8a59e23e275f4f3ff0c7e13e31584f3fd47ae13e079e4f3f97ade03e138e4f3fda0ee13e4d4d4f3f5d1ae03ee53d4f3f6929e13ea1154f3fe425e03e730e4f3f96c3df3efc704f3ffff5de3e3a564f3fd7f9de3e6a2c4f3f51f3de3ee1fc4e3f66d3de3edca44f3fb416de3e21644f3f4abcdc3e9d6a4f3fb753dd3ea3bf4f3ff244de3ec524503fe7ccdf3e34d64f3f6ebcdd3e591b4f3f5bacdd3eabd64e3fea66dc3e799f4e3f686adc3e1f034f3fce0bdb3e1fdc4e3f6a38db3ee75a4e3faf32da3ecb1c4e3f58d9d93edfb74e3f680bd93ef1a74e3f1367d93e06f94d3fbd45d83efaba4d3fdd4ad83eb7cc4e3fa61eda3eaf234f3f2999d93eb34e4f3f2736d93ea88c4f3fb82bdb3e97544f3f05cedd3e3fa24e3f6b06df3e48d24e3ffd33e03e93e54e3fec1adf3e9fa94e3f7e30e03e4abe4e3fe820e13ea5bf4e3fc235e13ec8e84e3f6a04de3e16794e3f8a30dd3e3e264e3f6dbadc3eed554e3f6007e03ebb934e3fa4d7e03e1f934e3f6768e03e53624e3f81cbdf3e41674e3f5590df3e473a4e3f2be1df3e4f2c4e3f0a0fdf3ed5534e3f4111df3efe234e3fce37df3e9ce24d3fd79bde3e8a194e3ff361de3e22374e3f78f9dd3ecf044e3fbe70de3eaff54d3f5042e03e8a244e3faed3e03e804c4e3f3ff3e03e54204e3f4f31e03e1d004e3f0554e03edde04d3fbef6e03e8de94d3fbeb5e03e06b14d3f3008e03e12c24d3f21e5df3e06a04d3fe255e03ef17f4d3f91b9df3e89654d3f4872df3e119a4d3f6901df3ec98f4d3ffff5de3e0a614d3f2349de3ec0804d3fffa3de3ee1ac4d3f5752de3e06cd4d3fadeadd3ee8be4d3f057cdd3e34a74d3f01eddd3e78494d3f0fbcdc3ef1e84c3fbbe2dc3ea1aa4d3fd494dd3e17104e3fa832de3e30564e3fe417df3eeb7f4e3f85fbdb3eceed4d3ff74ddb3e42994d3f8e6eda3ec7874d3f2744da3eba314d3f67fad83e53b44c3f6b39d93e03264c3ff279d93e896e4b3fae66dc3eb7ea4b3f87a3de3ee3214c3f33d6de3e99c24c3faeecde3ece244d3f450ce03e692f4d3f1edde03e7d5f4d3fe263e13e9ba94d3f0f0ee23efda74d3f9eafe23e4ca84d3f25d3e23e6b274e3f194be23e2e1c4e3f4551e23e77974e3f65dde23eca9c4e3f1ae3e23e5beb4e3fb870e23e47e84e3f1eebe13e8ae84e3f396de23e98224f3f32e3e13e9d1c4f3f97c7e13e26b64e3fd2e1e23ec8264f3fec5fe13e977f4e3f5da3e13ecd514e3f58a5e13e6e024e3f5528fe3eacd4553f321ffc3e95d4553fd903fd3e9bd4553f7dfcfb3e95d4553fc260fb3e95d4553fe45cfa3e95d4553f0623fb3e95d4553f82b6fc3e95d4553f08affb3e95d4553fa8a2fa3e95d4553f1063fa3e95d4553f70b6f93e95d4553f468cf93e95d4553fc370f83e95d4553fe03df93e95d4553ff380f83e95d4553ff2eaf83e95d4553fee65f83e95d4553f5104f83e95d4553f6d51f83e95d4553fc23bf83e95d4553f49b1f83e95d4553fdbd0f83e95d4553f2763f93e95d4553fdaf6f93e95d4553f4495fa3e95d4553fb764fb3e95d4553f6a1ffb3e95d4553f9111fc3e95d4553f9d03fd3e95d4553f4f87fb3e95d4553f3a16fc3e95d4553f0068fc3e95d4553f6bd4fb3e95d4553fd8e3fd3e6bb4543f4f36f43e0e7f553faef0f43edf8c553f5de9f53e52ac553fe8fbf63e86ca553f4d3ef73e5dc8553f822df63ea7a3553febe8f63e8daa553f7cb8f73e16ca553f5104f83e95d4553fee65f83e95d4553ff380f83e95d4553fc23bf83e95d4553f49b1f83e95d4553f993df73ebef1553f5332f83e7502563f3b90f93ebf09563ff5d7f83e10e0553f1ad8f93ee0e1553f6339fb3e95d4553f0e0efb3e450a563f981df83edfdb553fc262fc3ebc06563f9111fc3e95d4553f0068fc3e95d4553fdb7efd3ec5fe553fd852fe3ef5f1553f3028fd3ef0db553f3a16fc3e95d4553f3028fd3ef0db553fdbd0f83e95d4553f2763f93e95d4553fdaf6f93e95d4553f49aff73ee0d6553f7dfcfb3e95d4553f6bd4fb3e95d4553f7ef0fb3e83bc553f08affb3e95d4553f884d2a3ef479373f9b2d483e0745373ffce72a3e57e63a3f3a710e3e0fe73a3f5b0c0e3e9b7f373f1eb2463e0ba9333f3f4a293eeaca333f6ed7e63d7575373f440de83d03db3a3f67a5b63d73d03a3ff84ab43dbe6a373fb0e5833dbc6e373fce00883daad53a3fd179353dbde23a3f8927293d107a373f4fb02a3e72cd3d3feafd0d3e0fb83d3fa4ca0c3e69bc403f4498283eebdf403f55f00a3ef1bd443f877ce43d4bd5443f2a30e63da8b8403f73bae23d265c493fd2dbb23d7aa5493ffbe7b43dcf00453fc4bbb63dd2cc403fa114893dda2c453f75f58a3d07f1403f4b29863d47dc493f171a363dcd094a3f47433e3d2d59453f760b423d491d413f1925e13d2aa84d3f62c8e03d3bad513f76c8b13d9746523fe58bb13dfd174e3f2c86833d32684e3f0869823d45bd523f27b4253da922533f77932c3d99a84e3f10b2e23d535f553fdf37e73d25f3583fb4ceb93d88dc593f4362b43d651f563f0511843d1ec8563fea32893d88c15a3f17fc2d3d54a45b3f097f253d2a65573f69b1ee3d7e9d5c3f0609fa3dcf5c603f1678cf3d2baf613f2284c23d11b85d3f7e83923d50e25e3fe818a13de421633fb1a5613dd5a4643f4633413d6514603f0115053ea32f643fcecc0f3ecfd4673fa8c9f93d5ea3693ff8a1e13dfebe653f400ab63db077673fcd9ed13dfca66b3f9045a83d1dc56d3fb2ea883d0645693f506e1d3e230b6b3f17922d3e496c693f10163d3e875b683f25473a3e4f226c3f98c7483efb2a6b3f2669583e81946a3f7ab94c3ed799673f233b5d3e37e8663fe9b9693e41016a3f9c28763ed9b26c3fb0af803ebe786f3f7c9b6d3ef9cf6f3fe2f5633e76286d3fb9c2533e18946d3f25ab5b3e1e00703f5ad04e3e2e21703fa0f2453ecf726e3f43255e3e46d8723f84eb4a3e3503723fa294733e4c05733f6192763e1180763f96df5c3e63f8753f7c0f453ebfbc743fec87593e2e3c793fab773d3ea1c4773fd244773ed8f7793f82d1763e296e7d3f6327553ed8917c3f9c01353ebcf37a3f4b1b853ea1ce723f3167883e7166763f1ba38a3e15f2793f17578c3ea2777d3f857b243ebe96753fcc7b303e7cba723fc1e93a3eb841703f4c582c3e3bd86d3f28f91d3e1b1f703faf5c0c3e12186d3fda1df43d22736f3f61270e3e53c9723fcd38fb3d37a5753fe846ce3d43f5713f33b2173ec9a4783f000bfa3e623f3f3f6dc9ea3e46f8403f3c970d3f8e56593f59d70f3f483b573f422b123f04a7553f4d247b3ee45b4d3f0add7b3e23cb4b3f00d5763e60d74c3fc93d7f3ec86b4c3fa63a813e35ef4c3fd4217f3eabca4d3fa70b7d3e22ac4e3fbd72783e1b5d4e3feb60733ec5004e3f9d84813e693b4e3f83dd823ed86b4d3ff6c6843e098b4c3f4333843e82d34d3f8ea5853e5ff84c3f90ab833e020f4c3f7588863eec4b4b3fa215873e66c04b3f4e9e893e59334b3fc676873ed92e4c3ffcac893ee59d4b3f7976893ecdc74a3f10548c3ef67b4a3fa4378c3ed0db4a3f750f8c3ea83f4b3f84b88e3ea6b14a3f1e658e3e4b0e4b3febff8e3ec0614a3f8b85903e56714a3fa9d7903e8fab4a3f7781903ee00c4b3fa231893ee25c4a3fcfcc853e68d74a3f440c853e773f4a3ff4f9883efad1493fc2b28c3e3aa8493fa6718c3e031f4a3f7c7c823efc8d4b3f2c41813edaea4a3f51538f3e511e4a3f53df8f3e17c8493f6845923e3b2a4a3fe46a913eba554a3f484c923e40c04a3f00ab933e41c74a3f2b50943e2fb04b3f0338923e803e4b3ff86e913e2ab14b3f0ac2923e5f2f4c3f41df913ef8794c3fcbb8903eb7384c3f915d8f3e4f084c3fb7db8f3e35794b3fb9ed8d3e0d784b3f1cce8b3e96a84b3f9bd18b3e53334c3f8bad8d3ea7074c3f3aa6893eb6054c3f38ae873e57914c3f6236883e74024d3fa4f2893eef874c3f3a1e863e5b4d4d3fb1e7843e0e184e3f9d9f853ebb4a4e3fd1c2863ed99f4d3f67fc833eb4cf4e3fbb19833e57994e3f925c823e52524f3f96a8803ec9054f3f9e35803e14d74f3fdde27b3e5b9e4f3fd09b7b3e3892503fcf1c803e7ea6503fa2ec813e67b6503f9eff813e0607503fcbef763e476e4f3f3691763e2d82503f254e773e8f8b513f720a713e0374503f770a723ec8a8513f502b7c3e8c78513fd4987d3e394d523fa725793eb485523f0b74743ea8cd523fb477713e7b384f3f5c4f803e476b513f73d3803eb521523f5daf813efac5523f0bec7f3e1e0c533f61b9813e0ab6533f6108833e8f5b533f980c843e7616533f4308833ec98f523f6269823e7bfe513fa503853ee6e5533f0d3d843edc4b543fca48833e48d4543f173b803efc33543f34a87d3e7dba543fa267823ed85e553fc237873e5fb8543f08d6863e4339553f3379863eb0b7553fe4838a3e6a4f553fcaa58a3e1eb6553f40608a3e5ae6543f56798c3eb9e6543fa9a18d3eae18553f54678e3e6a55553fa67e8f3ee496543fdf37913ee990543f8c6e933ed861533fb434903e6fff533f7e258d3effa5543f1e3f8d3e424d543fdd578a3e4391543fd07e873e1653543f9eaf873e21ff533f1799853ea195533f45528a3ebf44543f94dd8f3e9f87533fb755923e06c2523fd1f98c3e8af3533fcebf8c3e887c533f06308f3e7313533f0828913ed15f523fe3f9853e5a4e533ff5a9843eaed8523f7dd0833ee85f523fc21b853e56b3523f90a8843e074d523f8b4f833ef8de513f7748843e0dcd513fd808833ebe50513f750e843ebc43513fe3fa833e22b4503f93f4823e5fb9503ff10a833edf1c503f930e843e4221503f2c5d833e107a4f3fa553843e268a4f3f5d0d823e735f513f97d4843ebced4e3f18eb853ef83c513f0217863ea9d2513f6630863ec36d523fb02a863ecaf4523f64f5873e8d49533fd5ce873e33b2533f21378a3e81f5533f0d3f8a3eaa82533f0fa28a3e7fcb523f54fb8c3ef5cb523fcce28e3ef386523f303f903e4903523f3af7903ed147513fd13f923e037a513f0dd5933e0fb3513fee81953e88fa513fce8a963e417f503f1969943e04a7503fefa9923ed79a503f041f943e27ea4f3fb198923e21fb4f3fc15d923e82874f3fdb7e933ed95e4f3f3845943e6e3b4f3f0d41953e0c9d4f3f5e47913e7afa4f3f1a44913e74904f3f6b65913e3e3e4f3fa64a923e962c4f3f4f26923ecde24e3f1487913e33e44e3f6b80903e8edb4e3f205d903e403a4f3f7c21903ef88e4f3f2c0c903e45f84f3f31fe8f3edc7e503f2a3e913ec588503fecd88f3e7d2b513f65a98f3e8ab3513f33cc8e3ee3e5513fe7488d3ead03523f6dfe8a3efafc513f7a6d883eeee5513fad3c883e72a2523fd350883ef83c513fc81a883ecfa3503f0dc6853e72ab503f47c1853ed91c503f58e9853eb68f4f3f7c03883e64904f3fa4ff873eb716503f424a863ea4024f3f092a883e860b4f3f9c3d883eb7ab4e3fbcff863ee27c4e3f4325883eb9054e3f7589893ec69c4d3f36088b3e54474e3fd68c893e6e7d4e3fd1fa8a3eae414d3f0e788c3ea1fc4c3f8d548d3ee7ce4d3f93388c3eb6074e3fe5ff8d3ed3d54c3ff37d8f3ef6d14c3f75e98f3e01a64d3f6d928e3e2fad4d3fb8dd903eb0f54c3faf50913ec4bc4d3fb705933ee1fb4d3fa64a923ee0144d3ff5ef933e59034d3f04db943e41fc4d3f0bd1963eef144e3f65e0953ef7e34c3f8265953e48e94e3ffa23973e91434f3f3201943e92b84e3fc810933e84e74e3f2583923ea18f4e3fa284913ea6624e3fb44c903e55544e3f05138f3e5f584e3f6a558f3e68dc4e3fee718e3e82d44e3f4dfa8d3e97744e3fb22d8f3e553e4f3f420a8e3e881e4f3fba318d3e66874f3f0fe68e3e50984f3f5bc88e3e8404503fa6c28e3e0a8b503fa6c28e3e0b34513fcb248d3e529c503f4b458d3e9145513fb61b8d3e9d12503f05a68a3eff15503f63878a3ebe914f3f3fbe8a3eaba1503fea408a3e80054f3f6b138c3e1ce94e3fd8258d3ed1ae4e3fbbf18a3e3144513ffa177c3ed16b533feb43783e7bd9533fc4d0743e9749543ffaa96f3eb427533fb8cd693eacb6533f43d6703e59ea543f386b6b3efee9553f3ae6613e6b9d543fe23a5c3e2fa8523f2e6d653e3123523f44d5593efa64503f0783633ee25d503fad215a3e782e4e3f1ede633ec2944e3f659a663e4bd94c3fba585d3ee70f4c3f8db2633e7f144a3f84d46b3ef43c4b3f270d593e09a3483f96ec643eb684463f4aa4753eed18453fa6216d3e7668483fa564733e25dc493f5697793e0438473f93a4833e9a8a463fbb358a3eb567463f8ff8833e3d2a483f1756893eb4e8473f27448e3efe05483fdf0c903e00b9463fa6237d3e50d3483fd7b7943e3468473f1f5c923e6579483f6998953e2d37493f7952983ec563483fdbf89a3e2c9a493f14f3973e92334a3f5da6993eeb664b3f51db9c3ee2034b3f4f2a9e3e5a994c3fedeb9a3e95c94c3f299c9b3ebb4a4e3f71c79e3e85514e3f31949e3e3e23503f3b8f9b3e96d94f3f1eaa9a3ee763513fed659d3ef9ea513fe6119b3e1c85533facd1983e75d7523f8d2e963e2923543fc6e2973e2de5543fd00aa13e3799523ff21f9e3efd6c543f8e3d9a3ecbed553fc569a23ee475503fa447a73e1ad9503f64eea53e167f533f757fad3ed8b1543f85daac3eeac9503f1823943eaffe553f6ae9923ef835553fee158f3ee800563f9ee58f3e59cb563ffa3c8b3ee344573feac78a3e1475563f5138863e8e6a573f8de6803e913b573f0a2b863eb091563fdf6a813efa55563f50bc763e86ba563f3c84793e24c7553f0d957b3ea82e553fc3d9813e3ecb553f7940863e9f15563feea88a3e1304563ff1bc8e3e8c93553ff525923efdc0543f82ea943ef3a4533f3911973ef657523fa681983e93f3503f3523993e59914f3f0f03993ed5324e3f7c2e983e94d94c3f95ed963eea9d4b3f9288953e29984a3f019f933eaccc493f71d0903ee83f493f3a3a8d3ecafa483f7df9883e5b06493f4d70843ed160493f9f00803e73084a3fd81b783ecff64a3fd5f7713e7d254c3f38b06d3e337f4d3ff7606b3eb7ee4e3fe7f76a3e6465503f8e636c3eb0d4513fd861b63e774e573f6ae2b03ee1fb573fcf16b53ec338553f8acdb93edb72553f9e14bb3e2703573faa68be3e6a6e583ffb45ba3e2626593f4d4fb53e8b225a3fc927be3e1ada563f51e2c03eb6f7573f2284c23ebea0573ffc3bc03ed7bd563f9a77bf3e0dd7553fc427bd3e2aac553f7cafbe3e61a4543fc2d3c03e600d553f0a84c33e3556543f69d5c13e66be533f83bdbb3e0e0e543fe1adbf3eaee4523f008ac43e7bce583f07b3c53eb85e583f3f83c93ec8e8583f16d7c83e0463593f0e74c73e7f055a3f819fc23e2c64593f732ebf3e91555a3f34bcc43e1f1c5b3f5090ca3e25b95b3f2f19c13e018b5c3fe683c73eb85e5d3f8da0cc3e66735a3f166bd13e61a55a3f6b12d03ee61b5c3f22bbcd3e9bf35d3f62dfba3e448f5b3f67aad43eb0335c3f2d19d53ed4925a3f3410d53e0b6a593f1a0ad83e594f5a3f14bad73ef0fa583fa933d73eb4b2573f4e8bd43e5f8b583fda93d13eaa19593f49d2d13efec1593ff15ad83e2af55b3f7a5ad33ee5325e3fd326db3ef9545b3fb592dc3e5d8d5c3f626bde3ea38f5b3ff64cdd3e37a25a3f079dda3e73ee593f80d6dc3e1f8f593f200cdf3ef32b5a3f79d4df3e4fe25a3fd7b7e03eec785a3fc48ae03e3bee593f14efe13e16e5593f49d4e13e6b935a3f1061e03e2031593f06dde13ea030593f68bbde3e5050593f8b5ce13eb73e5b3f1594e03edb105c3f1dcee13eff72583fd6c0e13e94b9573f8d36e03e5ec0573f9b48e03e5a75583f719ade3e2084583f47a6dc3ef79c583fbd95dc3ebfc8573f598cde3e4ec7573f684eda3e91bd583f9226da3e09bf573fe373de3ece19573f2f20e03e9a17573f8e7edc3e6b0f573f8e10da3e88ef563fc1abd73e42ba563f90d1d53ec16f563fdeb7d73e94ff553f4cf2d53e63d9553f762bd53e2c13573f2886d33ee1c8573ff3dad33e54aa563f7a75d23e8933573ffb55d03e50a1573f9dfbd03e4a54583fb3a5cd3ec278583fb7afcd3ef22f593f5c16ca3ee24a583f9985ca3ea2b1573ff884cd3ee5c7573ff181cd3eebb9593fe5dfc63e2edf573f06dbc73ee068573f1b76c53eedfa563f4e1fc43e4a48573f9af1c13ed398563fd247c33e0975563f2835c23edfe6553fb30ec13ecee5553f852ec23e3244553fe522c33e1660553f7459c53e52e3543f4194c43ebfae543ff782c73e1b20543fabbbc63ee5a6533f2a47ca3e702c533f78b5ca3e60be533f58e6cd3ea0af533f351ccb3e0a2b543f2beccd3e1b26543fb676d03ee554543f60ead03e63e2533f5d78d13e6548533fb1f2cd3ede13533f1d96d33e4545543f9fa1d23edfa7543fb21dd43e4418553f4872d53e22c4543fc96dd73ec157543f8692d43e3bb5533f412ace3ee753523f8b16d23ed489523f378fd23e3e9f513f554bce3e8066513f3d14ce3e7f42503febacd23e3281503fe96fc93e8b82513f57acc83e7b5a503fb9e7c23e03d3503f979cc73eee034f3f1e54c13ef5694f3f20dcba3e6c57503fb732bd3e7bc6513fc267c43ebb06523f8d50cd3e7aee4e3f7be4d23e140e4f3f94b0c53ee1f5523fc0e9c93e8370523f1bfab73e3f4f533f3e99b43e4903523f3ecfb23e66c54f3f8c22b93e288b4e3ff0d0bf3eb5da4d3fc13dc63e8d8a4d3f35cccb3e15714d3f8f62d03ebe574d3f2fe7d33e00084d3fa0bfd53e8e444e3ff040d73e9a464f3f505ad63e570a503f5bedd83e9202503fc1b9d83efeb1503f5347db3eec6c503f455edb3ed1f84f3f324edb3e6aa74f3fb4b8dd3e64a2503f5babdf3eb3bf503f5152dd3eb93a513fc945df3e4552513fee2de03e3f51503f3bdde03edff04f3f42edde3eea1e523f6ff4dc3e1d0a523ff5deda3ebee7513f5297da3e57d5523fa73bda3e77b3533f2ef5d93ef989543f1500d83e2572533f5463d83eca95523fccecd93ead60553fb0c9d73eda3f553f2e01da3ecf2f563f0707d63eda4a553f3c80d43eb0bc553f067ed43e8331563fd3acd33e0321563fdcc0d33e82e2553f4f59d33e19c2553f10a1d33e949b553faeb5d33e2872553f96a9d43e2665553f958ad33ee34d553fa5f1d23ee794553f81ffd23e3478553f53e8d23ef95e553f0acad23efbb3553f3950d33eb8f7553f6dfbd23eaee7553f4da4d23e440e563fae22d33e811f563f4c87d23ea15b563fae14d23e2a3d563fb8b2d13e211e563f4b35d23e30f5553f64d9d13e39dc553fe480d23eddd3553f9020d23e28c0553f5e60d13e6901563fb5e0d03e95ea553f6452d13eaecb553f30b3d13e70a9553feb84d03e9d30563f931ad03e6c0f563f1fedce3e642e563f2d34cf3e2559563f625bcd3e3b6a563f7d45cd3eb43b563f177acb3e0d3c563fbc5ccb3e2969563fa636cb3e8c94563feb5acd3ea697563fc158cf3e3484563f4e9ac93e325b563f03e1c93e1634563fdd56c93e5180563f25a6c73ef05b563fd704c83ecf40563fe076c83e8023563f515ccd3ed5c6563fc512cb3eaec1563f6eeeca3ea3f9563f4262cd3e6801573fe47fcf3e99b1563fffafcf3e87e8563f318dc63e8d1a563f1238c73ee109563f760ec63e5328563f7957c53e34ee553f71e7c53e35ef553fcaafc63e5aec553f8dc7c63eb3c5553f3a69c73e17d0553f936bc83ef9d3553f64d6c83e34b6553ff166c93ef2c6553f2e28ca3e2ed1553fb58fc93e6ed4553ff166c93e03d8553f7cf3c73e4ae2553fb675c83e3f9f553f3c3aca3e2e7d553fa518c83ef081553f0b01ca3e8352553f1aeecb3e8734553fd602cc3ee167553f5008cc3e3d92553fd368ca3ee19f553f93bdcd3ed667553fbb9ccd3e5392553f565acd3e55b5553f4812cf3ebd91553fc69ace3e32b4553f8304ce3e7dcc553f4d11cd3ec5cc553f7804cc3ec0cc553f0b00cc3e3fb5553f3554cf3e216b553f7cb0d03ed95f553f8a7fcf3e4e3e553f36e9d03e533e553fa8f9d13ed93e553f36b6d13ed853553f0b7bd13e1670553f0c55d03e1782553f2f2cd13e9d18553f9c4ad23e1027553fcd5ad23e8410553f5083d13ebcf4543fdeebcf3e88d1543f06b3cf3e3509553f3649d23ef554553f7155d23e1766553fb1a0d23e434a553f1213d33ed736553f510cd33e6b13553fe2d9cd3e8cf6543fd6cccd3e6b34553f7bc8cb3e70f6543f6ca6c93eae1e553f2498cb3ee6b4543f9233c93e3fe7543fbaeac63ec636553fb192c73e095e553f9eacc53e54a3553f1f48c63e4bb6553f70bcc43eb3ec553f9c8ac53e5238563fe009c43ed3ea553f3cf4c43ee949563f0f3ec43e705c563fd9d2c63ea69d563feb4ac63e37c5563fb86ec83edf14573f7ac6ca3e6f45573fb6c7c83e50d8563fda32c33ebae8553fe413c43e4578553facf1c43e338e553fed26c63e460f553ff512c93e68a8563f5f43c73ebb7a563fb2b1c83ed8b1543f4321c83e3673543f4263cb3e2977543fe3eacd3e5a76543f22e4cd3ef1b4543f8127d03e069d543f24f8d13ec2d8543fc68ac23ecafc453fba04c83e5736463f6a00c83e5ffd473f41c0c83ef876443f8623ca3e77a5423f6e84cf3ea2e1423f269dcb3e3dde403f3dc2c83ed0e5493f6121cd3edafa493f2da0d03e870c4a3fcf79ce3ed3b84b3f6613d23e379c4b3f4a17ca3e33c54b3fdda9d63e99bd4c3fcb7bbf3e3ae83c3fb023c73eb8233d3fbaf9c53ef5d03e3f6e24c93e45713b3f47dacf3e2d223c3f17cbcd3e2eb03d3f319bcc3eaf3d3f3f6c71d83eec7c373ff1d5d83ef87b353fb035d93ed92d333f1b93d93e1fb9303fa74ae33ea536333f4764ed3e002e333f8a4ae33ec484353f23c4ed3e367c353fed05ed3e35b9303f2627ee3e3f7d373f2349e33e567d373f96c5e03e5b5b413ff420de3eb1de413f02b9e03e81f1413f7546de3e023a413fb26fde3e8b9b403f17cee03e50c5403f28b0e03eff8b423f59b4e03ed727433fe8cee03ef6c1433f4208de3e7439433fc63ede3e9dd8433f3b05de3e008d423f9292db3e0907443fc63ddb3e5b58433f5347db3e1d8e423f1688db3e7ebc413fecd8db3eb5f7403f854ddc3e113d403fadf9dc3eea893f3fb796de3eeaff3f3f6819df3e29813f3f6840de3ebdfd3e3fd284e03e08b83e3f3bb4e03e39803f3f832ddd3e90283e3ff800e03edcc73d3f493fdb3e3ad93e3f7acae03e212b403f0818db3e600e513f7696d83e689c513f5a04d63eb20c513f37d1d53e5f19523f6a53d53e14fc523fbecdd13e3ddc563f5cefcf3e3d30573f1964d13ef3a7563f330cd33e9576563f8d0dd13ea57b563ffcc4d03ebc54563f2f6fcd3eef50573f3562d03ef1cb553fa11ecf3e95d4553f613dcf3e95d4553f3562d03ef1cb553f2b9bd03ee1bb553f2af7cf3e3add553fb1aece3e95d4553f4653cf3e43f1553fde73ce3ec4db553f62b9cd3eefdf553f8e5ece3eef01563fe100cd3e2809563f5db9cc3ebfe1553f4b83cb3ea309563f339ecb3edae1553f0d2fca3e1506563f8997ca3ef5e0553f8a13c93e12fe553fb1e3c93ef9de553f3f40c83e38f1553fc96ac93ebedb553fad2dcb3e95d4553fabf0cb3e95d4553f2ef0ca3e95d4553fa17cca3e95d4553f149bcc3e95d4553fa82ecd3e95d4553ff4c0cd3e95d4553fb896ca3e95d4553f8ebeca3e95d4553fed1acb3e95d4553fa6a3ca3eecbb553f48f7ca3e6ece553f4e70cb3e95d4553f2e28ca3e2ed1553f2630cc3e95d4553fa8dccc3e95d4553ffb65cd3e95d4553fad11ce3e95d4553f23dace3eefc9553fd2a9cf3ef0a9553f8a64d03eeaa2553ffa53cf3e2bc8553f72a8d03e8eab553f2396cf3e54ca553fe6a0d13e8a8b553f445bd23e8d7d553f585fd23e8a96553f5566d23e52ac553fd88dce3e95d4553f952cce3e95d4553f3562d03ef1cb553f613dcf3e95d4553fb1aece3e95d4553f72a8d03e8eab553f2396cf3e54ca553fa11ecf3e95d4553fabaec33ec1375f3fbff4bc3e3c365e3ff057ca3e8efa5f3fb448c63ed707623f6f4dbf3e0519613fda65b83ee2ef5f3ff9bfd03ec776603f5455cd3e1dc9623fbd5ab63ed8fd5c3f5259b03e43675b3f4894b13ea07f5e3f3f49ab3e19ca5c3f1195c93eb4f3643f68edc13e87f2633f0ab0d13e0fe0653f1c9dba3e41d7623f8d83b33e068a613faa7fac3eebf25f3f6804a63ec8205e3f4884a03e5c225c3f3a059c3e662f5a3fb368a13e70df583f08f5a53e23d15a3ff38c983e917f583fecf7953e3118573f89759d3ec73f573f4769ab3e354b593fb8eda63ec82f573fdb49a23e1f9b553f93c1e83eab22483f0d23e83e8afc473f0d23e83e8afc473f5bbae83e88e9473f0d23e83e8afc473fe693dd3e4c01483fd5dadd3e77e9473f5371de3e8afc473f61d3dd3ea522483f5371de3e8afc473fd5dadd3e77e9473fd5dadd3e77e9473f3b98de3e40d9473fa8c5de3e8afc473f5371de3e8afc473f5cbcdf3ed2ce473fe2c2df3e8afc473ff304e13e56c8473fd006e13e8afc473f602fe23e96fc473f61d3dd3ea522483f5371de3e8afc473f5371de3e8afc473fd5dadd3e77e9473f5371de3e8afc473f3a16fc3e95d4553f452cfd3e35d8553f6bd4fb3e95d4553f0068fc3e95d4553f3028fd3ef0db553f5104f83e95d4553f5c1bf73e9bce553f6d51f83e95d4553f6d51f83e95d4553f4e70cb3e95d4553f1035cd3e95d4553f2630cc3e95d4553fed1acb3e95d4553fa8dccc3e95d4553ffb65cd3e95d4553fad11ce3e95d4553f952cce3e95d4553fd88dce3e95d4553f3b0fce3e95d4553fa11ecf3e95d4553fb896ca3e95d4553f8ebeca3e95d4553fa17cca3e95d4553f2ef0ca3e95d4553fad2dcb3e95d4553fabf0cb3e95d4553f149bcc3e95d4553fa82ecd3e95d4553ff4c0cd3e95d4553fc6b5cd3e95d4553fb1aece3e95d4553f2b56ce3e95d4553ff496cf3e95d4553f613dcf3e95d4553fa087cc3e95d4553fa17cca3e95d4553f8ebeca3e95d4553ff166c93e03d8553fbb28ec3eb2884d3f0473ae3e6c4c383f43aa673e69c1363f0d91653e2e51333fb6e8923e4e48323fa59ae73d50ab3d3f0863b73d40ac3d3f747a8a3ddfbf3d3fde713e3dcfdc3d3f653b0d3ef2cc333f99cde43d43c5333f3321b13d0cc0333faef37d3d6ec9333f9d281b3d1bda333f8ee02b3e48ca333f3fa6793d27ca333f5ee2593fe59e333f3ad9733f80ea293d8776753f49cc3b3d9ec2753f80ea293dc810793f80ea293d8eb2733fd308333d3544733f6bc13a3d6edc713f80ea293d139f723fe7eb3f3d6edc713fdfbc413d9e19713fe7eb3f3d6edc713f31a3583d505a733f8915553d409e743f02f44a3d7084783f02f44a3d8ef4763f3bf5663d409e743fb1ac793d43467b3f80ea293d7f74703f6bc13a3d655e703f8915553d4d06703fd308333d78df6f3f80ea293d4d06703f2dcc203d3df66d3f80ea293d2b426e3f49cc3b3d9c1a6f3f02f44a3d9c1a6f3fb1ac793d6edc713f271f803d6b346b3f02f44a3d22c46c3f3bf5663d2b426e3ff50f893d6b346b3fb1ac793deba76a3f80ea293d2b426e3fa208183d9c1a6f3f16e1083d6b346b3f16e1083d9972683f80ea293d092a693f8915553d6edc713f025b8d3d6edc713fddad993db9786d3f7372943d15b86c3faf539f3d6edc713f6874a53dfcbf693f938c853d9643673f12835e3d465c683fbfe08d3d0664663f80ea293d092a693f4983fd3c6b346b3fcc50b43caf72653fb887673d22c46c3fbabfd93c2b426e3f2e6a833cfcbf693fb877913c9643673fdfa3ea3cda6c643f80ea293d9c1a6f3fcc50b43c6edc713f382da73c655e703f4983fd3c7f74703f9513193d9e19713f5ce9133d6edc713f0c1a123d139f723f5ce9133d6edc713fcd63f63c505a733f4983fd3c3544733f9513193d8eb2733f2dcc203d8776753fa208183d409e743f16e1083d7084783f16e1083d8ef4763fbabfd93c409e743fcc50b43c8776753f2e6a833c7084783fcc50b43cd18e7a3f4983fd3c47757c3fdfa3ea3cb1f8793fb877913c2240763fc7c02b3c8b00773f146da93b2d467e3fd7a0d83c955c7b3f604e603c014c7f3f80ea293d6edc713fec7b643c6edc713f80e6013c6edc713f0dc30e3bb9786d3fc7c02b3c15b86c3f146da93b465c683f604e603cd8547d3f80ea293d2d467e3fb887673daa8e7a3f8915553d4884783fb1ac793d47757c3f12835e3d955c7b3fbfe08d3db1f8793f938c853d8d00773faf539f3d8776753ff50f893d2240763f7372943daf72653fd7a0d83c54426e3f49cc3b3d9fdf6f3f80ea293d3df66d3f80ea293d54426e3fa208183d4d06703fd308333d6edc713f80ea293da674703f6bc13a3d9c1a6f3f02f44a3d8c5e703f8915553dc819713fe7eb3f3d6edc713f31a3583d6edc713fdfbc413d3c9f723fe7eb3f3d775a733f8915553d5c44733f6bc13a3d409e743f02f44a3d8eb2733fd308333d65d9733f80ea293d8eb2733f2dcc203d5c44733f9513193d3c9f723f5ce9133d6edc713f0c1a123db076753f49cc3b3d9ec2753f80ea293db076753fa208183d409e743f16e1083d775a733f4983fd3c6edc713fcd63f63c7084783f16e1083db9f4763fbabfd93cf210793f80ea293d409e743fcc50b43c7084783f02f44a3d6edc713f382da73c7084783fcc50b43cd18e7a3f4983fd3cb076753f2e6a833c6edc713fec7b643c43467b3f80ea293dd18e7a3f8915553d7084783fb1ac793d6edc713f80e6013c2240763fc7c02b3cb9786d3fc7c02b3cdff8793fb877913c47757c3fdfa3ea3cd8547d3f80ea293d47757c3f12835e3ddff8793f938c853d2240763f7372943dc600773faf539f3d955c7b3fbfe08d3d2d467e3fb887673d014c7f3f80ea293d2d467e3fd7a0d83c955c7b3f604e603cc600773f146da93b6edc713f0dc30e3b4fb86c3f146da93b6edc713fddad993d6edc713f6874a53db076753ff50f893d6edc713f025b8d3d6edc713f271f803d54426e3ff50f893db9786d3f7372943d4db86c3faf539f3d9c1a6f3fb1ac793d409e743fb1ac793d2bc0693f938c853d465c683fbfe08d3db9f4763f3bf5663d9643673f12835e3d94346b3fb1ac793dad72653fb887673d4bc46c3f3bf5663d322a693f8915553d6b346b3f02f44a3d9972683f80ea293d0664663f80ea293d9643673fdfa3ea3cda6c643f80ea293dad72653fd7a0d83c2bc0693fb877913c465c683f604e603c092a693f4983fd3c6b346b3f16e1083d12a86a3f80ea293d54426e3f2e6a833c9c1a6f3fcc50b43c4bc46c3fbabfd93c6b346b3fcc50b43c8c5e703f4983fd3c9c1a6f3f16e1083da674703f9513193dc819713f5ce9133d4d06703f2dcc203dd7bf773ffbc5123e35bc783f4780153e9217793ffabb133e7bc4773f5aa0113e29e2773f6726143e0121773fb9b7153e33b8763f5af7123e39a9763f5aa0113e7dad753f8959133e00ef753f8373163e62d8773f35b1173eaa65743f63e7133e204f763f92c8193e6583743fd8be163e9e92783fa726193e9fe7763fe4fb1b3e36f7783f03fd193ee096793ffe5f163e5d397a3f54ad163e9ebb743f3060193e686f7a3ff6dc163e5c2d773fa1211d3e1b38793ffcc51a3e3319753f70e51b3e66f57a3f5d87173e5b67773f3af61d3e0997793f1af31b3e848f753faf3c1e3e959a773fbcf91e3e5819763fa5a91f3e9783743f603f203ec7c8733f74b71e3e19a37a3f29c71d3e4848783f5a4c213e77447c3feb19183e19a87c3fa6f7143e61cd7e3f995f153e788c763f92dd203ee728773f905f213e6410753fd4f1203ef4e1773f9ad8263ed1337b3f0b7c243ee00d763f1d5a233e768e753fcaac213e093e7d3fefc91f3e313e7e3f09441a3eb7137f3f8b9d113e8bc77c3f5aa0113e1da87c3f13490e3e59497b3fd607153e4b747b3f5aa0113e5b497b3fdd380e3e6af57a3f56b90b3e6c6f7a3fbd630c3e74eb7a3f5aa0113e9ac67a3fe195143ed08d7a3fef72143e04b57a3f5aa0113e82047a3f4d2e143ec3217a3f5aa0113e84047a3f65120f3e9417793fb9840f3e36bc783f6bc00d3ed7bf773fb87a103e0138793f5aa0113e2be2773f4c1a0f3e33b8763f5349103e0121773ff4880d3e64d8773f788f0b3ee396793fb5e00c3ed28d7a3fc4cd0e3e00ef753f2acd0c3e204f763f1b78093e7dad753f2ae70f3ea292783f061a0a3e60397a3f59930c3e9cc67a3fd1aa0e3ee7a5753f5aa0113eeb5c743f5aa0113eaa65743f50590f3e6383743fdb810c3e9cbb743f7ee0093eb056733fd6010f3e0f70733f108e0c3eea5d733f5aa0113eb056733fdd3e143e4e18723f7e7a0b3ed6ab733f43170a3e3119753f3e5b073ea0e7763fc344073e1170733fa3b2163e4e18723f3bc6173ed8ab733f7029193e1f88723f0f721a3ea4f7733f774e1b3ed84d743ff8151d3e18c7713f8ae1143e251c733f5fc81c3e602d773f011f063e828f753ff803053e3af7783faa43093e1f38793fb17a083e5d67773f684a053e5819763ff896033e9283743f4201033ec1c8733f3989043e0e97793f8e4d073e999a773fe646043e22a37a3f8579053e7a8c763f0b63023e4f48783f43f4013e6010753fce4e023e7c447c3fc8260b3e3a3e7e3faffc083e67cd7e3f2be10d3eea28773f0ce1013ee10d763fe8ccff3d758e753fcd93013efbe1773feecff83dde337b3f4489fd3d123e7d3fcf76033e9b5d6a3f0143153e1c136c3f7c56163e215c6b3f49d3143eac156a3f5c42133ee78a6b3f3348183e54c7693f4264163e2865693febf0133e120f6a3f5aa0113e66086b3f5aa0113eac156a3f57fe0f3e79096b3f867f193e227d693f30cd163eec0c693fab13143ef7e2683f5aa0113e859a683f5aa0113eec0c693f082d0f3e5cc06a3fbc021a3ee12a693f422f173efdaa683fc906143e5c5f6a3fd1e01a3e2ccd683fe1d9173e4940683fef43143e071d683f5aa0113ea14a6c3f96591b3e310b6c3fb3b21c3ea1716c3fdb801a3efeac6c3fb5cf193eca2d6a3fbbae1b3eeff96b3f3fc81d3e3dca673f088b193e980b673f115e143e199f643fd441153e5bf3663f5aa0113e3c8c643fbd9d113e85d66b3f50f7203e8473693f76a61e3ebc64653f68bb193e1d246d3f087f173e739d6e3f8076173e13e36e3f2ef1133e7229703f4961143e9bb36d3f9351143e57f36e3f5aa0113e6ccd6d3f5aa0113e8729703f5aa0113ea8856c3ffaff133e4f076b3fe0c8123e5ba86c3f5aa0113ed5f36f3fdf4b173e727b6e3f03d2193ee4a46f3f1bac193eff356e3fb54a1c3ea4666e3f98041f3e7d456f3ff5281c3ea41d713f2fdf1a3e5a8a713feef8173ed3d76d3ff8bf1f3efd4c6d3f6832203eebc66e3f7e1d233ebe8d6c3f5a4f213ea8486e3fde4b243e85966d3fecc2253ecd6c6b3ffe04273e625f683ffd5b233ed17d663f75d01e3e11486f3f4aee213e940e703f28cc1f3ed0ff6e3f32ec1d3e3ca0703ffc6c1d3e3dc4713f5aa0113e18c7713f295f0e3e7429703f6adf0e3e13e36e3f7f4f0f3e739d6e3f33ca0b3e1d246d3fabc10b3efeac6c3ffe70093ed5f36f3fcef40b3ee78a6b3f7af80a3e79096b3f2dc1093e52c7693f71dc0c3e1c136c3f37ea0c3e9b5d6a3fb2fd0d3e9bb36d3f20ef0e3e215c6b3f646d0e3e227d693f7e730c3e5ec06a3ff73d093ea1716c3fd8bf083ee12a693f6b110c3e5c5f6a3fdc5f083ea14a6c3f1de7073ea6666e3f1b3c043e310b6c3ffa8d063eca2d6a3ff891073e2ccd683fd2660b3ed5d76d3fb580033ef1f96b3f7478053eff4c6d3f4b0e033eedc66e3f3023003e13486f3f6452013e950e703f8b74033e85d66b3f5e49023e8473693f379a043ebe8d6c3f53f1013e605f683f62c9ff3dcf7d663f4470043e3bca673fabb5093ebc64653f5185093eaa486e3f9ee9fd3d85966d3f77fbfa3dcd6c6b3f5377f83d1b9f643fe5fe0d3e980b673fa2e20e3e4940683fc4fc0e3efdaa683fe9390f3e2865693fc84f0f3e4f076b3fce77103ea8856c3fb9400f3ee93a693f5aa0113e747b6e3faa6e093eff356e3ffef5063ee4a46f3f9294093e7d456f3fbe17073ea61d713f8461083e5a8a713fc5470b3ed0ff6e3f7c54053e3ca0703fb1d3053e1d88723fa9ce083ea3f7733f3cf2073ed44d743fb62a063e201c733f5978063e7ff67d3fd96bd83dc4237d3f3589dc3da9747d3f0618de3d03317c3f7855e43d975b7d3ff936d83d0b0f7c3f2a15e03d1f5a7a3fb3f0e73d7b2f7e3f1d00d13d22197c3f34b1d93d8f287a3f9b0fe23d32837d3f1d00d13d4d6c7c3f0866e83d67f17d3fce1ae13dafc37e3ffe11da3d3d7b7a3f534fed3d7bf77e3f1d00d13d62f7793f786cda3dd5287c3f1d00d13d55e2793f1d00d13db974773f8d89f03d7d88773fcbe9e93dde44743fad7fed3def68773ff951e23d6035773f90bdd93d281b773f1d00d13d87a2743f1e50e13dfda0743fe245d93d7d9d743f1d00d13d0fb7723f665bd83de174723f1d00d13d62f7793fcd93c73d21197c3f114fc83d6f99713f1d00d13d6ca7713fa00ad83d7789723f9f1edf3da98b743f3742e83da4ae723f3ec4e33d3465723f2237e73d0eb7723fdfa4c93dfda0743f6ebac83d6035773fb542c83d8f287a3faaf0bf3d0a0f7c3f1bebc13d1ba8713f04a7df3da895703f83f7dd3d36a5703f75e0e53d37cb703f8ce9d73d25ba703f1d00d13d6ca7713fa5f5c93d7589723fa5e1c23d87a2743f27b0c03def68773f57aebf3d1f5a7a3f910fba3d01317c3fc2aabd3d36956e3f1d00d13d82a36e3f286fd83d1eb96e3f37f1df3dada66e3f4d51e63d37cb703fb816ca3dfd1f6c3f1d00d13d891b6c3f279bd83d84ba693f3c67d83d22166c3f983be03d9584693f3151df3d8bfa6b3f5244e73d2241693f568fe53d28d06b3f3e83ed3d07ec683f24f7ea3d82a36e3f2891c93d20b96e3f0d0fc23d891b6c3f1d65c93d84ba693f0999c93d28dc693f1d00d13d0fdf6e3fad16ec3d7955703f392ae33d7310673fdb72e63dfb79673fda86e23dfe86653f07e1df3df219663ff167dd3d8bba673f26e4dd3dfee7643fdf0ad93db1a5653f37cdd73ded59663fdb38d73dfd7f663f5678db3dcd82653f1d00d13d54b7643f1d00d13dfce7643f66f5c83d11c8673f1801d83d8649663f1d00d13deecb673f1d00d13d11c8673f2dffc93ded59663f69c7ca3db1a5653f0d33ca3df219663f5498c43dfc86653f3e1fc23df979673f6b79bf3d7110673f5e8dbb3d2241693fe470bc3dfd7f663fef87c63d8bba673f1f1cc43d9684693f13afc23d24166c3fadc4c13d8dfa6b3ff3bbba3d09ec683f1609b73d2ad06b3f067db43dada66e3f02afbb3da895703fcc08c43d1ba8713f4c59c23d3465723f2ec9ba3da4ae723f123cbe3ddc44743fa380b43da78b743f0ebeb93d36a5703fdb1fbc3d7955703f16d6be3d11df6e3f98e9b53d7b88773f8516b83db774773fc376b13d3d7b7a3ff2b0b43d4b6c7c3f3d9ab93da9747d3f34e8c33dc4237d3f1077c53d7ff67d3f6c94c93d67f17d3f6be5c03d975b7d3f4cc9c93db0c37e3f47eec73d325a873e2ae63c3fac3cb93e36765d3fac3cb93e7bbf453f325a873ed49c543f0d8a463ecde8473f0d8a463e1232303f69a8113ef984243f69a8113eb43b3c3fee04db3dbb7c333fee04db3d11c61b3f3657ad3d3bdf173f3657ad3de6952f3ffab5fd3efcdf453ffab5fd3ea7965d3f56bc213fa358563f56bc213fe8a13e3faaf33c3fc05e313faaf33c3f7b15493f5d4e513f1920393f6e4e513f6e69213f9d2a5f3f9c14123f8d2a5f3f47cb293fe318513f5ebb743ec8ee363f3ca5d33edcd8503ff17faf3ecf2e373ff9829e3e34da623fc0968f3e2a1a633f3ee9343ec66f163ff88db73ecf2f163f3ab0ec3e8e07e33e6fbcf33e9c87e33e2c9abe3ea261993e2178ac3e93e1983e639ae13eb550323eaad6c23ed350333e67b48d3ec5c9bd3d87c45d3e8ac9bb3d8604a43ec83f6b3f02661e3ec1ff6a3f4355843e325a873e2ae63c3fac3cb93e36765d3f325a873ed49c543fac3cb93e7bbf453f0d8a463ecde8473f0d8a463e1232303f69a8113ef984243f69a8113eb43b3c3fee04db3dbb7c333fee04db3d11c61b3f3657ad3d3bdf173f3657ad3de6952f3ffab5fd3efcdf453ffab5fd3ea7965d3f56bc213fa358563f56bc213fe8a13e3faaf33c3fc05e313faaf33c3f7b15493f5d4e513f1920393f6e4e513f6e69213f9d2a5f3f9c14123f8d2a5f3f47cb293fe318513f5ebb743ec8ee363f3ca5d33ecf2e373ff9829e3edcd8503ff17faf3e34da623fc0968f3e2a1a633f3ee9343ec66f163ff88db73ecf2f163f3ab0ec3e8e07e33e6fbcf33e9c87e33e2c9abe3ea261993e2178ac3e93e1983e639ae13eb550323eaad6c23ed350333e67b48d3ec5c9bd3d87c45d3e8ac9bb3d8604a43ec83f6b3f02661e3ec1ff6a3f4355843e0000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000003dcf733f340c433d0000000000000000000000000100000000000000000000000000803f000000000000000000000000000000000000000000000000000000000438223ff88fbb3e00000000000000000000000001000000000000000000000078d9673f4434c13d0000000000000000000000000200000000000000000000005655553fa9aa2a3e000000000000000000000000020000000000000000000000668e603fce8cfb3d0000000000000000000000000200000000000000000000002173713ff5cd683d00000000000000000000000002000000000000000000000034a9293f92a2843e162ca03d00000000000000000300000002000000000000000000803f00000000000000000000000000000000000000000000000000000000b6602f3f943ea13e0000000000000000000000000100000000000000000000002fba683f8a2eba3d0000000000000000000000000200000000000000000000000000803f00000000000000000000000000000000000000000000000000000000bbd3583f2a76ad3dfbeb8b3d00000000000000000200000004000000000000007e15583f08aa1f3e0000000000000000000000000200000000000000000000008b2c473fd34d633e000000000000000000000000020000000000000000000000fc27003ff0dfaa3e22b3083e3ab4033d030000000000000002000000050000007929193f4969903e130ff53d00000000000000000100000003000000000000002173713ff5cd683d0000000000000000000000000600000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f00000000000000000000000000000000000000000000000000000000ad0d173fa6e4d13e0000000000000000000000000200000000000000000000001072403fc1377e3e000000000000000000000000020000000000000000000000e1d1453f8b401e3ee7ef943d00000000000000000200000004000000000000007f0c353fb7e3743e36a95b3d00000000000000000200000004000000000000008b72313fea1a9d3e0000000000000000000000000200000000000000000000000f0be53eaa64e13e1d41e63d00000000020000000000000005000000000000009e99bf3ed4979f3e65b9653e71c7b73d0200000000000000030000000500000056d0b13e1e3eaa3ed660333e4482143e03000000020000000000000005000000e7c8283f1ccd913eb308653d00000000000000000200000004000000000000009796163f9796963eecf0f03d0000000000000000020000000500000000000000822f303ffba09f3e000000000000000003000000000000000000000000000000bb50293f8b5ead3e000000000000000003000000000000000000000000000000278af43e1a48d73efdb6d03d0000000003000000000000000100000000000000884a393f4f33143e92a2063e000000000000000002000000040000000000000000b0293f122e5f3ee023f43d0000000000000000020000000400000000000000b729243f9054833e0a60d13d000000000000000002000000040000000000000028ed4f3f2440d83d9f56a83d00000000000000000400000002000000000000002770273f136da73efd299b3c0000000000000000020000000400000000000000cef1233fcef1a33eb754213d00000000000000000200000004000000000000005460193f2a17743e84fbf03d0ba7373d00000000020000000400000007000000c1ba0b3f076c4d3ef4bb113e03dae33d000000000200000004000000070000001710163ff7d93e3eb619f03da6b1e13d000000000400000002000000070000000296183f5701423e8730053e32ecac3d0000000004000000070000000200000059d9423f9e9af43d9e9af43d0000000000000000040000000800000000000000a83d053f5bb57e3e94a72a3ee458833d00000000070000000400000002000000d8ea173f32e49b3e7518d13d00000000000000000700000002000000000000007361273fa840643ed0c67e3d631f7a3d000000000700000002000000040000002fa6243fbf2b263e6554163e779c433d0000000002000000070000000400000011a6313f9528403ee8bca23dc5821f3d00000000070000000200000004000000b7f6163fd3306e3e41f2eb3dc8ec7f3d000000000200000004000000070000006bc12a3f2b7daa3e0000000000000000000000000200000000000000000000008cfb0a3f357a953e661d293e0000000000000000020000000500000000000000f433f43eb108a93eb686453e0000000005000000020000000000000000000000a576fd3e6719b03eeadf243e0000000000000000020000000500000000000000fc21233ff121a33eb7d0343d0000000000000000020000000400000000000000f70d1b3faf2f423ed2c6e73d166abb3d00000000020000000400000007000000942b2d3ff5f1283ebb5f223e0000000000000000040000000700000000000000de5f3b3f4440093e4440093e00000000000000000400000008000000000000004109403ffedaff3dfedaff3d00000000000000000400000008000000000000009106243f3fbb263ecdf8d63d2b5cbb3d0000000009000000040000000700000071b8313f63f5353e843fc03d61240c3d00000000090000000400000007000000b8e9373fb8e9373ed0de503dd0de503d00000000090000000400000008000000ef9c263f253a243e2408ec3d1c9c963d00000000090000000400000007000000a73c2f3fa53c2f3ed6a6ed3dbceae73c00000000090000000400000007000000763d0d3f63e4ba3ec082aa3d00000000000000000900000004000000000000008868093fb67eb83e9547883da1f2143d0000000009000000040000000a000000159e073f42edb53e0e0d713d92a7653d0000000009000000040000000a00000090e9083fef35b63ec7dbdf3d0000000009000000000000000a000000000000007efc063f2ab5b33e6447f93d0000000009000000000000000a0000000000000085431a3f1bd45d3e6ed2f63d6fd2763d090000000a000000000000000b00000071b8313f63f5353e843fc03d61240c3d0000000009000000080000000c000000abaa2a3fafaa2a3ea6aa2a3e0000000000000000090000000200000000000000212c153fd410c73e0d2bc63c860e8d3b0000000009000000040000000d000000c62e113f3e0ec33eb5a1543d0000000009000000000000000a000000000000009f321d3f5f924e3e3184fb3d32847b3d090000000a000000000000000b0000002478113f9bdfa23e9bc1683d4fbf683d090000000a0000000b0000000000000012f0133f08f39c3e4fb36c3d4fb36c3d090000000a000000000000000b000000ef21333f175b0f3e02ecb83d5a4e8f3d09000000000000000a0000000b0000003438f63e033bcc3e2433f63d00000000090000000a0000000b000000000000007070193f2b6bcc3e3af5b33a0000000009000000000000000d00000000000000f89e193f0fc2cc3e0000000000000000000000000900000000000000000000009220253fdcbe353edcbe353e0000000000000000020000000900000000000000e5e7ed3e13a7d23e1fc4fd3d00000000000000000200000005000000000000000a71f43e949ac93ec4e8033e0000000000000000020000000500000000000000a547cb3e91fabd3e947b6d3e00000000020000000500000000000000000000008102d33e8439b93ef687673e0000000002000000050000000000000000000000bfe1f43ec6bdc33ef6c00e3e0000000002000000000000000500000000000000173b333fcf956c3ea9fb8c3d0000000005000000020000000000000000000000e1ad193f3da4cc3e0000000000000000000000000200000000000000000000008366be3e17b9bc3e67e0843e0000000005000000020000000000000000000000bd60ff3e267dbf3e3b44023e0000000002000000000000000500000000000000cb042e3f96b4653e7d70c43d0000000005000000020000000000000000000000f7d2383fc0f7733e92f1223d00000000050000000200000000000000000000000cb8ff3eb43bc03e8218003e0000000002000000000000000500000000000000badc133f8c46d83e000000000000000000000000020000000000000000000000c981073f6dfcf03e000000000000000002000000000000000000000000000000afca013f91aad23e4300a73d0000000002000000000000000300000000000000bc67f83eb99dc13e16f50b3e00000000050000000200000000000000000000001f7efa3e1be7893e8c35773e00000000020000000000000005000000000000007615ac3e0d57a43ef5e9623e097af83d020000000300000000000000050000002abbed3e6ed1d53ea1cdf13d00000000050000000200000000000000000000003869063ff99fba3e5e36e23d0000000005000000020000000000000000000000d162c83efa20833ea908803e2eced13d02000000030000000000000005000000d3760f3f5912e13e000000000000000003000000000000000000000000000000564a313f556b9d3e0000000000000000030000000000000000000000000000008f11113fb442ac3eb968c63d0000000000000000020000000300000000000000c12e013f7ea2fd3e000000000000000000000000020000000000000000000000d6b1203f559cbe3e000000000000000000000000020000000000000000000000278af43e1a48d73efdb6d03d00000000030000000000000001000000000000001c58033f8900893e0293493ecc5bb83c0000000001000000030000000200000061deb03eeff2af3e97de303ec87e0d3e03000000020000000000000005000000aca9b03e3d57b03eaaa9303e84540d3e0300000002000000000000000500000056d0b13e1e3eaa3ed660333e4482143e03000000020000000000000005000000822f303ffba09f3e0000000000000000030000000000000000000000000000002251383fbc5d8f3e000000000000000003000000000000000000000000000000bb50293f8b5ead3e0000000000000000030000000000000000000000000000001cfa263fc80bb23e000000000000000000000000020000000000000000000000645a3c3f374b873e0000000000000000000000000200000000000000000000004a29323fd410413e0a94ec3d000000000000000002000000030000000000000067761c3f3113473e3113473e0000000000000000060000000200000000000000a66c283fcabc743e3e21d33d00000000000000000300000002000000000000006eb8483f5f10173ed01b8c3d000000000000000003000000020000000000000050a8123f4182b53e7ab4943d00000000000000000100000003000000000000009b38393fca8e0d3eca8e0d3e0000000000000000060000000200000000000000e4ae043f8736c43ec3ae493dc3ae493d00000000010000000e000000030000001638273fd48f313ed48f313e000000000000000006000000020000000000000065c52e3f3675223e3675223e00000000000000000600000002000000000000001752543fa3b72e3e00000000000000000000000002000000000000000000000007a73e3ff2b1823e00000000000000000000000002000000000000000000000003e1333ffa3d183efa3d183e00000000000000000600000002000000000000006dfb323ff4c54f3eae98c83d0000000000000000090000000200000000000000bf2c373fc9754a3e73aeb13d00000000000000000900000002000000000000003bb1133f4fecc43ed6891d3d000000000000000009000000020000000000000097052b3f22d73c3e8212973d8212973d000000000900000006000000020000003bb1133f4fecc43ed9891d3d00000000000000000900000002000000000000009a99193fcdcccc3e000000000000000009000000000000000000000000000000e3380e3f30a1bd3e24b4173d24b4173d000000000900000006000000020000009a99193fcdcccc3e00000000000000000900000000000000000000000000000024ac453fbb2d193e6b43a03d0000000009000000000000000b000000000000009a99193fcdcccc3e00000000000000000000000009000000000000000000000070911e3f21dd423e1edd423e00000000000000000200000009000000000000009a99193fcdcccc3e0000000000000000090000000000000000000000000000004fec443fd9891d3ed9899d3d0000000009000000000000000b000000000000009a99193fcccccc3e00000000000000000000000009000000000000000000000060371a3f4091cb3e0000000000000000090000000000000000000000000000004fec443fd9891d3ed9899d3d0000000009000000000000000b00000000000000f501193f49f3cd3ee2d28c380000000009000000000000000d000000000000006032443f134b1c3e1af59c3db71b8e3b09000000000000000b0000000d0000003b95533f2f44a93d2f44a93d446e063c09000000000000000b0000000d0000005555553faaaaaa3daaaaaa3d0000000009000000000000000b000000000000005555553faaaaaa3daaaaaa3d0000000009000000000000000b000000000000003b54553f82c9aa3da494aa3d00000000090000000b000000000000000000000093fa333f01b2333e63c7f83d00000000090000000b0000000a00000000000000cdcc4c3fcdcc4c3e0000000000000000090000000b0000000000000000000000286b4c3f499f4d3e1b15343a00000000090000000b0000000d0000000000000036b64b3fd2234c3ec46aa03b00000000090000000b0000000f000000000000003d19003f86cdff3e00000000000000000b000000090000000000000000000000591b003f4fc9ff3e0000000000000000090000000b0000000000000000000000664d333fc0ec613e4ebba13d000000000b000000090000000a00000000000000dad8fa3e7e27b13e51ff273e000000000b0000000a0000000900000000000000d195b93e5b9cb83ed5cd8d3e00000000090000000b0000000a00000000000000d4f1223f2360993ed5f0823d000000000b0000000a00000009000000000000005555553faaaaaa3daaaaaa3d0000000009000000000000000b00000000000000ae72473fa0034d3e428da93c00000000090000000b0000000f00000000000000d222f83ee9ebf73e5214ff3c000000000b000000090000000f00000000000000f189333f96626f3ed295423d93818e3c0b000000090000000d0000000f000000776f493f0b96aa3df925a13d8690513d0b0000000d000000090000000f00000002543c3fa3f7313eaa70b93d000000000b000000090000000f00000000000000f3322b3fb369493e2134f73d0b07633c0b000000090000000f00000010000000410b433f51dd333eb2d67f3d000000000b0000000f00000009000000000000009fdc3e3f50651e3e6850cc3d000000000b0000000d0000000f000000000000005555553faaaaaa3daaaaaa3d0000000009000000000000000b0000000000000089f9443f9ac3453e2b6dd03cdd89443c090000000b0000000f000000100000004fec443fd9891d3ed9899d3d0000000009000000000000000b0000000000000009aaf13e328cf13ed2f05b3d3cd5253b0b000000090000000f00000010000000d5551b3fdba06a3ee47fe73d801f513d0b000000090000000f000000100000004da94a3f7d8f133e9c96833d000000000b0000000f000000100000000000000006e8493fea5fd83dea5fd83d000000000b000000100000000f000000000000005555553faaaaaa3daaaaaa3d0000000009000000000000000b00000000000000dd21453f349e1c3eb0b49d3d0000000009000000000000000b00000000000000caba433f6bb82b3eddb88a3d000000000b0000000f00000010000000000000009ffce93e9ffce93e2db4843d749bad3c090000000b0000000f00000010000000a545433fa545433e228fbe3c228fbe3c090000000b000000100000000f0000006bf03a3f6c25873e926fbe3b000000000b0000000f0000001000000000000000d5073d3fda7e3d3e6092473dcfe9e33c0b0000000f00000009000000100000004f0b3b3fdd3a703e9f5f0e3d000000000b0000000f00000010000000000000001b9f133ff6487e3ea03ab33da03ab33d0b00000009000000100000000f000000bba8e73e7083e73e534f433d534f433d0b00000009000000100000000f000000daa2423f9974f53d9974f53d000000000b000000100000000f000000000000009a99193fcdcccc3e0000000000000000090000000000000000000000000000002fba683f8d2e3a3d8d2e3a3d0000000000000000040000000800000000000000e779643fc3305c3dc3305c3d000000000000000004000000080000000000000028ed4f3f2440d83d9f56a83d0000000000000000080000000600000000000000bbd3583f2a76ad3dfbeb8b3d00000000000000000600000008000000000000000296183f5701423e8730053e32ecac3d00000000080000000c00000006000000a83d053f5bb57e3e94a72a3ee458833d000000000c00000008000000060000002fba683f8a2eba3d0000000000000000000000000600000000000000000000007e15583f08aa1f3e000000000000000000000000060000000000000000000000e1d1453f8b401e3ee7ef943d0000000000000000060000000800000000000000884a393f4f33143e92a2063e00000000000000000600000008000000000000001710163ff7d93e3eb619f03da6b1e13d0000000008000000060000000c000000d8ea173f32e49b3e7518d13d00000000000000000c00000006000000000000007361273fa840643ed0c67e3d631f7a3d000000000c0000000600000008000000668e603fce8cfb3d0000000000000000000000000600000000000000000000001072403fc1377e3e0000000000000000000000000600000000000000000000007f0c353fb7e3743e36a95b3d000000000000000006000000080000000000000000b0293f122e5f3ee023f43d0000000000000000060000000800000000000000c1ba0b3f076c4d3ef4bb113e03dae33d0000000006000000080000000c0000002fa6243fbf2b263e6554163e779c433d00000000060000000c00000008000000b3a7313f9624403e86b9a23d727f1f3d000000000c00000006000000080000008b2c473fd34d633e0000000000000000000000000600000000000000000000005655553fa9aa2a3e000000000000000000000000060000000000000000000000fc27003ff0dfaa3e22b3083e3ab4033d0e000000000000000600000011000000ad0d173fa6e4d13e0000000000000000000000000600000000000000000000009e99bf3ed4979f3e65b9653e71c7b73d06000000000000000e0000001100000056d0b13e1e3eaa3ed660333e4482143e0e00000006000000000000001100000034a9293f92a2843e162ca03d00000000000000000e00000006000000000000003869063ff99fba3e5e36e23d00000000110000000600000000000000000000008b72313fea1a9d3e000000000000000000000000060000000000000000000000e7c8283f1ccd913eb308653d00000000000000000600000008000000000000000f0be53eaa64e13e1d41e63d0000000006000000000000001100000000000000b729243f9054833e0a60d13d00000000000000000600000008000000000000005460193f2a17743e84fbf03d0ba7373d0000000006000000080000000c000000b7f6163fd3306e3e41f2eb3dc8ec7f3d0000000006000000080000000c000000f70d1b3faf2f423ed2c6e73d166abb3d0000000006000000080000000c0000009796163f9796963eecf0f03d0000000000000000060000001100000000000000822f303ffba09f3e00000000000000000e000000000000000000000000000000bb50293f8b5ead3e00000000000000000e000000000000000000000000000000278af43e1a48d73efdb6d03d000000000e000000000000000100000000000000f433f43eb108a93eb686453e00000000110000000600000000000000000000004e68f43e0f1fce3e8ce2f53d00000000110000000600000000000000000000008cfb0a3f357a953e661d293e0000000000000000060000001100000000000000cef1233fcef1a33eb754213d00000000000000000600000008000000000000002770273f136da73efd299b3c00000000000000000600000008000000000000006bc12a3f2b7daa3e000000000000000000000000060000000000000000000000a576fd3e6719b03eeadf243e0000000000000000060000001100000000000000fc21233ff121a33eb7d0343d00000000000000000600000008000000000000007a7cec3e91a6ca3ee9b9113e0000000000000000060000001100000000000000b83e243f89ec9e3e33b0443d00000000000000000600000008000000000000007e17e53e558eda3e59b4003e000000000000000006000000110000000000000077890a3f44a8a53e9c890a3e00000000110000000600000000000000000000002cfc353f6c38703e9c5b5f3d0000000011000000060000000000000000000000e5b53f3f29a95c3e05fd113d000000001100000006000000000000000000000096b53a3fd074763ecba6f53c0000000011000000060000000000000000000000ee9f073f2bf0ac3ef29f073e0000000011000000060000000000000000000000951c3b3fd5c6893e0000000000000000110000000600000000000000000000004c143b3fd9f1763eabe7e53c00000000110000000600000000000000000000001b7d0b3ffaaccb3e83c66a3d000000001100000006000000000000000000000074d7e63e85ded33e0d940a3e0000000006000000000000001100000000000000307b403f3f137e3e0000000000000000110000000600000000000000000000001ff30d3ffaa3983e91eb163e0000000006000000110000000000000000000000abaa2a3fafaa2a3ea6aa2a3e0000000000000000090000000600000000000000e5e7ed3e13a7d23e1fc4fd3d00000000000000000600000011000000000000009220253fdcbe353edcbe353e0000000000000000060000000900000000000000f89e193f0fc2cc3e00000000000000000000000009000000000000000000000040dacf3ea41fbb3e380c6a3e0000000006000000110000000000000000000000a547cb3e91fabd3e947b6d3e00000000060000001100000000000000000000000a71f43e949ac93ec4e8033e00000000000000000600000011000000000000008102d33e8439b93ef687673e000000000600000011000000000000000000000070911e3f21dd423e1edd423e00000000000000000600000009000000000000009a99193fcccccc3e000000000000000000000000090000000000000000000000f501193f49f3cd3ee2d28c380000000009000000000000001200000000000000bfe1f43ec6bdc33ef6c00e3e00000000060000000000000011000000000000008366be3e17b9bc3e67e0843e0000000011000000060000000000000000000000e1ad193f3da4cc3e00000000000000000000000006000000000000000000000007a73e3ff2b1823e000000000000000000000000060000000000000000000000d6b1203f559cbe3e000000000000000000000000060000000000000000000000badc133f8c46d83e000000000000000000000000060000000000000000000000645a3c3f374b873e000000000000000000000000060000000000000000000000bd60ff3e267dbf3e3b44023e0000000006000000000000001100000000000000c981073f6dfcf03e0000000000000000060000000000000000000000000000000cb8ff3eb43bc03e8218003e0000000006000000000000001100000000000000c12e013f7ea2fd3e0000000000000000000000000600000000000000000000001cfa263fc80bb23e0000000000000000000000000600000000000000000000001638273fd48f313ed48f313e00000000000000000600000002000000000000001f7efa3e1be7893e8c35773e0000000006000000000000001100000000000000bc67f83eb99dc13e16f50b3e0000000011000000060000000000000000000000cb042e3f96b4653e7d70c43d00000000110000000600000000000000000000002abbed3e6ed1d53ea1cdf13d00000000110000000600000000000000000000007615ac3e0d57a43ef5e9623e097af83d060000000e000000000000001100000061deb03eeff2af3e97de303ec87e0d3e0e000000060000000000000011000000aca9b03e3d57b03eaaa9303e84540d3e0e0000000600000000000000110000002251383fbc5d8f3e00000000000000000e000000000000000000000000000000822f303ffba09f3e00000000000000000e00000000000000000000000000000056d0b13e1e3eaa3ed660333e4482143e0e000000060000000000000011000000d162c83efa20833ea908803e2eced13d060000000e0000000000000011000000afca013f91aad23e4300a73d0000000006000000000000000e00000000000000564a313f556b9d3e00000000000000000e000000000000000000000000000000d3760f3f5912e13e00000000000000000e000000000000000000000000000000bb50293f8b5ead3e00000000000000000e0000000000000000000000000000008f11113fb442ac3eb968c63d0000000000000000060000000e00000000000000278af43e1a48d73efdb6d03d000000000e0000000000000001000000000000001c58033f8900893e0293493ecc5bb83c00000000010000000e00000006000000a66c283fcabc743e3e21d33d00000000000000000e00000006000000000000004a29323fd410413e0a94ec3d0000000000000000060000000e000000000000006eb8483f5f10173ed01b8c3d00000000000000000e000000060000000000000050a8123f4182b53e7ab4943d0000000000000000010000000e000000000000009b38393fca8e0d3eca8e0d3e0000000000000000060000000200000000000000e4ae043f8736c43ec3ae493dc3ae493d00000000010000000e0000000300000067761c3f3113473e3113473e000000000000000006000000020000000000000065c52e3f3675223e3675223e00000000000000000600000002000000000000001752543fa3b72e3e00000000000000000000000006000000000000000000000003e1333ffa3d183efa3d183e0000000000000000060000000200000000000000bf2c373fc9754a3e73aeb13d00000000000000000900000006000000000000006dfb323ff4c54f3eae98c83d00000000000000000900000006000000000000003bb1133f4fecc43ed6891d3d00000000000000000900000006000000000000003bb1133f4fecc43ed9891d3d000000000000000009000000060000000000000097052b3f22d73c3e8212973d8212973d000000000900000006000000020000009a99193fcdcccc3e000000000000000009000000000000000000000000000000e3380e3f30a1bd3e24b4173d24b4173d000000000900000006000000020000009a99193fcdcccc3e00000000000000000900000000000000000000000000000024ac453fbb2d193e6b43a03d0000000009000000000000000b000000000000009a99193fcdcccc3e0000000000000000000000000900000000000000000000009a99193fcdcccc3e0000000000000000090000000000000000000000000000004fec443fd9891d3ed9899d3d0000000009000000000000000b000000000000005555553faaaaaa3daaaaaa3d0000000009000000000000000b0000000000000060371a3f4091cb3e0000000000000000090000000000000000000000000000004fec443fd9891d3ed9899d3d0000000009000000000000000b000000000000005555553faaaaaa3daaaaaa3d0000000009000000000000000b00000000000000286b4c3f499f4d3e1b15343a00000000090000000b0000001200000000000000cdcc4c3fcdcc4c3e0000000000000000090000000b00000000000000000000003b95533f2f44a93d2f44a93d446e063c09000000000000000b000000120000006032443f134b1c3e1af59c3db71b8e3b09000000000000000b0000001200000036b64b3fd2234c3ec46aa03b00000000090000000b00000010000000000000005555553faaaaaa3daaaaaa3d0000000009000000000000000b00000000000000ae72473fa0034d3e428da93c00000000090000000b00000010000000000000005555553faaaaaa3daaaaaa3d0000000009000000000000000b0000000000000089f9443f9ac3453e2b6dd03cdd89443c090000000b000000100000000f0000005555553faaaaaa3daaaaaa3d0000000009000000000000000b00000000000000dd21453f349e1c3eb0b49d3d0000000009000000000000000b000000000000004fec443fd9891d3ed9899d3d0000000009000000000000000b000000000000003d19003f86cdff3e00000000000000000b000000090000000000000000000000d222f83ee9ebf73e5214ff3c000000000b00000009000000100000000000000009aaf13e328cf13ed2f05b3d3cd5253b0b00000009000000100000000f0000009ffce93e9ffce93e2db4843d749bad3c090000000b000000100000000f000000f189333f96626f3ed295423d93818e3c0b00000009000000120000001000000002543c3fa3f7313eaa70b93d000000000b000000090000001000000000000000664d333fc0ec613e4ebba13d000000000b000000090000000a00000000000000f3322b3fb369493e2134f73d0b07633c0b00000009000000100000000f000000d5551b3fdba06a3ee47fe73d801f513d0b00000009000000100000000f000000776f493f0b96aa3df925a13d8690513d0b000000120000000900000010000000fe90553f64daaa3daf9da83d000000000b000000090000000a000000000000005ef3543f1847293e8adc3a3b000000000b000000120000001000000000000000410b433f51dd333eb2d67f3d000000000b0000001000000009000000000000009fdc3e3f50651e3e6850cc3d000000000b000000120000001000000000000000591b003f4fc9ff3e0000000000000000090000000b0000000000000000000000dad8fa3e7e27b13e51ff273e000000000b0000000a0000000900000000000000d4f1223f2360993ed5f0823d000000000b0000000a000000090000000000000033d6383f60b6143e41e5073e2d4339380b000000120000000a00000010000000e981063f6515d83e4536573d000000000b0000000a00000009000000000000001ea4e33e959cd63e9a7e0b3e000000000a0000000b0000000900000000000000da5f1d3f829d743e17e3153e000000000b0000000a0000001200000000000000d195b93e5b9cb83ed5cd8d3e00000000090000000b0000000a0000000000000060d1e13e50178f3e50178f3e000000000a000000090000000b0000000000000093fa333f01b2333e63c7f83d00000000090000000b0000000a00000000000000757a0a3fddcda53e747a0a3e00000000090000000a0000000b000000000000003b54553f82c9aa3da494aa3d00000000090000000b0000000000000000000000677f2f3f769c353eed658c3ded658c3d090000000a000000000000000b00000014ec443fd47d1d3ec5899d3d389e4f3809000000000000000b00000012000000ef21333f175b0f3e02ecb83d5a4e8f3d09000000000000000a0000000b00000012f0133f08f39c3e4fb36c3d4fb36c3d090000000a000000000000000b000000385df33e9cbbcf3eb09cf33d00000000090000000a0000000b00000000000000bb3fed3e2260893e2260893e000000000a000000090000000b00000000000000f1e1ef3e8b16cc3e070f083e000000000a0000000b0000000900000000000000ad3cfd3e44d4e83e79784f3d000000000b0000000a00000009000000000000009f321d3f5f924e3e3184fb3d32847b3d090000000a000000000000000b0000002478113f9bdfa23e9bc1683d4fbf683d090000000a0000000b000000000000003438f63e033bcc3e2433f63d00000000090000000a0000000b00000000000000b633ec3e25e6893e25e6893e000000000a000000090000000b000000000000007c36f13eec87ca3e3083083e000000000a0000000b000000090000000000000083f3f93e0e2eed3e77f3463d000000000b0000000a00000009000000000000006d53013f08a5ca3e7fd0ca3d000000000b0000000a000000120000000000000085431a3f1bd45d3e6ed2f63d6fd2763d090000000a000000000000000b0000000f1f133fa9e89e3ee6646b3de6646b3d090000000a000000000000000b0000002d59fb3e87d0c53e2e59fb3d00000000090000000a0000000b000000000000003c14ee3ef904893ecbe6883e000000000a0000000b0000000900000000000000f554f03e12a8cb3ef105083e000000000a0000000b0000000900000000000000e3cbfd3eecd2e83e84094b3d000000000b0000000a0000000900000000000000d6d1ec3ed473b43eac74bd3dac74bd3d0b0000000a000000120000000d00000083f3f93e0e2eed3e77f3463d000000000b0000000a00000009000000000000007c36f13eec87ca3e3083083e000000000a0000000b0000000900000000000000b633ec3e25e6893e25e6893e000000000a000000090000000b00000000000000385df33e9cbbcf3eb09cf33d00000000090000000a0000000b0000000000000064ea1b3f2c3d553e0677f93d0777793d090000000a000000000000000b000000bb3fed3e2260893e2260893e000000000a000000090000000b00000000000000757a0a3fddcda53e747a0a3e00000000090000000a0000000b00000000000000f1e1ef3e8b16cc3e070f083e000000000a0000000b0000000900000000000000ad3cfd3e44d4e83e79784f3d000000000b0000000a00000009000000000000001ea4e33e959cd63e9a7e0b3e000000000a0000000b000000090000000000000060d1e13e50178f3e50178f3e000000000a000000090000000b000000000000006d53013f08a5ca3e7fd0ca3d000000000b0000000a0000000d00000000000000677f2f3f769c353eed658c3ded658c3d090000000a000000000000000b00000014ec443fd47d1d3ec5899d3d389e4f3809000000000000000b0000000d000000e981063f6515d83e4536573d000000000b0000000a0000000900000000000000bdd6083f423cab3e862c063e000000000b0000000a0000000d00000000000000da5f1d3f829d743e17e3153e000000000b0000000a0000000d0000000000000033d6383f60b6143e41e5073e2d4339380b0000000d0000000a0000000f000000fe90553f64daaa3daf9da83d000000000b000000090000000a000000000000005ef3543f1847293e8adc3a3b000000000b0000000d0000000f000000000000004e68f43e0f1fce3e8ce2f53d00000000050000000200000000000000000000002cfc353f6c38703e9c5b5f3d00000000050000000200000000000000000000003869063ff99fba3e5e36e23d000000000500000002000000000000000000000096b53a3fd074763ecba6f53c0000000005000000020000000000000000000000e5b53f3f29a95c3e05fd113d00000000050000000200000000000000000000004c143b3fd9f1763eabe7e53c0000000005000000020000000000000000000000951c3b3fd5c6893e000000000000000005000000020000000000000000000000307b403f3f137e3e00000000000000000500000002000000000000000000000077890a3f44a8a53e9c890a3e0000000005000000020000000000000000000000ee9f073f2bf0ac3ef29f073e00000000050000000200000000000000000000001b7d0b3ffaaccb3e83c66a3d00000000050000000200000000000000000000007a7cec3e91a6ca3ee9b9113e00000000000000000200000005000000000000007e17e53e558eda3e59b4003e0000000000000000020000000500000000000000b83e243f89ec9e3e33b0443d000000000000000002000000040000000000000074d7e63e85ded33e0d940a3e00000000020000000000000005000000000000001ff30d3ffaa3983e91eb163e000000000200000005000000000000000000000040dacf3ea41fbb3e380c6a3e0000000002000000050000000000000000000000227b403f78137e3e000000000000000005000000020000000000000000000000e3223a3f2fb3753e1705073d0000000005000000020000000000000000000000287b403f60137e3e0000000000000000050000000200000000000000000000004c143b3fd9f1763eabe7e53c0000000005000000020000000000000000000000307b403f3f137e3e00000000000000000500000002000000000000000000000096b53a3fd074763ecba6f53c00000000050000000200000000000000000000000000803f00000000000000000000000005000000000000000000000000000000800e673f9bd8b83d2f36eb3b0000000005000000020000000d0000000000000068766a3fc34cac3d0000000000000000050000000200000000000000000000000000803f000000000000000000000000050000000000000000000000000000008b53703f4fc77a3d000000000000000005000000020000000000000000000000a547cb3e91fabd3e947b6d3e000000000200000005000000000000000000000040dacf3ea41fbb3e380c6a3e0000000002000000050000000000000000000000227b403f78137e3e000000000000000005000000020000000000000000000000287b403f60137e3e0000000000000000050000000200000000000000000000000000803f000000000000000000000000050000000000000000000000000000002cba683fa12eba3d000000000000000005000000020000000000000000000000307b403f3f137e3e0000000000000000050000000200000000000000000000000000803f000000000000000000000000050000000000000000000000000000002bba683fa92eba3d000000000000000005000000020000000000000000000000951c3b3fd5c6893e0000000000000000050000000200000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000003eba683f102eba3d0000000000000000050000000200000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000bff663fa807c83d0000000000000000050000000200000000000000000000001b7d0b3ffaaccb3e83c66a3d00000000050000000200000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f00000000000000000000000005000000000000000000000000000000cb3c673fac19c63d0000000000000000050000000200000000000000000000001ff30d3ffaa3983e91eb163e00000000020000000500000000000000000000000000803f0000000000000000000000000500000000000000000000000000000068766a3fc34cac3d00000000000000000500000002000000000000000000000040dacf3ea41fbb3e380c6a3e00000000020000000500000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000007f8b6a3f07a4ab3d0000000000000000050000001300000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f0000000000000000000000000500000000000000000000000000000012187a3fb2fdbc3c000000000000000005000000130000000000000000000000d88b083f50e8ee3e0000000000000000130000000500000000000000000000002200003fbcffff3e0000000000000000050000001300000000000000000000000000803f000000000000000000000000130000000000000000000000000000002000003fc1ffff3e0000000000000000050000001300000000000000000000000000803f000000000000000000000000130000000000000000000000000000002b00003fa9ffff3e0000000000000000050000001300000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000006a93123f2cd9da3e0000000000000000130000000500000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000009cd6063fc852f23e0000000000000000130000000500000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f00000000000000000000000013000000000000000000000000000000932d403fb5497f3e000000000000000013000000140000000000000000000000ce3e423fca04773e000000000000000013000000140000000000000000000000cee23f3f643a803e0000000000000000130000001400000000000000000000000000803f0000000000000000000000001300000000000000000000000000000094e6033fd732f83e0000000000000000050000001300000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000a00403fd8ff7f3e0000000000000000130000001400000000000000000000004393003f7ad9fe3e0000000000000000140000001300000000000000000000005f88013f42effc3e0000000000000000130000001400000000000000000000000300003ffaffff3e0000000000000000130000001400000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000000000803f000000000000000000000000050000000000000000000000000000002400003fb9ffff3e00000000000000000500000013000000000000000000000012187a3fb2fdbc3c0000000000000000050000001300000000000000000000006a93123f2cd9da3e0000000000000000130000000500000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f0000000000000000000000001300000000000000000000000000000028b7723f7e8d543d0000000000000000130000001400000000000000000000000800403fdeff7f3e0000000000000000130000001400000000000000000000000c00403fd0ff7f3e000000000000000013000000140000000000000000000000d067403fbe607e3e00000000000000001300000014000000000000000000000065e4433f6a6e703e000000000000000013000000140000000000000000000000cee23f3f643a803e0000000000000000130000001400000000000000000000001800003fd0ffff3e0000000000000000130000001400000000000000000000000000003f0000003f0000000000000000140000001300000000000000000000000e00003fe4ffff3e000000000000000013000000140000000000000000000000ba72003f8d1aff3e000000000000000013000000140000000000000000000000ed06023f27f2fb3e0000000000000000130000001400000000000000000000000300003ffaffff3e0000000000000000130000001400000000000000000000005f893f3f43ed803e0000000000000000140000001300000000000000000000009506413faae57b3e000000000000000014000000130000000000000000000000a56e3c3fb722873e0000000000000000140000001300000000000000000000000000803f00000000000000000000000014000000000000000000000000000000ef5b663f8b20cd3d00000000000000001400000015000000000000000000000034396b3f6336a63d000000000000000014000000150000000000000000000000430a3f3f7aeb813e000000000000000014000000130000000000000000000000efff3f3f2200803e0000000000000000140000001300000000000000000000000000803f00000000000000000000000014000000000000000000000000000000f0ff3f3f2100803e0000000000000000140000001300000000000000000000000000803f000000000000000000000000140000000000000000000000000000000000803f00000000000000000000000014000000000000000000000000000000adab3d3fa7a8843e000000000000000014000000130000000000000000000000f3ff3f3f1b00803e0000000000000000140000001300000000000000000000000000803f00000000000000000000000014000000000000000000000000000000430a3f3f7aeb813e00000000000000001400000013000000000000000000000034396b3f6336a63d0000000000000000140000001500000000000000000000000000803f000000000000000000000000140000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000001d80443f8dff6d3e0000000000000000150000001600000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f000000000000000000000000130000000000000000000000000000000000803f00000000000000000000000013000000000000000000000000000000fa02073ff803b43e4dd8f73d0000000009000000000000000a000000000000007efc063f2ab5b33e6447f93d0000000009000000000000000a000000000000002bcf113f8f69c23ed0c04f3d0000000000000000090000000a00000000000000159e073f42edb53e0e0d713d92a7653d0000000009000000080000000a0000008868093fb67eb83e9547883da1f2143d0000000009000000080000000a0000009106243f3fbb263ecdf8d63d2b5cbb3d0000000009000000080000000c00000021d2263f6ad8233eab7beb3d7b42963d0000000009000000080000000c000000942b2d3ff5f1283ebb5f223e0000000000000000080000000c00000000000000a73c2f3fa53c2f3ed6a6ed3dbceae73c0000000009000000080000000c000000212c153fd410c73e0d2bc63c860e8d3b00000000090000000800000012000000763d0d3f63e4ba3ec082aa3d0000000000000000090000000800000000000000c62e113f3e0ec33eb5a1543d0000000009000000000000000a000000000000007070193f2b6bcc3e3af5b33a000000000900000000000000120000000000000090e9083fef35b63ec7dbdf3d0000000009000000000000000a00000000000000326c213f9b27bd3e0000000000000000000000000100000000000000000000003dcf733f2c0c433d0000000000000000000000000100000000000000000000000831283fef9daf3e0000000000000000000000000100000000000000000000003dcf733f340c433d0000000000000000000000000100000000000000000000000831283fef9daf3e0000000000000000000000000100000000000000000000000438223ff88fbb3e000000000000000000000000010000000000000000000000b6602f3f943ea13e00000000000000000000000001000000000000000000000078d9673f4434c13d0000000000000000000000000600000000000000000000007929193f4969903e130ff53d0000000000000000010000000e000000000000003869063ff99fba3e5e36e23d0000000011000000060000000000000000000000f7d2383fc0f7733e92f1223d000000001100000006000000000000000000000096b53a3fd074763ecba6f53c0000000011000000060000000000000000000000e3223a3f2fb3753e1705073d0000000011000000060000000000000000000000173b333fcf956c3ea9fb8c3d0000000011000000060000000000000000000000227b403f78137e3e000000000000000011000000060000000000000000000000287b403f60137e3e0000000000000000110000000600000000000000000000004c143b3fd9f1763eabe7e53c0000000011000000060000000000000000000000307b403f3f137e3e0000000000000000110000000600000000000000000000000000803f00000000000000000000000011000000000000000000000000000000800e673f9bd8b83d2f36eb3b00000000110000000600000012000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f0000000000000000000000001100000000000000000000000000000068766a3fc34cac3d000000000000000011000000060000000000000000000000a547cb3e91fabd3e947b6d3e000000000600000011000000000000000000000040dacf3ea41fbb3e380c6a3e00000000060000001100000000000000000000008b53703f4fc77a3d0000000000000000110000000600000000000000000000000000803f00000000000000000000000011000000000000000000000000000000227b403f78137e3e0000000000000000110000000600000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000002cba683fa12eba3d000000000000000011000000060000000000000000000000287b403f60137e3e0000000000000000110000000600000000000000000000000000803f000000000000000000000000110000000000000000000000000000002bba683fa92eba3d000000000000000011000000060000000000000000000000307b403f3f137e3e0000000000000000110000000600000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000003eba683f102eba3d000000000000000011000000060000000000000000000000951c3b3fd5c6893e0000000000000000110000000600000000000000000000000bff663fa807c83d0000000000000000110000000600000000000000000000000000803f000000000000000000000000110000000000000000000000000000001b7d0b3ffaaccb3e83c66a3d00000000110000000600000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f00000000000000000000000011000000000000000000000000000000cb3c673fac19c63d0000000000000000110000000600000000000000000000001ff30d3ffaa3983e91eb163e00000000060000001100000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f0000000000000000000000001100000000000000000000000000000068766a3fc34cac3d00000000000000001100000006000000000000000000000040dacf3ea41fbb3e380c6a3e00000000060000001100000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f0000000000000000000000001100000000000000000000000000000012187a3fb2fdbc3c0000000000000000110000001700000000000000000000002b00003fa9ffff3e0000000000000000110000001700000000000000000000009cd6063fc852f23e00000000000000001700000011000000000000000000000094e6033fd732f83e0000000000000000110000001700000000000000000000007f8b6a3f07a4ab3d0000000000000000110000001700000000000000000000002000003fc1ffff3e0000000000000000110000001700000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000002200003fbcffff3e000000000000000011000000170000000000000000000000d88b083f50e8ee3e0000000000000000170000001100000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000006a93123f2cd9da3e0000000000000000170000001100000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f0000000000000000000000001700000000000000000000000000000028b7723f7e8d543d0000000000000000170000001800000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f0000000000000000000000001700000000000000000000000000000065e4433f6a6e703e0000000000000000170000001800000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f00000000000000000000000017000000000000000000000000000000cee23f3f643a803e0000000000000000170000001800000000000000000000000300003ffaffff3e0000000000000000170000001800000000000000000000000000803f000000000000000000000000170000000000000000000000000000000000803f000000000000000000000000170000000000000000000000000000002400003fb9ffff3e0000000000000000110000001700000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000006a93123f2cd9da3e0000000000000000170000001100000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f0000000000000000000000001100000000000000000000000000000012187a3fb2fdbc3c0000000000000000110000001700000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f000000000000000000000000110000000000000000000000000000000000803f00000000000000000000000011000000000000000000000000000000d5073d3fda7e3d3e6092473dcfe9e33c0b00000010000000090000000f0000004f0b3b3fdd3a703e9f5f0e3d000000000b000000100000000f000000000000004da94a3f7d8f133e9c96833d000000000b000000100000000f000000000000006bf03a3f6c25873e926fbe3b000000000b000000100000000f0000000000000006e8493fea5fd83dea5fd83d000000000b000000100000000f000000000000001b9f133ff6487e3ea03ab33da03ab33d0b00000009000000100000000f000000bba8e73e7083e73e534f433d534f433d0b00000009000000100000000f000000caba433f6bb82b3eddb88a3d000000000b000000100000000f00000000000000a545433fa545433e228fbe3c228fbe3c090000000b000000100000000f000000daa2423f9974f53d9974f53d000000000b000000100000000f00000000000000bdd6083f423cab3e862c063e000000000b0000000a00000012000000000000000a00403fd8ff7f3e0000000000000000170000001800000000000000000000000800403fdeff7f3e000000000000000017000000180000000000000000000000932d403fb5497f3e000000000000000017000000180000000000000000000000ce3e423fca04773e0000000000000000170000001800000000000000000000001800003fd0ffff3e0000000000000000170000001800000000000000000000000000003f0000003f0000000000000000180000001700000000000000000000004393003f7ad9fe3e0000000000000000180000001700000000000000000000005f88013f42effc3e0000000000000000170000001800000000000000000000000300003ffaffff3e000000000000000017000000180000000000000000000000a56e3c3fb722873e0000000000000000180000001700000000000000000000009506413faae57b3e0000000000000000180000001700000000000000000000000000803f000000000000000000000000180000000000000000000000000000005f893f3f43ed803e000000000000000018000000170000000000000000000000efff3f3f2200803e000000000000000018000000170000000000000000000000ef5b663f8b20cd3d0000000000000000180000001900000000000000000000000000803f000000000000000000000000180000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000001d80443f8dff6d3e0000000000000000190000001a0000000000000000000000cee23f3f643a803e000000000000000017000000180000000000000000000000430a3f3f7aeb813e00000000000000001800000017000000000000000000000034396b3f6336a63d0000000000000000180000001900000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f00000000000000000000000018000000000000000000000000000000f0ff3f3f2100803e0000000000000000180000001700000000000000000000000e00003fe4ffff3e0000000000000000170000001800000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f00000000000000000000000018000000000000000000000000000000adab3d3fa7a8843e000000000000000018000000170000000000000000000000ba72003f8d1aff3e0000000000000000170000001800000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000c00403fd0ff7f3e000000000000000017000000180000000000000000000000d067403fbe607e3e000000000000000017000000180000000000000000000000ed06023f27f2fb3e000000000000000017000000180000000000000000000000f3ff3f3f1b00803e000000000000000018000000170000000000000000000000430a3f3f7aeb813e0000000000000000180000001700000000000000000000000000803f0000000000000000000000001800000000000000000000000000000034396b3f6336a63d0000000000000000180000001900000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000180000000000000000000000000000009a99193fcdcccc3e0000000000000000090000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000300003ffaffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000100003ffeffff3e00000000000000001c0000001b00000000000000000000000000003f0000003f00000000000000001b0000001c00000000000000000000000400003ff9ffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000400003ff9ffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000100003ffeffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000200003ffcffff3e00000000000000001c0000001b00000000000000000000000200003ffdffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000200003ffcffff3e00000000000000001c0000001b00000000000000000000000300003ffbffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000600003ff4ffff3e00000000000000001c0000001b00000000000000000000000500003ff6ffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000400003ff8ffff3e00000000000000001c0000001b00000000000000000000000200003ffdffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c00000000000000000000000000000069362c3f2d93a73e00000000000000001d0000001c00000000000000000000001499283fd9cdae3e00000000000000001d0000001c0000000000000000000000b57d113f9504dd3e00000000000000001d0000001c0000000000000000000000d8600a3f513eeb3e00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001c000000000000000000000000000000a0aa2a3fc0aaaa3e00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000009faa2a3fc3aaaa3e00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000500003ff6ffff3e00000000000000001c0000001d00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000500003ff6ffff3e00000000000000001c0000001d00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000009d300b3fc59ee93e00000000000000001d0000001c00000000000000000000008d3d113fe684dd3e00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000009faa2a3fc3aaaa3e00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000003f0000003f00000000000000001b0000001c00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000200003ffdffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000200003ffcffff3e00000000000000001c0000001b00000000000000000000000200003ffdffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000200003ffdffff3e00000000000000001c0000001b00000000000000000000000200003ffdffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000200003ffdffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000200003ffdffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000001d00003fc7ffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001b000000000000000000000000000000aa2b003faba8ff3e00000000000000001b0000001c00000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000200003ffdffff3e00000000000000001c0000001b00000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001b0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001c0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000300003ffaffff3e00000000000000001f0000001e00000000000000000000000100003ffeffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000400003ff9ffff3e00000000000000001f0000001e00000000000000000000000100003ffeffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000003f0000003f00000000000000001e0000001f00000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000200003ffcffff3e00000000000000001f0000001e00000000000000000000000200003ffdffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000200003ffcffff3e00000000000000001f0000001e00000000000000000000000300003ffbffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000600003ff4ffff3e00000000000000001f0000001e00000000000000000000000500003ff6ffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000400003ff8ffff3e00000000000000001f0000001e00000000000000000000000200003ffdffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000001d00003fc7ffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e000000000000000000000000000000aa2b003faba8ff3e00000000000000001e0000001f00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000200003ffdffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000200003ffdffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000200003ffdffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000200003ffdffff3e00000000000000001f0000001e00000000000000000000000200003ffdffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000200003ffdffff3e00000000000000001f0000001e00000000000000000000000200003ffcffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000400003ff9ffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000003f0000003f00000000000000001e0000001f00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000200003ffdffff3e00000000000000001f0000001e00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000008d3d113fe684dd3e0000000000000000200000001f00000000000000000000009d300b3fc59ee93e0000000000000000200000001f00000000000000000000000500003ff6ffff3e00000000000000001f0000002000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000500003ff6ffff3e00000000000000001f0000002000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000009faa2a3fc3aaaa3e0000000000000000200000001f00000000000000000000000000803f0000000000000000000000001f000000000000000000000000000000d8600a3f513eeb3e0000000000000000200000001f0000000000000000000000b57d113f9504dd3e0000000000000000200000001f00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f00000000000000000000000000000069362c3f2d93a73e0000000000000000200000001f00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000001499283fd9cdae3e0000000000000000200000001f00000000000000000000000000803f0000000000000000000000001f000000000000000000000000000000a0aa2a3fc0aaaa3e0000000000000000200000001f00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000009faa2a3fc3aaaa3e0000000000000000200000001f00000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001e0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f0000000000000000000000001f0000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f0000000000000000000000002100000000000000000000000000000068712a3f301dab3e0000000000000000210000002200000000000000000000008aaa2a3fedaaaa3e0000000000000000210000002200000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f00000000000000000000000022000000000000000000000000000000bfda2a3f834aaa3e0000000000000000210000002200000000000000000000000000803f000000000000000000000000210000000000000000000000000000008caa2a3fe8aaaa3e0000000000000000210000002200000000000000000000000000803f00000000000000000000000022000000000000000000000000000000af6b273fa328b13e0000000000000000220000002300000000000000000000005caa2a3f47abaa3e0000000000000000220000002300000000000000000000009aaa2a3fcbaaaa3e00000000000000002200000023000000000000000000000098aa2a3fd0aaaa3e0000000000000000220000002300000000000000000000000000803f0000000000000000000000002300000000000000000000000000000067ab2a3f31a9aa3e0000000000000000230000002200000000000000000000000000803f0000000000000000000000002300000000000000000000000000000005a5013ff6b5fc3e000000000000000023000000240000000000000000000000a47d003fb804ff3e000000000000000023000000240000000000000000000000a02c123fc0a6db3e0000000000000000220000002100000000000000000000000a00003fedffff3e0000000000000000230000002500000000000000000000009fbec93e2e809c3e33c1993e000000001500000023000000250000000000000085371a3ff790cb3e0000000000000000150000002300000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f0000000000000000000000001500000000000000000000000000000029b0dc3e0ba8913ecda7913e00000000150000002500000026000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000006775163f504ac53e1caedc3c00000000150000002600000025000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000300003ffaffff3e0000000000000000150000001600000000000000000000001d80443f8dff6d3e0000000000000000150000001600000000000000000000001e33023fc499fb3e0000000000000000160000001500000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000160000000000000000000000000000000000803f000000000000000000000000160000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000003f0000003f0000000000000000270000001600000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000160000000000000000000000000000000c00003fe9ffff3e000000000000000016000000150000000000000000000000df48123f426edb3e000000000000000015000000160000000000000000000000d1784c3fbb1c4e3e0000000000000000150000002400000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000240000000000000000000000000000000000803f00000000000000000000000024000000000000000000000000000000ffaa2a3f03aaaa3e000000000000000028000000270000000000000000000000fbb9273f0b8cb03e0000000000000000280000002700000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f00000000000000000000000028000000000000000000000000000000aaaa2a3facaaaa3e0000000000000000280000002700000000000000000000000000803f000000000000000000000000280000000000000000000000000000008990283fefdeae3e0000000000000000280000002700000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f00000000000000000000000021000000000000000000000000000000bfda2a3f834aaa3e0000000000000000210000002200000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f000000000000000000000000210000000000000000000000000000008caa2a3fe8aaaa3e0000000000000000210000002200000000000000000000000000803f000000000000000000000000210000000000000000000000000000000000803f00000000000000000000000021000000000000000000000000000000af1a283fa3caaf3e000000000000000021000000220000000000000000000000f6ae2a3f15a2aa3e000000000000000021000000220000000000000000000000252f123fb6a1db3e000000000000000022000000210000000000000000000000a02c123fc0a6db3e000000000000000022000000210000000000000000000000034a123ffa6bdb3e000000000000000022000000210000000000000000000000aa4e2a3fad62ab3e00000000000000002200000023000000000000000000000098aa2a3fd0aaaa3e00000000000000002200000023000000000000000000000070ab2a3f21a9aa3e00000000000000002300000022000000000000000000000069a92a3f2dadaa3e0000000000000000220000002300000000000000000000005caa2a3f47abaa3e0000000000000000220000002300000000000000000000007ec5133f0375d83e00000000000000002200000021000000000000000000000058ab2a3f51a9aa3e00000000000000002300000022000000000000000000000067ab2a3f31a9aa3e0000000000000000230000002200000000000000000000000eab2a3fe3a9aa3e00000000000000002300000022000000000000000000000011a5033fa821ea3e6b43e93c000000002500000023000000290000000000000072ec003f1d27fe3e00000000000000002500000023000000000000000000000091aa2a3fdeaaaa3e000000000000000025000000290000000000000000000000c8aa2a3f71aaaa3e00000000000000002500000029000000000000000000000056312a3f549dab3e0000000000000000290000002500000000000000000000007baa2a3f0babaa3e000000000000000029000000250000000000000000000000af40123fa27edb3e0000000000000000290000002a000000000000000000000091b9313fdf8c9c3e0000000000000000290000002500000000000000000000002149123fbe6ddb3e0000000000000000290000002a000000000000000000000048e8123f6f2fda3e0000000000000000290000002a000000000000000000000058242b3f4fb7a93e00000000000000002a000000290000000000000000000000f4732a3f1718ab3e00000000000000002a00000029000000000000000000000063c4113f3a77dc3e0000000000000000290000002a00000000000000000000007aaa2a3f0babaa3e000000000000000029000000250000000000000000000000aaaa2a3facaaaa3e00000000000000002500000029000000000000000000000052f1013f5c1dfc3e000000000000000026000000250000000000000000000000d460013f5bbbf73ea45f303c0000000026000000250000002b000000000000002a80233fadffb83e0000000000000000260000002b00000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a000000000000000000000000000000a5aa2a3fb6aaaa3e00000000000000002a000000290000000000000000000000a7aa2a3fb2aaaa3e00000000000000002a0000002900000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c000000000000000000000000000000b6542a3f9456ab3e00000000000000002c0000002b00000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c000000000000000000000000000000cea92a3f63acaa3e00000000000000002c0000002b00000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c00000000000000000000000000000058aa2a3f51abaa3e00000000000000002c0000002b00000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c00000000000000000000000000000091d32b3fde58a83e00000000000000002c0000002b00000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c0000000000000000000000000000000000803f0000000000000000000000002c00000000000000000000000000000076aa2a3f14abaa3e00000000000000002c0000002b000000000000000000000013202c3fdabfa73e00000000000000002c0000002b00000000000000000000000000803f0000000000000000000000002b0000000000000000000000000000000000803f0000000000000000000000002b00000000000000000000000000000094aa2a3fd9aaaa3e00000000000000002b00000026000000000000000000000090aa2a3fe1aaaa3e00000000000000002b000000260000000000000000000000ca49123f6b6cdb3e00000000000000002b0000002c000000000000000000000076aa2a3f14abaa3e00000000000000002c0000002b000000000000000000000094aa2a3fd8aaaa3e00000000000000002b0000002600000000000000000000008eaa2a3fe4aaaa3e00000000000000002b000000260000000000000000000000494a123f6e6bdb3e00000000000000002b0000002c0000000000000000000000a3642a3fbb36ab3e00000000000000002b000000260000000000000000000000ee0d133f24e4d93e00000000000000002b0000002c0000000000000000000000039a2b3ffacba83e00000000000000002b00000026000000000000000000000058da133f4f4bd83e00000000000000002b0000002c0000000000000000000000ca49123f6b6cdb3e00000000000000002b0000002c000000000000000000000090aa2a3fe1aaaa3e00000000000000002b0000002600000000000000000000000000803f000000000000000000000000260000000000000000000000000000000000803f000000000000000000000000260000000000000000000000000000000000803f000000000000000000000000260000000000000000000000000000000dac2a3fe6a7aa3e0000000000000000260000002b00000000000000000000007c5e253f0943b53e0000000000000000260000002b00000000000000000000000000803f00000000000000000000000026000000000000000000000000000000c2ab2a3f7da8aa3e0000000000000000260000002b00000000000000000000000000803f00000000000000000000000026000000000000000000000000000000f49f193f18c0cc3e0000000000000000150000002600000000000000000000000000803f000000000000000000000000150000000000000000000000000000006d46113f2573dd3e0000000000000000250000002600000000000000000000000000803f000000000000000000000000250000000000000000000000000000000000803f00000000000000000000000025000000000000000000000000000000aaaa2a3facaaaa3e000000000000000029000000250000000000000000000000a5aa2a3fb7aaaa3e0000000000000000290000002500000000000000000000000000803f000000000000000000000000290000000000000000000000000000007aaa2a3f0babaa3e000000000000000029000000250000000000000000000000abaa2a3faaaaaa3e0000000000000000250000002900000000000000000000007baa2a3f0babaa3e0000000000000000290000002500000000000000000000000000803f000000000000000000000000290000000000000000000000000000002c3e2b3fa983a93e00000000000000002a000000290000000000000000000000d460013f5bbbf73ea45f303c0000000026000000250000002b0000000000000063c4113f3a77dc3e0000000000000000290000002a0000000000000000000000a7aa2a3fb2aaaa3e00000000000000002a000000290000000000000000000000af40123fa27edb3e0000000000000000290000002a0000000000000000000000a5aa2a3fb6aaaa3e00000000000000002a0000002900000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a000000000000000000000000000000a3aa2a3fbbaaaa3e00000000000000002a0000002900000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002a0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000006b5d2a3f2945ab3e00000000000000002d0000002e00000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000009aaa2a3fcdaaaa3e00000000000000002d0000002e0000000000000000000000baaa2a3f8caaaa3e00000000000000002d0000002e0000000000000000000000a8302b3fb09ea93e00000000000000002d0000002e00000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000003e2d0e3f84a5e33e00000000000000002e0000002d0000000000000000000000dc1f113f48c0dd3e00000000000000002e0000002d000000000000000000000010aa2a3fe1abaa3e00000000000000002e00000024000000000000000000000075aa2a3f16abaa3e00000000000000002e0000002400000000000000000000001b49123fc96ddb3e00000000000000002e0000002d00000000000000000000008249123ffc6cdb3e00000000000000002e0000002d0000000000000000000000ebaa2a3f29aaaa3e0000000000000000240000002e00000000000000000000003bfb293f8a09ac3e00000000000000002e0000002400000000000000000000005eaa2a3f44abaa3e00000000000000002e00000024000000000000000000000020ab2a3fc0a9aa3e0000000000000000240000002e00000000000000000000000000803f00000000000000000000000024000000000000000000000000000000c6aa2a3f73aaaa3e0000000000000000240000002e00000000000000000000000000803f000000000000000000000000240000000000000000000000000000000000803f0000000000000000000000001500000000000000000000000000000058ab2a3f50a9aa3e0000000000000000240000002e0000000000000000000000a47d003fb804ff3e000000000000000023000000240000000000000000000000d1784c3fbb1c4e3e0000000000000000150000002400000000000000000000002749123fb26ddb3e000000000000000015000000160000000000000000000000df48123f426edb3e0000000000000000150000001600000000000000000000000000803f000000000000000000000000150000000000000000000000000000000b00003feaffff3e0000000000000000160000002700000000000000000000000000803f000000000000000000000000160000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000003f0000003f0000000000000000270000001600000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f00000000000000000000000015000000000000000000000000000000d92cf03ed92cf03e78327d3d00000000270000001600000015000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f00000000000000000000000027000000000000000000000000000000fca92a3f07acaa3e000000000000000027000000280000000000000000000000d6a92a3f53acaa3e000000000000000027000000280000000000000000000000d1b1353f5e9c943e00000000000000002800000027000000000000000000000097fb2b3fd208a83e000000000000000028000000270000000000000000000000ffaa2a3f03aaaa3e0000000000000000280000002700000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000000000803f000000000000000000000000280000000000000000000000000000008990283fefdeae3e0000000000000000280000002700000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f000000000000000000000000270000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d00000000000000000000000000000084d51f3ff854c03e00000000000000002d0000002e000000000000000000000016aa2b3fd5aba83e00000000000000002d0000002e00000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000006b5d2a3f2945ab3e00000000000000002d0000002e00000000000000000000009aaa2a3fcdaaaa3e00000000000000002d0000002e00000000000000000000000000803f0000000000000000000000002d0000000000000000000000000000000000803f0000000000000000000000002e0000000000000000000000000000001b49123fc96ddb3e00000000000000002e0000002d00000000000000000000000000803f0000000000000000000000002e0000000000000000000000000000008249123ffc6cdb3e00000000000000002e0000002d0000000000000000000000c6aa2a3f74aaaa3e00000000000000002e0000002400000000000000000000003bfb293f8a09ac3e00000000000000002e0000002400000000000000000000000000803f00000000000000000000000024000000000000000000000000000000eb4e2a3f2a62ab3e00000000000000002e00000024000000000000000000000075aa2a3f16abaa3e00000000000000002e0000002400000000000000000000000000803f00000000000000000000000024000000000000000000000000000000c6aa2a3f73aaaa3e0000000000000000240000002e0000000000000000000000ebaa2a3f29aaaa3e0000000000000000240000002e0000000000000000000000a64c613f4166853d1c69603d00000000150000002500000026000000000000000000803f000000000000000000000000150000000000000000000000000000000000803f000000000000000000000000150000000000000000000000000000002c9dfb3e107cf63e426cde3c000000002400000023000000250000000000000070ab2a3f21a9aa3e00000000000000002300000022000000000000000000000072ec003f1d27fe3e000000000000000025000000230000000000000000000000c8aa2a3f71aaaa3e000000000000000025000000290000000000000000000000c2ab2a3f7da8aa3e0000000000000000260000002b00000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f00000000000000000000000000000068712a3f301dab3e00000000000000002f0000003000000000000000000000008aaa2a3fedaaaa3e00000000000000002f0000003000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000008caa2a3fe8aaaa3e00000000000000002f000000300000000000000000000000bfda2a3f834aaa3e00000000000000002f0000003000000000000000000000000000803f000000000000000000000000300000000000000000000000000000000000803f00000000000000000000000030000000000000000000000000000000a02c123fc0a6db3e0000000000000000300000002f000000000000000000000098aa2a3fd0aaaa3e0000000000000000300000003100000000000000000000009aaa2a3fcbaaaa3e000000000000000030000000310000000000000000000000af6b273fa328b13e0000000000000000300000003100000000000000000000005caa2a3f47abaa3e000000000000000030000000310000000000000000000000252f123fb6a1db3e0000000000000000300000002f00000000000000000000000000803f0000000000000000000000003100000000000000000000000000000067ab2a3f31a9aa3e0000000000000000310000003000000000000000000000000000803f0000000000000000000000003100000000000000000000000000000070ab2a3f21a9aa3e0000000000000000310000003000000000000000000000000a00003fedffff3e00000000000000003100000032000000000000000000000005a5013ff6b5fc3e000000000000000031000000330000000000000000000000a47d003fb804ff3e000000000000000031000000330000000000000000000000c6aa2a3f73aaaa3e0000000000000000330000003400000000000000000000009fbec93e2e809c3e33c1993e000000001900000031000000320000000000000085371a3ff790cb3e0000000000000000190000003100000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f0000000000000000000000001900000000000000000000000000000029b0dc3e0ba8913ecda7913e00000000190000003200000035000000000000000000803f000000000000000000000000190000000000000000000000000000006d46113f2573dd3e0000000000000000320000003500000000000000000000000000803f000000000000000000000000320000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000006775163f504ac53e1caedc3c00000000190000003500000032000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000350000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000300003ffaffff3e0000000000000000190000001a00000000000000000000000000803f000000000000000000000000190000000000000000000000000000001d80443f8dff6d3e0000000000000000190000001a00000000000000000000001e33023fc499fb3e00000000000000001a0000001900000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f0000000000000000000000001a0000000000000000000000000000000000803f0000000000000000000000001a0000000000000000000000000000000c00003fe9ffff3e00000000000000001a0000001900000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f0000000000000000000000001a000000000000000000000000000000df48123f426edb3e0000000000000000190000001a0000000000000000000000d1784c3fbb1c4e3e0000000000000000190000003300000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000003f0000003f0000000000000000360000001a00000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f00000000000000000000000036000000000000000000000000000000aaaa2a3facaaaa3e0000000000000000370000003600000000000000000000008990283fefdeae3e0000000000000000370000003600000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f00000000000000000000000037000000000000000000000000000000fbb9273f0b8cb03e000000000000000037000000360000000000000000000000ffaa2a3f03aaaa3e0000000000000000370000003600000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f000000000000000000000000000000bfda2a3f834aaa3e00000000000000002f0000003000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f0000000000000000000000000000000000803f0000000000000000000000002f000000000000000000000000000000af1a283fa3caaf3e00000000000000002f000000300000000000000000000000f6ae2a3f15a2aa3e00000000000000002f0000003000000000000000000000008caa2a3fe8aaaa3e00000000000000002f000000300000000000000000000000252f123fb6a1db3e0000000000000000300000002f00000000000000000000007ec5133f0375d83e0000000000000000300000002f000000000000000000000069a92a3f2dadaa3e000000000000000030000000310000000000000000000000034a123ffa6bdb3e0000000000000000300000002f0000000000000000000000a02c123fc0a6db3e0000000000000000300000002f00000000000000000000005caa2a3f47abaa3e00000000000000003000000031000000000000000000000067ab2a3f31a9aa3e000000000000000031000000300000000000000000000000aa4e2a3fad62ab3e00000000000000003000000031000000000000000000000098aa2a3fd0aaaa3e00000000000000003000000031000000000000000000000070ab2a3f21a9aa3e00000000000000003100000030000000000000000000000058ab2a3f51a9aa3e0000000000000000310000003000000000000000000000000eab2a3fe3a9aa3e00000000000000003100000030000000000000000000000072ec003f1d27fe3e00000000000000003200000031000000000000000000000011a5033fa821ea3e6b43e93c000000003200000031000000380000000000000091aa2a3fdeaaaa3e00000000000000003200000038000000000000000000000052f1013f5c1dfc3e0000000000000000350000003200000000000000000000002c9dfb3e107cf63e426cde3c0000000033000000310000003200000000000000a64c613f4166853d1c69603d00000000190000003200000035000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f00000000000000000000000019000000000000000000000000000000a47d003fb804ff3e00000000000000003100000033000000000000000000000058ab2a3f50a9aa3e0000000000000000330000003400000000000000000000000000803f000000000000000000000000330000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000350000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000002a80233fadffb83e000000000000000035000000390000000000000000000000d460013f5bbbf73ea45f303c0000000035000000320000003900000000000000f49f193f18c0cc3e0000000000000000190000003500000000000000000000000000803f000000000000000000000000350000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000350000000000000000000000000000000000803f0000000000000000000000003500000000000000000000000000000094aa2a3fd9aaaa3e0000000000000000390000003500000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000003f0000003f0000000000000000360000001a0000000000000000000000d92cf03ed92cf03e78327d3d00000000360000001a00000019000000000000000b00003feaffff3e00000000000000001a0000003600000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000002749123fb26ddb3e0000000000000000190000001a0000000000000000000000df48123f426edb3e0000000000000000190000001a00000000000000000000000000803f0000000000000000000000001a000000000000000000000000000000d1784c3fbb1c4e3e0000000000000000190000003300000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000330000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f000000000000000000000000190000000000000000000000000000000000803f0000000000000000000000001900000000000000000000000000000020ab2a3fc0a9aa3e000000000000000033000000340000000000000000000000ebaa2a3f29aaaa3e00000000000000003300000034000000000000000000000010aa2a3fe1abaa3e00000000000000003400000033000000000000000000000075aa2a3f16abaa3e0000000000000000340000003300000000000000000000003e2d0e3f84a5e33e0000000000000000340000003a00000000000000000000005eaa2a3f44abaa3e000000000000000034000000330000000000000000000000dc1f113f48c0dd3e0000000000000000340000003a0000000000000000000000a8302b3fb09ea93e00000000000000003a0000003400000000000000000000001b49123fc96ddb3e0000000000000000340000003a0000000000000000000000baaa2a3f8caaaa3e00000000000000003a0000003400000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000009aaa2a3fcdaaaa3e00000000000000003a0000003400000000000000000000008249123ffc6cdb3e0000000000000000340000003a00000000000000000000003bfb293f8a09ac3e0000000000000000340000003300000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000006b5d2a3f2945ab3e00000000000000003a0000003400000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b000000000000000000000000000000b6542a3f9456ab3e00000000000000003b0000003900000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b000000000000000000000000000000cea92a3f63acaa3e00000000000000003b0000003900000000000000000000000000803f000000000000000000000000390000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b00000000000000000000000000000058aa2a3f51abaa3e00000000000000003b0000003900000000000000000000000000803f000000000000000000000000390000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b00000000000000000000000000000013202c3fdabfa73e00000000000000003b0000003900000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b00000000000000000000000000000091d32b3fde58a83e00000000000000003b0000003900000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b0000000000000000000000000000000000803f0000000000000000000000003b000000000000000000000000000000494a123f6e6bdb3e0000000000000000390000003b0000000000000000000000ee0d133f24e4d93e0000000000000000390000003b00000000000000000000000000803f0000000000000000000000003b00000000000000000000000000000076aa2a3f14abaa3e00000000000000003b000000390000000000000000000000a3642a3fbb36ab3e0000000000000000390000003500000000000000000000008eaa2a3fe4aaaa3e00000000000000003900000035000000000000000000000094aa2a3fd8aaaa3e000000000000000039000000350000000000000000000000039a2b3ffacba83e00000000000000003900000035000000000000000000000058da133f4f4bd83e0000000000000000390000003b0000000000000000000000ca49123f6b6cdb3e0000000000000000390000003b000000000000000000000090aa2a3fe1aaaa3e00000000000000003900000035000000000000000000000090aa2a3fe1aaaa3e000000000000000039000000350000000000000000000000ca49123f6b6cdb3e0000000000000000390000003b000000000000000000000076aa2a3f14abaa3e00000000000000003b0000003900000000000000000000000dac2a3fe6a7aa3e0000000000000000350000003900000000000000000000007c5e253f0943b53e000000000000000035000000390000000000000000000000c2ab2a3f7da8aa3e000000000000000035000000390000000000000000000000c2ab2a3f7da8aa3e000000000000000035000000390000000000000000000000d460013f5bbbf73ea45f303c0000000035000000320000003900000000000000abaa2a3faaaaaa3e0000000000000000320000003800000000000000000000000000803f00000000000000000000000032000000000000000000000000000000a5aa2a3fb7aaaa3e0000000000000000380000003200000000000000000000007aaa2a3f0babaa3e0000000000000000380000003200000000000000000000000000803f00000000000000000000000038000000000000000000000000000000aaaa2a3facaaaa3e0000000000000000380000003200000000000000000000000000803f000000000000000000000000380000000000000000000000000000002c3e2b3fa983a93e00000000000000003c00000038000000000000000000000063c4113f3a77dc3e0000000000000000380000003c00000000000000000000007baa2a3f0babaa3e000000000000000038000000320000000000000000000000af40123fa27edb3e0000000000000000380000003c0000000000000000000000a5aa2a3fb6aaaa3e00000000000000003c0000003800000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c000000000000000000000000000000a3aa2a3fbbaaaa3e00000000000000003c000000380000000000000000000000a7aa2a3fb2aaaa3e00000000000000003c0000003800000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a00000000000000000000000000000084d51f3ff854c03e00000000000000003a0000003400000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a0000000000000000000000000000000000803f0000000000000000000000003a00000000000000000000000000000016aa2b3fd5aba83e00000000000000003a0000003400000000000000000000009aaa2a3fcdaaaa3e00000000000000003a0000003400000000000000000000000000803f000000000000000000000000340000000000000000000000000000000000803f00000000000000000000000034000000000000000000000000000000c6aa2a3f74aaaa3e0000000000000000340000003300000000000000000000008249123ffc6cdb3e0000000000000000340000003a00000000000000000000006b5d2a3f2945ab3e00000000000000003a0000003400000000000000000000001b49123fc96ddb3e0000000000000000340000003a0000000000000000000000eb4e2a3f2a62ab3e00000000000000003400000033000000000000000000000075aa2a3f16abaa3e0000000000000000340000003300000000000000000000000000803f000000000000000000000000330000000000000000000000000000000000803f000000000000000000000000330000000000000000000000000000003bfb293f8a09ac3e000000000000000034000000330000000000000000000000ebaa2a3f29aaaa3e0000000000000000330000003400000000000000000000000000803f000000000000000000000000330000000000000000000000000000000000803f000000000000000000000000330000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c000000000000000000000000000000a5aa2a3fb6aaaa3e00000000000000003c0000003800000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c00000000000000000000000000000058242b3f4fb7a93e00000000000000003c000000380000000000000000000000f4732a3f1718ab3e00000000000000003c000000380000000000000000000000a7aa2a3fb2aaaa3e00000000000000003c00000038000000000000000000000063c4113f3a77dc3e0000000000000000380000003c00000000000000000000000000803f0000000000000000000000003c0000000000000000000000000000000000803f0000000000000000000000003c000000000000000000000000000000af40123fa27edb3e0000000000000000380000003c00000000000000000000002149123fbe6ddb3e0000000000000000380000003c000000000000000000000056312a3f549dab3e00000000000000003800000032000000000000000000000091b9313fdf8c9c3e0000000000000000380000003200000000000000000000007aaa2a3f0babaa3e000000000000000038000000320000000000000000000000aaaa2a3facaaaa3e00000000000000003200000038000000000000000000000048e8123f6f2fda3e0000000000000000380000003c00000000000000000000007baa2a3f0babaa3e000000000000000038000000320000000000000000000000c8aa2a3f71aaaa3e000000000000000032000000380000000000000000000000abaa2a3faaaaaa3e00000000000000003200000038000000000000000000000097fb2b3fd208a83e0000000000000000370000003600000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f000000000000000000000000370000000000000000000000000000000000803f00000000000000000000000037000000000000000000000000000000d1b1353f5e9c943e0000000000000000370000003600000000000000000000008990283fefdeae3e000000000000000037000000360000000000000000000000fca92a3f07acaa3e000000000000000036000000370000000000000000000000ffaa2a3f03aaaa3e0000000000000000370000003600000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f00000000000000000000000036000000000000000000000000000000d6a92a3f53acaa3e0000000000000000360000003700000000000000000000000000803f000000000000000000000000360000000000000000000000000000000000803f00000000000000000000000036000000000000000000000000000000c6aa2a3f73aaaa3e000000000000000033000000340000000000000000000000c8aa2a3f71aaaa3e00000000000000003200000038000000000000000000000072ec003f1d27fe3e000000000000000032000000310000000000000000000000252f123fb6a1db3e000000000000000022000000210000000000000000000000abaa2a3faaaaaa3e0000000000000000250000002900000000000000000000000000803f0000000000000000000000003a000000000000000000000000000000bdd6083f423cab3e862c063e000000000b0000000a0000000d0000000000000091d0ec3e2d6db53e84843b3e000000000b0000000d0000000a000000000000006d53013f08a5ca3e7fd0ca3d000000000b0000000a0000000d000000000000006b2be53eac26d23ed25b113e000000000d0000000b0000000a00000000000000da5f1d3f829d743e17e3153e000000000b0000000a0000000d000000000000004d651f3f6735c13e00000000000000000b0000000d0000000000000000000000e3380e3f398e633e398e633e000000000b000000120000000d000000000000000700003ff3ffff3e00000000000000000b0000000d0000000000000000000000e3380e3f398e633e398e633e000000000b000000120000000d000000000000000700003ff3ffff3e00000000000000000b0000001200000000000000000000004d651f3f6735c13e00000000000000000b0000001200000000000000000000004706f83e8e46473e8e46473e5666013e0b000000120000000d0000000a000000d6d1ec3ed473b43eac74bd3dac74bd3d0b0000000a000000120000000d0000006d53013f08a5ca3e7fd0ca3d000000000b0000000a000000120000000000000091d0ec3e2d6db53e84843b3e000000000b000000120000000a00000000000000bdd6083f423cab3e862c063e000000000b0000000a00000012000000000000006b2be53eac26d23ed25b113e00000000120000000b0000000a00000000000000da5f1d3f829d743e17e3153e000000000b0000000a00000012000000000000002446003fb773ff3e00000000000000000b0000000d000000000000000000000033d6383f60b6143e41e5073e2d4339380b0000000d0000000a0000000f00000078ae003f6b97fe3efb54ba38000000000b0000000d0000000f000000000000003754403f92027e3e1b932c3a000000000d0000000b0000000f00000000000000fd9ce63e1aa0e53ea40bcf3d000000000b0000000d0000000f00000000000000f974403fee0a7e3e3fbd0439000000000d0000000b0000000f00000000000000c2d8713fe373623d00000000000000000d0000000b000000000000000000000082832b3fb305913e529a3f3d000000000d0000000b0000000f000000000000008d06193fed35693edeaf323e000000000b0000000d0000000f000000000000009fdc3e3f50651e3e6850cc3d000000000b0000000d0000000f0000000000000059a31e3f4809633e5469223e000000000b0000000d0000000f000000000000003e04043f63e7903e43204e3e000000000b0000000d0000000f00000000000000f751323fe1b48c3e1673ea3c000000000b0000000f0000000d00000000000000af8c313fb22b9b3e97785d3b000000000b0000000f00000010000000000000006bf03a3f6c25873e926fbe3b000000000b0000000f00000010000000000000005ef3543f1847293e8adc3a3b000000000b0000000d0000000f00000000000000b908373fcbfc873e642b9e3c85cbf0380b0000000f000000100000000d0000004f0b3b3fdd3a703e9f5f0e3d000000000b0000000f00000010000000000000009848283f8437673e7786c63df616a33c0b0000000f0000000d000000100000000e17013ff4e9b13ee1cf173e000000000b0000000d0000000f0000000000000035f20f3f52b8873e87c6303e000000000d0000000b0000000f000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d000000000000000000000000000000567d423ffcea4d3eb37e203d000000000b0000000f0000001000000000000000caba433f6bb82b3eddb88a3d000000000b0000000f0000001000000000000000539c323f7594733e81f4833d000000000b0000000f0000001000000000000000c49efd3e9cc5ae3e3f37273e000000000b0000000d0000000f00000000000000ae50143f0c0c773e3db1373e000000000d0000000b0000000f000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d00000000000000000000000000000017e0403fa37ffc3da37ffc3d000000000b000000100000000f00000000000000daa2423f9974f53d9974f53d000000000b000000100000000f00000000000000619d113ff74d833e8dee323e000000000d0000000b0000000f000000000000004d94e53ed4d98d3e86c9263e72b4e43d0b0000000d0000000f000000100000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000008b1a433fd295f33dd295f33d000000000b000000100000000f0000000000000048552d3f6f55253e6f55253e000000000b000000120000000d00000000000000e3380e3f398e633e398e633e000000000b000000120000000d000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000008291053ffe2abe3ef6c7da3d000000000d0000000b0000000f000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d000000000000000000000000000000e3380e3f398e633e398e633e000000000b000000120000000d0000000000000030606b3f82fea43d00000000000000000d0000000b00000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000005755553fa6aa2a3e00000000000000000d0000001d00000000000000000000005655553faaaa2a3e00000000000000000d0000001d000000000000000000000030ba683f7f2eba3d00000000000000000d0000001d0000000000000000000000ffcd663f0890c93d00000000000000000d0000001d00000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000007ad3683f3464b93d00000000000000000d0000001d00000000000000000000006eaa013f25abfc3e00000000000000001d0000000d00000000000000000000000100003ffeffff3e00000000000000000d0000001d0000000000000000000000b660023f933efb3e00000000000000001d0000000d00000000000000000000000100003fffffff3e00000000000000001d0000000d00000000000000000000007326673f6cccc63d00000000000000000d0000001d00000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000002fba683f892eba3d00000000000000000d0000001d00000000000000000000008e50123fe35edb3e00000000000000001d0000000d00000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d00000000000000000000000000000025926b3fd66ea33d00000000000000000d0000000b00000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d000000000000000000000000000000c6866e3fd3c98b3d00000000000000000d0000000b00000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d000000000000000000000000000000c569773fb163093d00000000000000000d0000000b0000000000000000000000bd60403f0e7d7e3e00000000000000000d0000000b000000000000000000000030606b3f82fea43d00000000000000000d0000000b00000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000000000803f0000000000000000000000000d000000000000000000000000000000ccb5743f45a3343d00000000000000000d0000001d00000000000000000000007326673f6cccc63d00000000000000000d0000001d00000000000000000000000000803f0000000000000000000000000d0000000000000000000000000000002eba683f8d2eba3d00000000000000000d0000001d00000000000000000000002fba683f852eba3d00000000000000000d0000001d00000000000000000000002c49123fa86ddb3e00000000000000001d0000000d00000000000000000000007157123f1d51db3e00000000000000001d0000000d00000000000000000000001912563f9db7273e00000000000000001d0000000d00000000000000000000002949123faf6ddb3e00000000000000001d0000000d00000000000000000000002a49123fac6ddb3e00000000000000001d0000000d00000000000000000000008b2e553fd3452b3e00000000000000001d0000000d00000000000000000000002d49123fa66ddb3e00000000000000001d0000000d00000000000000000000000000803f0000000000000000000000001d00000000000000000000000000000032ba683f6d2eba3d00000000000000001d0000000d00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d00000000000000000000000000000032ba683f722eba3d00000000000000001d0000000d00000000000000000000002a49123fac6ddb3e00000000000000001d0000000d00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000005955553f9baa2a3e00000000000000001d0000000d00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000005e55553f88aa2a3e00000000000000001d0000000d00000000000000000000000000803f0000000000000000000000001d00000000000000000000000000000032ba683f722eba3d00000000000000001d0000000d00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000cba683f9f2fba3d00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d00000000000000000000000000000022ba683fed2eba3d00000000000000001d0000001c000000000000000000000023ba683fe82eba3d00000000000000001d0000001c00000000000000000000001499283fd9cdae3e00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000002bba683fac2eba3d00000000000000001d0000001c000000000000000000000069362c3f2d93a73e00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000001bba683f2b2fba3d00000000000000001d0000001c0000000000000000000000b57d113f9504dd3e00000000000000001d0000001c000000000000000000000018ba683f422fba3d00000000000000001d0000001c0000000000000000000000d8600a3f513eeb3e00000000000000001d0000001c00000000000000000000000500003ff6ffff3e00000000000000001c0000001d00000000000000000000000500003ff6ffff3e00000000000000001c0000001d0000000000000000000000b556693f574ab53d00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000003c62653f22eed43d00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000009d300b3fc59ee93e00000000000000001d0000001c00000000000000000000001077663f7f47cc3d00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000004f97683f8745bb3d00000000000000001d0000001c00000000000000000000009faa2a3fc3aaaa3e00000000000000001d0000001c00000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000000000803f0000000000000000000000001d0000000000000000000000000000008d3d113fe684dd3e00000000000000001d0000001c00000000000000000000004f97683f8745bb3d00000000000000001d0000001c0000000000000000000000a0aa2a3fc0aaaa3e00000000000000001d0000001c00000000000000000000009faa2a3fc3aaaa3e00000000000000001d0000001c00000000000000000000002446003fb773ff3e00000000000000000b00000012000000000000000000000033d6383f60b6143e41e5073e2d4339380b000000120000000a0000001000000078ae003f6b97fe3efb54ba38000000000b0000001200000010000000000000003754403f92027e3e1b932c3a00000000120000000b0000001000000000000000fd9ce63e1aa0e53ea40bcf3d000000000b000000120000001000000000000000f974403fee0a7e3e3fbd043900000000120000000b0000001000000000000000bd60403f0e7d7e3e0000000000000000120000000b0000000000000000000000c6866e3fd3c98b3d0000000000000000120000000b0000000000000000000000c2d8713fe373623d0000000000000000120000000b000000000000000000000082832b3fb305913e529a3f3d00000000120000000b00000010000000000000008d06193fed35693edeaf323e000000000b00000012000000100000000000000025926b3fd66ea33d0000000000000000120000000b00000000000000000000000000803f0000000000000000000000001200000000000000000000000000000059a31e3f4809633e5469223e000000000b000000120000001000000000000000af8c313fb22b9b3e97785d3b000000000b000000100000000f000000000000003e04043f63e7903e43204e3e000000000b000000120000001000000000000000f751323fe1b48c3e1673ea3c000000000b000000100000001200000000000000b908373fcbfc873e642b9e3c85cbf0380b000000100000000f000000120000000e17013ff4e9b13ee1cf173e000000000b0000001200000010000000000000004f0b3b3fdd3a703e9f5f0e3d000000000b000000100000000f00000000000000caba433f6bb82b3eddb88a3d000000000b000000100000000f000000000000006bf03a3f6c25873e926fbe3b000000000b000000100000000f000000000000009fdc3e3f50651e3e6850cc3d000000000b0000001200000010000000000000009848283f8437673e7786c63df616a33c0b00000010000000120000000f000000567d423ffcea4d3eb37e203d000000000b000000100000000f00000000000000c49efd3e9cc5ae3e3f37273e000000000b000000120000001000000000000000daa2423f9974f53d9974f53d000000000b000000100000000f00000000000000ae50143f0c0c773e3db1373e00000000120000000b0000001000000000000000619d113ff74d833e8dee323e00000000120000000b000000100000000000000035f20f3f52b8873e87c6303e00000000120000000b00000010000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000008291053ffe2abe3ef6c7da3d00000000120000000b00000010000000000000004d94e53ed4d98d3e86c9263e72b4e43d0b00000012000000100000000f0000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f0000000000000000000000001200000000000000000000000000000030606b3f82fea43d0000000000000000120000000b00000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000005755553fa6aa2a3e000000000000000012000000200000000000000000000000ffcd663f0890c93d0000000000000000120000002000000000000000000000006eaa013f25abfc3e0000000000000000200000001200000000000000000000007ad3683f3464b93d0000000000000000120000002000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000005655553faaaa2a3e0000000000000000120000002000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000100003ffeffff3e0000000000000000120000002000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f0000000000000000000000001200000000000000000000000000000030ba683f7f2eba3d000000000000000012000000200000000000000000000000b660023f933efb3e0000000000000000200000001200000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000000000803f000000000000000000000000120000000000000000000000000000007326673f6cccc63d000000000000000012000000200000000000000000000000c569773fb163093d0000000000000000120000000b00000000000000000000000000803f0000000000000000000000001200000000000000000000000000000030606b3f82fea43d0000000000000000120000000b0000000000000000000000ccb5743f45a3343d0000000000000000120000002000000000000000000000002eba683f8d2eba3d0000000000000000120000002000000000000000000000002949123faf6ddb3e0000000000000000200000001200000000000000000000002a49123fac6ddb3e00000000000000002000000012000000000000000000000032ba683f722eba3d0000000000000000200000001200000000000000000000007157123f1d51db3e0000000000000000200000001200000000000000000000005e55553f88aa2a3e0000000000000000200000001200000000000000000000002fba683f852eba3d0000000000000000120000002000000000000000000000002fba683f892eba3d0000000000000000120000002000000000000000000000002c49123fa86ddb3e0000000000000000200000001200000000000000000000001912563f9db7273e0000000000000000200000001200000000000000000000008b2e553fd3452b3e0000000000000000200000001200000000000000000000000000803f000000000000000000000000200000000000000000000000000000008e50123fe35edb3e0000000000000000200000001200000000000000000000002d49123fa66ddb3e00000000000000002000000012000000000000000000000032ba683f6d2eba3d0000000000000000200000001200000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000005955553f9baa2a3e0000000000000000200000001200000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000100003fffffff3e0000000000000000200000001200000000000000000000002a49123fac6ddb3e0000000000000000200000001200000000000000000000007326673f6cccc63d0000000000000000120000002000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f0000000000000000000000002000000000000000000000000000000032ba683f722eba3d0000000000000000200000001200000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f00000000000000000000000020000000000000000000000000000000b556693f574ab53d0000000000000000200000001f00000000000000000000003c62653f22eed43d0000000000000000200000001f00000000000000000000000cba683f9f2fba3d0000000000000000200000001f00000000000000000000001077663f7f47cc3d0000000000000000200000001f00000000000000000000004f97683f8745bb3d0000000000000000200000001f00000000000000000000009faa2a3fc3aaaa3e0000000000000000200000001f00000000000000000000000500003ff6ffff3e00000000000000001f0000002000000000000000000000009d300b3fc59ee93e0000000000000000200000001f00000000000000000000008d3d113fe684dd3e0000000000000000200000001f000000000000000000000018ba683f422fba3d0000000000000000200000001f00000000000000000000000500003ff6ffff3e00000000000000001f0000002000000000000000000000000000803f000000000000000000000000200000000000000000000000000000001bba683f2b2fba3d0000000000000000200000001f0000000000000000000000d8600a3f513eeb3e0000000000000000200000001f00000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000002bba683fac2eba3d0000000000000000200000001f0000000000000000000000b57d113f9504dd3e0000000000000000200000001f00000000000000000000000000803f0000000000000000000000002000000000000000000000000000000023ba683fe82eba3d0000000000000000200000001f00000000000000000000000000803f0000000000000000000000002000000000000000000000000000000069362c3f2d93a73e0000000000000000200000001f00000000000000000000000000803f0000000000000000000000002000000000000000000000000000000022ba683fed2eba3d0000000000000000200000001f00000000000000000000000000803f000000000000000000000000200000000000000000000000000000001499283fd9cdae3e0000000000000000200000001f00000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000004f97683f8745bb3d0000000000000000200000001f0000000000000000000000a0aa2a3fc0aaaa3e0000000000000000200000001f00000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000000000803f000000000000000000000000200000000000000000000000000000009faa2a3fc3aaaa3e0000000000000000200000001f0000000000000000000000539c323f7594733e81f4833d000000000b000000100000000f000000000000008b1a433fd295f33dd295f33d000000000b000000100000000f0000000000000048552d3f6f55253e6f55253e000000000b000000120000000d00000000000000e3380e3f398e633e398e633e000000000b000000120000000d0000000000000017e0403fa37ffc3da37ffc3d000000000b000000100000000f00000000000000e3380e3f398e633e398e633e000000000b000000120000000d000000000000000700003ff3ffff3e00000000000000000b0000001200000000000000000000000000803f000000000000000000000000120000000000000000000000000000000700003ff3ffff3e00000000000000000b0000000d00000000000000000000005ef3543f1847293e8adc3a3b000000000b0000001200000010000000000000000000803f0000000000000000000000002000000000000000000000000000000083dcfd3e1c13e13e8241843d0000000000000000010000003d00000000000000b6602f3f943ea13e0000000000000000000000000100000000000000000000000438223ff88fbb3e000000000000000000000000010000000000000000000000b047f13ef6a7ed3e6641843d0000000000000000010000003d000000000000007929193f4969903e130ff53d00000000000000000100000003000000000000007726d93ea7a3d23e661aca3d22bd863d0000000001000000030000003d000000278af43e1a48d73efdb6d03d00000000030000000000000001000000000000006676b63e567cb43ebea6813e31341b3d0300000000000000010000003d00000003ec033f9debb43ebb78063e0000000001000000000000003d00000000000000d68b0e3ffc55a23eb124013e0000000001000000000000003d000000000000006b23053f1b70d43e3c24853d0000000000000000010000003d00000000000000c50c003f7159bd3e0c1a053e0000000001000000000000003d00000000000000187ef83e21a1c53e8ec1033e0000000001000000000000003d000000000000007a08c83ec887b43ee3ac643e64ca083d010000003d000000000000003e0000005d0fc83e82f89b3e4f9e723ee7a38a3d010000003d000000000000003e0000000000003f2449923e2649123e2349923d3d000000010000003e000000000000004eaa163f859c8c3e26e28c3d56598b3d3d000000010000003e000000000000003d34033f496b8d3e66c71f3e4b44623d3d0000003f000000010000003e00000050b72b3f5f57873e08e8843d000000003d000000010000000000000000000000e67c0d3f69b58c3e4a1a153e693adc3c3d0000003f0000000100000000000000ac38f03e3138f03e18797c3d000000003f0000003d000000010000000000000017fbe13ec6fae13ec3c4953d95c7343d3f0000003d000000010000003e000000bcec0d3f2320b93e51905e3db845f33c3f0000003d0000003e00000001000000eabd123f2469bb3e800a183d969bc13c3f0000003d0000003e000000010000008533133f1e02c03ed450fc3cac1c9d3c3f0000003d000000010000003e0000004c6aec3ef969ec3eecae9c3d000000003f0000003d000000010000000000000051bae83e23bae83e302eba3d000000003f0000003d00000001000000000000003eb1133f51ecc43e9b891d3d000000003f0000003d000000010000000000000010990c3f1b02d03e285e363d000000003f0000003d0000000100000000000000a7aa2a3fb2aaaa3e00000000000000003f0000003d0000000000000000000000a022343fc0ba973e00000000000000003f0000003d00000000000000000000000b052f3fa67a903e29da0b3d000000003f0000003d0000003e0000000000000060bd263f7215a23e777e033d000000003f0000003d0000003e0000000000000017013f3fd2fd813e00000000000000003f0000003d000000000000000000000025be383fbc9c773ec5aa153d000000003f0000003d0000003e000000000000005e05333fcb4e6c3e7e378f3d000000003f0000003d0000003e00000000000000d6732a3f83018a3e475b843d000000003f0000003d0000003e0000000000000004f1293faaa38a3e36e9853d000000003f0000003d0000003e00000000000000ce81333f402b6a3e0c9b8f3d000000003f0000003d0000003e000000000000005b08213f538d623ec238f23d7dd3003d3f000000400000003d0000003e0000000a08233f8b1d473e17270c3ed56c023d3f000000400000003d0000003e000000f7a9153f0ecab63e23106f3d000000003f000000400000003d000000000000008d01123f6069cd3e6338e93c000000003f000000400000003d000000000000007866043f5011e73efa0d013d000000003f000000400000003d00000000000000d2850e3f5df4e23e00000000000000003f0000004000000000000000000000003686053f94f3f43e00000000000000003f000000400000000000000000000000d94c043f4e66f73e0000000000000000400000003f0000000000000000000000fffe003f593eec3e471d0e3d00000000400000003f0000003d00000000000000fc01fd3eafd2a33e2482d43d2f2ba83d400000003f00000041000000420000002efaf23e240e8f3e18f4333e8df68f3d400000003f000000410000004200000085ebc73e13ebc73eb5ef1f3e34c6803d4100000040000000420000003d0000009c94c73e01168f3e5f76623ed268e03d4000000041000000420000003d0000004495fb3e716ce13e2af98b3d00000000400000003f0000003d000000000000002264ef3e7a6cad3ebbfdd63dd7bfb53d400000003f0000003d000000420000007fe6a73ed7d69c3e4f86973e6ef18e3d400000003f0000003d0000004200000072aadd3e8e52b53efe055a3e000000003f000000400000003d0000000000000033c4d83e1e84cd3e5d6f333e000000003f0000003d000000400000000000000021d4003f61d68a3eb199343e1ea4493d3d0000003f000000400000004200000095462f3f30ad363e7c380c3e000000003d0000004000000042000000000000000461fe3e676d873e2963743e000000003d000000400000004200000000000000e8bac63e79f9c43e3e97683e0000000040000000420000003d0000000000000043be2a3fdc776d3ee2eba13d35c9b43c3d0000003f0000004000000042000000feed5d3f42339a3d9cb96c3d000000003d000000400000004200000000000000c31f0b3f4114c03ee4b0a63d000000003d0000003f0000004000000000000000ea27fb3e578cdf3efa2e953d000000003d0000003f0000004000000000000000c0aa2a3f81aaaa3e00000000000000003d0000003f000000000000000000000007302b3ff39fa93e00000000000000003d0000003f00000000000000000000001cb52b3fc895a83e00000000000000003d0000003f000000000000000000000075a6fc3eff19e23e30fe843d000000003f0000003d0000004000000000000000e0ae273f83575d3efdec033e000000003f0000003d000000400000000000000026660c3f3c4f9a3ef1c8193e000000003f0000003d00000040000000000000008a45023f2633ea3e2c0e0a3d000000003f0000003d00000040000000000000004370323fa2296f3ea82a8e3d000000003f0000003d0000004000000000000000d087063f60f0f23e00000000000000003f0000003d00000000000000000000003e75233f0a43ad3ea927bd3c000000003d0000003f0000000100000000000000cbaa2a3f6baaaa3e00000000000000003d0000003f000000000000000000000071cd4b3f3cca503e00000000000000003d0000003f00000000000000000000000000803f0000000000000000000000003d000000000000000000000000000000ec656f3f9ed0843d00000000000000003d00000001000000000000000000000021ec023f5320df3e503b583d000000003f0000003d00000001000000000000005c09553f8fda2b3e00000000000000003d0000000100000000000000000000000c302b3fe89fa93e00000000000000003d0000003f00000000000000000000006368073fe379993eae6a2f3e000000003f000000400000003d0000000000000075291e3fb9627f3e73f7073e000000003f000000400000003d00000000000000ce43033ff60ad93eb8b5813d000000003f000000400000003d00000000000000c8562a3fef1c3b3ed0630a3e1121893c3f0000003d000000400000003e000000ba78163ff99d963e49c2f13d000000003d0000003f00000001000000000000002ca6183f284b4f3e87fa2a3e84860c3d3d000000010000003f00000000000000916b333f0aa8823ea006343d000000003d000000010000000000000000000000abd5113f4b58af3e7bf1b33d000000003d000000010000000000000000000000e5811b3fb35ca03e0e7ea23d000000003d000000010000000000000000000000eabf063fffa58e3efd2c2b3ee83ae43c3d0000003f00000001000000000000009bdd233f5b6a933ebb69933d000000003d00000001000000000000000000000026d7ea3e962bb43e66b72f3e0719923c010000003d00000000000000030000002d3ced3e9026b03ead5e1d3e696f1f3d010000003d0000000000000003000000c5d0e83ebc91b73efd3a3f3e00000000010000003d0000000000000000000000e66bd83ef2ffc13e4f284b3e00000000010000003d00000000000000000000006ff3273fd7218d3e2bdd8b3d000000003d0000000100000000000000000000008171cc3ec501c83e7319573e000000003d00000001000000000000000000000050240a3f01ac8d3e4b10203ea733e03c3d0000003f000000010000000000000003ec033f9debb43ebb78063e0000000001000000000000003d00000000000000d68b0e3ffc55a23eb124013e0000000001000000000000003d000000000000008e62183f2220913e056bf83d0000000001000000000000003d000000000000001afceb3edfaba53e611e233eb146663d010000003d00000000000000030000009b95133f5b01ad3ebe4daf3d000000003d000000010000000000000000000000b655153f30aaaa3e8ca9aa3d000000003d00000001000000000000000000000024e2ea3e9e709c3ed82e283e4a57923d010000003d00000000000000030000008f60343fe153813e02582f3d000000003d0000000100000000000000000000005b2f553f92422b3e00000000000000003d00000001000000000000000000000023b46f3fe65e823d00000000000000003d0000000100000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000703f0000803d00000000000000003d0000000100000000000000000000008ee3783f3a8ee33c00000000000000003d0000000100000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000bf36f3fa767803d00000000000000003d0000000100000000000000000000000000703f0000803d00000000000000003d0000000100000000000000000000005555553faaaa2a3e00000000000000003d0000000100000000000000000000005555553faaaa2a3e00000000000000003d0000000100000000000000000000005555553faaaa2a3e00000000000000003d00000001000000000000000000000001e66f3ff5cf803d00000000000000003d000000010000000000000000000000d7fd6f3f4811803d00000000000000003d0000000100000000000000000000007973553f1a322a3e00000000000000003d0000000100000000000000000000009a91553f98b9293e00000000000000003d0000000100000000000000000000008515703faea77e3d00000000000000003d0000000100000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d000000000000000000000000000000f805703f7aa07f3d00000000000000003d0000000100000000000000000000001d66553f8c672a3e00000000000000003d000000010000000000000000000000993a553f9d152b3e00000000000000003d0000000100000000000000000000006bf66f3fa94c803d00000000000000003d0000000100000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000008003453faba4373e4f35513d000000003d0000004300000044000000000000000000803f0000000000000000000000003d000000000000000000000000000000b34b4a3f34d1d63d34d1d63d000000003d00000044000000430000000000000064810e3f37fd623e37fd623e000000003d00000044000000430000000000000038dd063f3991bc3e57d1d63d000000003d0000004300000044000000000000002900003fadffff3e00000000000000003d0000004300000000000000000000001f00403f86ff7f3e00000000000000003d00000043000000000000000000000038e1e83ea3dba23eb9940b3e23e3b93d3d00000043000000450000004400000071b7de3e219dde3edb56053e000000003d0000004300000045000000000000001ebbe83e4938ba3e33193a3e00000000430000003d00000045000000000000005a17c53e48e9c43ebdfe6b3e000000003d00000043000000450000000000000018eeb63e76d8b63e7339923e000000003d000000430000004500000000000000daaaaa3ec4aaaa3e62aaaa3e000000003d000000450000004300000000000000c6ffef3e2100a03e3200603e00000000430000003d00000045000000000000006296163fb696963e1af2f03d00000000430000003d0000004500000000000000b6380e3f52a1bd3e06b5973d00000000430000003d00000045000000000000000667eb3eaed18d3ee9346d3ebd66013d430000003d000000460000004500000093e9dd3e53d3bf3e3486443e000000003d0000004300000046000000000000009616c63e9befa63ecff9923e000000003d000000460000004300000000000000e7ccce3e30efc63ed187543e0000000046000000430000003d00000000000000986fcf3ee830523e3d0a4a3eabe5443e46000000470000003d00000043000000aea2b63e4f8ba93ed66c303e31370f3e3d0000004600000047000000430000002a06ac3eb405ac3e23f4a73e0000000047000000460000003d00000000000000760fd03efd0ed03e1bc33f3e0000000047000000460000003d0000000000000048bae83e37bae83e052eba3d0000000046000000430000003d000000000000002bbae83e7fba683e40ba683ed42dba3d4600000047000000430000003d00000089bae83e0fbae83ea22dba3d0000000047000000460000003d00000000000000304c023f4e8e823ea5b2713e0000000047000000460000003d00000000000000c388cd3e9316cb3e54c14e3e00000000470000003d00000046000000000000000400003ff8ffff3e00000000000000003d000000470000000000000000000000c28b2e3f7be8a23e0000000000000000470000003d0000000000000000000000afd71e3fc2b0b73ef6fda93c000000003d000000470000004200000000000000d50f3f3f56e0813e00000000000000003d0000004700000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000005b2b713f796a2f3d3d7f773c000000003d0000004200000047000000000000009455553fb1a92a3e0000000000000000470000003d00000000000000000000008b31033ffbdee53e72ef1d3d000000003d000000470000004200000000000000340a643f025ba53d774de93c000000003d000000420000004700000000000000d773dd3eef24c73e2a59143e26d5093d470000003d0000004800000042000000b4c4343fef60433ef840b03d225e8b3c3d000000480000004200000047000000a1a0f23e4a44dd3e546cc03d00000000480000003d0000004200000000000000af64d53ec32e913ebe998a3eff2ced3c47000000480000003d00000042000000a505333f6dc23d3eff4dec3d00000000470000003d0000004800000000000000c6371a3f7a904b3e6e904b3e00000000470000003d000000480000000000000080f6193fb2134a3e5806453e55bf103c3d000000420000004800000047000000a076433f6c9c613ea548843c000000003d000000420000004700000000000000fbcd183f0a64ce3e00000000000000003d0000004200000000000000000000008902fa3eab96a23e98cd463e000000003d00000042000000480000000000000078fcc33e75fcc33e250e703e00000000480000003d0000004200000000000000e284d93e50a8cf3e9da52d3e00000000480000003d00000042000000000000001b84043f79ef843e15810c3e1d1faf3d47000000460000003d00000048000000daa1ec3ed7216e3e5a5b1c3e1b3f1c3e4700000046000000480000003d0000001a2ac13e60f2bf3ee8f4fd3d3099fd3d4600000047000000480000003d000000d00bd33e3461d23e1520df3ddd2b8b3d46000000470000003d00000048000000ce96163f7896963eafeff03d0000000047000000460000003d0000000000000048a61f3fda27753eeb00cd3d3dfa163d480000003d00000042000000490000003753113f991e673e588b0d3e62128c3d480000003d00000042000000490000008e20ff3e5766793eb0de4a3e6ee7753d48000000420000003d0000004900000070e8c23e2d8c9e3e628b9e3e0000000042000000480000003d000000000000005d55553f8caa2a3e0000000000000000480000004900000000000000000000005955553f9daa2a3e0000000000000000480000004900000000000000000000005555553fadaa2a3e0000000000000000480000004900000000000000000000008c57e33e80e1a63e11c6343e661f5b3d48000000420000003d00000049000000b3daee3ee6a2923e0dd1423e09cf683d48000000420000003d0000004900000071c4f53e711e853e1e1d853e0000000042000000480000003d00000000000000db37db3e939f913eff8d8b3e7352733c420000003d0000004800000041000000f424bc3ed043a03e5516933e3607043d420000003d000000480000004100000087e6fb3e9263773e04bb523e7a51783d48000000420000003d000000490000005455553fafaa2a3e0000000000000000480000004900000000000000000000005355553fb3aa2a3e000000000000000048000000490000000000000000000000c177123f0661673eba3d0c3e7404853d480000003d000000420000004a0000003a3ab23e8844b03edcac553e42abca3d480000003d000000420000004a000000bb3dd23e5347bd3ee4f5603e00000000480000003d0000004a000000000000009894203f7c686f3e26450e3e00000000480000003d0000004a000000000000002eba683f942eba3d0000000000000000480000004900000000000000000000000000803f00000000000000000000000048000000000000000000000000000000dffec03ec0c2993ec199543e04c6eb3d420000003d0000004100000048000000474dcc3e5592983e76863d3ea374f13d420000003d0000004100000048000000cf62ad3e03e6a93e2fb7a83e0000000041000000420000003d00000000000000b877b23e4ed2ad3efab59f3e0000000041000000420000003d000000000000005a3fc83e5f8da63e5268833e58afdc3c410000003d000000420000004b000000ec11b73edf5fb13e358e973e0000000041000000420000003d0000000000000054f7d43e530c993e5b2b713e63354b3d410000003d000000420000004b000000fd74f33e0a929a3e10a9fa3dd53acd3d410000003d000000420000004b0000002314e03eb809ae3e51ff293ee013673d410000003d000000420000004b000000a21dc73ea21dc73e7789633e00000000410000003d0000004200000000000000a522b93efe98b63e5d44903e00000000410000003d0000004200000000000000416eea3e2e7b9e3e222d6e3e000000003d000000420000004100000000000000cc26d93e6dcfb63e8e13603e000000003d000000420000004100000000000000e1f1233f3e1cb83e00000000000000003d000000420000000000000000000000b7c9fe3e6bd1813ebbc97e3e000000003d00000042000000410000000000000050d6303f60539e3e00000000000000003d000000420000000000000000000000cf62bd3ea98abc3ef539163e35d6eb3d3d0000004200000048000000410000001ef24f3f3d67373ec1040d3c000000003d00000042000000470000000000000073315e3f343a073e00000000000000003d0000004200000000000000000000003113363fd052353ed9c0e43d000000003d000000420000004000000000000000de595d3facd19c3dcfbe703d000000003d000000400000004200000000000000be12703fd62a103da152dd3c000000003d0000004000000042000000000000000000803f0000000000000000000000003d000000000000000000000000000000dfcc4c3f86cc4c3e00000000000000003d0000003f00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d000000000000000000000000000000f4ff5f3f3200003e00000000000000003d0000004c0000000000000000000000e7ff5f3f6400003e00000000000000003d0000004c00000000000000000000003f555c3f03ab0e3e00000000000000003d0000004c00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d00000000000000000000000000000097aa583fa3551d3e00000000000000003d0000004c00000000000000000000002e55313fa3559d3e00000000000000003d0000004c00000000000000000000007eaa383f03ab8e3e00000000000000003d0000004c0000000000000000000000ceff3f3f6400803e00000000000000003d0000004c0000000000000000000000e7ff3f3f3300803e00000000000000003d0000004c00000000000000000000000000403f0000803e00000000000000003d0000004c00000000000000000000000000603f0000003e00000000000000003d0000004c00000000000000000000007c1c473f468ee33ddb8de33d000000003d0000004c0000003f000000000000004233333f86cc4c3ee2cccc3d000000003d0000003f0000004c000000000000000300403ff5ff7f3e00000000000000003d0000004c00000000000000000000000100403ffbff7f3e00000000000000003d0000004c00000000000000000000004a82333fe49b4b3ee3b5cc3d000000003d0000003f0000004c0000000000000041d1333f876b4a3eea9ecc3d000000003d0000003f0000004c000000000000000300403ff3ff7f3e00000000000000003d0000004c00000000000000000000000300403ff3ff7f3e00000000000000003d0000004c00000000000000000000004a83333fd39b4b3e08aecc3d000000003d0000003f0000004c000000000000004335333f61cc4c3e28bdcc3d000000003d0000003f0000004c00000000000000286d453fa897ee3d1bffe53d000000003d0000004c0000003f00000000000000c0c15c3f01f90c3e00000000000000003d0000004c0000000000000000000000a9323b3fae9a893e00000000000000003d0000004c0000000000000000000000ce9b3d3f64c8843e00000000000000003d0000004c0000000000000000000000f204403f39ec7f3e00000000000000003d0000004c0000000000000000000000cc655e3fd068063e00000000000000003d0000004c0000000000000000000000cfff5f3fc600003e00000000000000003d0000004c0000000000000000000000e7ff5f3f6400003e00000000000000003d0000004c00000000000000000000009dff3f3fc600803e00000000000000003d0000004c0000000000000000000000ceff3f3f6400803e00000000000000003d0000004c0000000000000000000000ffff3f3f0200803e00000000000000003d0000004c00000000000000000000000000603f0100003e00000000000000003d0000004c000000000000000000000023993d3fb9cd843e00000000000000003d0000004c0000000000000000000000ffff5f3f0200003e00000000000000003d0000004c0000000000000000000000ffff5f3f0200003e00000000000000003d0000004c00000000000000000000001c00603f24ffff3d00000000000000003d0000004c0000000000000000000000ffff3f3f0100803e00000000000000003d0000004c00000000000000000000003700403f24ff7f3e00000000000000003d0000004c00000000000000000000006f00403f46fe7f3e00000000000000003d0000004c00000000000000000000003700603f46feff3d00000000000000003d0000004c0000000000000000000000ffff3f3f0200803e00000000000000003d0000004c0000000000000000000000edff5f3f4c00003e00000000000000003d0000004c0000000000000000000000a3ff5f3f7401003e00000000000000003d0000004c000000000000000000000078605f3f207e023e00000000000000003d0000004c000000000000000000000046ff3f3f7301803e00000000000000003d0000004c000000000000000000000039c53e3f8f75823e00000000000000003d0000004c00000000000000000000002b8b3d3faae9843e00000000000000003d0000004c000000000000000000000038c15e3f20fb043e00000000000000003d0000004c0000000000000000000000ed5a5e3f4a94063e00000000000000003d0000004c000000000000000000000047ba3c3f738b863e00000000000000003d0000004c000000000000000000000062e93b3f3c2d883e00000000000000003d0000004c0000000000000000000000b0f45d3f3f2d083e00000000000000003d0000004c0000000000000000000000a44f5b3f71c1123e00000000000000003d0000004c00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000009d192a3f269d643ed0f8e53d000000003d0000004700000046000000000000000200403ff8ff7f3e00000000000000003d0000004700000000000000000000000000803f0000000000000000000000003d000000000000000000000000000000339f183fe2c14e3e54c14e3e000000003d00000047000000460000000000000098081e3fa6b7493e72e7d13d8164aa3d3d0000004600000047000000430000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d000000000000000000000000000000d19c233f1a86443ea4062d3e000000003d000000460000004300000000000000226d303f5d7a523e34a2d73d000000003d0000004300000046000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000002a4fd63e88d2c83e678d0c3edebc543d0000000001000000030000003d00000050a8123f4182b53e7ab4943d00000000000000000100000003000000000000001c58033f8900893e0293493ecc5bb83c000000000100000003000000020000003c3bf03e6867da3ea006713d45e4393d0100000000000000030000003d000000e4ae043f8736c43ec3ae493dc3ae493d00000000010000000e00000003000000f261033f7047d53e67ec3a3dfe71c93c01000000000000003d0000000e000000875d0a3f2735923e6f76ef3d7c91693d01000000000000003d00000003000000355c0d3ffe84983ed3a3c83d1fcd543d01000000000000003d000000030000001fde0f3fe3cd9d3e8822a83de569433d01000000000000003d00000003000000eb83163fddbc9b3e4628ad3db713bf3c01000000000000003d000000030000008c6b003f8b35833e3cef683ed2776f3c010000003d0000000000000003000000c3eff83e7159823e2d306b3e4aebf13c010000003d000000000000000300000013ea083f43e7b93e5812d13d000000003d000000010000000000000000000000c3610b3f16adb63e913dca3d000000003d00000001000000000000000000000059e60d3f0a62b33e1345c33d000000003d000000010000000000000000000000ec4a043f390d843edfb9663e00000000010000003d0000000000000000000000f777f13e5f758f3ec9fe5d3e299a003d010000003d0000000000000003000000bbfa0e3f5e76b23eae50be3d000000003d000000010000000000000000000000cd55153f2eaaaa3ee3a8aa3d000000003d0000000100000000000000000000000400e93ef3529e3ede084f3ed344093d010000003d000000000000000300000074b62f3fe4d4863e98f14d3d000000003d000000010000000000000000000000525a2e3fee8d883e72eb553d000000003d0000000100000000000000000000004c16313f2817853e02e2453d000000003d00000001000000000000000000000048cd313fe953843e428c403d000000003d0000000100000000000000000000009655353f76ff7f3ecba82a3d000000003d0000000100000000000000000000008f55353f7aff7f3e26a92a3d000000003d000000010000000000000000000000c155153f2faaaa3e38a9aa3d000000003d0000000100000000000000000000008955353f7eff7f3e7fa92a3d000000003d00000001000000000000000000000051f1e93e8b619d3eeb963b3e730d573d010000003d000000000000000300000049e40b3f701c623ec2a8f83d13fce33d0100000000000000030000003d000000e27e0e3f8ed75d3e59cf013e23bbcc3d01000000000000003d00000003000000d6c2113f037d583e73a5153e60a4953d01000000000000003d000000030000007361153fcd65803e0ebf073e35be073d01000000000000003d000000030000003c210b3f879a813ec7b6e93d39d5b63d01000000000000003d000000030000007361153fcd65803e0ebf073e35be073d01000000000000003d000000030000008e62183f2220913e056bf83d0000000001000000000000003d0000000000000049e40b3f701c623ec2a8f83d13fce33d0100000000000000030000003d0000003c210b3f879a813ec7b6e93d39d5b63d01000000000000003d00000003000000355c0d3ffe84983ed3a3c83d1fcd543d01000000000000003d000000030000002a4fd63e88d2c83e678d0c3edebc543d00000000010000000e0000003d00000050a8123f4182b53e7ab4943d0000000000000000010000000e000000000000003c3bf03e6867da3ea006713d45e4393d01000000000000000e0000003d0000001c58033f8900893e0293493ecc5bb83c00000000010000000e00000006000000e4ae043f8736c43ec3ae493dc3ae493d00000000010000000e00000003000000f261033f7047d53e67ec3a3dfe71c93c01000000000000003d0000000e0000006676b63e567cb43ebea6813e31341b3d0e00000000000000010000003d000000278af43e1a48d73efdb6d03d000000000e0000000000000001000000000000007726d93ea7a3d23e661aca3d22bd863d00000000010000000e0000003d0000007929193f4969903e130ff53d0000000000000000010000000e00000000000000b047f13ef6a7ed3e6641843d0000000000000000010000003d00000000000000b6602f3f943ea13e00000000000000000000000001000000000000000000000083dcfd3e1c13e13e8241843d0000000000000000010000003d000000000000000438223ff88fbb3e000000000000000000000000010000000000000000000000e27e0e3f8ed75d3e59cf013e23bbcc3d01000000000000003d0000000e00000049e40b3f701c623ec2a8f83d13fce33d01000000000000000e0000003d0000006b23053f1b70d43e3c24853d0000000000000000010000003d000000000000000831283fef9daf3e000000000000000000000000010000000000000000000000b6ff003f6ec0dd3e9700813d0000000000000000010000003d00000000000000326c213f9b27bd3e0000000000000000000000000100000000000000000000000831283fef9daf3e000000000000000000000000010000000000000000000000e26afb3e8c6fc33e234b023e0000000001000000000000003d000000000000003b47fe3e4c4ac13ef1dc003e0000000001000000000000003d00000000000000d68b0e3ffc55a23eb124013e0000000001000000000000003d000000000000008e62183f2220913e056bf83d0000000001000000000000003d00000000000000c50c003f7159bd3e0c1a053e0000000001000000000000003d0000000000000003ec033f9debb43ebb78063e0000000001000000000000003d00000000000000187ef83e21a1c53e8ec1033e0000000001000000000000003d00000000000000e26afb3e8c6fc33e234b023e0000000001000000000000003d00000000000000e66bd83ef3ffc13e4f284b3e00000000010000003d00000000000000000000008e62183f2220913e056bf83d0000000001000000000000003d00000000000000c5d0e83ebc91b73efd3a3f3e00000000010000003d00000000000000000000009bdd233f5b6a933ebb69933d000000003d0000000100000000000000000000006ff3273fd7218d3e2bdd8b3d000000003d00000001000000000000000000000050b72b3f5f57873e08e8843d000000003d0000000100000000000000000000008171cc3ec501c83e7319573e000000003d00000001000000000000000000000003ec033f9debb43ebb78063e0000000001000000000000003d000000000000007a08c83ec887b43ee3ac643e64ca083d010000003d000000000000003e000000c50c003f7159bd3e0c1a053e0000000001000000000000003d000000000000005d0fc83e82f89b3e4f9e723ee7a38a3d010000003d000000000000003e0000000000003f2449923e2649123e2349923d3d000000010000003e000000000000004eaa163f859c8c3e26e28c3d56598b3d3d000000010000003e000000000000003e34033f4a6b8d3e66c71f3e4a44623d3d0000004d000000010000003e000000e67c0d3f69b58c3e4a1a153e693adc3c3d0000004d00000001000000000000004a3eeb3eff608a3edb0d263e2b67dd3d3d0000004d000000010000003e0000008955d53e5c55d53ebaaaaa3db5a9aa3d4d0000003d000000010000003e00000017fbe13ec6fae13ec3c4953d95c7343d4d0000003d000000010000003e000000bcec0d3f2220b93e54905e3db845f33c4d0000003d0000003e00000001000000ac38f03e3138f03e18797c3d000000004d0000003d0000000100000000000000eabd123f2469bb3e800a183d969bc13c4d0000003d0000003e000000010000008533133f1e02c03ed450fc3cac1c9d3c4d0000003d000000010000003e0000004c6aec3ef969ec3eecae9c3d000000004d0000003d0000000100000000000000784d233f3a929a3eb596763d000000004d0000003d0000003e0000000000000060bd263f7215a23e777e033d000000004d0000003d0000003e000000000000000b052f3fa67a903e29da0b3d000000004d0000003d0000003e00000000000000a7aa2a3fb2aaaa3e00000000000000004d0000003d0000000000000000000000a022343fc0ba973e00000000000000004d0000003d0000000000000000000000d6732a3f83018a3e475b843d000000004d0000003d0000003e0000000000000004f1293faaa38a3e36e9853d000000004d0000003d0000003e000000000000005e05333fcb4e6c3e7e378f3d000000004d0000003d0000003e00000000000000ce81333f402b6a3e0c9b8f3d000000004d0000003d0000003e000000000000005b08213f538d623ec238f23d7dd3003d4d0000004e0000003d0000003e0000000a08233f8b1d473e17270c3ed56c023d4d0000004e0000003d0000003e000000edfe333fbb04683e24ff8f3d000000004d0000003d0000003e0000000000000011151f3ffa527d3e7f0fcd3d1b88fe3c4d0000004e0000003d0000003e000000d2850e3f5df4e23e00000000000000004d0000004e00000000000000000000008d01123f6069cd3e6338e93c000000004d0000004e0000003d000000000000007866043f5011e73efa0d013d000000004d0000004e0000003d00000000000000f7a9153f0ecab63e23106f3d000000004d0000004e0000003d00000000000000ce43033ff60ad93eb8b5813d000000004d0000004e0000003d000000000000006368073fe379993eae6a2f3e000000004d0000004e0000003d000000000000004495fb3e716ce13e2af98b3d000000004e0000004d0000003d0000000000000072aadd3e8e52b53efe055a3e000000004d0000004e0000003d000000000000007fe6a73ed7d69c3e4f86973e6ef18e3d4e0000004d0000003d0000004f0000002264ef3e7a6cad3ebbfdd63dd7bfb53d4e0000004d0000003d0000004f000000e8bac63e79f9c43e3e97683e000000004e0000004f0000003d000000000000000461fe3e676d873e2963743e000000003d0000004e0000004f0000000000000095462f3f30ad363e7c380c3e000000003d0000004e0000004f0000000000000021d4003f61d68a3eb199343e1ea4493d3d0000004d0000004e0000004f00000033c4d83e1e84cd3e5d6f333e000000004d0000003d0000004e00000000000000fe01fd3eaed2a33e2382d43d2f2ba83d4e0000004d000000500000004f0000009c94c73e01168f3e5f76623ed268e03d4e000000500000004f0000003d00000085ebc73e13ebc73eb5ef1f3e34c6803d500000004e0000004f0000003d0000002efaf23e240e8f3e18f4333e8df68f3d4e0000004d000000500000004f000000fffe003f593eec3e471d0e3d000000004e0000004d0000003d00000000000000d94c043f4e66f73e00000000000000004e0000004d000000000000000000000043be2a3fdc776d3ee2eba13d35c9b43c3d0000004d0000004e0000004f000000feed5d3f42339a3d9cb96c3d000000003d0000004e0000004f000000000000000000803f0000000000000000000000003d000000000000000000000000000000dfcc4c3f86cc4c3e00000000000000003d0000004d0000000000000000000000c0aa2a3f81aaaa3e00000000000000003d0000004d0000000000000000000000c31f0b3f4114c03ee4b0a63d000000003d0000004d0000004e00000000000000ea27fb3e578cdf3efa2e953d000000003d0000004d0000004e0000000000000026660c3f3c4f9a3ef1c8193e000000004d0000003d0000004e00000000000000e0ae273f83575d3efdec033e000000004d0000003d0000004e0000000000000075a6fc3eff19e23e30fe843d000000004d0000003d0000004e0000000000000007302b3ff39fa93e00000000000000003d0000004d00000000000000000000001cb52b3fc895a83e00000000000000003d0000004d00000000000000000000008a45023f2633ea3e2c0e0a3d000000004d0000003d0000004e000000000000004370323fa2296f3ea82a8e3d000000004d0000003d0000004e000000000000000c302b3fe89fa93e00000000000000003d0000004d0000000000000000000000cbaa2a3f6baaaa3e00000000000000003d0000004d0000000000000000000000d087063f60f0f23e00000000000000004d0000003d00000000000000000000003e75233f0a43ad3ea927bd3c000000003d0000004d000000010000000000000017013f3fd2fd813e00000000000000004d0000003d000000000000000000000021ec023f5320df3e503b583d000000004d0000003d00000001000000000000005c09553f8fda2b3e00000000000000003d000000010000000000000000000000ec656f3f9ed0843d00000000000000003d0000000100000000000000000000000000803f0000000000000000000000003d00000000000000000000000000000071cd4b3f3cca503e00000000000000003d0000004d0000000000000000000000c8562a3fef1c3b3ed0630a3e1121893c4d0000003d0000004e0000003e00000075291e3fb9627f3e73f7073e000000004d0000004e0000003d0000000000000025be383fbc9c773ec5aa153d000000004d0000003d0000003e0000000000000010990c3f1b02d03e285e363d000000004d0000003d00000001000000000000003eb1133f51ecc43e9b891d3d000000004d0000003d000000010000000000000051bae83e23bae83e302eba3d000000004d0000003d0000000100000000000000ba78163ff99d963e49c2f13d000000003d0000004d00000001000000000000002ca6183f284b4f3e87fa2a3e84860c3d3d000000010000004d00000000000000eabf063fffa58e3efd2c2b3ee83ae43c3d0000004d0000000100000000000000e5811b3fb35ca03e0e7ea23d000000003d000000010000000000000000000000abd5113f4b58af3e7bf1b33d000000003d000000010000000000000000000000916b333f0aa8823ea006343d000000003d00000001000000000000000000000026d7ea3e972bb43e67b72f3e0719923c010000003d000000000000000e0000007361153fcd65803e0ebf073e35be073d01000000000000003d0000000e000000d6c2113f037d583e73a5153e60a4953d01000000000000003d0000000e0000002d3ced3e9026b03ead5e1d3e696f1f3d010000003d000000000000000e0000008f60343fe153813e02582f3d000000003d0000000100000000000000000000009b95133f5b01ad3ebe4daf3d000000003d000000010000000000000000000000b655153f30aaaa3e8ca9aa3d000000003d0000000100000000000000000000008955353f7eff7f3e7fa92a3d000000003d0000000100000000000000000000005555553faaaa2a3e00000000000000003d0000000100000000000000000000005b2f553f92422b3e00000000000000003d00000001000000000000000000000023b46f3fe65e823d00000000000000003d0000000100000000000000000000000000703f0000803d00000000000000003d0000000100000000000000000000008ee3783f3a8ee33c00000000000000003d0000000100000000000000000000000000703f0000803d00000000000000003d0000000100000000000000000000000bf36f3fa767803d00000000000000003d0000000100000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000008003453faba4373e4f35513d000000003d0000004400000043000000000000000000803f0000000000000000000000003d0000000000000000000000000000001f00403f86ff7f3e00000000000000003d0000004400000000000000000000002900003fadffff3e00000000000000003d00000044000000000000000000000038dd063f3991bc3e57d1d63d000000003d00000044000000430000000000000038e1e83ea3dba23eb9940b3e24e3b93d3d000000440000004500000043000000cc03f43e81c6423e81c6423e646b123e3d0000004400000043000000450000005954d53ec801803ee0a92a3ee0a92a3e3d0000004500000044000000430000009de3cc3e2e548f3ec59b753e4ae9a33d3d0000004300000045000000440000007bd3c83e659ca03ea8cb5c3e2fa9a03d3d00000045000000430000004400000084e3cc3efacda33e824e8f3e000000003d000000450000004300000000000000572dc43edc70bf3eb59e653e2927993c450000003d000000430000004a000000af62d53e2154d53e5f922a3e00000000450000003d00000043000000000000002a01fb3e40c8c83e3c8aa03d36a0203d450000003d000000430000004a00000014fefa3e84c8c83e7095a03d6aa0203d450000003d0000004300000044000000e4380e3f2ea1bd3e27b4973d00000000450000003d0000004a00000000000000e4380e3f2fa1bd3e27b4973d00000000450000003d0000004a00000000000000e4380e3f30a1bd3e26b4973d00000000450000003d0000004a000000000000006a82f13e2335c13ee8909a3de8909a3d450000003d00000044000000430000006edbb63e6edbb63e2449123e2449123e450000003d000000440000004300000083f2c43eccebc43eab7e1d3e70899d3d450000003d0000004300000044000000d88fe03e48a6b33eaaa5333e54b80f3d450000003d000000430000004a000000e4ebc43e9a8a9d3e82891d3e82891d3e3d000000450000004400000043000000a4daf13edb20c73e03090e3e00000000450000003d0000004a000000000000002deef13e4325c73e1fd90d3e00000000450000003d0000004a0000000000000091b6e33eaefca93e8399643e000000003d0000004a000000450000000000000063a2e33eb453aa3ed213643e000000003d0000004a00000045000000000000001cc7f13e721cc73ee4380e3e00000000450000003d0000004a00000000000000398ee33eabaaaa3e398e633e000000003d0000004a00000045000000000000008b90c33e1445be3ecff7093ee5b9e43d450000003d000000430000004a000000f56ce13e6affba3e4227473e000000003d0000004a0000004500000000000000a5ecde3eee98cd3edbf4263e000000003d0000004a000000450000000000000089e9b53ecbe7973eecf0853e02f7b03d3d00000045000000430000004a000000dfadfa3e3b51973e03d4193e935b843d430000003d00000045000000480000007561183f18f47c3ef023c93d72d0733d430000003d0000004800000045000000965cff3e885c7f3e78a52d3ea589a83d43000000460000003d000000480000002448033f2948833e8acb373e5b0e523d43000000460000003d0000004500000028b3d23e1ab3d23e3757df3dc10f8b3d46000000430000003d00000048000000397bc03e307bc03e4313fe3d1a13fe3d46000000430000003d000000480000009209ed3e6c096d3eec711c3e84711c3e43000000460000003d0000004800000098371a3f47914b3e5a904b3e00000000430000003d0000004800000000000000c23de23e38e2613e0de2613e7680ef3d4600000043000000470000003d000000941adc3eaf685b3e1f685b3e0afa103e460000004300000047000000480000003f76be3e3e90833e80fc3f3e8af63b3e460000004800000047000000430000009432ab3e8d32ab3ecee1763ee2a7b83d4600000043000000480000003d000000ac7ffd3e72654d3e72654d3e896bd43d4800000046000000430000005100000075b5063f1495723ed0ffff3d5a2ae53d4800000046000000470000004300000055bae83efdb9683efab9683ebd2eba3d480000004700000046000000510000004c65af3e9282ae3edaf6673ed972b83d4600000047000000480000003d000000daa9d03e8c70903ec8734e3eddaede3d4300000048000000460000003d000000940e093fd8d0763e7b29e93d32c0e03d480000004300000046000000510000004296163f8f97963eb4eff03d00000000480000004300000051000000000000006bfbfe3efe4da93e79a1063ed42e233d43000000480000003d0000005100000045bdce3e8793903eb4a7523e6b6ddd3d4700000048000000460000003d000000bc75f63e2c25b53e41c5053eba130c3d47000000480000003d000000510000000773f23e9beca73e8764333eb3e1be3c48000000470000003d000000510000009564303fefc7823e3377633d00000000480000003d00000042000000000000000000803f000000000000000000000000480000000000000000000000000000004ed0473f4688203e056d803d0000000048000000470000005100000000000000dba0263ffb587f3e2f47cc3d00000000480000004700000051000000000000000bf8683fa53fb83d0000000000000000480000004900000000000000000000008e810a3ffeb0723e1835023e6327c23d4800000047000000460000005100000084852e3f56c7223e3158d43d0ada633d4800000051000000470000004600000056b33a3f2f0e2e3ef348ce3d0000000048000000510000004700000000000000734d483f34ca5e3e000000000000000048000000510000000000000000000000f8874a3f21e0553e0000000000000000480000005100000000000000000000004ecf4c3fc7c24c3e000000000000000048000000510000000000000000000000c768233f567d183e90dfd93d8ddfd93d48000000510000004700000046000000521a563f1b76d23da16e793d0000000048000000510000004700000000000000d02d5f3fc248033e0000000000000000480000005100000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000005473643f6265dc3d00000000000000004800000049000000000000000000000034914f3f30bb413e000000000000000048000000490000000000000000000000a7cc4c3f65cd4c3e000000000000000048000000490000000000000000000000c01a623f032aef3d00000000000000004800000049000000000000000000000052c9293f5c6dac3e0000000000000000480000005100000000000000000000004fc5413fc5ea783e000000000000000048000000510000000000000000000000792e3a3f0da38b3e000000000000000048000000510000000000000000000000cd3d0d3f6584e53e00000000000000004800000051000000000000000000000042b2123f7d9bda3e000000000000000051000000480000000000000000000000efff1f3f2200c03e0000000000000000480000005100000000000000000000009999193fcdcccc3e00000000000000005100000048000000000000000000000053734e3fb332463e000000000000000051000000480000000000000000000000089e673fc20fc33d0000000000000000510000004800000000000000000000003d282f3f86afa13e000000000000000051000000480000000000000000000000be31373f849c913e000000000000000051000000480000000000000000000000d1380e3f5e8ee33e000000000000000051000000480000000000000000000000124e173fdd63d13e000000000000000051000000480000000000000000000000be2e223f84a2bb3e00000000000000005100000048000000000000000000000075fe3f3f1503803e00000000000000005100000048000000000000000000000062ba683ff12cba3d000000000000000051000000480000000000000000000000832f683fe783be3d0000000000000000510000004800000000000000000000002d4a113fa56bdd3e0000000000000000480000005100000000000000000000005bff0a3f4b01ea3e000000000000000048000000510000000000000000000000b2f93e3f9d0c823e00000000000000004800000051000000000000000000000061bd453f7c0a693e000000000000000048000000510000000000000000000000fc15173f07d4d13e0000000000000000480000005100000000000000000000006526223f35b3bb3e00000000000000005100000048000000000000000000000005d3523febb3343e00000000000000005100000048000000000000000000000037a1043f92bdf63e000000000000000051000000480000000000000000000000de891d3f44ecc43e0000000000000000480000005100000000000000000000009dbc063fc686f23e000000000000000048000000510000000000000000000000933b363fdb88933e000000000000000048000000510000000000000000000000d4aa2a3f58aaaa3e0000000000000000510000004800000000000000000000000de1253fe63db43e000000000000000048000000510000000000000000000000df03533f86f0333e000000000000000048000000510000000000000000000000a0955f3f81a9013e00000000000000004800000051000000000000000000000009b16b3fba77a23d000000000000000048000000510000000000000000000000eb8f413f54c0793e0000000000000000480000005100000000000000000000000bf8513fd61f383e000000000000000048000000510000000000000000000000244f753fc30d2b3d0000000000000000480000005100000000000000000000000000803f00000000000000000000000048000000000000000000000000000000cf8d633f8991e33d0000000000000000480000005100000000000000000000005db4343f4697963e00000000000000004800000051000000000000000000000011cc4c3fbccf4c3e0000000000000000480000005100000000000000000000009125283fdeb4af3e0000000000000000480000005100000000000000000000006874513f622e3a3e0000000000000000510000004800000000000000000000000000803f000000000000000000000000510000000000000000000000000000008ebd683f8f13ba3d0000000000000000480000005100000000000000000000000000803f000000000000000000000000480000000000000000000000000000001dac2a3fc5a7aa3e0000000000000000480000005100000000000000000000000000803f00000000000000000000000051000000000000000000000000000000bcd9793f77c8c43c000000000000000048000000510000000000000000000000244f753fc50d2b3d0000000000000000480000005100000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f0000000000000000000000004800000000000000000000000000000049c5693fb4d5b13d0000000000000000480000005100000000000000000000004fbd683f8915ba3d00000000000000004800000051000000000000000000000094c1683f60f3b93d0000000000000000480000004900000000000000000000005ed6733f1c9a423d000000000000000048000000490000000000000000000000acca653fac79ba3dc187393c000000004800000049000000510000000000000088ac633ffaafba3d22af9f3c000000004800000049000000510000000000000034ba683f5f2eba3d0000000000000000480000004900000000000000000000005b89553ff410173ef94c963c00000000480000004900000051000000000000001ad2253f00a4b03e23f3ed3b0000000048000000490000005100000000000000d0f12c3ff7d8883e4a1b6a3d00000000480000004900000051000000000000000cf4103f8266d43e61169b3c000000004900000048000000510000000000000082db363ffb48923e0000000000000000490000004800000000000000000000007890063f11dff23e00000000000000004800000049000000000000000000000078e1333f103d983e00000000000000004800000049000000000000000000000076eb4a3f2752543e000000000000000048000000490000000000000000000000d20c0a3f5ce6eb3e0000000000000000490000004800000000000000000000006b895a3f52da153e00000000000000004900000048000000000000000000000024ca6b3fe3aea13d0000000000000000490000004800000000000000000000006655553f67aa2a3e0000000000000000490000004800000000000000000000000000803f000000000000000000000000490000000000000000000000000000000000803f000000000000000000000000490000000000000000000000000000000000803f000000000000000000000000490000000000000000000000000000000000803f000000000000000000000000490000000000000000000000000000000000803f00000000000000000000000049000000000000000000000000000000fa072e3f0bf0a33e000000000000000048000000490000000000000000000000ec8c283f28e6ae3e000000000000000048000000490000000000000000000000cb5c1a3f6a46cb3e000000000000000049000000480000000000000000000000c256073f7c52f13e00000000000000004900000048000000000000000000000024175a3f71a3173e00000000000000004900000048000000000000000000000082d5293ffc54ac3e00000000000000004900000048000000000000000000000056a00d3f54bfe43e000000000000000048000000490000000000000000000000b8ab2a3f90a8aa3e0000000000000000480000004900000000000000000000009f9a293fc1caac3e00000000000000004800000049000000000000000000000024f0423f703f743e000000000000000048000000490000000000000000000000f217353f1cd0953e0000000000000000480000004900000000000000000000005730303f539f9f3e0000000000000000480000004900000000000000000000008c734b3fd131523e0000000000000000490000004800000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f00000000000000000000000048000000000000000000000000000000f05f2a3f1f40ab3e0000000000000000480000004900000000000000000000000000803f0000000000000000000000004900000000000000000000000000000028cd4c3f5fcb4c3e0000000000000000480000004900000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f00000000000000000000000048000000000000000000000000000000d647553fa9e02a3e000000000000000048000000510000000000000000000000e6a54c3f6a684d3e000000000000000048000000510000000000000000000000b26d5b3f3949123e00000000000000004800000051000000000000000000000080555d3f00aa0a3e0000000000000000480000005100000000000000000000000000803f00000000000000000000000048000000000000000000000000000000dfa0563f857c253e000000000000000048000000490000000000000000000000f32e3a3f1ba28b3e000000000000000048000000490000000000000000000000258c393fb6e78c3e00000000000000004800000049000000000000000000000002cd4c3ff8cb4c3e00000000000000004800000049000000000000000000000074ea383f182b8e3e0000000000000000480000004900000000000000000000005dcd4c3f8cca4c3e000000000000000048000000490000000000000000000000b82a3c3f91aa873e0000000000000000480000004900000000000000000000005ecd4c3f8aca4c3e000000000000000048000000490000000000000000000000ac914f3f50b9413e0000000000000000480000004900000000000000000000005ecd4c3f87ca4c3e000000000000000048000000490000000000000000000000ac914f3f50b9413e000000000000000048000000490000000000000000000000ac914f3f4fb9413e000000000000000048000000490000000000000000000000cd883f3f65ee803e00000000000000004800000049000000000000000000000027db4b3f6593503e0000000000000000480000004900000000000000000000000fcd4c3fc5cb4c3e0000000000000000480000004900000000000000000000004adf593fd782183e000000000000000048000000490000000000000000000000bfcc4c3f04cd4c3e000000000000000048000000490000000000000000000000aa6d5b3f5949123e0000000000000000480000004900000000000000000000007f55553f03aa2a3e0000000000000000480000004900000000000000000000006bdb253fb269783e4551e03d00000000480000003d0000004a000000000000007d68d73eb455c73e9d83423e000000003d000000480000004a0000000000000084b1e43e0f619b3ed9da7f3e000000003d0000004a0000004800000000000000ec6ad03e79ada03e9ce78e3e000000003d0000004a0000004800000000000000ddd7d43ecc34c83e82b6fc3dd9168f3d3d0000004a000000480000004b000000d855023ff931873ead44683e000000003d0000004a0000004800000000000000f4622e3f173aa33e00000000000000003d0000004a0000000000000000000000bb87e73ea659d83e3f3d003e000000004a0000003d0000004b0000000000000076370e3f9691633e9190633e000000004a0000003d0000004b0000000000000022e20a3f8dc89b3e5de61c3e000000004a0000003d0000004b00000000000000f8552b3f66a2433eb9050f3e000000004a0000003d0000004b000000000000005778263f89615c3e1abd093e000000004a0000004b0000003d000000000000002a3d3d3f14a3553e14a1553d000000004a0000004b0000003d000000000000008c83463f7e66033ea516c53d000000004a0000004b0000003d000000000000006a55553f5aaa2a3e00000000000000004a0000003d0000000000000000000000eb54343f2b56973e00000000000000004a0000003d00000000000000000000001f38223fc28fbb3e00000000000000004a0000003d0000000000000000000000c7de393f72428c3e00000000000000004a0000003d00000000000000000000003546193f9773cd3e00000000000000004a0000003d0000000000000000000000261c0e3fb3c7e33e00000000000000004a0000003d00000000000000000000001a00003fccffff3e00000000000000004a0000003d0000000000000000000000bec0013f857efc3e00000000000000004a0000003d0000000000000000000000757b033f1509f93e00000000000000004a0000003d000000000000000000000042d23a3f7d5b8a3e00000000000000004a0000003d000000000000000000000064f51b3f3915c83e00000000000000004a0000003d0000000000000000000000a38a1e3fbaeac23e00000000000000004a0000003d000000000000000000000072c13b3f1c7d883e00000000000000004a0000003d0000000000000000000000c355553ff4a82a3e00000000000000004a0000003d00000000000000000000009655553fa8a92a3e00000000000000004a0000003d00000000000000000000009a83463fb166033ecc15c53d000000004a0000004b0000003d00000000000000a983463fe466033ef114c53d000000004a0000004b0000003d00000000000000213d3d3fb3a3553e219f553d000000004a0000004b0000003d00000000000000263d3d3f62a3553e1ba0553d000000004a0000004b0000003d0000000000000062d0f83e147cf23e579c253d000000004b0000004a0000003d00000000000000a491f83e8bc8f23e802e253d000000004b0000004a0000003d000000000000000231293f52ce9c3e527d063d000000004b0000004a0000003d00000000000000dd76293fd42d9c3e9023073d000000004b0000004a0000003d00000000000000cc1e443fcbbe343e17186b3d000000004b0000004a0000003d00000000000000f2bc293fd18c9b3e5cca073d000000004b0000004a0000003d00000000000000b24d443f1ce5333e6f906b3d000000004b0000004a0000003d00000000000000fcef433f1298353ef79f6a3d000000004b0000004a0000003d000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8a2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002eba683f8d2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000b0103c3fc173163e0193f23d000000004b0000003d0000004100000000000000bf954b3fe839003e32dea23d000000004b000000410000003d00000000000000cbed343fb7e9633e3dbe903d000000004b000000410000003d00000000000000fac81d3f87844b3e92573d3e000000004b000000410000003d00000000000000cf4c143fb2476d3e1185413e000000004b0000003d0000004100000000000000fac81d3f87844b3e92573d3e000000004b000000410000003d0000000000000006e40b3f06e48b3ee0a7383e000000004b0000003d000000410000000000000006e40b3f06e48b3ee0a7383e000000004b0000003d000000410000000000000006e40b3f06e48b3ee0a7383e000000004b0000003d000000410000000000000006e40b3f06e48b3ee0a7383e000000004b0000003d000000410000000000000006e40b3f06e48b3ee0a7383e000000004b0000003d000000410000000000000078be2e3f5eb1513e81a9e63d000000004b0000003d00000041000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000f2366c3f6d489e3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000e4c6703fbd91733d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000f2366c3f6d489e3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000f2366c3f6d489e3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000f2366c3f6d489e3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000f2366c3f6d489e3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000f2366c3f6d489e3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000f2366c3f6d489e3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000e9a24b3f2ebae83d8c2eba3d000000004b000000520000003d000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000a38b2e3f2fba683e8c2eba3d000000004b000000520000003d000000000000002ebae83e2ebae83e8c2eba3d000000004b000000520000003d00000000000000a38b2e3f2fba683e8c2eba3d000000004b000000520000003d00000000000000aca82e3f28b01f3e329cc73d22be833d4b0000003d0000005200000041000000da0e033f5eb1513e78be2e3e81a9e63d4b0000003d000000520000004100000025bc1c3febbb9c3e312fa73d000000004b000000520000003d00000000000000a3380e3f9ba1bd3e7db4973d00000000520000004b0000003d00000000000000f1f5263f3d9c5e3eb90cb23d9616323d520000004b000000530000003d00000086ff1f3fcb00a03ea200803d00000000520000004b0000003d000000000000009c8e303fde8e303eb8368d3da9368d3d520000004b00000053000000540000001edc363f5edc363e6541923de549123d520000004b000000540000003d000000ccde363f6f42123e6042123e000000005200000053000000540000000000000030ef443f3a821d3e10829d3d00000000520000005400000053000000000000001a6cdb3ee1ddb63e0a6c5b3e00000000540000005200000053000000000000008457553ff2a12a3e0000000000000000520000005400000000000000000000009da10b3fc7bce83e0000000000000000540000005200000000000000000000000000803f00000000000000000000000054000000000000000000000000000000adaa2a3fa6aaaa3e000000000000000054000000530000000000000000000000b0aa2a3f9faaaa3e0000000000000000540000005300000000000000000000000000803f000000000000000000000000540000000000000000000000000000000000803f00000000000000000000000054000000000000000000000000000000b4aa2a3f97aaaa3e000000000000000054000000530000000000000000000000d5842a3f56f6aa3e0000000000000000540000005300000000000000000000001500003fd6ffff3e0000000000000000540000005300000000000000000000002f55003fa355ff3e0000000000000000530000005400000000000000000000007342203fcd6d9f3e3035803d0000000053000000540000005500000000000000e4aa003f38aafe3e0000000000000000530000005400000000000000000000004885203fd8da9e3e5f6a803d00000000530000005400000055000000000000006a55553f5aaa2a3e0000000000000000530000005500000000000000000000004d55553fcaaa2a3e0000000000000000530000005500000000000000000000008738db3e8074993ef8528b3e0000000053000000550000003d000000000000003155553f3bab2a3e000000000000000053000000550000000000000000000000e851db3ea686993e73278b3e0000000053000000550000003d00000000000000162c0f3fd5a7e13e00000000000000003d00000055000000000000000000000040470f3f8171e13e00000000000000003d0000005500000000000000000000002c1fdb3e6062993e747e8b3e0000000053000000550000003d000000000000005d620f3f463be13e00000000000000003d000000550000000000000000000000e5ac0e3f36a6e23e00000000000000003d000000550000000000000000000000f04b0e3f2068e33e00000000000000003d0000005500000000000000000000004a680d3f6d2fe53e00000000000000003d000000550000000000000000000000e2100e3f3ddee33e00000000000000003d000000550000000000000000000000360d0f3f95e5e13e00000000000000003d0000005500000000000000000000008db70e3fe690e23e00000000000000003d00000055000000000000000000000051f1203f34e79e3e54b1793d0000000053000000540000005500000000000000a1ad563f7b49253e000000000000000053000000550000000000000000000000e6ff573f6800203e0000000000000000530000005500000000000000000000004b5c213f71f39e3ec29f723d00000000530000005400000055000000000000001400003fd7ffff3e0000000000000000530000005400000000000000000000004355003f7a55ff3e000000000000000053000000540000000000000000000000c9842a3f6ff6aa3e000000000000000054000000530000000000000000000000d35e2a3f5a42ab3e0000000000000000540000005300000000000000000000000000803f000000000000000000000000540000000000000000000000000000000000803f000000000000000000000000540000000000000000000000000000000000803f000000000000000000000000540000000000000000000000000000009caa2a3fc9aaaa3e0000000000000000540000005300000000000000000000000000803f00000000000000000000000054000000000000000000000000000000ffc5dd3e1beb973ee74e8a3e0000000053000000550000003d000000000000001b090f3fcaede13e00000000000000003d000000550000000000000000000000f9ed0e3f0d24e23e00000000000000003d0000005500000000000000000000008db70e3fe690e23e00000000000000003d0000005500000000000000000000004caf0e3f68a1e23e00000000000000003d0000005500000000000000000000006cb30e3f2799e23e00000000000000003d0000005500000000000000000000002864ca3e50efa73e88ac8d3e00000000560000003d0000005500000000000000d860ca3eebf4a73e3daa8d3e00000000560000003d000000550000000000000055e5ca3e9c13a73e10078e3e00000000560000003d000000550000000000000065db363f3849123e3449123e00000000560000003d000000550000000000000069db363f2e49123e2d49123e00000000560000003d00000055000000000000009796163f9296963e01f1703dfff0703d56000000570000003d000000550000009596163f9596963e0bf1703d03f1703d56000000570000003d000000550000000400003ff8ffff3e0000000000000000560000005700000000000000000000000400003ff8ffff3e000000000000000056000000570000000000000000000000aeaa2a3fa4aaaa3e0000000000000000570000005600000000000000000000000500003ff7ffff3e000000000000000056000000570000000000000000000000b5aa2a3f96aaaa3e0000000000000000570000005600000000000000000000000000803f000000000000000000000000570000000000000000000000000000000000803f00000000000000000000000057000000000000000000000000000000a7aa2a3fb3aaaa3e000000000000000057000000560000000000000000000000a7aa2a3fb3aaaa3e0000000000000000570000005600000000000000000000000000803f000000000000000000000000570000000000000000000000000000000000803f000000000000000000000000570000000000000000000000000000000400003ff9ffff3e0000000000000000560000005700000000000000000000000400003ff9ffff3e000000000000000056000000570000000000000000000000a6aa2a3fb4aaaa3e0000000000000000570000005600000000000000000000000000803f000000000000000000000000570000000000000000000000000000000665093fde7f893e31ea373ecc1f783c57000000560000003e0000003d000000489f3f3f71c1803e0000000000000000570000003e000000000000000000000005b3003ff699fe3e00000000000000003e00000057000000000000000000000098a8c63e5b93c53e9d07463ef801063d3e00000057000000560000003d0000009c52133fbc5e823ed7c9093e0bb9103d3e00000057000000560000003d000000678ea13e638ea13e5b8ea13ed8a65a3d3e00000056000000570000003d0000006d56fc3e8f746f3e31fe583e96817b3d3e00000056000000570000003d0000000efe2f3fe303a03e00000000000000003e00000057000000000000000000000064ea573f7256203e00000000000000003e000000570000000000000000000000a0b5433f6174fa3d561b9a3d97861b3d3e00000057000000560000003d0000008155323f00500f3e2b12be3dd0a1903d3e00000056000000570000003d0000002a40d63e1c40d63e74d50e3e0750c13c56000000570000003e0000003d00000092e9fa3e23ee8b3e2013003ef17ae43d3e00000056000000570000003d000000b759b33e8159b33ea959333ecd7ffe3d3e00000056000000570000003d000000ceeea43e71eea43e4b093a3e373c323e3e00000056000000550000003d0000000e2bd03e1d648d3e846f273e26721d3e3e00000056000000550000003d000000379d2c3f36f42f3e2d30c23d5ffb713d3e000000560000003d00000057000000d00f0d3fce3f4a3e5a9e073e31c5f33d3e00000056000000550000003d00000058affd3e5faf7d3ea11f293e9ea4bb3d56000000570000003e0000003d0000009a96163f8f96963ef6f0703df6f0703d5600000057000000550000003d0000006ddb363f2649123e2649123e0000000056000000550000003d000000000000000f13023fe06e2d3e732f273e7215233e560000003e000000550000003d0000008e195b3f87438b3d5a612b3db67e0c3d3e00000057000000560000003d0000008e724d3f81e1a23dfc86853d1e06583d3e000000560000003d00000057000000de22713f1bd26d3d00000000000000003e0000003d00000000000000000000004b65783faf56f33c00000000000000003e0000003d000000000000000000000063416a3febf4ad3d00000000000000003e0000005700000000000000000000000000803f0000000000000000000000003e00000000000000000000000000000039277c3fd631763c00000000000000003e0000003d00000000000000000000004b65783faa56f33c00000000000000003e0000003d00000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000fba643f10c6c33dd24b333c000000003e0000003d0000005500000000000000558e6e3f5a8d8b3d00000000000000003e0000003d00000000000000000000002a00513f5aff3b3e00000000000000003e0000003d00000000000000000000001124453f223c4e3ec79ce93c000000003e0000003d0000005500000000000000bd77e23e6fb6883e95da723e48245b3d3e0000003f0000003d00000040000000a1b5e83e9bd1943ec478823e000000003e0000003f0000003d000000000000008994043f33f09b3e78cd353e000000003e0000003f0000003d00000000000000888ce23eaa85953eceed873e000000003f0000003d0000003e000000000000006268e53ee8519c3e6c8b7c3e000000003f0000003e0000003d000000000000000386e73e3369ab3e95215a3e000000003f0000003e0000003d00000000000000b2e30e3f3876a03ec784033e000000003e0000003f0000003d0000000000000031d9583faf1b093e75fc9b3c000000003e0000003f0000003d000000000000008f3b563f24d1b63d6352973d000000003e0000003f0000003d000000000000004726d03e4abb843e9e69813e45d3a63d3f0000003e0000003d000000400000007663bf3eaad1813efb2f5e3ec5651f3e3f0000003e0000003d0000004000000089c8dc3e06607b3e2b61623e735bd13d3e0000003f0000003d00000040000000e1ffea3ece647c3efb7b173e781f163e3e0000003d000000550000003f00000046eb3a3f21f45d3e137b593d000000003e0000003d0000005500000000000000d9c8203f77ec243e0087e63d4859c93d3e0000003d0000005600000055000000cc10993eabab873ee229843e4e33363e3d0000003f0000003e000000550000009573d03ec70aaa3e42af373e0da8a63d550000003d0000003e00000040000000f0a3ca3e463d893e453f663e9bfce33d3e000000550000003d0000005600000073f7c43ed5f4673e9ba8643eab73293e550000003f0000003d00000040000000078d023fdcf09c3e97e2dc3dbff19a3d550000003d000000400000004100000013d5023f6233c23ea782613d22915f3d550000003d000000400000003e000000ed97eb3ed9a5bf3e5360053e8490103d550000003d0000003e00000040000000df30003f2732d03e69b0bd3d00000000550000003d0000003e00000000000000aeedf63ee96fdb3e84ea3f3dcb282d3d550000003d000000530000003e00000095fdee3e53e0e43e6288b03d00000000550000003d0000005300000000000000687e033f6ed2b73ee119853d45527f3d550000003d00000040000000410000005f03043f8d30883e843be43d56e7da3d550000003d00000040000000410000004b38db3e9c9ec93efce5e13d69be8a3d550000003d00000041000000530000008c06f13e8614c53eddc9133e000000003d000000550000005300000000000000b67a003ff91d8e3e35d9613e000000003d0000005500000053000000000000001ab6da3e7d52983ef08a2f3ecac7d43d3d00000055000000410000004b0000003c37dc3ef1c6993ea14c443e076e9f3d550000003d000000410000004b000000cf569a3e2cb18a3e98e9863ed91c283e3d00000041000000550000004b000000d57bfc3ef806ed3eef27bd3c45abaa3c3d00000055000000530000003e0000009977003fdc7ae83e92af343d000000003d00000055000000530000000000000064e4e33eadb79d3edec77c3e0000000053000000550000003d000000000000004655553fe9aa2a3e0000000000000000530000005500000000000000000000005a55553f98aa2a3e000000000000000053000000550000000000000000000000aa44ec3e29d0a13e5ad6633e0000000053000000550000003d00000000000000e0ff1f3f4700a03ecdff7f3d0000000053000000540000005500000000000000d6ff1f3f4900a03e2e00803d00000000530000005400000055000000000000000d00003fe5ffff3e0000000000000000540000005300000000000000000000000600003ff5ffff3e000000000000000054000000530000000000000000000000eaff1f3f4400a03e41ff7f3d00000000530000005400000055000000000000001422be3ed4b9853e14b8793e3720fd3d53000000550000003d0000005200000014891d3f784c833ec342033e000000005300000052000000550000000000000007b12a3f1483883e786b883d0000000052000000530000005500000000000000018a9a3e24a38c3e4434773e72713a3e520000003d000000530000005500000099b3b43e90b3b43ed798963e00000000540000005300000052000000000000003aade53e2a908f3ea1ad653e625e3f3d53000000520000005400000055000000389f323fa37a3e3e8e7abe3db259be3c52000000530000005400000055000000843a0e3fb1388e3e2e82e33de98d633d520000004b000000530000003d00000033ca9d3e6385913eebe45c3ee97b443e520000003d0000004b00000055000000fd72b33ea42d803e608d6f3e6131293e4b000000520000003d00000041000000676ce33edd64813e2596303e54c7053e4b0000003d0000004100000052000000da0e033f5eb1513e78be2e3e81a9e63d4b0000003d0000005200000041000000588fc93e3eaa913ef2b65d3ec5abd73d4b0000003d00000041000000550000008b60cd3e7a4b8b3e569b7b3e4719a63d410000003d0000004b000000550000004f3dab3e1420a43e5bdd923e0d2a6e3d4b000000410000003d0000004200000090dcbd3e2cd6b63e9c61743ebae3083d3d0000004b00000041000000420000004123033fb758a53e233daa3d0146a73d3d00000041000000420000004a000000173c4a3fa50f573e00000000000000003d0000004a0000000000000000000000ab33e63ef147b83e3f40f33d4fd1923d3d0000004b000000410000004a0000000793033f8b9e9e3edc51cd3dc49b9b3d4b0000003d0000004a0000004100000078be2e3f5eb1513e81a9e63d000000004b0000003d0000004100000000000000b0103c3fc073163e0193f23d000000004b0000003d00000041000000000000004bd1d43e5320b03ebe214e3e16ec1f3d3d0000004b0000004a00000041000000f3b3023f810a703eebce493e1a5b6d3d4b0000003d0000004a000000410000000865273f3e313b3e063b013e71fe173d4b0000003d0000004a000000410000003eb3343f998c183e0a24003e4613a43c4b0000004a0000003d000000410000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d000000000000000000000046af133fb15a793efe61163ee918063d4b0000004a0000003d000000410000000fbde63e615dc53e41f8113ef796ae3c4b0000004a0000003d00000041000000400ff93e742ff23e610a263d000000004b0000004a0000003d000000000000009bedd63eb5af9e3e401d6c3e79a0223d4b0000004a0000003d00000041000000f811d63e349e943eef68883e526ece3c3d0000004a0000004b00000041000000da6f3e3f4c20833e00000000000000003d0000004a00000000000000000000009c02ec3e81a9933e9537273e5ee0b23d3d00000041000000420000004a000000302bd13ef996813eba1d7b3ee8bbbe3d3d00000041000000420000004a000000b437d53e6a7d803eabab2d3e1aea263e3d000000420000004800000041000000de95b53ef6f59a3e57e36b3e030ae63d420000003d00000041000000480000004986193fee617c3e05949e3dd7759c3d410000003d000000420000004000000099481f3f2bdb223e5c84ec3d8380d33d41000000400000003d00000055000000ba46fa3e3395663e8edf4a3e92fbb33d410000003d0000005500000040000000bf24b33e70faaf3e6eb9393e3508003e41000000550000003d00000040000000dd63e53e165d633eeb8d2b3e464d263e41000000550000003f0000004000000021f6e63efe9f6b3e32562b3e901d1b3e55000000410000003f00000040000000c236943ef79c913eb9ba8c3e1be31a3e55000000410000003f000000400000004c50c93e6512573e444c533ebf00433e3f0000005500000041000000400000003716f03e3779b83e6b6db03de254ad3d3f00000040000000550000004100000080c9f63e26cda63e141fd43d5286b53d3f000000400000003e0000003d0000006ac0073f3142353e0dd2283e18ea023e3f000000400000003d0000003e00000011151f3ffa527d3e7f0fcd3d1b88fe3c3f000000400000003d0000003e000000edfe333fbb04683e24ff8f3d000000003f0000003d0000003e00000000000000f068293f574c8b3e2487873d000000003f0000003d0000003e000000000000000200203ffeff9f3efbff7f3d000000003f0000003d0000003e000000000000003fb5213f43319d3e00227b3d000000003f0000003d0000003e00000000000000784d233f3a929a3eb596763d000000003f0000003d0000003e000000000000008974163fd0d8823e3d7c203e000000003f0000003d0000003e000000000000009f24093f6edbb63eb948923d3049123d3f0000003d0000003e000000010000008955d53e5c55d53ebaaaaa3db5a9aa3d3f0000003d000000010000003e0000004a3eeb3eff608a3edb0d263e2b67dd3d3d0000003f000000010000003e0000007398f33ebcac953e2a5e5b3ecfbb903c3f0000003d0000003e00000001000000f3650a3fe120873e7426483e000000003f0000003d0000003e00000000000000a48cd53ef042b53ed9606a3e000000003f0000003e0000003d000000000000009a67103fadb0943e3e00153e000000003e0000003f0000003d00000000000000e1674e3fcad0133ec63e4a3d000000003e0000003f0000003d0000000000000039a45f3fb115cc3d2a22db3c000000003e0000003f0000003d0000000000000035ec443f068a1d3e4e8a9d3d000000003e0000003f0000003d00000000000000207e553f12a9fe3dd6cb2a3d000000003e0000003f0000003d0000000000000067a5633f7bc5873d981e363d000000003e0000003f0000003d000000000000003f55553f3dabaa3dcdaaaa3d000000003e0000003d0000003f0000000000000019ba683f3b2fba3d00000000000000003e0000003d000000000000000000000030cf733ff80c433d00000000000000003e0000003d00000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000009904743f74b63f3d00000000000000003e0000003f00000000000000000000007e1b693f0d24b73d00000000000000003e0000003f0000000000000000000000a6cd6a3ff275943ddfe6283c000000003e0000003f0000003d000000000000009904743f74b63f3d00000000000000003e0000003f00000000000000000000008cdd793f894ec43c00000000000000003e0000003f00000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000003408313fc6cd2d3e68110e3e000000003e0000003d0000003f0000000000000071f6113f3196883edaf9263e000000003e0000003f0000003d00000000000000d6f6c03e028bc03e50fc7c3e000000003f0000003e0000003d000000000000009051103fb1877d3e0d32413e000000003e0000003d0000003f0000000000000056c6d83e202eab3e8ad34e3e2f0e253d3e0000003d0000003f00000001000000179dca3e4ea1a73ed816733e7bb1213d3f0000003d0000003e00000001000000267b403f68137e3e00000000000000003e0000003d000000000000000000000045061e3f89e1ae3e6e8f283d000000003e0000003d000000010000000000000050bae83efdb9e83ec92eba3d000000003d0000003e0000000100000000000000e79bde3e7790853e0f9c5e3e6816b23d3d0000003e0000003f0000000100000009b3523fdc33353e00000000000000003e0000003d000000000000000000000057c6d83e1f2eab3e89d34e3e2f0e253d3e0000003d0000004d00000001000000e79bde3e7790853e0f9c5e3e6816b23d3d0000003e0000004d00000001000000179dca3e4ea1a73ed816733e7bb1213d4d0000003d0000003e00000001000000d6f6c03e028bc03e50fc7c3e000000004d0000003e0000003d000000000000009051103fb1877d3e0d32413e000000003e0000003d0000004d000000000000003408313fc6cd2d3e68110e3e000000003e0000003d0000004d0000000000000071f6113f3196883edaf9263e000000003e0000004d0000003d000000000000009a67103fadb0943e3e00153e000000003e0000004d0000003d00000000000000a48cd53ef042b53ed9606a3e000000004d0000003e0000003d000000000000000386e73e3369ab3e95215a3e000000004d0000003e0000003d00000000000000b2e30e3f3876a03ec784033e000000003e0000004d0000003d000000000000008994043f33f09b3e77cd353e000000003e0000004d0000003d0000000000000031d9583faf1b093e75fc9b3c000000003e0000004d0000003d000000000000008f3b563f24d1b63d6352973d000000003e0000004d0000003d000000000000002a00513f5aff3b3e00000000000000003e0000003d0000000000000000000000a1b5e83e9bd1943ec478823e000000003e0000004d0000003d00000000000000888ce23eaa85953eceed873e000000004d0000003d0000003e000000000000006268e53ee8519c3e6c8b7c3e000000004d0000003e0000003d00000000000000bd77e23e6fb6883e97da723e48245b3d3e0000004d0000003d0000004e0000001124453f223c4e3ec79ce93c000000003e0000003d000000580000000000000046eb3a3f21f45d3e137b593d000000003e0000003d000000580000000000000089c8dc3e06607b3e2b61623e735bd13d3e0000004d0000003d0000004e000000e0ffea3ece647c3efb7b173e791f163e3e0000003d000000580000004d000000d9c8203f77ec243e0087e63d4859c93d3e0000003d0000005900000058000000d00f0d3fce3f4a3e5a9e073e31c5f33d3e00000059000000580000003d000000f0a3ca3e463d893e453f663e9bfce33d3e000000580000003d000000590000009573d03ec70aaa3e42af373e0da8a63d580000003d0000003e0000004e000000cc10993eabab873ee229843e4e33363e3d0000004d0000003e000000580000007663bf3eaad1813efb2f5e3ec5651f3e4d0000003e0000003d0000004e00000072f7c43ed4f4673e9da8643eab73293e580000004d0000003d0000004e0000004c50c93e6512573e444c533ebf00433e4d00000058000000500000004e000000c236943ef79c913eb9ba8c3e1be31a3e58000000500000004d0000004e00000021f6e63efe9f6b3e32562b3e901d1b3e58000000500000004d0000004e000000078d023fdcf09c3e97e2dc3dbff19a3d580000003d0000004e0000005000000013d5023f6233c23ea782613d22915f3d580000003d0000004e0000003e0000005f03043f8d30883e843be43d56e7da3d580000003d0000004e00000050000000687e033f6ed2b73ee119853d45527f3d580000003d0000004e0000005000000095fdee3e53e0e43e6288b03d00000000580000003d0000005a00000000000000aeedf63ee96fdb3e84ea3f3dcb282d3d580000003d0000005a0000003e000000ed97eb3ed9a5bf3e5360053e8490103d580000003d0000003e0000004e000000df30003f2732d03e69b0bd3d00000000580000003d0000003e000000000000004b38db3e9c9ec93efce5e13d69be8a3d580000003d000000500000005a0000003c37dc3ef1c6993ea14c443e076e9f3d580000003d000000500000004b000000cf569a3e2cb18a3e98e9863ed91c283e3d00000050000000580000004b0000001ab6da3e7d52983ef08a2f3ecac7d43d3d00000058000000500000004b000000b67a003ff91d8e3e35d9613e000000003d000000580000005a000000000000008c06f13e8614c53eddc9133e000000003d000000580000005a00000000000000d57bfc3ef806ed3eef27bd3c45abaa3c3d000000580000005a0000003e0000009977003fdc7ae83e92af343d000000003d000000580000005a0000000000000063e4e33eadb79d3edfc77c3e000000005a000000580000003d00000000000000aa44ec3e29d0a13e5ad6633e000000005a000000580000003d000000000000005a55553f98aa2a3e00000000000000005a0000005800000000000000000000004655553fe9aa2a3e00000000000000005a000000580000000000000000000000162c0f3fd5a7e13e00000000000000003d000000580000000000000000000000e851db3ea686993e73278b3e000000005a000000580000003d000000000000008738db3e8074993ef8528b3e000000005a000000580000003d0000000000000040470f3f8171e13e00000000000000003d0000005800000000000000000000005d620f3f463be13e00000000000000003d0000005800000000000000000000002c1fdb3e6062993e747e8b3e000000005a000000580000003d000000000000006a55553f5aaa2a3e00000000000000005a0000005800000000000000000000004d55553fcaaa2a3e00000000000000005a0000005800000000000000000000003155553f3bab2a3e00000000000000005a000000580000000000000000000000e5ac0e3f36a6e23e00000000000000003d000000580000000000000000000000360d0f3f95e5e13e00000000000000003d0000005800000000000000000000008db70e3fe690e23e00000000000000003d000000580000000000000000000000e2100e3f3ddee33e00000000000000003d0000005800000000000000000000004a680d3f6d2fe53e00000000000000003d000000580000000000000000000000f04b0e3f2068e33e00000000000000003d0000005800000000000000000000007342203fcd6d9f3e3035803d000000005a000000540000005800000000000000d6ff1f3f4900a03e2e00803d000000005a0000005400000058000000000000001500003fd6ffff3e0000000000000000540000005a00000000000000000000002f55003fa355ff3e00000000000000005a000000540000000000000000000000e4aa003f38aafe3e00000000000000005a0000005400000000000000000000004885203fd8da9e3e5f6a803d000000005a00000054000000580000000000000050f1203f35e79e3e54b1793d000000005a0000005400000058000000000000004355003f7a55ff3e00000000000000005a0000005400000000000000000000001400003fd7ffff3e00000000000000005a0000005400000000000000000000004b5c213f71f39e3ec29f723d000000005a000000540000005800000000000000e6ff573f6800203e00000000000000005a000000580000000000000000000000a1ad563f7b49253e00000000000000005a000000580000000000000000000000c9842a3f6ff6aa3e0000000000000000540000005a0000000000000000000000d35e2a3f5a42ab3e0000000000000000540000005a00000000000000000000009caa2a3fc9aaaa3e0000000000000000540000005a0000000000000000000000d5842a3f56f6aa3e0000000000000000540000005a0000000000000000000000b4aa2a3f97aaaa3e0000000000000000540000005a0000000000000000000000b0aa2a3f9faaaa3e0000000000000000540000005a00000000000000000000000d00003fe5ffff3e0000000000000000540000005a0000000000000000000000e0ff1f3f4700a03ecdff7f3d000000005a0000005400000058000000000000000600003ff5ffff3e0000000000000000540000005a0000000000000000000000eaff1f3f4400a03e41ff7f3d000000005a000000540000005800000000000000adaa2a3fa6aaaa3e0000000000000000540000005a00000000000000000000001b6cdb3ee1ddb63e0a6c5b3e0000000054000000520000005a0000000000000099b3b43e90b3b43ed798963e00000000540000005a0000005200000000000000ccde363f6f42123e6042123e00000000520000005a000000540000000000000030ef443f3a821d3e10829d3d0000000052000000540000005a000000000000003aade53e2a908f3ea1ad653e625e3f3d5a000000520000005400000058000000389f323fa37a3e3e8e7abe3db259be3c520000005a000000540000005800000007b12a3f1483883e786b883d00000000520000005a000000580000000000000014891d3f784c833ec342033e000000005a0000005200000058000000000000001322be3ed5b9853e15b8793e3720fd3d5a000000580000003d00000052000000018a9a3e24a38c3e4434773e72713a3e520000003d0000005a000000580000001edc363f5edc363e6541923de549123d520000004b000000540000003d0000009c8e303fde8e303eb8368d3da9368d3d520000004b0000005a0000005400000086ff1f3fcb00a03ea200803d00000000520000004b0000003d000000000000008aff1f3fc400a03e9d00803d00000000520000004b0000003d0000000000000004390e3fdba0bd3e79b4973d000000004b000000520000003d0000000000000006390e3fd5a0bd3e7bb4973d000000004b000000520000003d000000000000008eff1f3fbe00a03e9900803d00000000520000004b0000003d0000000000000001390e3fe0a0bd3e76b4973d000000004b000000520000003d0000000000000004390e3fdaa0bd3e79b4973d000000004b000000520000003d000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d000000000000000000000006390e3fd5a0bd3e7bb4973d000000004b000000520000003d000000000000008aff1f3fc400a03e9d00803d00000000520000004b0000003d000000000000001adc363f56dc363e9b41923de049123d520000004b000000540000003d0000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d000000000000000000000077db363f8bfa503e312fa73d000000004b000000520000003d000000000000002fba683f8c2eba3d00000000000000004b0000003d000000000000000000000006390e3fd5a0bd3e7bb4973d000000004b000000520000003d000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c00000000000000000000000000000087987d3f38de193c00000000000000004c0000003d00000000000000000000000e317b3f38de993c00000000000000004c0000003d00000000000000000000001c62763f3bde193d00000000000000004c0000003d00000000000000000000000e317b3f3dde993c00000000000000004c0000003d000000000000000000000087987d3f2dde193c00000000000000004c0000003d00000000000000000000000f317b3f28de993c00000000000000004c0000003d00000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000700203ff1ffbf3e00000000000000004c0000003d00000000000000000000005800203f50ffbf3e00000000000000004c0000003d0000000000000000000000daff3f3f4b00803e00000000000000003d0000004c0000000000000000000000b7ff1f3f9100c03e00000000000000004c0000003d00000000000000000000008c9d203fe7c4be3e00000000000000004c0000003d0000000000000000000000c03a213f808abd3e00000000000000004c0000003d0000000000000000000000daff1f3f4d00c03e00000000000000004c0000003d0000000000000000000000fdff1f3f0700c03e00000000000000004c0000003d00000000000000000000003ceb1f3f8829c03e00000000000000004c0000003d000000000000000000000072d61f3f1c53c03e00000000000000004c0000003d00000000000000000000004eeb1f3f6329c03e00000000000000004c0000003d00000000000000000000002200203fbdffbf3e00000000000000004c0000003d00000000000000000000008b09213fe9ecbd3e00000000000000004c0000003d0000000000000000000000e013223f40d8bb3e00000000000000004c0000003d00000000000000000000003408213f98efbd3e00000000000000004c0000003d000000000000000000000074fd1f3f1905c03e00000000000000004c0000003d000000000000000000000040971d3f7fd1c43e00000000000000004c0000003d00000000000000000000007b02403f16f67f3e00000000000000003d0000004c00000000000000000000000c311b3fe89dc93e00000000000000004c0000003d00000000000000000000008b981d3feacec43e00000000000000004c0000003d00000000000000000000000b00203febffbf3e00000000000000004c0000003d00000000000000000000000800203ff0ffbf3e00000000000000004c0000003d00000000000000000000000600203ff4ffbf3e00000000000000004c0000003d00000000000000000000001000203fdfffbf3e00000000000000004c0000003d00000000000000000000001b00203fcbffbf3e00000000000000004c0000003d0000000000000000000000dfaa233f42aab83e00000000000000004c0000003d0000000000000000000000a155273fbe54b13e00000000000000004c0000003d0000000000000000000000a6b0243fb39eb63e00000000000000004c0000003d0000000000000000000000489f363f6fc1923e00000000000000003d0000004c0000000000000000000000ac0b223fa8e8bb3e00000000000000004c0000003d000000000000000000000036a3213f94b9bc3e00000000000000004c0000003d00000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000004c0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000006698f73e9405f23e2b10333d000000003d000000550000003e000000000000007f8c973e89dc963ebfba953ee370ef3d560000003d000000550000003e000000806acb3e2531a63e5c648e3e00000000560000003d00000055000000000000005bf89c3eb2bb873ea8dc6d3e3ebb483e550000003d0000003e000000560000008252973ed755953e41847f3e0c2b273e3e000000550000003d000000560000003aed413f4343da3d21ecc33d99cd243d3e0000003d00000056000000550000002ab45b3f4f62f73d8bf1ab3c000000003e0000003d00000055000000000000009696163f9796963efbf0703df5f0703d56000000570000003d000000550000006ddb363f2649123e2649123e0000000056000000550000003d0000000000000069db363f2f49123e2c49123e00000000560000003d00000055000000000000009796163f9796963ee9f0703de9f0703d5600000057000000550000003d0000007867ca3eb3e9a73ed5ae8d3e00000000560000003d0000005500000000000000a8f5c93e3931a23e1ed9933e00000000560000003d0000005500000000000000c73e323fb5fd1c3e2f071a3e00000000560000003d0000005500000000000000a8f5c93e3931a23e1ed9933e00000000560000003d0000005500000000000000c9932d3f8fd3273e4ddd213e00000000560000003d0000005500000000000000db7cc93ec71e9c3e5f649a3e00000000560000003d0000005500000000000000af9d143f26f6963e31d4803d7bcb7c3d56000000570000003d0000005500000046a2123f2d56973e8c3a893d8d5a843d56000000570000003d000000550000000200003ffdffff3e0000000000000000560000005700000000000000000000000200003ffcffff3e000000000000000056000000570000000000000000000000afaa2a3fa2aaaa3e000000000000000057000000560000000000000000000000b7aa2a3f92aaaa3e0000000000000000570000005600000000000000000000000000803f000000000000000000000000570000000000000000000000000000000000803f00000000000000000000000057000000000000000000000000000000afaa2a3fa2aaaa3e000000000000000057000000590000000000000000000000a6aa2a3fb4aaaa3e000000000000000057000000590000000000000000000000a6aa2a3fb4aaaa3e000000000000000057000000590000000000000000000000a7aa2a3fb3aaaa3e0000000000000000570000005900000000000000000000000400003ff9ffff3e0000000000000000590000005700000000000000000000000400003ff9ffff3e0000000000000000590000005700000000000000000000000400003ff8ffff3e000000000000000059000000570000000000000000000000aeaa2a3fa4aaaa3e000000000000000057000000590000000000000000000000b5aa2a3f96aaaa3e0000000000000000570000005900000000000000000000000400003ff8ffff3e0000000000000000590000005700000000000000000000000500003ff7ffff3e0000000000000000590000005700000000000000000000000665093fde7f893e31ea373ecc1f783c57000000590000003e0000003d0000002a40d63e1c40d63e74d50e3e0750c13c59000000570000003e0000003d000000678ea13e638ea13e5b8ea13ed8a65a3d3e00000059000000570000003d00000098a8c63e5b93c53e9d07463ef801063d3e00000057000000590000003d0000009c52133fbc5e823ed8c9093e0bb9103d3e00000057000000590000003d0000006d56fc3e8f746f3e31fe583e96817b3d3e00000059000000570000003d0000008155323f00500f3e2b12be3dd0a1903d3e00000059000000570000003d000000a0b5433f6174fa3d561b9a3d97861b3d3e00000057000000590000003d00000092e9fa3e23ee8b3e2013003ef17ae43d3e00000059000000570000003d000000379d2c3f36f42f3e2d30c23d5ffb713d3e000000590000003d000000570000000e2bd03e1d648d3e846f273e26721d3e3e00000059000000580000003d000000ceeea43e71eea43e4b093a3e373c323e3e00000059000000580000003d000000b759b33e8159b33ea959333ecd7ffe3d3e00000059000000570000003d00000058affd3e5faf7d3ea11f293e9ea4bb3d59000000570000003e0000003d0000000f13023fe06e2d3e732f273e7215233e590000003e000000580000003d0000006ddb363f2649123e2649123e0000000059000000580000003d000000000000009a96163f8f96963ef6f0703df6f0703d5900000057000000580000003d0000009796163f9296963e01f1703dfff0703d59000000570000003d0000005800000069db363f2e49123e2d49123e00000000590000003d000000580000000000000065db363f3849123e3449123e00000000590000003d00000058000000000000009596163f9596963e0bf1703d03f1703d59000000570000003d000000580000009696163f9696963ef9f0703df6f0703d59000000570000003d0000005800000069db363f2f49123e2c49123e00000000590000003d00000058000000000000006ddb363f2649123e2649123e0000000059000000580000003d000000000000009796163f9796963ee9f0703de9f0703d5900000057000000580000003d00000055e5ca3e9c13a73e10078e3e00000000590000003d0000005800000000000000806acb3e2531a63e5c648e3e00000000590000003d00000058000000000000007f8c973e89dc963ebfba953ee370ef3d590000003d000000580000003e0000006698f73e9405f23e2b10333d000000003d000000580000003e000000000000005bf89c3eb2bb873ea8dc6d3e3ebb483e580000003d0000003e000000590000008252973ed755953e41847f3e0c2b273e3e000000580000003d00000059000000d860ca3eebf4a73e3daa8d3e00000000590000003d00000058000000000000002964ca3e4fefa73e89ac8d3e00000000590000003d00000058000000000000006cb30e3f2799e23e00000000000000003d0000005800000000000000000000004caf0e3f68a1e23e00000000000000003d0000005800000000000000000000007867ca3eb3e9a73ed5ae8d3e00000000590000003d0000005800000000000000f9ed0e3f0d24e23e00000000000000003d0000005800000000000000000000001b090f3fcaede13e00000000000000003d0000005800000000000000000000008db70e3fe690e23e00000000000000003d000000580000000000000000000000ffc5dd3e1beb973ee74e8a3e000000005a000000580000003d00000000000000c068e03e1576963e2c21893e000000005a000000580000003d000000000000003d50e43e8c859c3e6f547e3e000000005a000000580000003d00000000000000efad563f4248253e00000000000000005a0000005800000000000000000000000ba9203f6b8a9f3ef01b793d000000005a0000005400000058000000000000004155553ffdaa2a3e00000000000000005a00000058000000000000000000000076f41f3f8522a03e7ba47f3d000000005a0000005400000058000000000000000400003ff9ffff3e0000000000000000540000005a00000000000000000000000900003fefffff3e00000000000000005a000000540000000000000000000000837de83e5401a33e5402693e000000005a000000580000003d00000000000000a4aa2a3fb8aaaa3e0000000000000000540000005a0000000000000000000000acaa2a3fa7aaaa3e0000000000000000540000005a00000000000000000000000000803f000000000000000000000000540000000000000000000000000000000000803f00000000000000000000000054000000000000000000000000000000a4aa2a3fb8aaaa3e0000000000000000540000005300000000000000000000000900003fefffff3e0000000000000000530000005400000000000000000000000ba9203f6b8a9f3ef01b793d0000000053000000540000005500000000000000efad563f4248253e0000000000000000530000005500000000000000000000000400003ff9ffff3e00000000000000005400000053000000000000000000000076f41f3f8522a03e7ba47f3d00000000530000005400000055000000000000004155553ffdaa2a3e0000000000000000530000005500000000000000000000003d50e43e8b859c3e6f547e3e0000000053000000550000003d00000000000000837de83e5401a33e5402693e0000000053000000550000003d00000000000000c068e03e1576963e2c21893e0000000053000000550000003d00000000000000e6c9073f356cf03e00000000000000003d000000550000000000000000000000a8f5c93e3931a23e1ed9933e00000000560000003d00000055000000000000004e00003f64ffff3e0000000000000000550000003d00000000000000000000003d50e43e8b859c3e6f547e3e0000000053000000550000003d000000000000004e00003f64ffff3e0000000000000000550000003d0000000000000000000000acaa2a3fa7aaaa3e000000000000000054000000530000000000000000000000c1a0c03e6180a83ebc34183e0189153e3f00000040000000550000004100000075f3a83e328aa53eab206d3e0cc8eb3d40000000410000003f000000550000004954083f0ed3943e51fbbf3d3016aa3d41000000400000003d00000042000000c7d1fd3e0f1e723e9a440a3ecaf9073e410000003d00000040000000420000005e84c73e3ea5673e0484473e03ce413e410000003d00000040000000420000005835a13ee9c8863ef202743e8d003c3e3d000000410000004200000040000000b9b5ff3e9846ae3e5d07243e000000003d000000420000004000000000000000c45b2b3f7c9a343ed992d63d19b44a3d48000000510000004300000046000000cfbb453fc310693e0000000000000000480000005100000000000000000000002064213f99363d3ee738bd3de738bd3d48000000510000004600000043000000e3da363f35ac2a3e7bd0f33d000000004800000051000000430000000000000064d71e3f3851c23e000000000000000048000000510000000000000000000000f25f2a3fa18c333ee755d53d8822613d480000005100000046000000470000005e06563f9ee2c33d74ea8b3d0000000048000000510000004300000000000000446d403fd8a3353e324e913d00000000480000004300000051000000000000002c5de53e1d6eb33e3db4313ea2a9e53c48000000430000003d000000510000007a242c3fcb91813e0995983d00000000480000003d0000004a0000000000000093fefd3ea33ab73e938d153e000000003d000000480000004a000000000000001a50e43ec0528d3eece0753e7f651b3d430000003d000000480000004a000000836cab3e1a17ab3edb9c383eed5b1a3e430000003d000000480000004a0000004d76ff3e270c823e499a283e9fc1a83d430000003d000000480000004a000000673bef3eef72e63eaa46a93d000000003d0000004a0000004500000000000000cfd5ec3eefa1e23e0721c23d000000004a0000003d00000045000000000000005442f23e83eed73ea53cd73d000000004a0000003d000000450000000000000082cffe3edf8d943e3c45593e000000003d0000004a0000004800000000000000cdeef53e29ecd43e2994d43d000000004a0000003d0000004500000000000000da87f93eb8f9d13eb9f9d13d000000004a0000003d0000004500000000000000cdeef53e29ecd43e2994d43d000000004a0000003d000000450000000000000064f51b3f3915c83e00000000000000004a0000003d000000000000000000000042d23a3f7d5b8a3e00000000000000004a0000003d00000000000000000000003546193f9773cd3e00000000000000004a0000003d0000000000000000000000c7de393f72428c3e00000000000000004a0000003d00000000000000000000001f38223fc38fbb3e00000000000000004a0000003d00000000000000000000006a55553f5aaa2a3e00000000000000004a0000003d0000000000000000000000eb54343f2b56973e00000000000000004a0000003d0000000000000000000000757b033f1509f93e00000000000000004a0000003d0000000000000000000000bec0013f857efc3e00000000000000004a0000003d00000000000000000000001a00003fccffff3e00000000000000004a0000003d0000000000000000000000261c0e3fb3c7e33e00000000000000004a0000003d0000000000000000000000f8552b3f66a2433eb9050f3e000000004a0000003d0000004b000000000000008c83463f7e66033ea516c53d000000004a0000004b0000003d0000000000000022e20a3f8dc89b3e5de61c3e000000004a0000003d0000004b0000000000000076370e3f9691633e9190633e000000004a0000003d0000004b000000000000005778263f89615c3e1abd093e000000004a0000004b0000003d000000000000002a3d3d3f14a3553e14a1553d000000004a0000004b0000003d000000000000009a83463fb166033ecc15c53d000000004a0000004b0000003d000000000000009655553fa8a92a3e00000000000000004a0000003d0000000000000000000000263d3d3f62a3553e1ba0553d000000004a0000004b0000003d0000000000000062d0f83e147cf23e549c253d000000004b0000004a0000003d00000000000000400ff93e742ff23e610a263d000000004b0000004a0000003d00000000000000f2bc293fd18c9b3e5cca073d000000004b0000004a0000003d00000000000000dd76293fd42d9c3e9023073d000000004b0000004a0000003d00000000000000cc1e443fcbbe343e17186b3d000000004b0000004a0000003d00000000000000b24d443f1ce5333e6f906b3d000000004b0000004a0000003d000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002eba683f8d2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8a2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000b0103c3fc173163e0193f23d000000004b0000003d000000500000000000000078be2e3f5eb1513e81a9e63d000000004b0000003d000000500000000000000006e40b3f06e48b3ee0a7383e000000004b0000003d0000005000000000000000fac81d3f87844b3e92573d3e000000004b000000500000003d00000000000000cf4c143fb2476d3e1185413e000000004b0000003d000000500000000000000006e40b3f06e48b3ee0a7383e000000004b0000003d000000500000000000000006e40b3f06e48b3ee0a7383e000000004b0000003d000000500000000000000006e40b3f06e48b3ee0a7383e000000004b0000003d0000005000000000000000cbed343fb7e9633e3dbe903d000000004b000000500000003d00000000000000fac81d3f87844b3e92573d3e000000004b000000500000003d0000000000000006e40b3f06e48b3ee0a7383e000000004b0000003d0000005000000000000000bf954b3fe839003e32dea23d000000004b000000500000003d000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000f2366c3f6f489e3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000e4c6703fbd91733d00000000000000004b0000003d0000000000000000000000f2366c3f6f489e3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000f2366c3f6f489e3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000f2366c3f6f489e3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000f2366c3f6f489e3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000f2366c3f6f489e3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000fd976d3f1840933d00000000000000004b0000003d0000000000000000000000f2366c3f6f489e3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000e9a24b3f2ebae83d8c2eba3d000000004b000000520000003d00000000000000a38b2e3f2fba683e8c2eba3d000000004b000000520000003d000000000000002ebae83e2ebae83e8c2eba3d000000004b000000520000003d00000000000000a38b2e3f2fba683e8c2eba3d000000004b000000520000003d000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d0000000000000000000000aca82e3f29b01f3e329cc73d22be833d4b0000003d0000005200000050000000da0e033f5eb1513e78be2e3e81a9e63d4b0000003d00000052000000500000002b74063f7ea36c3eb3fb0d3e4520d73d4b0000003d0000005000000052000000da0e033f5eb1513e78be2e3e81a9e63d4b0000003d0000005200000050000000676ce33edd64813e2596303e54c7053e4b0000003d0000005000000052000000fd72b33ea42d803e608d6f3e6131293e4b000000520000003d0000005000000033ca9d3e6385913eebe45c3ee97b443e520000003d0000004b00000058000000843a0e3fb1388e3e2e82e33de98d633d520000004b0000005a0000003d000000f1f5263f3d9c5e3eb90cb23d9616323d520000004b0000005a0000003d000000a3380e3f9ba1bd3e7db4973d00000000520000004b0000003d0000000000000025bc1c3febbb9c3e312fa73d000000004b000000520000003d0000000000000006390e3fd5a0bd3e7bb4973d000000004b000000520000003d0000000000000077db363f8bfa503e312fa73d000000004b000000520000003d000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000005730303f539f9f3e0000000000000000480000004900000000000000000000000000803f00000000000000000000000049000000000000000000000000000000f05f2a3f1f40ab3e000000000000000048000000490000000000000000000000f5964c3f2da44d3e000000000000000048000000490000000000000000000000ee5f2a3f2440ab3e0000000000000000480000004900000000000000000000000000803f0000000000000000000000004800000000000000000000000000000088b4193fef96cc3e0000000000000000490000004800000000000000000000000000803f000000000000000000000000490000000000000000000000000000000000803f000000000000000000000000490000000000000000000000000000000000803f000000000000000000000000490000000000000000000000000000000400003ff8ffff3e000000000000000049000000480000000000000000000000c1e8223f7e2eba3e0000000000000000490000004800000000000000000000000000803f000000000000000000000000490000000000000000000000000000000000803f000000000000000000000000490000000000000000000000000000001a49123fcb6ddb3e0000000000000000480000004900000000000000000000008a1f033fecc0f93e0000000000000000490000004800000000000000000000000000803f0000000000000000000000004900000000000000000000000000000096eb443fa6516c3e000000000000000048000000490000000000000000000000b09b5e3f3f91053e0000000000000000480000004900000000000000000000000000803f0000000000000000000000004800000000000000000000000000000063cd4c3f74ca4c3e000000000000000048000000510000000000000000000000d9aa2a3f4daaaa3e0000000000000000480000005100000000000000000000008999193fedcccc3e0000000000000000510000004800000000000000000000000100003fffffff3e000000000000000051000000480000000000000000000000a9aa2a3fadaaaa3e0000000000000000510000004800000000000000000000000400003ff8ffff3e0000000000000000480000005100000000000000000000009299193fdccccc3e0000000000000000510000004800000000000000000000000000803f000000000000000000000000510000000000000000000000000000000000803f000000000000000000000000510000000000000000000000000000000000803f00000000000000000000000051000000000000000000000000000000b9aa2a3f8faaaa3e000000000000000048000000510000000000000000000000d8cc4c3fa1cc4c3e0000000000000000480000005100000000000000000000000000803f000000000000000000000000510000000000000000000000000000000000803f0000000000000000000000004800000000000000000000000000000070914f3f40ba413e0000000000000000480000004900000000000000000000005b97663fe031783d76581e3d0000000048000000510000004900000000000000b291463f503f0c3ed3f3b23d000000004800000051000000490000000000000051d4453f2a821b3e27599a3d000000004800000049000000510000000000000099ec443f9c4d6c3e0000000000000000480000004900000000000000000000000000803f00000000000000000000000049000000000000000000000000000000300c093fe858db3eb975143d0000000049000000480000005100000000000000d9743d3fb68e7e3e73de393c00000000490000004800000051000000000000000000803f00000000000000000000000049000000000000000000000000000000b09b5e3f3f91053e00000000000000004800000049000000000000000000000096eb443fa6516c3e0000000000000000480000004900000000000000000000008a1f033fecc0f93e00000000000000004900000048000000000000000000000063cd4c3f74ca4c3e000000000000000048000000510000000000000000000000d9aa2a3f4daaaa3e0000000000000000480000005100000000000000000000001900683f35ffbf3d00000000000000005100000048000000000000000000000058cf733f790a433d00000000000000005100000048000000000000000000000093a9733fca66453d0000000000000000510000004800000000000000000000000000803f000000000000000000000000510000000000000000000000000000000000803f000000000000000000000000510000000000000000000000000000000000803f00000000000000000000000051000000000000000000000000000000e382733fd3d1473d0000000000000000510000004800000000000000000000000000803f00000000000000000000000051000000000000000000000000000000add1663f9a72c93d0000000000000000510000004800000000000000000000000000803f000000000000000000000000510000000000000000000000000000000000803f00000000000000000000000051000000000000000000000000000000c5cc4c3feacc4c3e000000000000000051000000480000000000000000000000dfa13b3f42bc883e000000000000000048000000510000000000000000000000bbaa2a3f8aaaaa3e000000000000000048000000510000000000000000000000d8cc4c3fa1cc4c3e000000000000000048000000510000000000000000000000bbaa2a3f8aaaaa3e0000000000000000480000005100000000000000000000008999193fedcccc3e0000000000000000510000004800000000000000000000000100003fffffff3e000000000000000051000000480000000000000000000000a9aa2a3fadaaaa3e0000000000000000510000004800000000000000000000000000803f00000000000000000000000051000000000000000000000000000000f5964c3f2da44d3e0000000000000000480000004900000000000000000000000000803f00000000000000000000000048000000000000000000000000000000e9696b3fb4b0a43d0000000000000000490000004800000000000000000000000000803f0000000000000000000000004900000000000000000000000000000051f1e93e8b619d3eeb963b3e730d573d010000003d000000000000000e00000024e2ea3e9e709c3ed82e283e4a57923d010000003d000000000000000e000000c155153f2faaaa3e38a9aa3d000000003d000000010000000000000000000000cd55153f2eaaaa3ee3a8aa3d000000003d0000000100000000000000000000000400e93ef3529e3ede084f3ed344093d010000003d000000000000000e00000049e40b3f701c623ec2a8f83d13fce33d01000000000000000e0000003d0000003c210b3f879a813ec7b6e93d39d5b63d01000000000000003d0000000e000000f877f13e60758f3ec7fe5d3e299a003d010000003d000000000000000e000000bbfa0e3f5e76b23eae50be3d000000003d00000001000000000000000000000013ea083f43e7b93e5812d13d000000003d000000010000000000000000000000c3eff83e7159823e2d306b3e4aebf13c010000003d000000000000000e0000008c6b003f8a35833e3eef683ed2776f3c010000003d000000000000000e000000c3610b3f16adb63e913dca3d000000003d00000001000000000000000000000059e60d3f0a62b33e1345c33d000000003d000000010000000000000000000000ec4a043f390d843edfb9663e00000000010000003d00000000000000000000008f55353f7bff7f3e26a92a3d000000003d0000000100000000000000000000009655353f76ff7f3ecba82a3d000000003d0000000100000000000000000000005555553faaaa2a3e00000000000000003d0000000100000000000000000000005555553faaaa2a3e00000000000000003d00000001000000000000000000000001e66f3ff5cf803d00000000000000003d000000010000000000000000000000d7fd6f3f4811803d00000000000000003d0000000100000000000000000000007973553f1a322a3e00000000000000003d0000000100000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000008515703faea77e3d00000000000000003d0000000100000000000000000000009a91553f98b9293e00000000000000003d000000010000000000000000000000f805703f7aa07f3d00000000000000003d0000000100000000000000000000001d66553f8c672a3e00000000000000003d0000000100000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000006bf66f3fa94c803d00000000000000003d000000010000000000000000000000993a553f9d152b3e00000000000000003d0000000100000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d00000000000000000000000000000017d10f3f4c34853e0b53363e000000003f0000003d0000003e00000000000000ca626c3ff8b32b3d601f0e3d000000003e0000003f0000003d0000000000000066c45f3f69ee003e00000000000000003d0000004700000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b00000000000000000000000000000087987d3f38de193c00000000000000005b0000003d00000000000000000000000e317b3f3dde993c00000000000000005b0000003d00000000000000000000001c62763f3bde193d00000000000000005b0000003d00000000000000000000000e317b3f38de993c00000000000000005b0000003d000000000000000000000087987d3f2dde193c00000000000000005b0000003d00000000000000000000000f317b3f28de993c00000000000000005b0000003d00000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000000803f0000000000000000000000005b0000000000000000000000000000000700203ff1ffbf3e00000000000000005b0000003d0000000000000000000000b7ff1f3f9100c03e00000000000000005b0000003d00000000000000000000006f00403f46fe7f3e00000000000000003d0000005b0000000000000000000000daff3f3f4b00803e00000000000000003d0000005b0000000000000000000000edff5f3f4c00003e00000000000000003d0000005b00000000000000000000003700603f46feff3d00000000000000003d0000005b00000000000000000000001c00603f24ffff3d00000000000000003d0000005b00000000000000000000003700403f24ff7f3e00000000000000003d0000005b0000000000000000000000ffff5f3f0200003e00000000000000003d0000005b0000000000000000000000ffff3f3f0100803e00000000000000003d0000005b0000000000000000000000ffff5f3f0200003e00000000000000003d0000005b0000000000000000000000ffff3f3f0200803e00000000000000003d0000005b0000000000000000000000ffff3f3f0200803e00000000000000003d0000005b00000000000000000000000000603f0100003e00000000000000003d0000005b0000000000000000000000e7ff5f3f6300003e00000000000000003d0000005b0000000000000000000000ceff3f3f6400803e00000000000000003d0000005b00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d000000000000000000000000000000cfff5f3fc600003e00000000000000003d0000005b00000000000000000000009dff3f3fc600803e00000000000000003d0000005b0000000000000000000000cc655e3fd068063e00000000000000003d0000005b0000000000000000000000c0c15c3f01f90c3e00000000000000003d0000005b0000000000000000000000286d453fa897ee3d1bffe53d000000003d0000005b0000004d00000000000000a9323b3fae9a893e00000000000000003d0000005b0000000000000000000000ce9b3d3f64c8843e00000000000000003d0000005b0000000000000000000000f204403f39ec7f3e00000000000000003d0000005b00000000000000000000004335333f61cc4c3e28bdcc3d000000003d0000004d0000005b0000000000000023993d3fb9cd843e00000000000000003d0000005b00000000000000000000004b83333fd29b4b3e06aecc3d000000003d0000004d0000005b000000000000007b02403f16f67f3e00000000000000003d0000005b00000000000000000000000300403ff3ff7f3e00000000000000003d0000005b000000000000000000000041d1333f876b4a3eea9ecc3d000000003d0000004d0000005b000000000000004b82333fe49b4b3ee3b5cc3d000000003d0000004d0000005b000000000000000300403ff3ff7f3e00000000000000003d0000005b00000000000000000000000300403ff5ff7f3e00000000000000003d0000005b00000000000000000000004233333f86cc4c3ee2cccc3d000000003d0000004d0000005b000000000000007c1c473f468ee33ddb8de33d000000003d0000005b0000004d000000000000000100403ffbff7f3e00000000000000003d0000005b00000000000000000000000000403f0000803e00000000000000003d0000005b00000000000000000000000000603f0000003e00000000000000003d0000005b0000000000000000000000f3ff5f3f3200003e00000000000000003d0000005b0000000000000000000000e7ff3f3f3300803e00000000000000003d0000005b0000000000000000000000ceff3f3f6400803e00000000000000003d0000005b0000000000000000000000e7ff5f3f6400003e00000000000000003d0000005b00000000000000000000003f555c3f03ab0e3e00000000000000003d0000005b00000000000000000000007eaa383f03ab8e3e00000000000000003d0000005b00000000000000000000002e55313fa3559d3e00000000000000003d0000005b000000000000000000000097aa583fa3551d3e00000000000000003d0000005b00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d000000000000000000000000000000be12703fd62a103da152dd3c000000003d0000004e0000004f000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d000000000000000000000000000000de595d3facd19c3dcfbe703d000000003d0000004e0000004f00000000000000a44f5b3f71c1123e00000000000000003d0000005b0000000000000000000000489f363f6fc1923e00000000000000003d0000005b000000000000000000000062e93b3f3c2d883e00000000000000003d0000005b0000000000000000000000b0f45d3f3f2d083e00000000000000003d0000005b0000000000000000000000ed5a5e3f4a94063e00000000000000003d0000005b000000000000000000000047ba3c3f738b863e00000000000000003d0000005b000000000000000000000038c15e3f20fb043e00000000000000003d0000005b000000000000000000000078605f3f207e023e00000000000000003d0000005b00000000000000000000002b8b3d3faae9843e00000000000000003d0000005b000000000000000000000039c53e3f8f75823e00000000000000003d0000005b0000000000000000000000a3ff5f3f7401003e00000000000000003d0000005b000000000000000000000046ff3f3f7301803e00000000000000003d0000005b00000000000000000000005800203f50ffbf3e00000000000000005b0000003d00000000000000000000008c9d203fe7c4be3e00000000000000005b0000003d0000000000000000000000c03a213f808abd3e00000000000000005b0000003d000000000000000000000036a3213f94b9bc3e00000000000000005b0000003d0000000000000000000000ac0b223fa8e8bb3e00000000000000005b0000003d0000000000000000000000a6b0243fb49eb63e00000000000000005b0000003d0000000000000000000000a155273fbe54b13e00000000000000005b0000003d0000000000000000000000dfaa233f42aab83e00000000000000005b0000003d00000000000000000000001b00203fcbffbf3e00000000000000005b0000003d00000000000000000000001000203fdfffbf3e00000000000000005b0000003d00000000000000000000000600203ff4ffbf3e00000000000000005b0000003d00000000000000000000000800203fefffbf3e00000000000000005b0000003d00000000000000000000000b00203febffbf3e00000000000000005b0000003d00000000000000000000008b981d3feacec43e00000000000000005b0000003d00000000000000000000000c311b3fe89dc93e00000000000000005b0000003d000000000000000000000040971d3f7fd1c43e00000000000000005b0000003d000000000000000000000074fd1f3f1905c03e00000000000000005b0000003d00000000000000000000003408213f98efbd3e00000000000000005b0000003d0000000000000000000000e013223f40d8bb3e00000000000000005b0000003d00000000000000000000008c09213fe8ecbd3e00000000000000005b0000003d00000000000000000000002200203fbdffbf3e00000000000000005b0000003d00000000000000000000004feb1f3f6329c03e00000000000000005b0000003d000000000000000000000072d61f3f1c53c03e00000000000000005b0000003d00000000000000000000003ceb1f3f8929c03e00000000000000005b0000003d0000000000000000000000fdff1f3f0700c03e00000000000000005b0000003d0000000000000000000000daff1f3f4d00c03e00000000000000005b0000003d0000000000000000000000b0d71e3fc1b0b73ef6fda93c000000003d0000005c0000004f00000000000000d50f3f3f56e0813e00000000000000003d0000005c00000000000000000000005b2b713f796a2f3d3d7f773c000000003d0000004f0000005c00000000000000340a643f025ba53d774de93c000000003d0000004f0000005c000000000000008b31033ffbdee53e72ef1d3d000000003d0000005c0000004f000000000000009455553fb1a92a3e00000000000000005c0000003d0000000000000000000000c28b2e3f7be8a23e00000000000000005c0000003d00000000000000000000000400003ff8ffff3e00000000000000003d0000005c0000000000000000000000d873dd3eee24c73e2a59143e26d5093d5c0000003d0000005d0000004f000000a505333f6dc23d3eff4dec3d000000005c0000003d0000005d00000000000000c6371a3f7a904b3e6e904b3e000000005c0000003d0000005d00000000000000af64d53ec32e913ebe998a3eff2ced3c5c0000005d0000003d0000004f000000a1a0f23e4a44dd3e546cc03d000000005d0000003d0000004f00000000000000b4c4343fef60433ef840b03d225e8b3c3d0000005d0000004f0000005c00000080f6193fb4134a3e5806453e55bf103c3d0000004f0000005d0000005c000000e284d93e50a8cf3e9da52d3e000000005d0000003d0000004f0000000000000078fcc33e75fcc33e250e703e000000005d0000003d0000004f000000000000008902fa3eab96a23e98cd463e000000003d0000004f0000005d00000000000000a076433f6c9c613ea548843c000000003d0000004f0000005c00000000000000fbcd183f0a64ce3e00000000000000003d0000004f00000000000000000000001a84043f79ef843e16810c3e1e1faf3d5c0000005e0000003d0000005d000000daa1ec3ed7216e3e5a5b1c3e1b3f1c3e5c0000005e0000005d0000003d0000001a2ac13e60f2bf3ee8f4fd3d3099fd3d5e0000005c0000005d0000003d000000d00bd33e3461d23e1520df3ddd2b8b3d5e0000005c0000003d0000005d00000089bae83e0fbae83ea22dba3d000000005c0000005e0000003d00000000000000ce96163f7896963eafeff03d000000005c0000005e0000003d000000000000002f4c023f4e8e823ea7b2713e000000005c0000005e0000003d00000000000000760fd03efd0ed03e1bc33f3e000000005c0000005e0000003d00000000000000986fcf3ee830523e3d0a4a3eabe5443e5e0000005c0000003d000000440000002a06ac3eb405ac3e23f4a73e000000005c0000005e0000003d00000000000000aea2b63e4f8ba93ed66c303e31370f3e3d0000005e0000005c000000440000002bbae83e7fba683e40ba683ed42dba3d5e0000005c000000440000003d00000048bae83e37bae83e052eba3d000000005e000000440000003d00000000000000e7ccce3e30efc63ed187543e000000005e000000440000003d000000000000009616c63e9befa63ecff9923e000000003d0000005e0000004400000000000000c388cd3e9316cb3e54c14e3e000000005c0000003d0000005e000000000000000667eb3eaed18d3ee9346d3ebd66013d440000003d0000005e000000450000002448033f2948833e8acb373e5b0e523d440000005e0000003d00000045000000965cff3e885c7f3e78a52d3ea589a83d440000005e0000003d0000005d0000006296163fb696963e1af2f03d00000000440000003d00000045000000000000007561183f18f47c3ef023c93d72d0733d440000003d0000005d0000004500000098371a3f47914b3e5a904b3e00000000440000003d0000005d000000000000009209ed3e6c096d3eec711c3e84711c3e440000005e0000003d0000005d000000397bc03e307bc03e4313fe3d1a13fe3d5e000000440000003d0000005d00000028b3d23e1ab3d23e3757df3dc10f8b3d5e000000440000003d0000005d000000b6380e3f52a1bd3e06b5973d00000000440000003d000000450000000000000093e9dd3e53d3bf3e3486443e000000003d000000440000005e000000000000001ebbe83e4938ba3e33193a3e00000000440000003d000000450000000000000071b7de3e219dde3edb56053e000000003d0000004400000045000000000000005a17c53e48e9c43ebdfe6b3e000000003d00000044000000450000000000000018eeb63e76d8b63e7339923e000000003d000000440000004500000000000000c6ffef3e2100a03e3200603e00000000440000003d0000004500000000000000daaaaa3ec4aaaa3e62aaaa3e000000003d000000450000004400000000000000572dc43edd70bf3eb49e653e2927993c450000003d000000440000004a00000084e3cc3efacda33e824e8f3e000000003d000000450000004400000000000000af62d53e2154d53e5f922a3e00000000450000003d00000044000000000000002a01fb3e40c8c83e3c8aa03d36a0203d450000003d000000440000004a00000014fefa3e84c8c83e7095a03d6aa0203d450000003d000000440000004300000083f2c43eccebc43eab7e1d3e70899d3d450000003d0000004400000043000000e4380e3f2ea1bd3e27b4973d00000000450000003d0000004a00000000000000e4380e3f2fa1bd3e27b4973d00000000450000003d0000004a00000000000000d88fe03e48a6b33eaaa5333e54b80f3d450000003d000000440000004a0000007bd3c83e659ca03ea8cb5c3e2fa9a03d3d0000004500000044000000430000009de3cc3e2e548f3ec59b753e4ae9a33d3d000000440000004500000043000000a4daf13eda20c73e03090e3e00000000450000003d0000004a0000000000000063a2e33eb453aa3ed213643e000000003d0000004a000000450000000000000091b6e33eaefca93e8399643e000000003d0000004a00000045000000000000002deef13e4325c73e1fd90d3e00000000450000003d0000004a000000000000008b90c33e1545be3ecef7093ee5b9e43d450000003d000000440000004a00000089e9b53ecbe7973eecf0853e02f7b03d3d00000045000000440000004a000000a5ecde3eee98cd3edbf4263e000000003d0000004a0000004500000000000000f56ce13e6affba3e4227473e000000003d0000004a0000004500000000000000dfadfa3e3c51973e02d4193e935b843d440000003d000000450000005d0000004d76ff3e270c823e499a283e9fc1a83d440000003d0000005d0000004a000000cfd5ec3eefa1e23e0721c23d000000004a0000003d00000045000000000000005442f23e83eed73ea53cd73d000000004a0000003d0000004500000000000000673bef3eef72e63eaa46a93d000000003d0000004a0000004500000000000000836cab3e1a17ab3edb9c383eed5b1a3e440000003d0000005d0000004a0000001a50e43ec0528d3eece0753e7f651b3d440000003d0000005d0000004a0000002c5de53e1d6eb33e3db4313ea2a9e53c5d000000440000003d0000005f00000093fefd3ea33ab73e938d153e000000003d0000005d0000004a000000000000007a242c3fcb91813e0995983d000000005d0000003d0000004a000000000000006bfbfe3efe4da93e79a1063ed42e233d440000005d0000003d0000005f000000dba9d03e8b70903ec8734e3eddaede3d440000005d0000005e0000003d0000004296163f8f97963eb4eff03d000000005d000000440000005f00000000000000940e093fd8d0763e7b29e93d32c0e03d5d000000440000005e0000005f000000ac7ffd3e72654d3e72654d3e896bd43d5d0000005e000000440000005f0000009432ab3e8d32ab3ecee1763ee2a7b83d5e000000440000005d0000003d0000003f76be3e3e90833e80fc3f3e8af63b3e5e0000005d0000005c00000044000000941adc3eaf685b3e1f685b3e0afa103e5e000000440000005c0000005d0000004c65af3e9282ae3edaf6673ed972b83d5e0000005c0000005d0000003d00000055bae83efdb9683efab9683ebd2eba3d5d0000005c0000005e0000005f00000075b5063f1495723ed0ffff3d5a2ae53d5d0000005e0000005c00000044000000c13de23e38e2613e0de2613e7680ef3d5e000000440000005c0000003d00000045bdce3e8793903eb4a7523e6b6ddd3d5c0000005d0000005e0000003d0000008e810a3ffeb0723e1835023e6327c23d5d0000005c0000005e0000005f000000dba0263ffb587f3e2f47cc3d000000005d0000005c0000005f00000000000000bc75f63e2c25b53e41c5053eba130c3d5c0000005d0000003d0000005f0000000773f23e9beca73e8764333eb3e1be3c5d0000005c0000003d0000005f0000004ed0473f4688203e056d803d000000005d0000005c0000005f000000000000000000803f0000000000000000000000005d0000000000000000000000000000009564303fefc7823e3377633d000000005d0000003d0000004f0000000000000048a61f3fda27753eeb00cd3d3dfa163d5d0000003d0000004f000000600000000bf8683fa53fb83d00000000000000005d0000006000000000000000000000005d55553f8caa2a3e00000000000000005d0000006000000000000000000000003753113f991e673e588b0d3e62128c3d5d0000003d0000004f000000600000008e20ff3e5766793eb0de4a3e6ee7753d5d0000004f0000003d0000006000000070e8c23e2d8c9e3e628b9e3e000000004f0000005d0000003d0000000000000071c4f53e711e853e1e1d853e000000004f0000005d0000003d000000000000008c57e33e80e1a63e11c6343e661f5b3d5d0000004f0000003d00000060000000b3daee3ee6a2923e0dd1423e09cf683d5d0000004f0000003d000000600000005555553fadaa2a3e00000000000000005d0000006000000000000000000000005455553fafaa2a3e00000000000000005d0000006000000000000000000000005355553fb3aa2a3e00000000000000005d00000060000000000000000000000087e6fb3e9263773e04bb523e7a51783d5d0000004f0000003d00000060000000f424bc3ed043a03e5516933e3607043d4f0000003d0000005d00000050000000db37db3e939f913eff8d8b3e7352733c4f0000003d0000005d00000050000000c177123f0661673eba3d0c3e7404853d5d0000003d0000004f0000004a0000002eba683f942eba3d00000000000000005d0000006000000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000009894203f7c686f3e26450e3e000000005d0000003d0000004a00000000000000bb3dd23e5347bd3ee4f5603e000000005d0000003d0000004a000000000000003a3ab23e8844b03edcac553e42abca3d5d0000003d0000004f0000004a000000dffec03ebfc2993ec199543e03c6eb3d4f0000003d000000500000005d000000de95b53ef6f59a3e57e36b3e030ae63d4f0000003d000000500000005d000000ec11b73edf5fb13e358e973e00000000500000004f0000003d00000000000000b877b23e4ed2ad3efab59f3e00000000500000004f0000003d000000000000005a3fc83e5f8da63e5168833e58afdc3c500000003d0000004f0000004b00000054f7d43e530c993e5b2b713e63354b3d500000003d0000004f0000004b000000cf62ad3e03e6a93e2fb7a83e00000000500000004f0000003d00000000000000a522b93efe98b63e5d44903e00000000500000003d0000004f00000000000000416eea3e2e7b9e3e222d6e3e000000003d0000004f0000005000000000000000a21dc73ea21dc73e7789633e00000000500000003d0000004f00000000000000b7c9fe3e6bd1813ebbc97e3e000000003d0000004f000000500000000000000050d6303f60539e3e00000000000000003d0000004f0000000000000000000000e1f1233f3e1cb83e00000000000000003d0000004f0000000000000000000000cc26d93e6dcfb63e8e13603e000000003d0000004f00000050000000000000002314e03eb809ae3e51ff293ee013673d500000003d0000004f0000004b000000fd74f33e0a929a3e10a9fa3dd53acd3d500000003d0000004f0000004b000000cf62bd3ea98abc3ef539163e35d6eb3d3d0000004f0000005d00000050000000474dcc3e5592983e76863d3ea374f13d4f0000003d000000500000005d0000001ef24f3f3c67373ec1040d3c000000003d0000004f0000005c0000000000000073315e3f343a073e00000000000000003d0000004f00000000000000000000003113363fd052353ed9c0e43d000000003d0000004f0000004e00000000000000b9b5ff3e9846ae3e5d07243e000000003d0000004f0000004e000000000000005835a13ee9c8863ef102743e8d003c3e3d000000500000004f0000004e0000005e84c73e3ea5673e0484473e03ce413e500000003d0000004e0000004f000000c7d1fd3e101e723e9a440a3ecaf9073e500000003d0000004e0000004f0000004986193fee617c3e05949e3dd7759c3d500000003d0000004f0000004e0000008860cd3e7a4b8b3e559b7b3e4619a63d500000003d0000004b000000580000004f3dab3e1420a43e5bdd923e0d2a6e3d4b000000500000003d0000004f00000090dcbd3e2cd6b63e9c61743ebae3083d3d0000004b000000500000004f0000004123033fb758a53e233daa3d0146a73d3d000000500000004f0000004a000000ab33e63ef147b83e3f40f33d4fd1923d3d0000004b000000500000004a000000173c4a3fa50f573e00000000000000003d0000004a00000000000000000000000793033f8b9e9e3edc51cd3dc49b9b3d4b0000003d0000004a0000005000000078be2e3f5eb1513e81a9e63d000000004b0000003d0000005000000000000000b0103c3fc073163e0193f23d000000004b0000003d00000050000000000000000865273f3e313b3e063b013e71fe173d4b0000003d0000004a000000500000003eb3343f998c183e0a24003e4613a43c4b0000004a0000003d00000050000000f3b3023f810a703eebce493e1a5b6d3d4b0000003d0000004a0000005000000046af133fb15a793efe61163ee918063d4b0000004a0000003d000000500000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000002fba683f8c2eba3d00000000000000004b0000003d00000000000000000000000ebde63e615dc53e42f8113ef796ae3c4b0000004a0000003d000000500000009bedd63eb5af9e3e401d6c3e79a0223d4b0000004a0000003d00000050000000f811d63e349e943eef68883e526ece3c3d0000004a0000004b00000050000000bb87e73ea659d83e3f3d003e000000004a0000003d0000004b00000000000000ddd7d43ecc34c83e82b6fc3dd9168f3d3d0000004a0000005d0000004b000000ec6ad03e79ada03e9ce78e3e000000003d0000004a0000005d00000000000000d855023ff931873ead44683e000000003d0000004a0000005d00000000000000f4622e3f173aa33e00000000000000003d0000004a000000000000000000000085b1e43e0f619b3ed7da7f3e000000003d0000004a0000005d000000000000007d68d73eb455c73e9d83423e000000003d0000005d0000004a0000000000000082cffe3edf8d943e3c45593e000000003d0000004a0000005d000000000000006bdb253fb269783e4551e03d000000005d0000003d0000004a000000000000000000803f0000000000000000000000005d000000000000000000000000000000446d403fd8a3353e324e913d000000005d000000440000005f000000000000005e06563f9ee2c33d74ea8b3d000000005d0000005f00000044000000000000000000803f0000000000000000000000005d000000000000000000000000000000bcd9793f77c8c43c00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d000000000000000000000000000000244f753fc50d2b3d00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005d000000000000000000000000000000244f753fc30d2b3d00000000000000005d0000005f00000000000000000000000af8513fd61f383e00000000000000005d0000005f0000000000000000000000cf8d633f8991e33d00000000000000005d0000005f000000000000000000000011cc4c3fbccf4c3e00000000000000005d0000005f00000000000000000000005db4343f4697963e00000000000000005d0000005f0000000000000000000000de891d3f44ecc43e00000000000000005d0000005f0000000000000000000000eb8f413f54c0793e00000000000000005d0000005f0000000000000000000000933b363fdb88933e00000000000000005d0000005f000000000000000000000009b16b3fba77a23d00000000000000005d0000005f0000000000000000000000a0955f3f81a9013e00000000000000005d0000005f00000000000000000000009dbc063fc686f23e00000000000000005d0000005f0000000000000000000000d4aa2a3f58aaaa3e00000000000000005f0000005d00000000000000000000000de1253fe63db43e00000000000000005d0000005f0000000000000000000000df03533f86f0333e00000000000000005d0000005f00000000000000000000006626223f35b3bb3e00000000000000005f0000005d000000000000000000000005d3523febb3343e00000000000000005f0000005d000000000000000000000062ba683ff12cba3d00000000000000005f0000005d000000000000000000000075fe3f3f1503803e00000000000000005f0000005d0000000000000000000000be31373f849c913e00000000000000005f0000005d0000000000000000000000832f683fe783be3d00000000000000005f0000005d0000000000000000000000089e673fc20fc33d00000000000000005f0000005d00000000000000000000003d282f3f86afa13e00000000000000005f0000005d0000000000000000000000d1380e3f5e8ee33e00000000000000005f0000005d0000000000000000000000124e173fdd63d13e00000000000000005f0000005d0000000000000000000000be2e223f84a2bb3e00000000000000005f0000005d000000000000000000000041b2123f7d9bda3e00000000000000005f0000005d000000000000000000000053734e3fb332463e00000000000000005f0000005d0000000000000000000000cd3d0d3f6584e53e00000000000000005d0000005f0000000000000000000000792e3a3f0da38b3e00000000000000005d0000005f0000000000000000000000efff1f3f2200c03e00000000000000005d0000005f00000000000000000000009999193fcdcccc3e00000000000000005f0000005d00000000000000000000002d4a113fa56bdd3e00000000000000005d0000005f0000000000000000000000fc15173f07d4d13e00000000000000005d0000005f00000000000000000000004ecf4c3fc7c24c3e00000000000000005d0000005f000000000000000000000061bd453f7c0a693e00000000000000005d0000005f00000000000000000000005bff0a3f4b01ea3e00000000000000005d0000005f0000000000000000000000b2f93e3f9d0c823e00000000000000005d0000005f0000000000000000000000d647553fa9e02a3e00000000000000005d0000005f0000000000000000000000e6a54c3f6a684d3e00000000000000005d0000005f0000000000000000000000b26d5b3f3949123e00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d00000000000000000000000000000024f0423f713f743e00000000000000005d000000600000000000000000000000f217353f1cd0953e00000000000000005d0000006000000000000000000000005730303f539f9f3e00000000000000005d00000060000000000000000000000082d5293ffc54ac3e0000000000000000600000005d00000000000000000000008c734b3fd131523e0000000000000000600000005d00000000000000000000000000803f00000000000000000000000060000000000000000000000000000000f05f2a3f1f40ab3e00000000000000005d0000006000000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d00000000000000000000000000000056a00d3f54bfe43e00000000000000005d000000600000000000000000000000c256073f7d52f13e0000000000000000600000005d0000000000000000000000b8ab2a3f90a8aa3e00000000000000005d0000006000000000000000000000009f9a293fc1caac3e00000000000000005d000000600000000000000000000000ec8c283f28e6ae3e00000000000000005d000000600000000000000000000000cb5c1a3f6a46cb3e0000000000000000600000005d00000000000000000000000000803f0000000000000000000000006000000000000000000000000000000024175a3f71a3173e0000000000000000600000005d0000000000000000000000d20c0a3f5ce6eb3e0000000000000000600000005d00000000000000000000006b895a3f52da153e0000000000000000600000005d000000000000000000000024ca6b3fe3aea13d0000000000000000600000005d000000000000000000000082db363ffb48923e0000000000000000600000005d00000000000000000000006655553f67aa2a3e0000000000000000600000005d00000000000000000000000000803f000000000000000000000000600000000000000000000000000000000000803f000000000000000000000000600000000000000000000000000000000000803f000000000000000000000000600000000000000000000000000000000000803f000000000000000000000000600000000000000000000000000000007890063f11dff23e00000000000000005d0000006000000000000000000000001ad2253f00a4b03e23f3ed3b000000005d000000600000005f0000000000000078e1333f103d983e00000000000000005d00000060000000000000000000000076eb4a3f2752543e00000000000000005d00000060000000000000000000000034ba683f5f2eba3d00000000000000005d0000006000000000000000000000005b89553ff410173ef94c963c000000005d000000600000005f00000000000000d0f12c3ff7d8883e4a1b6a3d000000005d000000600000005f000000000000000cf4103f8266d43e61169b3c00000000600000005d0000005f0000000000000027db4b3f6593503e00000000000000005d0000006000000000000000000000004adf593fd782183e00000000000000005d000000600000000000000000000000bfcc4c3f04cd4c3e00000000000000005d0000006000000000000000000000000fcd4c3fc5cb4c3e00000000000000005d0000006000000000000000000000005ecd4c3f87ca4c3e00000000000000005d000000600000000000000000000000cd883f3f65ee803e00000000000000005d000000600000000000000000000000acca653faa79ba3dc187393c000000005d000000600000005f0000000000000088ac633ffaafba3d22af9f3c000000005d000000600000005f000000000000005ed6733f1c9a423d00000000000000005d00000060000000000000000000000094c1683f60f3b93d00000000000000005d000000600000000000000000000000aa6d5b3f5949123e00000000000000005d000000600000000000000000000000b82a3c3f91aa873e00000000000000005d000000600000000000000000000000fa072e3f0bf0a33e00000000000000005d00000060000000000000000000000074ea383f182b8e3e00000000000000005d000000600000000000000000000000258c393fb5e78c3e00000000000000005d0000006000000000000000000000005dcd4c3f8cca4c3e00000000000000005d00000060000000000000000000000002cd4c3ff8cb4c3e00000000000000005d000000600000000000000000000000a7cc4c3f65cd4c3e00000000000000005d000000600000000000000000000000f32e3a3f1ba28b3e00000000000000005d000000600000000000000000000000dfa0563f857c253e00000000000000005d00000060000000000000000000000028cd4c3f5fcb4c3e00000000000000005d0000006000000000000000000000000000803f0000000000000000000000005d00000000000000000000000000000080555d3f00aa0a3e00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005d000000000000000000000000000000d02d5f3fc248033e00000000000000005d0000005f0000000000000000000000531a563f1b76d23da16e793d000000005d0000005f0000005c00000000000000734d483f34ca5e3e00000000000000005d0000005f000000000000000000000056b33a3f2f0e2e3ef348ce3d000000005d0000005f0000005c0000000000000084852e3f55c7223e3058d43d0ada633d5d0000005f0000005c0000005e000000c768233f567d183e90dfd93d8ddfd93d5d0000005f0000005c0000005e000000f8874a3f21e0553e00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000005473643f6165dc3d00000000000000005d000000600000000000000000000000c01a623f032aef3d00000000000000005d00000060000000000000000000000034914f3f30bb413e00000000000000005d00000060000000000000000000000052c9293f5d6dac3e00000000000000005d0000005f00000000000000000000004fc5413fc5ea783e00000000000000005d0000005f000000000000000000000070914f3f41ba413e00000000000000005d0000006000000000000000000000005955553f9daa2a3e00000000000000005d000000600000000000000000000000ac914f3f4fb9413e00000000000000005d000000600000000000000000000000ac914f3f50b9413e00000000000000005d0000006000000000000000000000005ecd4c3f8aca4c3e00000000000000005d000000600000000000000000000000ac914f3f50b9413e00000000000000005d0000006000000000000000000000007f55553f04aa2a3e00000000000000005d0000006000000000000000000000003686053f94f3f43e00000000000000004d0000004e00000000000000000000003716f03e3779b83e6b6db03de254ad3d4d0000004e0000005800000050000000c1a0c03e6180a83ebc34183e0189153e4d0000004e000000580000005000000080c9f63e26cda63e141fd43d5286b53d4d0000004e0000003e0000003d0000006ac0073f3142353e0ed2283e18ea023e4d0000004e0000003d0000003e0000004726d03e4abb843e9e69813e45d3a63d4d0000003e0000003d0000004e0000008974163fd0d8823e3d7c203e000000004d0000003d0000003e0000000000000075f3a83e328aa53eab206d3e0cc8eb3d4e000000500000004d00000058000000dd63e53e165d633eeb8d2b3e464d263e50000000580000004d0000004e000000bf24b33e70faaf3e6eb9393e3508003e50000000580000003d0000004e00000099481f3f2bdb223e5c84ec3d8380d33d500000004e0000003d00000058000000ba46fa3e3395663e8edf4a3e92fbb33d500000003d000000580000004e0000004954083f0ed3943e51fbbf3d3016aa3d500000004e0000003d0000004f000000588fc93e3eaa913ef2b65d3ec5abd73d4b0000003d00000050000000580000003fb5213f43319d3e00227b3d000000004d0000003d0000003e000000000000000200203ffeff9f3efbff7f3d000000004d0000003d0000003e00000000000000f068293f574c8b3e2487873d000000004d0000003d0000003e000000000000009f24093f6edbb63eb948923d3049123d4d0000003d0000003e000000010000007298f33ebcac953e2a5e5b3ecfbb903c4d0000003d0000003e00000001000000f3650a3fe120873e7426483e000000004d0000003d0000003e0000000000000017d10f3f4c34853e0b53363e000000004d0000003d0000003e0000000000000029c7f13eee8d633eb8aa2a3e09390e3e3d0000003e000000010000004d000000ffffff3e2549923e2649123e2449923d3d000000010000003e0000000000000034e4c93e140e9b3ead31713e86d3893d010000003d000000000000003e000000e26afb3e8c6fc33e234b023e0000000001000000000000003d0000000000000092b3cb3e64269a3e4ac96f3e9405893d010000003d000000000000003e00000034e4c93e150e9b3eac31713e86d3893d010000003d000000000000003e0000000000003f2549923e2549123e2449923d3d000000010000003e00000000000000ffffff3e2549923e2649123e2449923d3d000000010000003e00000000000000e26afb3e8c6fc33e234b023e0000000001000000000000003d000000000000002ac7f13eed8d633eb8aa2a3e08390e3e3d0000003e000000010000003f00000031c7f13e8baaaa3ec1aa2a3e3f8ee33c3d0000003e00000001000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e0000000000000000000000000000000000803f0000000000000000000000003e00000000000000000000000000000039277c3fd631763c00000000000000003e0000003d00000000000000000000004b65783faf56f33c00000000000000003e0000003d00000000000000000000008e195b3f87438b3d5a612b3db67e0c3d3e00000057000000590000003d000000de22713f1bd26d3d00000000000000003e0000003d00000000000000000000008e724d3f81e1a23dfc86853d1e06583d3e000000590000003d000000570000004b65783faa56f33c00000000000000003e0000003d00000000000000000000003aed413f4343da3d21ecc33d99cd243d3e0000003d00000059000000580000002ab45b3f4f62f73d8bf1ab3c000000003e0000003d00000058000000000000000fba643f0ec6c33dd24b333c000000003e0000003d0000005800000000000000558e6e3f5a8d8b3d00000000000000003e0000003d0000000000000000000000ca626c3ff8b32b3d601f0e3d000000003e0000004d0000003d00000000000000a6cd6a3ff275943ddfe6283c000000003e0000004d0000003d0000000000000039a45f3fb115cc3d2a22db3c000000003e0000004d0000003d000000000000009904743f74b63f3d00000000000000003e0000004d00000000000000000000007e1b693f0d24b73d00000000000000003e0000004d0000000000000000000000207e553f12a9fe3dd6cb2a3d000000003e0000004d0000003d0000000000000067a5633f7bc5873d981e363d000000003e0000004d0000003d000000000000009904743f74b63f3d00000000000000003e0000004d000000000000000000000035ec443f068a1d3e4e8a9d3d000000003e0000004d0000003d000000000000003f55553f3dabaa3dcdaaaa3d000000003e0000003d0000004d00000000000000e1674e3fcad0133ec63e4a3d000000003e0000004d0000003d000000000000008cdd793f894ec43c00000000000000003e0000004d00000000000000000000004bd1d43e5320b03ebe214e3e16ec1f3d3d0000004b0000004a00000050000000da6f3e3f4c20833e00000000000000003d0000004a00000000000000000000009c02ec3e81a9933e9537273e5ee0b23d3d000000500000004f0000004a000000302bd13ef996813eba1d7b3ee8bbbe3d3d000000500000004f0000004a000000b437d53e6a7d803eabab2d3e1aea263e3d0000004f0000005d00000050000000c45b2b3f7c9a343ed992d63d19b44a3d5d0000005f000000440000005e0000002064213f99363d3ee738bd3de738bd3d5d0000005f0000005e00000044000000cfbb453fc310693e00000000000000005d0000005f0000000000000000000000e3da363f35ac2a3e7bd0f33d000000005d0000005f000000440000000000000064d71e3f3851c23e00000000000000005d0000005f000000000000000000000037a1043f92bdf63e00000000000000005f0000005d0000000000000000000000f25f2a3fa28c333ee755d53d8822613d5d0000005f0000005e0000005c0000009125283fdeb4af3e00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000001dac2a3fc5a7aa3e00000000000000005d0000005f00000000000000000000009125283fdeb4af3e00000000000000005d0000005f00000000000000000000008ebd683f8f13ba3d00000000000000005d0000005f00000000000000000000006874513f622e3a3e00000000000000005f0000005d00000000000000000000000000803f0000000000000000000000005f0000000000000000000000000000001900683f37ffbf3d00000000000000005f0000005d00000000000000000000000000803f0000000000000000000000005f0000000000000000000000000000000000803f0000000000000000000000005f00000000000000000000000000000058cf733f790a433d00000000000000005f0000005d000000000000000000000094a9733fc766453d00000000000000005f0000005d00000000000000000000000000803f0000000000000000000000005f000000000000000000000000000000e382733fd3d1473d00000000000000005f0000005d00000000000000000000000000803f0000000000000000000000005f000000000000000000000000000000add1663f9a72c93d00000000000000005f0000005d00000000000000000000000000803f0000000000000000000000005f000000000000000000000000000000c5cc4c3feacc4c3e00000000000000005f0000005d00000000000000000000000000803f0000000000000000000000005f000000000000000000000000000000dfa13b3f42bc883e00000000000000005d0000005f0000000000000000000000bbaa2a3f8aaaaa3e00000000000000005d0000005f00000000000000000000009299193fdccccc3e00000000000000005f0000005d00000000000000000000000400003ff8ffff3e00000000000000005d0000005f0000000000000000000000b9aa2a3f8faaaa3e00000000000000005d0000005f0000000000000000000000d8cc4c3fa1cc4c3e00000000000000005d0000005f0000000000000000000000a9aa2a3fadaaaa3e00000000000000005f0000005d00000000000000000000000100003fffffff3e00000000000000005f0000005d00000000000000000000008999193fedcccc3e00000000000000005f0000005d0000000000000000000000f5964c3f2da44d3e00000000000000005d0000006000000000000000000000000000803f0000000000000000000000005d000000000000000000000000000000ee5f2a3f2440ab3e00000000000000005d000000600000000000000000000000e9696b3fb4b0a43d0000000000000000600000005d00000000000000000000000000803f0000000000000000000000006000000000000000000000000000000088b4193fef96cc3e0000000000000000600000005d00000000000000000000000000803f000000000000000000000000600000000000000000000000000000000400003ff8ffff3e0000000000000000600000005d0000000000000000000000c1e8223f7e2eba3e0000000000000000600000005d00000000000000000000001a49123fcb6ddb3e00000000000000005d0000006000000000000000000000008a1f033fecc0f93e0000000000000000600000005d00000000000000000000000000803f00000000000000000000000060000000000000000000000000000000d9743d3fb68e7e3e73de393c00000000600000005d0000005f00000000000000300c093fe858db3eb975143d00000000600000005d0000005f000000000000000000803f0000000000000000000000006000000000000000000000000000000051d4453f2a821b3e27599a3d000000005d000000600000005f0000000000000099ec443f9c4d6c3e00000000000000005d000000600000000000000000000000b291463f503f0c3ed3f3b23d000000005d0000005f00000060000000000000005a97663fe331783d76581e3d000000005d0000005f00000060000000000000004fbd683f8915ba3d00000000000000005d0000005f000000000000000000000049c5693fb4d5b13d00000000000000005d0000005f0000000000000000000000b09b5e3f3f91053e00000000000000005d00000060000000000000000000000096eb443fa6516c3e00000000000000005d0000006000000000000000000000009125283fdeb4af3e00000000000000005d0000005f00000000000000000000001dac2a3fc5a7aa3e00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005f00000000000000000000000000000051d4453f2a821b3e27599a3d000000005d000000600000005f0000000000000099ec443f9c4d6c3e00000000000000005d0000006000000000000000000000000000803f0000000000000000000000005d00000000000000000000000000000098081e3fa6b7493e72e7d13d8164aa3d3d0000005e0000005c00000044000000339f183fe2c14e3e54c14e3e000000003d0000005c0000005e00000000000000d19c233f1a86443ea4062d3e000000003d0000005e00000044000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d000000000000000000000000000000226d303f5c7a523e33a2d73d000000003d000000440000005e000000000000000000803f0000000000000000000000003d0000000000000000000000000000009c192a3f279d643ed0f8e53d000000003d0000005c0000005e000000000000000200403ff8ff7f3e00000000000000003d0000005c00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d00000000000000000000000000000066c45f3f69ee003e00000000000000003d0000005c00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000003d50e43e8b859c3e6f547e3e0000000053000000550000003d000000000000004e00003f64ffff3e0000000000000000550000003d0000000000000000000000837de83e5401a33e5402693e0000000053000000550000003d00000000000000a8f5c93e3931a23e1ed9933e00000000560000003d0000005500000000000000db7cc93ec71e9c3e5f649a3e00000000560000003d0000005500000000000000e6c9073f356cf03e00000000000000003d000000580000000000000000000000a9f5c93e3931a23e1fd9933e00000000590000003d00000058000000000000004e00003f64ffff3e0000000000000000580000003d00000000000000000000003d50e43e8c859c3e6f547e3e000000005a000000580000003d000000000000004e00003f64ffff3e0000000000000000580000003d0000000000000000000000a9f5c93e3931a23e1fd9933e00000000590000003d0000005800000000000000a9f5c93e3931a23e1fd9933e00000000590000003d0000005800000000000000c73e323fb5fd1c3e2f071a3e00000000590000003d0000005800000000000000c9932d3f8fd3273e4ddd213e00000000590000003d0000005800000000000000db7cc93ec71e9c3e5f649a3e00000000590000003d0000005800000000000000af9d143f26f6963e31d4803d7bcb7c3d59000000570000003d0000005800000046a2123f2d56973e8c3a893d8d5a843d59000000570000003d000000580000000200003ffcffff3e0000000000000000590000005700000000000000000000000200003ffdffff3e000000000000000059000000570000000000000000000000b7aa2a3f92aaaa3e0000000000000000570000005900000000000000000000003d50e43e8c859c3e6f547e3e000000005a000000580000003d00000000000000837de83e5401a33e5402693e000000005a000000580000003d000000000000004e00003f64ffff3e0000000000000000580000003d0000000000000000000000a9f5c93e3931a23e1fd9933e00000000590000003d0000005800000000000000db7cc93ec71e9c3e5f649a3e00000000590000003d0000005800000000000000d8cc4c3fa1cc4c3e0000000000000000480000005100000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f00000000000000000000000051000000000000000000000000000000bbaa2a3f8aaaaa3e000000000000000048000000510000000000000000000000b09b5e3f3f91053e0000000000000000480000004900000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f000000000000000000000000480000000000000000000000000000000000803f0000000000000000000000004800000000000000000000000000000088b4193fef96cc3e0000000000000000600000005d00000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000400003ff8ffff3e0000000000000000600000005d0000000000000000000000ee5f2a3f2440ab3e00000000000000005d000000600000000000000000000000c1e8223f7e2eba3e0000000000000000600000005d00000000000000000000001a49123fcb6ddb3e00000000000000005d0000006000000000000000000000008a1f033fecc0f93e0000000000000000600000005d000000000000000000000096eb443fa6516c3e00000000000000005d000000600000000000000000000000b09b5e3f3f91053e00000000000000005d0000006000000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d000000000000000000000000000000f5964c3f2da44d3e00000000000000005d0000006000000000000000000000000000803f0000000000000000000000005d000000000000000000000000000000d8cc4c3fa1cc4c3e00000000000000005d0000005f0000000000000000000000b9aa2a3f8faaaa3e00000000000000005d0000005f00000000000000000000009299193fdccccc3e00000000000000005f0000005d00000000000000000000000400003ff8ffff3e00000000000000005d0000005f0000000000000000000000a9aa2a3fadaaaa3e00000000000000005f0000005d00000000000000000000000100003fffffff3e00000000000000005f0000005d00000000000000000000008999193fedcccc3e00000000000000005f0000005d0000000000000000000000d9aa2a3f4daaaa3e00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005f00000000000000000000000000000063cd4c3f74ca4c3e00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000001dac2a3fc5a7aa3e00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005d000000000000000000000000000000d8cc4c3fa1cc4c3e00000000000000005d0000005f00000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000000000803f0000000000000000000000005d0000000000000000000000000000002b74063f7ea36c3eb3fb0d3e4520d73d4b0000003d000000410000005200000050240a3f01ac8d3e4910203ea733e03c3d0000004d00000001000000000000001afceb3edfaba53e611e233eb446663d010000003d000000000000000e000000e27e0e3f8ed75d3e59cf013e23bbcc3d01000000000000003d0000000e0000007361153fcd65803e0ebf073e35be073d01000000000000003d0000000e00000047cd313fe953843e428c403d000000003d000000010000000000000000000000525a2e3fee8d883e72eb553d000000003d00000001000000000000000000000075b62f3fe3d4863e98f14d3d000000003d0000000100000000000000000000004c16313f2817853e02e2453d000000003d000000010000000000000000000000875d0a3f2735923e6f76ef3d7c91693d01000000000000003d0000000e000000355c0d3ffe84983ed3a3c83d1fcd543d01000000000000003d0000000e0000001fde0f3fe3cd9d3e8822a83de569433d01000000000000003d0000000e000000eb83163fddbc9b3e4628ad3db713bf3c01000000000000003d0000000e000000d2df1c3fd1c2993e2ff6b13d0000000001000000000000003d000000000000003c210b3f879a813ec7b6e93d39d5b63d01000000000000003d0000000e000000eb83163fddbc9b3e4628ad3db713bf3c01000000000000003d0000000e000000d2df1c3fd1c2993e2ff6b13d0000000001000000000000003d000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000610000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f000000000000000000000000620000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d00000000000000000000000000000046c42a3fe806523efee7023e000000003d000000580000005a000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000400003ff9ffff3e0000000000000000540000005a00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000200003ffdffff3e0000000000000000630000003d00000000000000000000000450003ff85fff3e00000000000000003d0000006300000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000003f0000003f0000000000000000630000003d000000000000000000000079ef003f0f21fe3e00000000000000003d0000006300000000000000000000004e00003f64ffff3e0000000000000000580000003d00000000000000000000004155553ffdaa2a3e00000000000000005a0000005800000000000000000000000000803f000000000000000000000000540000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d00000000000000000000000000000046c42a3fe806523efee7023e000000003d0000005500000053000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000005c51003f485dff3e0000000000000000630000003d00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000005c51003f485dff3e0000000000000000630000003d00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000008f62053fe23af53e0000000000000000630000003d00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d000000000000000000000000000000660b003f34e9ff3e00000000000000003d0000006300000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000200003ffdffff3e0000000000000000630000003d00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000004155553ffdaa2a3e0000000000000000530000005500000000000000000000000400003ff9ffff3e0000000000000000540000005300000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000003f0000003f0000000000000000630000003d000000000000000000000079ef003f0f21fe3e00000000000000003d0000006300000000000000000000000450003ff85fff3e00000000000000003d0000006300000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000004e00003f64ffff3e0000000000000000550000003d00000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000004faa2a3f61abaa3e0000000000000000630000003e000000000000000000000057aa2a3f53abaa3e0000000000000000630000003e00000000000000000000000200003ffdffff3e00000000000000005900000057000000000000000000000059aa2a3f4dabaa3e0000000000000000630000003e00000000000000000000000000803f000000000000000000000000570000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000005baa2a3f4babaa3e0000000000000000630000003e0000000000000000000000c9932d3f8fd3273e4ddd213e00000000590000003d00000058000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000007103733feec84f3d0000000000000000630000003d00000000000000000000000000803f000000000000000000000000630000000000000000000000000000008f62053fe23af53e0000000000000000630000003d00000000000000000000005c51003f485dff3e0000000000000000630000003d00000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000200003ffdffff3e0000000000000000630000003d00000000000000000000000000803f0000000000000000000000006300000000000000000000000000000079ef003f0f21fe3e00000000000000003d0000006300000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000450003ff85fff3e00000000000000003d0000006300000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000004e00003f64ffff3e0000000000000000580000003d00000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000003f0000003f0000000000000000630000003d0000000000000000000000660b003f34e9ff3e00000000000000003d0000006300000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000007103733feec84f3d0000000000000000630000003d00000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000200003ffdffff3e0000000000000000630000003d00000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000803f000000000000000000000000630000000000000000000000000000005baa2a3f4babaa3e0000000000000000630000003e00000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000004e00003f64ffff3e0000000000000000550000003d00000000000000000000004faa2a3f61abaa3e0000000000000000630000003e0000000000000000000000c9932d3f8fd3273e4ddd213e00000000560000003d000000550000000000000079ef003f0f21fe3e00000000000000003d0000006300000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000450003ff85fff3e00000000000000003d0000006300000000000000000000000200003ffdffff3e00000000000000005600000057000000000000000000000057aa2a3f53abaa3e0000000000000000630000003e00000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000803f000000000000000000000000630000000000000000000000000000008f62053fe23af53e0000000000000000630000003d00000000000000000000005c51003f485dff3e0000000000000000630000003d00000000000000000000000000803f000000000000000000000000630000000000000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000008f62053fe23af53e0000000000000000630000003d00000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000803f0000000000000000000000003d0000000000000000000000000000000000003f0000003f0000000000000000630000003d00000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000200003ffdffff3e0000000000000000640000006500000000000000000000000200003ffcffff3e0000000000000000640000006500000000000000000000000000803f000000000000000000000000650000000000000000000000000000000200003ffcffff3e0000000000000000640000006500000000000000000000000300003ffbffff3e0000000000000000640000006500000000000000000000000000003f0000003f0000000000000000640000006500000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000300003ffbffff3e0000000000000000640000006500000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000200003ffcffff3e0000000000000000640000006500000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000400003ff8ffff3e0000000000000000640000006500000000000000000000001600003fd4ffff3e0000000000000000650000006400000000000000000000000000803f00000000000000000000000064000000000000000000000000000000651e003f36c3ff3e0000000000000000650000006400000000000000000000000000803f00000000000000000000000064000000000000000000000000000000831c003ffac6ff3e0000000000000000650000006400000000000000000000000000803f000000000000000000000000640000000000000000000000000000000200003ffdffff3e0000000000000000640000006500000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000001600003fd4ffff3e0000000000000000650000006400000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f00000000000000000000000064000000000000000000000000000000651e003f36c3ff3e000000000000000065000000640000000000000000000000831c003ffac6ff3e0000000000000000650000006400000000000000000000000000803f000000000000000000000000640000000000000000000000000000000200003ffdffff3e0000000000000000640000006500000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000000803f000000000000000000000000650000000000000000000000000000000200003ffcffff3e0000000000000000640000006500000000000000000000000200003ffdffff3e0000000000000000640000006500000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000000000803f000000000000000000000000640000000000000000000000000000006526223f35b3bb3e00000000000000005100000048000000000000000000000075fe3f3f1503803e00000000000000005100000048000000000000000000000075fe3f3f1503803e0000000000000000510000004800000000000000000000006526223f35b3bb3e0000000000000000510000004800000000000000000000009dbc063fc686f23e0000000000000000480000005100000000000000000000009dbc063fc686f23e000000000000000048000000510000000000000000000000933b363fdb88933e000000000000000048000000510000000000000000000000933b363fdb88933e000000000000000048000000510000000000000000000000a0955f3f81a9013e000000000000000048000000510000000000000000000000a0955f3f81a9013e00000000000000004800000051000000000000000000000049c5693fb4d5b13d00000000000000004800000051000000000000000000000049c5693fb4d5b13d000000000000000048000000510000000000000000000000be31373f849c913e000000000000000051000000480000000000000000000000be31373f849c913e0000000000000000510000004800000000000000000000003d282f3f86afa13e0000000000000000510000004800000000000000000000003d282f3f86afa13e00000000000000005100000048000000000000000000000042b2123f7d9bda3e00000000000000005100000048000000000000000000000042b2123f7d9bda3e000000000000000051000000480000000000000000000000efff1f3f2200c03e000000000000000048000000510000000000000000000000efff1f3f2200c03e000000000000000048000000510000000000000000000000d647553fa9e02a3e000000000000000048000000510000000000000000000000d647553fa9e02a3e0000000000000000480000005100000000000000000000001ad2253f00a4b03e23f3ed3b00000000480000004900000051000000000000007890063f11dff23e0000000000000000480000004900000000000000000000001ad2253f00a4b03e23f3ed3b00000000480000004900000051000000000000007890063f11dff23e0000000000000000480000004900000000000000000000005b89553ff410173ef94c963c00000000480000004900000051000000000000005b89553ff410173ef94c963c0000000048000000490000005100000000000000d20c0a3f5ce6eb3e000000000000000049000000480000000000000000000000d20c0a3f5ce6eb3e000000000000000049000000480000000000000000000000cb5c1a3f6a46cb3e000000000000000049000000480000000000000000000000cb5c1a3f6a46cb3e000000000000000049000000480000000000000000000000c256073f7c52f13e000000000000000049000000480000000000000000000000c256073f7c52f13e00000000000000004900000048000000000000000000000056a00d3f54bfe43e00000000000000004800000049000000000000000000000056a00d3f54bfe43e00000000000000004800000049000000000000000000000024f0423f703f743e00000000000000004800000049000000000000000000000024f0423f703f743e000000000000000048000000490000000000000000000000acca653fac79ba3dc187393c0000000048000000490000005100000000000000acca653fac79ba3dc187393c00000000480000004900000051000000000000006526223f35b3bb3e00000000000000005f0000005d000000000000000000000075fe3f3f1503803e00000000000000005f0000005d00000000000000000000006526223f35b3bb3e00000000000000005f0000005d000000000000000000000075fe3f3f1503803e00000000000000005f0000005d00000000000000000000009dbc063fc686f23e00000000000000005d0000005f00000000000000000000009dbc063fc686f23e00000000000000005d0000005f0000000000000000000000933b363fdb88933e00000000000000005d0000005f0000000000000000000000933b363fdb88933e00000000000000005d0000005f0000000000000000000000a0955f3f81a9013e00000000000000005d0000005f0000000000000000000000a0955f3f81a9013e00000000000000005d0000005f000000000000000000000049c5693fb4d5b13d00000000000000005d0000005f000000000000000000000049c5693fb4d5b13d00000000000000005d0000005f0000000000000000000000be31373f849c913e00000000000000005f0000005d0000000000000000000000be31373f849c913e00000000000000005f0000005d00000000000000000000003d282f3f86afa13e00000000000000005f0000005d00000000000000000000003d282f3f86afa13e00000000000000005f0000005d000000000000000000000042b2123f7d9bda3e00000000000000005f0000005d000000000000000000000042b2123f7d9bda3e00000000000000005f0000005d0000000000000000000000efff1f3f2200c03e00000000000000005d0000005f0000000000000000000000efff1f3f2200c03e00000000000000005d0000005f0000000000000000000000d647553fa9e02a3e00000000000000005d0000005f0000000000000000000000d647553fa9e02a3e00000000000000005d0000005f00000000000000000000001ad2253f00a4b03e23f3ed3b000000005d000000600000005f000000000000007890063f11dff23e00000000000000005d0000006000000000000000000000007890063f11dff23e00000000000000005d0000006000000000000000000000001ad2253f00a4b03e23f3ed3b000000005d000000600000005f000000000000005b89553ff410173ef94c963c000000005d000000600000005f000000000000005b89553ff410173ef94c963c000000005d000000600000005f00000000000000d20c0a3f5ce6eb3e0000000000000000600000005d0000000000000000000000d20c0a3f5ce6eb3e0000000000000000600000005d0000000000000000000000cb5c1a3f6a46cb3e0000000000000000600000005d0000000000000000000000cb5c1a3f6a46cb3e0000000000000000600000005d0000000000000000000000c256073f7c52f13e0000000000000000600000005d0000000000000000000000c256073f7c52f13e0000000000000000600000005d000000000000000000000056a00d3f54bfe43e00000000000000005d00000060000000000000000000000056a00d3f54bfe43e00000000000000005d00000060000000000000000000000024f0423f703f743e00000000000000005d00000060000000000000000000000024f0423f703f743e00000000000000005d000000600000000000000000000000acca653fac79ba3dc187393c000000005d000000600000005f00000000000000acca653fac79ba3dc187393c000000005d000000600000005f00000000000000 - m_CompressedMesh: - m_Vertices: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_UV: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Normals: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Tangents: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_Weights: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_NormalSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_TangentSigns: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_FloatColors: - m_NumItems: 0 - m_Range: 0 - m_Start: 0 - m_Data: - m_BitSize: 0 - m_BoneIndices: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_Triangles: - m_NumItems: 0 - m_Data: - m_BitSize: 0 - m_UVInfo: 0 - m_LocalAABB: - m_Center: {x: 0.00000047683716, y: -0.0019429922, z: 0.998519} - m_Extent: {x: 0.7799995, y: 0.19456899, z: 0.99624604} - m_MeshUsageFlags: 0 - m_BakedConvexCollisionMesh: - m_BakedTriangleCollisionMesh: - m_MeshMetrics[0]: 1 - m_MeshMetrics[1]: 1 - m_MeshOptimizationFlags: 1 - m_StreamData: - offset: 0 - size: 0 - path: --- !u!1 &609089758 GameObject: m_ObjectHideFlags: 0 @@ -4107,8 +1862,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 609089758} - m_LocalRotation: {x: 0.1837082, y: 0.11580141, z: 0.48498634, w: 0.84713024} - m_LocalPosition: {x: -0.16176574, y: 0.000066067194, z: 0.00002301105} + m_LocalRotation: {x: 0.18370818, y: 0.11580133, z: 0.4849863, w: 0.8471303} + m_LocalPosition: {x: -0.16176574, y: 0.000066049906, z: 0.000023003586} m_LocalScale: {x: 1.0629758, y: 1.0629759, z: 1.0629758} m_Children: - {fileID: 1649615428} @@ -4230,8 +1985,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 689359630} - m_LocalRotation: {x: -0.058823083, y: -0.2705798, z: -0.017009525, w: 0.96074826} - m_LocalPosition: {x: -0.036073174, y: -0.000000003695857, z: -0.00000001161558} + m_LocalRotation: {x: -0.058823112, y: -0.27057981, z: -0.01700948, w: 0.9607482} + m_LocalPosition: {x: -0.036073193, y: -9.2924396e-10, z: -0.000000026018903} m_LocalScale: {x: 0.9999999, y: 1.0000005, z: 1.0000007} m_Children: [] m_Father: {fileID: 1786979009} @@ -4387,8 +2142,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 699432395} - m_LocalRotation: {x: 0.16588965, y: -0.17239144, z: 0.05747409, w: 0.96925676} - m_LocalPosition: {x: -0.43690458, y: 0.0000007851239, z: -0.000000044981093} + m_LocalRotation: {x: 0.16039233, y: -0.17492858, z: 0.052408464, w: 0.9700142} + m_LocalPosition: {x: -0.43684652, y: 0.00000080606077, z: -0.000000032386385} m_LocalScale: {x: 0.99999994, y: 1.0000001, z: 1.0000001} m_Children: - {fileID: 977725689} @@ -4737,6 +2492,7 @@ MeshRenderer: m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 + m_RayTraceProcedural: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4761,6 +2517,7 @@ MeshRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!136 &762324483 CapsuleCollider: m_ObjectHideFlags: 0 @@ -4820,8 +2577,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 771694334} - m_LocalRotation: {x: -0.01863213, y: 0.15032144, z: 0.026598308, w: 0.98810375} - m_LocalPosition: {x: -0.2779646, y: 0.000000017798802, z: 0.00000000188495} + m_LocalRotation: {x: -0.018632054, y: 0.15032138, z: 0.026598291, w: 0.98810375} + m_LocalPosition: {x: -0.27796465, y: -0.000000048729166, z: 0.0000000060911702} m_LocalScale: {x: 1.0078583, y: 1.0078588, z: 1.0078588} m_Children: - {fileID: 1964905759} @@ -4853,8 +2610,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 791518412} - m_LocalRotation: {x: -0.027502019, y: -0.35132408, z: -0.009436636, w: 0.9358024} - m_LocalPosition: {x: -0.04290792, y: 0.00000001267151, z: 0.00000002534307} + m_LocalRotation: {x: -0.027501967, y: -0.3513241, z: -0.009436637, w: 0.9358024} + m_LocalPosition: {x: -0.042907853, y: 0.0000000092924415, z: -0.000000018584918} m_LocalScale: {x: 0.99999964, y: 0.99999946, z: 1.0000001} m_Children: [] m_Father: {fileID: 520983812} @@ -4883,8 +2640,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 796221358} - m_LocalRotation: {x: -0.19621176, y: 0.22136354, z: 0.0068291565, w: -0.95522386} - m_LocalPosition: {x: -0.09333091, y: -0.014842873, z: 0.0014493987} + m_LocalRotation: {x: -0.19621187, y: 0.22136351, z: 0.006829112, w: -0.9552238} + m_LocalPosition: {x: -0.093330875, y: -0.014842869, z: 0.0014493559} m_LocalScale: {x: 0.9999995, y: 1, z: 0.9999999} m_Children: - {fileID: 299977212} @@ -4914,8 +2671,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 807047365} - m_LocalRotation: {x: 0.0000004995854, y: 0.1107154, z: 0.000000040978193, w: 0.99385214} - m_LocalPosition: {x: -0.18375593, y: 0.000000016817568, z: -0.000021206968} + m_LocalRotation: {x: 0.00000047911567, y: 0.11071541, z: 0.000000044703484, w: 0.9938522} + m_LocalPosition: {x: -0.18375592, y: 0, z: -0.000021211345} m_LocalScale: {x: 1.0000013, y: 1.0000013, z: 0.99999994} m_Children: - {fileID: 366293804} @@ -4950,8 +2707,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 830126199} - m_LocalRotation: {x: -0.09825901, y: -0.19951361, z: -0.017844124, w: 0.9747929} - m_LocalPosition: {x: -0.09688432, y: -0.012628428, z: 0.004193488} + m_LocalRotation: {x: -0.09825906, y: -0.19951366, z: -0.017844139, w: 0.9747929} + m_LocalPosition: {x: -0.09688437, y: -0.012628422, z: 0.00419358} m_LocalScale: {x: 1.0000001, y: 1.0000004, z: 1.0000004} m_Children: - {fileID: 520983812} @@ -5112,191 +2869,6 @@ Transform: m_Father: {fileID: 1013169051} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &881342888 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 881342889} - - component: {fileID: 881342890} - m_Layer: 0 - m_Name: UMARenderer - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &881342889 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 881342888} - 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_Children: [] - m_Father: {fileID: 84425583} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!137 &881342890 -SkinnedMeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 881342888} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 1932418181} - - {fileID: 1910961209} - 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 - serializedVersion: 2 - m_Quality: 0 - m_UpdateWhenOffscreen: 0 - m_SkinnedMotionVectors: 1 - m_Mesh: {fileID: 598349075} - m_Bones: - - {fileID: 1099546211} - - {fileID: 1573296364} - - {fileID: 645745834} - - {fileID: 988198025} - - {fileID: 1338292971} - - {fileID: 2145312308} - - {fileID: 212203007} - - {fileID: 588527430} - - {fileID: 2016517915} - - {fileID: 1458381344} - - {fileID: 1382375122} - - {fileID: 1864079936} - - {fileID: 1902355805} - - {fileID: 835193121} - - {fileID: 694677742} - - {fileID: 940872314} - - {fileID: 250831393} - - {fileID: 1632819967} - - {fileID: 627143431} - - {fileID: 718139052} - - {fileID: 1470769251} - - {fileID: 1926449834} - - {fileID: 371214876} - - {fileID: 1964905759} - - {fileID: 879643938} - - {fileID: 586770653} - - {fileID: 989871088} - - {fileID: 406397463} - - {fileID: 1095707860} - - {fileID: 58441081} - - {fileID: 1321021624} - - {fileID: 977725689} - - {fileID: 743697993} - - {fileID: 791518413} - - {fileID: 520983812} - - {fileID: 830126200} - - {fileID: 1937035032} - - {fileID: 1112687036} - - {fileID: 119291589} - - {fileID: 1853417510} - - {fileID: 1130675999} - - {fileID: 15965880} - - {fileID: 36833348} - - {fileID: 1243118705} - - {fileID: 1261016273} - - {fileID: 689359631} - - {fileID: 1786979009} - - {fileID: 1190706978} - - {fileID: 1976673006} - - {fileID: 882966432} - - {fileID: 796221359} - - {fileID: 896206983} - - {fileID: 122230097} - - {fileID: 1946929460} - - {fileID: 396650949} - - {fileID: 1563447375} - - {fileID: 299977212} - - {fileID: 1371748542} - - {fileID: 1163367684} - - {fileID: 906817747} - - {fileID: 524605509} - - {fileID: 117509254} - - {fileID: 498003648} - - {fileID: 1081624464} - - {fileID: 579439626} - - {fileID: 671857356} - - {fileID: 1124108964} - - {fileID: 2124707118} - - {fileID: 2019232785} - - {fileID: 1929196364} - - {fileID: 1229713631} - - {fileID: 1881226729} - - {fileID: 183818386} - - {fileID: 540472152} - - {fileID: 472517135} - - {fileID: 1538726982} - - {fileID: 752233909} - - {fileID: 330133737} - - {fileID: 1655372393} - - {fileID: 1455723460} - - {fileID: 459583458} - - {fileID: 853652051} - - {fileID: 1145810086} - - {fileID: 192416666} - - {fileID: 747246732} - - {fileID: 1437256137} - - {fileID: 359672695} - - {fileID: 1661371858} - - {fileID: 1499195693} - - {fileID: 850340718} - - {fileID: 204498340} - - {fileID: 1795280790} - - {fileID: 1251527559} - - {fileID: 1569731039} - - {fileID: 1348975697} - - {fileID: 898710691} - - {fileID: 742901072} - - {fileID: 404665211} - - {fileID: 1427318040} - - {fileID: 1066984002} - - {fileID: 492202346} - - {fileID: 176487552} - m_BlendShapeWeights: [] - m_RootBone: {fileID: 0} - m_AABB: - m_Center: {x: 0.000118374825, y: 0.85025287, z: 0.006411642} - m_Extent: {x: 0.3224908, y: 0.93854463, z: 0.22783162} - m_DirtyAABB: 0 --- !u!1 &882966431 GameObject: m_ObjectHideFlags: 0 @@ -5320,8 +2892,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 882966431} - m_LocalRotation: {x: -0.09865166, y: 0.23845544, z: -0.009857549, w: -0.9660796} - m_LocalPosition: {x: -0.096884854, y: 0.012628763, z: 0.004193743} + m_LocalRotation: {x: -0.09865163, y: 0.23845543, z: -0.0098575195, w: -0.9660796} + m_LocalPosition: {x: -0.09688483, y: 0.012628767, z: 0.0041937004} m_LocalScale: {x: 1.0000007, y: 1.0000004, z: 1.0000006} m_Children: - {fileID: 1976673006} @@ -5351,8 +2923,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 894476190} - m_LocalRotation: {x: -0.0077788834, y: -0.09403954, z: 0.0015996955, w: 0.9955368} - m_LocalPosition: {x: -0.19275971, y: 0.000000016817575, z: -0.00012539608} + m_LocalRotation: {x: -0.007778847, y: -0.09403957, z: 0.0015997216, w: 0.99553686} + m_LocalPosition: {x: -0.19275972, y: 0.000000014799467, z: -0.00012539778} m_LocalScale: {x: 1.0000007, y: 1.0000005, z: 1} m_Children: - {fileID: 807047366} @@ -5383,8 +2955,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 896206982} - m_LocalRotation: {x: -0.03431013, y: 0.14151165, z: -0.077968664, w: -0.9862648} - m_LocalPosition: {x: -0.09379464, y: 0.039509133, z: 0.0025050647} + m_LocalRotation: {x: -0.034309797, y: 0.14151168, z: -0.07796861, w: -0.98626477} + m_LocalPosition: {x: -0.09379462, y: 0.039509136, z: 0.0025051392} m_LocalScale: {x: 1.0000007, y: 1.0000006, z: 1.0000005} m_Children: - {fileID: 122230097} @@ -5444,8 +3016,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 906817746} - m_LocalRotation: {x: -0.0728938, y: 0.21205978, z: -0.07187105, w: -0.97188056} - m_LocalPosition: {x: -0.024524732, y: 0.00000004962999, z: -0.00000007919707} + m_LocalRotation: {x: -0.07289378, y: 0.21205981, z: -0.07187103, w: -0.97188056} + m_LocalPosition: {x: -0.02452475, y: 0.00000001951409, z: -0.00000014124537} m_LocalScale: {x: 1.0000005, y: 1.0000006, z: 0.99999976} m_Children: [] m_Father: {fileID: 1371748542} @@ -5474,8 +3046,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 917558009} - m_LocalRotation: {x: -0.15975177, y: 0.032999378, z: -0.479237, w: 0.8623934} - m_LocalPosition: {x: -0.16176613, y: -0.00006616858, z: 0.000023005005} + m_LocalRotation: {x: -0.15975174, y: 0.032999415, z: -0.4792371, w: 0.8623933} + m_LocalPosition: {x: -0.16176614, y: -0.00006626444, z: 0.000023008786} m_LocalScale: {x: 1.0629773, y: 1.0629772, z: 1.0629762} m_Children: - {fileID: 1632819967} @@ -5598,8 +3170,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 977725688} - m_LocalRotation: {x: 0.8071175, y: -0.011071791, z: -0.5899683, w: 0.019393379} - m_LocalPosition: {x: -0.48117787, y: 0.0000004963233, z: 0.0000021300557} + m_LocalRotation: {x: 0.8068568, y: -0.00024778952, z: -0.59029764, w: 0.023036817} + m_LocalPosition: {x: -0.4811138, y: 0.0000006405025, z: 0.000002139862} m_LocalScale: {x: 0.85825455, y: 0.85825485, z: 0.85825473} m_Children: - {fileID: 1321021624} @@ -5690,8 +3262,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 989871087} - m_LocalRotation: {x: 0.42835313, y: -0.07300285, z: 0.37837166, w: -0.8173244} - m_LocalPosition: {x: -0.03859319, y: 0.04131469, z: -0.01367895} + m_LocalRotation: {x: 0.4283533, y: -0.07300298, z: 0.37837157, w: -0.8173243} + m_LocalPosition: {x: -0.038593214, y: 0.041314688, z: -0.013678955} m_LocalScale: {x: 1.0000013, y: 1.000001, z: 1.0000002} m_Children: - {fileID: 396650949} @@ -5761,3584 +3333,6 @@ Transform: m_Father: {fileID: 1066984002} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!90 &1051091819 -Avatar: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: UMADynamicCharacterAvatar - m_AvatarSize: 28280 - m_Avatar: - serializedVersion: 3 - m_AvatarSkeleton: - data: - m_Node: - - m_ParentId: -1 - m_AxesId: -1 - - m_ParentId: 0 - m_AxesId: -1 - - m_ParentId: 1 - m_AxesId: -1 - - m_ParentId: 2 - m_AxesId: -1 - - m_ParentId: 3 - m_AxesId: -1 - - m_ParentId: 4 - m_AxesId: -1 - - m_ParentId: 5 - m_AxesId: -1 - - m_ParentId: 6 - m_AxesId: -1 - - m_ParentId: 5 - m_AxesId: -1 - - m_ParentId: 8 - m_AxesId: -1 - - m_ParentId: 9 - m_AxesId: -1 - - m_ParentId: 10 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 12 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 14 - m_AxesId: -1 - - m_ParentId: 15 - m_AxesId: -1 - - m_ParentId: 14 - m_AxesId: -1 - - m_ParentId: 14 - m_AxesId: -1 - - m_ParentId: 18 - m_AxesId: -1 - - m_ParentId: 14 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 21 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 23 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 25 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 27 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 29 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 31 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 33 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 36 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 38 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 40 - m_AxesId: -1 - - m_ParentId: 40 - m_AxesId: -1 - - m_ParentId: 40 - m_AxesId: -1 - - m_ParentId: 43 - m_AxesId: -1 - - m_ParentId: 40 - m_AxesId: -1 - - m_ParentId: 45 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 47 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 49 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 51 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 53 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 55 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 57 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 59 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 61 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 63 - m_AxesId: -1 - - m_ParentId: 64 - m_AxesId: -1 - - m_ParentId: 63 - m_AxesId: -1 - - m_ParentId: 66 - m_AxesId: -1 - - m_ParentId: 63 - m_AxesId: -1 - - m_ParentId: 68 - m_AxesId: -1 - - m_ParentId: 63 - m_AxesId: -1 - - m_ParentId: 70 - m_AxesId: -1 - - m_ParentId: 63 - m_AxesId: -1 - - m_ParentId: 63 - m_AxesId: -1 - - m_ParentId: 73 - m_AxesId: -1 - - m_ParentId: 63 - m_AxesId: -1 - - m_ParentId: 75 - m_AxesId: -1 - - m_ParentId: 63 - m_AxesId: -1 - - m_ParentId: 77 - m_AxesId: -1 - - m_ParentId: 63 - m_AxesId: -1 - - m_ParentId: 79 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 81 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 83 - m_AxesId: -1 - - m_ParentId: 11 - m_AxesId: -1 - - m_ParentId: 85 - m_AxesId: -1 - - m_ParentId: 10 - m_AxesId: -1 - - m_ParentId: 9 - m_AxesId: -1 - - m_ParentId: 88 - m_AxesId: -1 - - m_ParentId: 9 - m_AxesId: -1 - - m_ParentId: 90 - m_AxesId: -1 - - m_ParentId: 90 - m_AxesId: -1 - - m_ParentId: 92 - m_AxesId: -1 - - m_ParentId: 92 - m_AxesId: -1 - - m_ParentId: 94 - m_AxesId: -1 - - m_ParentId: 94 - m_AxesId: -1 - - m_ParentId: 96 - m_AxesId: -1 - - m_ParentId: 94 - m_AxesId: -1 - - m_ParentId: 98 - m_AxesId: -1 - - m_ParentId: 99 - m_AxesId: -1 - - m_ParentId: 100 - m_AxesId: -1 - - m_ParentId: 98 - m_AxesId: -1 - - m_ParentId: 102 - m_AxesId: -1 - - m_ParentId: 103 - m_AxesId: -1 - - m_ParentId: 98 - m_AxesId: -1 - - m_ParentId: 105 - m_AxesId: -1 - - m_ParentId: 106 - m_AxesId: -1 - - m_ParentId: 98 - m_AxesId: -1 - - m_ParentId: 108 - m_AxesId: -1 - - m_ParentId: 109 - m_AxesId: -1 - - m_ParentId: 98 - m_AxesId: -1 - - m_ParentId: 111 - m_AxesId: -1 - - m_ParentId: 112 - m_AxesId: -1 - - m_ParentId: 90 - m_AxesId: -1 - - m_ParentId: 9 - m_AxesId: -1 - - m_ParentId: 115 - m_AxesId: -1 - - m_ParentId: 9 - m_AxesId: -1 - - m_ParentId: 9 - m_AxesId: -1 - - m_ParentId: 118 - m_AxesId: -1 - - m_ParentId: 118 - m_AxesId: -1 - - m_ParentId: 118 - m_AxesId: -1 - - m_ParentId: 121 - m_AxesId: -1 - - m_ParentId: 122 - m_AxesId: -1 - - m_ParentId: 123 - m_AxesId: -1 - - m_ParentId: 124 - m_AxesId: -1 - - m_ParentId: 125 - m_AxesId: -1 - - m_ParentId: 123 - m_AxesId: -1 - - m_ParentId: 127 - m_AxesId: -1 - - m_ParentId: 128 - m_AxesId: -1 - - m_ParentId: 123 - m_AxesId: -1 - - m_ParentId: 130 - m_AxesId: -1 - - m_ParentId: 131 - m_AxesId: -1 - - m_ParentId: 123 - m_AxesId: -1 - - m_ParentId: 133 - m_AxesId: -1 - - m_ParentId: 134 - m_AxesId: -1 - - m_ParentId: 123 - m_AxesId: -1 - - m_ParentId: 136 - m_AxesId: -1 - - m_ParentId: 137 - m_AxesId: -1 - - m_ParentId: 122 - m_AxesId: -1 - - m_ParentId: 139 - m_AxesId: -1 - - m_ParentId: 122 - m_AxesId: -1 - - m_ParentId: 121 - m_AxesId: -1 - - m_ParentId: 8 - m_AxesId: -1 - - m_ParentId: 4 - m_AxesId: -1 - - m_ParentId: 144 - m_AxesId: -1 - - m_ParentId: 145 - m_AxesId: -1 - - m_ParentId: 145 - m_AxesId: -1 - - m_ParentId: 147 - m_AxesId: -1 - - m_ParentId: 144 - m_AxesId: -1 - - m_ParentId: 144 - m_AxesId: -1 - - m_ParentId: 4 - m_AxesId: -1 - - m_ParentId: 151 - m_AxesId: -1 - - m_ParentId: 151 - m_AxesId: -1 - - m_ParentId: 153 - m_AxesId: -1 - - m_ParentId: 154 - m_AxesId: -1 - - m_ParentId: 153 - m_AxesId: -1 - - m_ParentId: 151 - m_AxesId: -1 - m_ID: 000000006556c6b6883de7a7225d62603749eed6e82dbad4845951fb3664c6ddde611de980343191210288a75f67fefb721aef62bcaee354ec072763aa462e7f585ba06d6a365bb335b049904e860ec3c91a4e8f49a148af4f701339b607942abefa4c34b0e6d6fc943dc6ff4533df5b8b3ab1e0b84f6bfd6f543c7854ad931ee6db60381a1e3795a4ee961be68de75fc5da1ceb26554eb3a8141e0af9d1e69a3609d60ba36896dd5e341629a29e1136cf80d9803d6876d9574e40b4ded459f3d619bad20a8bd611abb3f579f3ba7988b2ca9ea30fdebd8aa0e9e91e464f78727dd0ad9695728702cf1e2d5be7180c760d094fbe90d21614ea757134f6ef68bfdbf2482f5c44a2b526ca129e6a106c6ce1232135b1567582dc480717139d4a01e1bf8792363d46c9e8593ef3c81c837e677a8eabd1272c527793a92a336e1ad02d524702810875e0d073eb3a3ba7d3c78daf31bcca7da942fad8bdcc22603efc0a2c969e1094c0862a889f608e5777274feea533d0c4b80ade044faa3ed6f31f7e4ceb06e54cc85a22db7ec1c07bd5e371287ff05d430f891c24bec60b1bcfbe0c2f7b1c7943027e60ecf8a3f443857ea51c695b1adf48eda52ff1eb4bb3dc49a7c610caad9af34c2adb621c04723652f9760ef91702548ce22121bdf402a74c6544d763357003bf22ae0cfdf14a7a15fd128eef06cbe572eaa3c42ccfe250d84cc018ad4a71b171214de5ca8ac6b3e72a3f6245442a5972c8c42ade0a05d3569875325744c97c4bca99753f86db2220c7e40ead8765b3acd477b28405e23577448ae30aca8cc485c1dda6f67529a9d92436766ff03d620d9a04f2ec0de76eb93bf8f469633148c6a20aee76505f7ab53b45be230d19e38f - m_AxesArray: [] - m_AvatarSkeletonPose: - data: - m_X: - - t: {x: 0, y: 0, z: 0} - q: {x: 0, y: 0, z: 0, w: 1} - s: {x: 1, y: 1, z: 1} - - t: {x: 0, y: 0, z: 0} - q: {x: 0.7071068, y: 0, z: 0, w: -0.7071068} - s: {x: 1, y: 1, z: 1} - - t: {x: 6.15551e-10, y: 0.01051005, z: -0.011465508} - q: {x: 0.5000003, y: 0.4999997, z: -0.50000006, w: 0.4999999} - s: {x: 1, y: 0.99999994, z: 1} - - t: {x: 0.014117634, y: 3e-15, z: 0.000000008326849} - q: {x: -0.000000004950124, y: 1.8325958e-16, z: -9.948377e-16, w: 1} - s: {x: 0.91100955, y: 0.91100955, z: 0.91100955} - - t: {x: -1.046681, y: 0.000000066209516, z: -0.00842917} - q: {x: -0.000000024859764, y: 0.055257294, z: -0.00000020834274, w: 0.99847215} - s: {x: 0.9999995, y: 0.9999998, z: 0.9999998} - - t: {x: -0.053878736, y: 0.000000004067728, z: -0.000000003725286} - q: {x: 0.000000072790776, y: -0.07920216, z: 0.00000006070385, w: 0.9968586} - s: {x: 0.97259897, y: 0.97259927, z: 0.97259873} - - t: {x: -0.053665183, y: 0.000000004051634, z: 0.00000000558794} - q: {x: 0, y: 0, z: -1.3322677e-15, w: 1} - s: {x: 0.9739008, y: 0.9402905, z: 0.9739004} - - t: {x: -0.034965567, y: 0.000000002639832, z: 0.000000022351745} - q: {x: 0.000000059587457, y: -0.000000037252903, z: -0.0000000014303447, - w: 1} - s: {x: 0.7603117, y: 0.916217, z: 0.7002415} - - t: {x: -0.19275962, y: 0.000000011617576, z: -0.00012540072} - q: {x: -0.0000005856389, y: -0.086834215, z: -0.00000010316014, w: 0.9962228} - s: {x: 1.0000007, y: 1.0000005, z: 1} - - t: {x: -0.18375577, y: 0.000000013882967, z: -0.00002123043} - q: {x: 0.00000051022846, y: 0.110715404, z: 0.000000034567357, w: 0.9938522} - s: {x: 1.0000013, y: 1.0000013, z: 0.99999994} - - t: {x: -0.19709714, y: 0.000000014880397, z: -0.000000008546294} - q: {x: -0.00000035964723, y: 0.070658274, z: 0.00000015052176, w: 0.99750066} - s: {x: 1.0000008, y: 1.0000006, z: 0.99999994} - - t: {x: -0.10225469, y: 0.000000007720018, z: 0} - q: {x: 0.00000008821572, y: -0.083160356, z: -0.000000050923394, w: 0.99653625} - s: {x: 1.0078583, y: 1.0078585, z: 1.007859} - - t: {x: -0.07060846, y: 0.07847385, z: 0.053546134} - q: {x: 0.112811, y: -0.5704385, z: -0.08211961, w: 0.809401} - s: {x: 1, y: 0.99999994, z: 0.99999994} - - t: {x: 0.0013332947, y: -0.003999993, z: 0.0083134975} - q: {x: 0.0000002556218, y: 0.000000096539885, z: 0.090223595, w: 0.99592155} - s: {x: 0.9764207, y: 0.9764207, z: 0.9764208} - - t: {x: -0.10662577, y: 0.034980323, z: 0.11798749} - q: {x: 0.7124565, y: 0.0000031413288, z: -0.70171624, w: 0.0000040460623} - s: {x: 0.9317243, y: 0.9317242, z: 0.9317242} - - t: {x: 0.000000058543428, y: 0.00000006502823, z: -0.0000005722841} - q: {x: -0.0002753267, y: -0.17976472, z: -0.000011421973, w: 0.98370963} - s: {x: 1, y: 1.0000001, z: 1.0000001} - - t: {x: 0.000000067076826, y: 0.00000000257387, z: -0.000000065832864} - q: {x: 0.0002784026, y: 0.00046008814, z: -0.000036914105, w: -0.9999999} - s: {x: 1.0000008, y: 1.0000008, z: 1.0000011} - - t: {x: 0.00000010325148, y: 0.00000009111068, z: -0.00000116833} - q: {x: -0.00034421866, y: -0.00000008940312, z: -0.000000007621011, w: 0.99999994} - s: {x: 0.9999997, y: 1, z: 1.0000001} - - t: {x: 0.00000008089521, y: 0.000000109731694, z: -0.0000005722835} - q: {x: 0.0003545885, y: 0.09056162, z: -0.00002521045, w: 0.9958908} - s: {x: 0.99999994, y: 0.99999994, z: 1} - - t: {x: 0.000000012275649, y: 0.000000003306013, z: 0.000000020669177} - q: {x: -0.0003495343, y: -0.00035921476, z: -0.00003620913, w: -0.9999999} - s: {x: 1, y: 0.99999994, z: 1.0000001} - - t: {x: 0.00000008089521, y: 0.000000109731694, z: -0.0000005722835} - q: {x: -0.000004225848, y: -0.0000000894048, z: 0.000000076694484, w: 1} - s: {x: 1, y: 1.0000004, z: 1.0000005} - - t: {x: -0.03283036, y: 0.010835797, z: 0.14380059} - q: {x: 0.7925747, y: -0.06697429, z: -0.6038794, w: 0.051667} - s: {x: 0.99999964, y: 0.99999964, z: 0.9999999} - - t: {x: -0.00000006984919, y: -0.000027435564, z: -0.000000013395038} - q: {x: -0.00012683493, y: 0.0000002009328, z: 0.000000033527606, w: -1} - s: {x: 1.0001968, y: 1.0035329, z: 1.0035328} - - t: {x: -0.032830365, y: -0.010835715, z: 0.14380059} - q: {x: 0.79257464, y: 0.066974595, z: -0.6038795, w: -0.051666934} - s: {x: 0.9999998, y: 0.9999998, z: 0.9999998} - - t: {x: -0.00000008393545, y: 0.000027440221, z: 0.00000010083659} - q: {x: -0.00012638416, y: 0.000000047963095, z: 0.00000048801286, w: 1} - s: {x: 1.0001965, y: 1.0035336, z: 1.0035331} - - t: {x: -0.10751021, y: 0.0190231, z: 0.083702885} - q: {x: 0.77709675, y: -0.00000012301177, z: -0.6293812, w: -0.00000007944375} - s: {x: 1.0000001, y: 0.99999994, z: 0.9999998} - - t: {x: -0.000029352806, y: 0.00000000223472, z: -0.00004881392} - q: {x: -0.00000005665234, y: 0.00000005960465, z: 0.00000003493151, w: -1} - s: {x: 0.99999994, y: 0.9999997, z: 1.0000001} - - t: {x: -0.06767554, y: -0.00009390456, z: 0.14743026} - q: {x: -0.7066935, y: -0.000000005227299, z: 0.70751995, w: -0.00000025150896} - s: {x: 1, y: 0.9999999, z: 0.99999994} - - t: {x: -0.00009806863, y: 4.663e-12, z: 0.000097917335} - q: {x: 0.00000018294442, y: 0.0013798266, z: -0.000000043951403, w: 0.99999905} - s: {x: 0.9291962, y: 0.9811298, z: 0.9664092} - - t: {x: -0.030948676, y: 0.03773913, z: 0.10849106} - q: {x: -0.6591185, y: 0.2391581, z: 0.670226, w: -0.24323557} - s: {x: 0.9999996, y: 0.9999999, z: 0.9999998} - - t: {x: -0.00027455867, y: 0.000000007450581, z: 0.01600009} - q: {x: -0.000000044703473, y: -0.000000081956365, z: -0.00000020861621, - w: 1} - s: {x: 1.000002, y: 1.0000021, z: 1.0000013} - - t: {x: -0.03346425, y: -0.00009391148, z: 0.14560841} - q: {x: 0.7929806, y: -0.00000027194244, z: -0.6092469, w: -0.00000018440363} - s: {x: 1.0000001, y: 0.99999994, z: 1} - - t: {x: 0.00000001489442, y: 5.434e-12, z: 0.00000005769348} - q: {x: -0.00000072097384, y: 0.00000011920936, z: 0.000000009991907, w: 1} - s: {x: 1.0001968, y: 1.003533, z: 1.0035337} - - t: {x: -0.05766228, y: 0.02632502, z: 0.103262894} - q: {x: 0.70887077, y: -0.001181514, z: -0.7053235, w: -0.004424751} - s: {x: 0.99999946, y: 0.9999998, z: 0.9999998} - - t: {x: -0.00004905082, y: -0.000000016385457, z: 0.000048823622} - q: {x: -0.000002485234, y: 0.000000023964272, z: -0.000000041269228, w: -1} - s: {x: 1.0000001, y: 1.0000005, z: 1.0000001} - - t: {x: -0.051950034, y: 0.000000003922105, z: 0.000000033527613} - q: {x: -0.000000029801402, y: -0.000000014901158, z: -2.2618968e-10, w: 1} - s: {x: 1.0000001, y: 0.959976, z: 1} - - t: {x: -0.11220421, y: -0.036671754, z: 0.08122144} - q: {x: 0.7770956, y: -0.00000019629408, z: -0.62938267, w: 0.00000017990683} - s: {x: 0.99999976, y: 0.99999994, z: 0.9999999} - - t: {x: -0.00002940285, y: -3.56321e-10, z: -0.00010783993} - q: {x: -0.00000009624478, y: -0.000000059604606, z: 0.000000044068504, w: -1} - s: {x: 1.0000005, y: 1.000001, z: 1.0000007} - - t: {x: -0.07060859, y: -0.07847363, z: 0.053546168} - q: {x: -0.11281155, y: -0.57043844, z: 0.08211995, w: 0.8094009} - s: {x: 1, y: 0.9999999, z: 0.9999999} - - t: {x: 0.0013333301, y: 0.003999983, z: 0.0083137425} - q: {x: -0.00000018410877, y: 0.00000013294283, z: -0.090223566, w: 0.99592155} - s: {x: 0.9764205, y: 0.97642106, z: 0.9764207} - - t: {x: -0.10662578, y: -0.034980256, z: 0.117987506} - q: {x: 0.71245635, y: -0.0000031184868, z: -0.7017164, w: -0.0000042344564} - s: {x: 0.93172395, y: 0.9317242, z: 0.9317242} - - t: {x: 0.000000110966646, y: -0.0000001574491, z: -0.0000010318676} - q: {x: -0.00034413536, y: -0.0000001788317, z: -0.000000047118146, w: -0.99999994} - s: {x: 1.0000002, y: 1.0000004, z: 1.0000006} - - t: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - q: {x: -0.000004153084, y: -0.00000014901465, z: 0.00000000549653, w: -1} - s: {x: 0.99999994, y: 1, z: 1.0000002} - - t: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - q: {x: -0.00035462173, y: 0.09056213, z: 0.000024150295, w: 0.9958908} - s: {x: 1.0000001, y: 1.0000001, z: 1.0000001} - - t: {x: 0.000000021716517, y: -0.000000004901267, z: -0.000000053663825} - q: {x: -0.00034918456, y: 0.00035879752, z: -0.00003603795, w: 0.9999999} - s: {x: 1.0000006, y: 1.0000006, z: 1.0000007} - - t: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - q: {x: 0.00027554593, y: -0.17976484, z: 0.0000110231795, w: 0.98370963} - s: {x: 1, y: 1, z: 1} - - t: {x: 0.000000092167966, y: -0.000000005253241, z: -0.000000018746505} - q: {x: -0.0002785174, y: 0.00046665955, z: 0.000036992522, w: -0.9999999} - s: {x: 1.0000008, y: 1.0000008, z: 1.000001} - - t: {x: -0.057662286, y: -0.026324952, z: 0.10326293} - q: {x: 0.7088708, y: 0.001175211, z: -0.7053236, w: 0.0044189156} - s: {x: 0.9999998, y: 1.0000002, z: 1.0000001} - - t: {x: -0.00004896231, y: 0.000000024971087, z: 0.000048934347} - q: {x: 0.000010777495, y: -0.0000001141843, z: 0.000000041152806, w: -1} - s: {x: 1.0000005, y: 1.000001, z: 1.0000008} - - t: {x: -0.11778397, y: 0.00000004942573, z: 0.12102794} - q: {x: 0.7070856, y: 0.0062066345, z: -0.70708257, w: 0.0050717616} - s: {x: 1.0000005, y: 0.9999998, z: 0.99999994} - - t: {x: -0.000029324656, y: 8.95515e-10, z: -0.000049009494} - q: {x: -0.00004252278, y: 0.00000005476248, z: 0.00000006565823, w: -1} - s: {x: 1.0000005, y: 1.0000008, z: 1.0000004} - - t: {x: -0.08058888, y: 0.033353485, z: 0.11639312} - q: {x: 0.64207387, y: -0.30542296, z: -0.6339928, w: 0.3041566} - s: {x: 1.0000002, y: 0.9999999, z: 1.0000002} - - t: {x: 0.000000041325194, y: 0.000000012107193, z: 0.000117835225} - q: {x: -0.00000005960463, y: -0.00000010430811, z: 0.00000019371505, w: -1} - s: {x: 1.0041237, y: 1.0041233, z: 1.0041234} - - t: {x: -0.089603975, y: 0.000000049756913, z: 0.1414512} - q: {x: 0.7072902, y: 0.0011002349, z: -0.7069201, w: -0.0018578874} - s: {x: 0.9999998, y: 0.9999999, z: 1} - - t: {x: -0.000047065067, y: -0.000000010341424, z: 0.000058734793} - q: {x: -0.000027814876, y: -0.0005024864, z: 0.00091035536, w: -0.9999995} - s: {x: 0.95859826, y: 0.98290855, z: 0.99588066} - - t: {x: -0.044395097, y: -0.00009391423, z: 0.11719049} - q: {x: 0.7071071, y: 0.00000005338665, z: -0.7071065, w: 0.000000053386696} - s: {x: 0.99999994, y: 0.99999994, z: 0.99999994} - - t: {x: -0.000000013031427, y: -3.49e-13, z: 0.000008992247} - q: {x: -0.00000015128457, y: -0.000000059604616, z: -0.00000018214733, w: -1} - s: {x: 1.0000002, y: 1, z: 1} - - t: {x: -0.111640856, y: -0.05187969, z: 0.07084919} - q: {x: 0.7707361, y: -0.00087633455, z: -0.6371536, w: 0.00070964516} - s: {x: 0.9999997, y: 0.9999999, z: 0.99999994} - - t: {x: -0.000029511999, y: -3.4197e-10, z: -0.000023493698} - q: {x: 0.000000060419545, y: -6.7871035e-11, z: 0.000000022933815, w: -1} - s: {x: 1.0000007, y: 1.0000011, z: 1.000001} - - t: {x: -0.11164072, y: 0.05187975, z: 0.07084918} - q: {x: 0.7707363, y: 0.0008762584, z: -0.6371533, w: -0.0007097716} - s: {x: 0.99999994, y: 0.9999999, z: 0.99999994} - - t: {x: -0.000029419754, y: 0.000000007574272, z: -0.000023492226} - q: {x: -0.000000114319846, y: -0.00000011933912, z: 0.000000062340405, w: 1} - s: {x: 1.0000006, y: 1.0000008, z: 1.0000008} - - t: {x: -0.080588885, y: -0.033353455, z: 0.116393134} - q: {x: 0.64207375, y: 0.30542332, z: -0.63399243, w: -0.30415702} - s: {x: 0.99999976, y: 0.99999976, z: 0.9999998} - - t: {x: 0.00000004551967, y: 0.000000001862645, z: 0.000117586125} - q: {x: -0.00000013411044, y: -0.000000059604638, z: -0.0000000745058, w: -1} - s: {x: 1.0041221, y: 1.0041219, z: 1.004122} - - t: {x: -0.044175807, y: -0.00009392363, z: 0.053631864} - q: {x: -0.4972366, y: 0.00000016931602, z: 0.86761504, w: 0.00000009477948} - s: {x: 1.0006866, y: 1.000687, z: 1.0006868} - - t: {x: -0.084927976, y: 0.010402911, z: 0.028449215} - q: {x: -0.00920702, y: 0.16402113, z: -0.06609625, w: 0.98419696} - s: {x: 0.9999998, y: 0.9999999, z: 0.9999999} - - t: {x: -0.000000053318217, y: 0.000027448603, z: -0.000031365904} - q: {x: 0.0000005736945, y: -0.000000059604623, z: 0.000000009313222, w: 1} - s: {x: 1.0001968, y: 1.0035341, z: 1.0035329} - - t: {x: -0.029504841, y: -0.057597507, z: -0.027499013} - q: {x: -0.029741721, y: 0.105628826, z: -0.22734705, w: 0.96761113} - s: {x: 0.99999994, y: 1.0000001, z: 0.99999994} - - t: {x: 0.000000037252903, y: -0.00004905667, z: 0.000058704336} - q: {x: 0.0000003948807, y: -0.00000005960463, z: 0.000000072177485, w: 1} - s: {x: 1.0000006, y: 1.0000007, z: 0.9999994} - - t: {x: -0.075910136, y: -0.025586976, z: 0.024111979} - q: {x: 0.021914467, y: 0.26832202, z: 0.07839589, w: 0.9598839} - s: {x: 0.9999999, y: 1, z: 1} - - t: {x: -0.000000008140205, y: -0.00005881765, z: -0.00000016986974} - q: {x: -0.0000009927896, y: 0.000000029802315, z: -0.0000000018626447, w: 1} - s: {x: 1.0000014, y: 1.0000007, z: 1} - - t: {x: -0.086288534, y: 0.000000024458675, z: 0.02867835} - q: {x: 0.000000012695441, y: 0.17807616, z: -0.00000006888677, w: 0.9840167} - s: {x: 0.9999999, y: 1, z: 0.9999999} - - t: {x: 0.000000007439353, y: 2.858e-12, z: -0.0000313395} - q: {x: -0.00000039331678, y: 0.00000013411041, z: 0.000000030241612, w: 1} - s: {x: 1.0001963, y: 1.0039256, z: 1.0039251} - - t: {x: -0.00000011920712, y: 7.393e-12, z: 0.000029381012} - q: {x: -0.00000004828186, y: 0.000000029802308, z: -0.000000035736438, w: 1} - s: {x: 1.0007063, y: 1.0051053, z: 1.0000001} - - t: {x: -0.084927976, y: -0.010590785, z: 0.028449215} - q: {x: 0.009207051, y: 0.16402112, z: 0.066096246, w: 0.98419696} - s: {x: 0.99999976, y: 0.9999999, z: 0.9999999} - - t: {x: -0.000000044936314, y: -0.000027450465, z: -0.000031365915} - q: {x: -0.0000007441263, y: 0.00000011920922, z: -0.00000006856858, w: 1} - s: {x: 1.0001969, y: 1.0035335, z: 1.0035323} - - t: {x: -0.020923134, y: -0.000093799084, z: -0.017397886} - q: {x: 0.0000019340207, y: 0.24886589, z: -0.000000716172, w: 0.968538} - s: {x: 1.0000012, y: 1.000001, z: 1} - - t: {x: -0.02847365, y: 0.000000002149267, z: -0.00000007008269} - q: {x: 0.9989919, y: -0.000000041880856, z: -0.04489069, w: 0.0000072369353} - s: {x: 0.99999994, y: 1.0000001, z: 0.99999994} - - t: {x: -0.075910136, y: 0.025399094, z: 0.024111979} - q: {x: -0.021914452, y: 0.26832196, z: -0.07839588, w: 0.9598839} - s: {x: 0.9999999, y: 1.0000001, z: 0.9999999} - - t: {x: -0.000000010323419, y: 0.000058822483, z: -0.000000034016526} - q: {x: 0.00000083632744, y: 0.00000014901158, z: 0.000000044703473, w: 1} - s: {x: 1.0000008, y: 1.0000006, z: 0.99999946} - - t: {x: -0.02950471, y: 0.057409532, z: -0.027499085} - q: {x: 0.029741673, y: 0.10562913, z: 0.2273467, w: 0.9676112} - s: {x: 0.9999998, y: 1, z: 0.99999994} - - t: {x: -0.00000010430813, y: 0.000049087404, z: 0.00005890882} - q: {x: -0.00000049173815, y: 0.000000111758666, z: -0.000000050524232, w: 1} - s: {x: 1.0000008, y: 1.0000006, z: 0.9999998} - - t: {x: -0.1122042, y: 0.03667182, z: 0.08122143} - q: {x: 0.7770956, y: 0.00000008287696, z: -0.62938255, w: 0.00000008730825} - s: {x: 0.9999998, y: 0.99999994, z: 0.99999994} - - t: {x: -0.000029446084, y: 0.000000001299492, z: -0.00010786233} - q: {x: 0.0000002508521, y: -0.000000029802322, z: 0.00000003496133, w: 1} - s: {x: 1.0000001, y: 1, z: 1.0000001} - - t: {x: -0.030948685, y: -0.037739087, z: 0.1084911} - q: {x: -0.65911824, y: -0.23915756, z: 0.6702265, w: 0.24323519} - s: {x: 1.0000004, y: 1.0000001, z: 1.0000001} - - t: {x: -0.00027455122, y: -0.000000013038516, z: 0.016000055} - q: {x: 0.000000089406946, y: -0.00000013783571, z: 0.000000014901158, w: 1} - s: {x: 1.0000004, y: 1.0000007, z: 1.0000005} - - t: {x: -0.10751021, y: -0.019023033, z: 0.083702855} - q: {x: 0.77709675, y: -0.00000014916701, z: -0.6293812, w: 0.00000028182342} - s: {x: 1.0000001, y: 0.99999994, z: 0.9999998} - - t: {x: -0.000029469638, y: -0.000000001343547, z: -0.000048831236} - q: {x: -0.00000006366759, y: 0.00000005960466, z: 0.000000032427817, w: -1} - s: {x: 0.99999994, y: 0.9999997, z: 1.0000002} - - t: {x: -0.035558783, y: 0.000000002684608, z: 0.000000070780516} - q: {x: 0.00000041689458, y: 0.000000029802319, z: -0.00000014157611, w: 1} - s: {x: 1.0000002, y: 0.9402967, z: 0.91037256} - - t: {x: -0.043685723, y: 0.06515683, z: 0.115223125} - q: {x: -0.12444717, y: 0.7023361, z: -0.116329774, w: 0.69116163} - s: {x: 1.0062851, y: 1.006285, z: 1.0062854} - - t: {x: -0.058503173, y: 0.000000007450581, z: -0.00000013026875} - q: {x: -0.025524477, y: -0.0444962, z: -0.0058081434, w: 0.9986666} - s: {x: 1.0000006, y: 1.0000004, z: 1.0000006} - - t: {x: -0.18975337, y: 0.05661986, z: 0.0033298077} - q: {x: 0.039255124, y: 0.03201982, z: 0.8036261, w: -0.59297466} - s: {x: 1.000001, y: 1.000001, z: 1.0000001} - - t: {x: -0.034978125, y: -0.037129283, z: -0.03650741} - q: {x: 0.6946836, y: 0.069688484, z: -0.14096293, w: -0.7019172} - s: {x: 1.0106096, y: 1.0106097, z: 1.0106091} - - t: {x: -0.16176583, y: -0.00006621634, z: 0.000022994354} - q: {x: 0.023624524, y: 0.0479611, z: 0.1251226, w: 0.99069977} - s: {x: 1.0629773, y: 1.0629772, z: 1.0629762} - - t: {x: -0.069490775, y: 0.00000030826777, z: -0.00000016763806} - q: {x: -0.23796001, y: 0.000000055879347, z: -0.0000003056775, w: 0.971275} - s: {x: 1, y: 0.97192365, z: 0.9719234} - - t: {x: -0.2779641, y: -0.000000018626451, z: 0.00000000372529} - q: {x: -0.04411956, y: 0.041526236, z: 0.033263754, w: 0.9976084} - s: {x: 1.0078583, y: 1.0078588, z: 1.0078588} - - t: {x: -0.035068974, y: -0.00000021187589, z: -0.00000010803342} - q: {x: -0.00000018626449, y: 0.00000002235174, z: -0.000000061932944, w: 1} - s: {x: 1.0000005, y: 1.0012747, z: 1.0012745} - - t: {x: -0.14027604, y: -0.00000036379788, z: -0.000000063329935} - q: {x: -0.0000003613531, y: 0.000000029802319, z: -0.000000020954756, w: 1} - s: {x: 0.9999999, y: 1.0000002, z: 0.9999999} - - t: {x: -0.03506889, y: -0.00000013626413, z: -0.000000020489097} - q: {x: 0.00000009313224, y: 0.000000007450594, z: -0.00000003306194, w: 1} - s: {x: 1.0000006, y: 1.0006868, z: 1.0006864} - - t: {x: -0.28055203, y: -0.00000019872095, z: 0.000000020489097} - q: {x: 0.72038645, y: 0.0045559406, z: -0.016480954, w: 0.6933622} - s: {x: 0.9291198, y: 0.92912, z: 0.9291198} - - t: {x: -0.09688466, y: 0.012628757, z: 0.004193769} - q: {x: 0.079227865, y: -0.047999866, z: -0.015272714, w: 0.9955832} - s: {x: 1.0000007, y: 1.0000004, z: 1.0000006} - - t: {x: -0.05342067, y: -0.000000022351742, z: 0.000000056810677} - q: {x: -0.0093751, y: -0.036781717, z: 0.0147884125, w: 0.9991699} - s: {x: 0.9999998, y: 0.99999994, z: 0.99999917} - - t: {x: -0.042907912, y: 0.000000018626451, z: -0.00000012479722} - q: {x: -0.017374245, y: -0.04760415, z: -0.017481765, w: 0.9985622} - s: {x: 0.9999998, y: 0.99999946, z: 1.0000002} - - t: {x: -0.038593143, y: 0.041314624, z: -0.013678891} - q: {x: -0.46069258, y: 0.16832037, z: -0.39540824, w: 0.7765842} - s: {x: 1.0000013, y: 1.000001, z: 1.0000002} - - t: {x: -0.03329902, y: 0.000000015366822, z: -0.00000004284084} - q: {x: 0.04481694, y: -0.020407852, z: 0.021573808, w: 0.99855375} - s: {x: 1.0000005, y: 1.000001, z: 1.0000001} - - t: {x: -0.038922727, y: -0.000000038882717, z: 0.000000003026798} - q: {x: -0.0256544, y: -0.031652726, z: 0.02530853, w: 0.9988491} - s: {x: 1.0000006, y: 1, z: 1.0000005} - - t: {x: -0.09379445, y: 0.0395091, z: 0.0025051245} - q: {x: 0.036175013, y: -0.024784617, z: -0.03544047, w: 0.99840933} - s: {x: 1.0000007, y: 1.0000006, z: 1.0000005} - - t: {x: -0.060065866, y: -0.000000011175871, z: -0.000000070314854} - q: {x: -0.0015665218, y: -0.039195575, z: -0.0035614849, w: 0.99922407} - s: {x: 1.0000012, y: 1.0000005, z: 1.0000007} - - t: {x: -0.03607316, y: -0.000000007450581, z: -0.000000004190952} - q: {x: 0.0020313761, y: -0.072688654, z: 0.0070823417, w: 0.9973275} - s: {x: 1.0000002, y: 1, z: 0.9999997} - - t: {x: -0.09333068, y: -0.014842848, z: 0.001449341} - q: {x: 0.1464563, y: -0.04240491, z: -0.009140864, w: 0.9882656} - s: {x: 0.9999995, y: 1, z: 0.9999999} - - t: {x: -0.042821966, y: -0.000000014901161, z: -0.000000044703484} - q: {x: -0.0051184003, y: -0.039652158, z: -0.0020092607, w: 0.99919844} - s: {x: 1.000001, y: 1.0000007, z: 1.000001} - - t: {x: -0.035355955, y: 0, z: 0.00000014714897} - q: {x: -0.0078114183, y: -0.07866921, z: 0.0011297686, w: 0.99686956} - s: {x: 1.0000006, y: 0.9999998, z: 1.0000007} - - t: {x: -0.086030155, y: -0.035094876, z: -0.008257229} - q: {x: 0.21294314, y: -0.021714322, z: 0.004175842, w: 0.9768144} - s: {x: 1.0000004, y: 1.0000007, z: 1.0000006} - - t: {x: -0.040974, y: -0.000000044703484, z: 0.000000055879354} - q: {x: -0.0150128715, y: -0.037432693, z: 0.004991034, w: 0.999174} - s: {x: 1.0000007, y: 1.0000004, z: 1.000001} - - t: {x: -0.02452468, y: 0.000000037252903, z: -0.00000009685755} - q: {x: 0.031532526, y: -0.047115006, z: -0.003371842, w: 0.99838597} - s: {x: 1.0000005, y: 1.0000006, z: 0.99999976} - - t: {x: -0.040425763, y: 0.00000008009374, z: -0.000000029802322} - q: {x: -0.14658868, y: 0.000000067055225, z: 0.000000004656613, w: 0.98919755} - s: {x: 1.0000012, y: 1.0056945, z: 1.0056937} - - t: {x: -0.043685734, y: -0.06515668, z: 0.11522319} - q: {x: 0.12444672, y: 0.7023361, z: 0.116329275, w: 0.69116175} - s: {x: 1.0062852, y: 1.0062851, z: 1.0062855} - - t: {x: -0.05850321, y: 0.000000001862645, z: -0.000000018218998} - q: {x: 0.025524419, y: -0.044496294, z: 0.005808189, w: 0.9986665} - s: {x: 1.0000002, y: 1.0000004, z: 1.0000005} - - t: {x: -0.041975934, y: 0.000000003169064, z: -0.000000011823658} - q: {x: 5.6843412e-14, y: 0.0000000074505797, z: 0.000000014901156, w: 1} - s: {x: 1.0000005, y: 0.9010593, z: 0.70123535} - - t: {x: -0.18975337, y: -0.05661983, z: 0.0033298738} - q: {x: 0.039254665, y: -0.03201927, z: 0.80362606, w: 0.5929747} - s: {x: 0.99999976, y: 1, z: 1} - - t: {x: -0.04042585, y: -0.00000015398837, z: -0.000000022351742} - q: {x: 0.14658885, y: 0.000000055879347, z: -0.000000021420417, w: 0.9891975} - s: {x: 1, y: 1.0056936, z: 1.0056933} - - t: {x: -0.034978047, y: 0.037129175, z: -0.036507383} - q: {x: 0.69468355, y: -0.06968856, z: -0.14096293, w: 0.7019173} - s: {x: 1.0106091, y: 1.0106091, z: 1.0106089} - - t: {x: -0.16176572, y: 0.000066091015, z: 0.00002300553} - q: {x: -0.023624752, y: 0.047960315, z: -0.12512293, w: 0.99069977} - s: {x: 1.0629758, y: 1.0629759, z: 1.0629758} - - t: {x: -0.2779642, y: -0.000000110827386, z: -0.000000018626451} - q: {x: 0.044119455, y: 0.041526616, z: -0.03326411, w: 0.9976085} - s: {x: 1.0078585, y: 1.0078588, z: 1.0078591} - - t: {x: -0.280552, y: 0.000000037020072, z: 0} - q: {x: -0.72038645, y: 0.0045559183, z: 0.016481187, w: 0.6933622} - s: {x: 0.92912, y: 0.929121, z: 0.9291208} - - t: {x: -0.09379414, y: -0.039508693, z: 0.0025047294} - q: {x: -0.03617471, y: -0.024784591, z: 0.035439868, w: 0.99840933} - s: {x: 0.9999998, y: 1.0000004, z: 1.0000001} - - t: {x: -0.06006597, y: 0.000000040978193, z: -0.00000014388934} - q: {x: 0.0015665467, y: -0.039191827, z: 0.0035599873, w: 0.9992242} - s: {x: 1.0000001, y: 1.0000001, z: 0.99999994} - - t: {x: -0.036073178, y: 0, z: -0.00000004284084} - q: {x: -0.0020310907, y: -0.07268848, z: -0.007082337, w: 0.9973275} - s: {x: 0.9999999, y: 1.0000005, z: 1.0000007} - - t: {x: -0.086029895, y: 0.035095196, z: -0.008257618} - q: {x: 0.21294335, y: 0.021714617, z: 0.0041771624, w: -0.97681427} - s: {x: 0.99999994, y: 1.0000002, z: 0.9999997} - - t: {x: -0.040973976, y: -0.000000014901161, z: -0.000000018626451} - q: {x: 0.015013302, y: -0.037438624, z: -0.004989681, w: 0.99917376} - s: {x: 0.9999995, y: 0.9999996, z: 0.99999976} - - t: {x: -0.02452459, y: -0.000000007450581, z: -0.00000000372529} - q: {x: -0.03153322, y: -0.047115102, z: 0.0033719717, w: 0.99838597} - s: {x: 1, y: 1.0000001, z: 1.0000002} - - t: {x: -0.09333042, y: 0.014843221, z: 0.0014490108} - q: {x: -0.14645581, y: -0.042405065, z: 0.009140923, w: 0.98826563} - s: {x: 1.0000001, y: 1.0000004, z: 1.0000008} - - t: {x: -0.042821992, y: 0.000000029802322, z: 0.000000063329935} - q: {x: -0.005118502, y: 0.03964813, z: -0.0020089615, w: -0.9991986} - s: {x: 0.99999976, y: 0.9999994, z: 0.9999997} - - t: {x: -0.03535577, y: 0, z: 0.00000004656613} - q: {x: 0.0078114327, y: -0.07867044, z: -0.0011303273, w: 0.9968695} - s: {x: 1.0000001, y: 1.0000005, z: 1.0000007} - - t: {x: -0.09688435, y: -0.012628396, z: 0.004193525} - q: {x: -0.07922754, y: -0.04800106, z: 0.0152710425, w: 0.9955832} - s: {x: 1.0000001, y: 1.0000004, z: 1.0000004} - - t: {x: -0.053420693, y: 0.000000014901161, z: 0.00000010617077} - q: {x: 0.009375039, y: -0.03678105, z: -0.0147887, w: 0.99916995} - s: {x: 0.9999999, y: 0.99999994, z: 1.0000002} - - t: {x: -0.042907897, y: 0.000000007450581, z: 0.000000038184226} - q: {x: 0.017373888, y: -0.04760424, z: 0.017481951, w: 0.9985622} - s: {x: 0.99999964, y: 0.99999946, z: 1.0000001} - - t: {x: -0.038593136, y: -0.041314337, z: -0.013679172} - q: {x: 0.46069485, y: 0.16831599, z: 0.39540786, w: 0.77658397} - s: {x: 1, y: 0.99999964, z: 1} - - t: {x: -0.033299044, y: 0.000000069325324, z: 0} - q: {x: -0.04481925, y: -0.02040754, z: -0.021573417, w: 0.9985537} - s: {x: 1.0000001, y: 1.0000004, z: 0.99999934} - - t: {x: -0.038922455, y: 0.00000007642666, z: -0.00000006053597} - q: {x: 0.025656313, y: -0.031653535, z: -0.025309926, w: 0.998849} - s: {x: 1.0000005, y: 0.9999999, z: 0.99999994} - - t: {x: -0.1402761, y: -0.00000006449409, z: -0.000000074505806} - q: {x: 0.0000004209578, y: 0.000000007450581, z: 4.656613e-10, w: 1} - s: {x: 1.0000002, y: 0.99999976, z: 0.99999994} - - t: {x: -0.035069004, y: 0.00000009563519, z: -0.000000029802322} - q: {x: -0.000000040978247, y: -0.000000007450599, z: -0.000000045169134, - w: 1} - s: {x: 0.9999999, y: 1.0006864, z: 1.0006862} - - t: {x: -0.03506903, y: -0.000000095926225, z: -0.00000011920929} - q: {x: 0.00000028312203, y: -0, z: -0.00000002235174, w: 1} - s: {x: 1.0000001, y: 1.0012742, z: 1.0012745} - - t: {x: -0.06949084, y: -0.0000004498288, z: -0.00000018626451} - q: {x: 0.23795915, y: 0.00000005960463, z: 0.00000006231129, w: 0.9712752} - s: {x: 1, y: 0.97192377, z: 0.9719234} - - t: {x: -0.037511554, y: 0.000000002876673, z: -0.00009686686} - q: {x: -0.00000006253777, y: 0, z: -0.000000023019917, w: 1} - s: {x: 1.0000008, y: 0.90141255, z: 0.80094117} - - t: {x: 0.017579908, y: -0.101263635, z: 0.0031655827} - q: {x: -0.055877987, y: -0.07036913, z: 0.9958572, w: -0.0139422715} - s: {x: 1.0000013, y: 1.0000013, z: 1} - - t: {x: -0.4319558, y: 0.000000028871, z: 9.31323e-10} - q: {x: -0.043848146, y: -0.040393874, z: -0.02174867, w: 0.99798435} - s: {x: 1.0000001, y: 1.0000004, z: 0.99999976} - - t: {x: -0.11892719, y: 0.000000031199306, z: 0.000000044703484} - q: {x: 0.000000026077032, y: -0.000000026077032, z: -0.0000000041909516, - w: 1} - s: {x: 1.0000001, y: 1.0386349, z: 1.0190157} - - t: {x: -0.47571138, y: 0.00000003259629, z: 0.000000002328306} - q: {x: 0.837541, y: 0.036573015, z: -0.5291056, w: -0.13128173} - s: {x: 0.858255, y: 0.858255, z: 0.858255} - - t: {x: -0.18387146, y: 0.000000025844201, z: 0.000000009313226} - q: {x: -0.062467325, y: -0.2067471, z: -0.02363323, w: 0.9761122} - s: {x: 1.0000007, y: 1, z: 1.0000004} - - t: {x: -0.107989594, y: -0.000000041211024, z: -0.00000011920929} - q: {x: -0.033350065, y: 0.000000022351742, z: -0.0000000013969839, w: 0.99944377} - s: {x: 1.0000002, y: 0.90615153, z: 0.9061514} - - t: {x: -0.00000004861795, y: -0.000000020489097, z: -0.00000009126961} - q: {x: -0.08551703, y: 0.88385785, z: 0.037582923, w: -0.45833367} - s: {x: 0.52756983, y: 0.52756953, z: 0.5275701} - - t: {x: 0.01758384, y: 0.10126295, z: 0.0031659142} - q: {x: 0.055798277, y: -0.07043252, z: -0.9958723, w: -0.01281313} - s: {x: 1.0000005, y: 1.0000007, z: 0.99999994} - - t: {x: -0.000000059058948, y: 0.000000002328306, z: -0.000000055879354} - q: {x: 0.08551739, y: 0.883858, z: -0.03758245, w: -0.45833328} - s: {x: 0.5275694, y: 0.52756906, z: 0.52756906} - - t: {x: -0.4319558, y: 0.000000024680048, z: 9.31323e-10} - q: {x: 0.043845, y: -0.04039296, z: 0.02175176, w: 0.9979844} - s: {x: 0.99999994, y: 1.0000001, z: 1.0000001} - - t: {x: -0.4757285, y: 0.0000005217734, z: 0.000002105953} - q: {x: 0.8375387, y: -0.036570527, z: -0.52910906, w: 0.13128255} - s: {x: 0.85825455, y: 0.85825485, z: 0.85825473} - - t: {x: -0.18387152, y: -0.000000008847564, z: 0} - q: {x: 0.062466748, y: -0.20674692, z: 0.023633018, w: 0.97611225} - s: {x: 1.0000006, y: 1.0000004, z: 1.0000005} - - t: {x: -0.11892757, y: 0.000000030267984, z: -0.000000029802322} - q: {x: 0.000000096857555, y: -0.0000000037252907, z: 0.000000011525118, - w: 1} - s: {x: 1.0000007, y: 1.0386355, z: 1.0190154} - - t: {x: -0.10798966, y: 0.000000048195943, z: -0.0000002104789} - q: {x: 0.03335002, y: -0.000000042840842, z: -0.000000021886082, w: 0.99944377} - s: {x: 0.99999976, y: 0.90615094, z: 0.90615165} - m_DefaultPose: - data: - m_X: - - t: {x: 0, y: 0, z: 0} - q: {x: 0, y: 0, z: 0, w: 1} - s: {x: 1, y: 1, z: 1} - - t: {x: 0, y: 0, z: 0} - q: {x: 0.7071068, y: 0, z: 0, w: -0.7071068} - s: {x: 1, y: 1, z: 1} - - t: {x: 6.15551e-10, y: 0.01051005, z: -0.011465508} - q: {x: 0.5000003, y: 0.4999997, z: -0.50000006, w: 0.4999999} - s: {x: 1, y: 0.99999994, z: 1} - - t: {x: 0.014117634, y: 3e-15, z: 0.000000008326849} - q: {x: -0.000000004950124, y: 1.8325958e-16, z: -9.948377e-16, w: 1} - s: {x: 0.91100955, y: 0.91100955, z: 0.91100955} - - t: {x: -1.046681, y: 0.000000066209516, z: -0.00842917} - q: {x: -0.000000024859764, y: 0.055257294, z: -0.00000020834274, w: 0.99847215} - s: {x: 0.9999995, y: 0.9999998, z: 0.9999998} - - t: {x: -0.053878736, y: 0.000000004067728, z: -0.000000003725286} - q: {x: 0.000000072790776, y: -0.07920216, z: 0.00000006070385, w: 0.9968586} - s: {x: 0.97259897, y: 0.97259927, z: 0.97259873} - - t: {x: -0.053665183, y: 0.000000004051634, z: 0.00000000558794} - q: {x: 0, y: 0, z: -1.3322677e-15, w: 1} - s: {x: 0.9739008, y: 0.9402905, z: 0.9739004} - - t: {x: -0.034965567, y: 0.000000002639832, z: 0.000000022351745} - q: {x: 0.000000059587457, y: -0.000000037252903, z: -0.0000000014303447, - w: 1} - s: {x: 0.7603117, y: 0.916217, z: 0.7002415} - - t: {x: -0.19275962, y: 0.000000011617576, z: -0.00012540072} - q: {x: -0.0000005856389, y: -0.086834215, z: -0.00000010316014, w: 0.9962228} - s: {x: 1.0000007, y: 1.0000005, z: 1} - - t: {x: -0.18375577, y: 0.000000013882967, z: -0.00002123043} - q: {x: 0.00000051022846, y: 0.110715404, z: 0.000000034567357, w: 0.9938522} - s: {x: 1.0000013, y: 1.0000013, z: 0.99999994} - - t: {x: -0.19709714, y: 0.000000014880397, z: -0.000000008546294} - q: {x: -0.00000035964723, y: 0.070658274, z: 0.00000015052176, w: 0.99750066} - s: {x: 1.0000008, y: 1.0000006, z: 0.99999994} - - t: {x: -0.10225469, y: 0.000000007720018, z: 0} - q: {x: 0.00000008821572, y: -0.083160356, z: -0.000000050923394, w: 0.99653625} - s: {x: 1.0078583, y: 1.0078585, z: 1.007859} - - t: {x: -0.07060846, y: 0.07847385, z: 0.053546134} - q: {x: 0.112811, y: -0.5704385, z: -0.08211961, w: 0.809401} - s: {x: 1, y: 0.99999994, z: 0.99999994} - - t: {x: 0.0013332947, y: -0.003999993, z: 0.0083134975} - q: {x: 0.0000002556218, y: 0.000000096539885, z: 0.090223595, w: 0.99592155} - s: {x: 0.9764207, y: 0.9764207, z: 0.9764208} - - t: {x: -0.10662577, y: 0.034980323, z: 0.11798749} - q: {x: 0.7124565, y: 0.0000031413288, z: -0.70171624, w: 0.0000040460623} - s: {x: 0.9317243, y: 0.9317242, z: 0.9317242} - - t: {x: 0.000000058543428, y: 0.00000006502823, z: -0.0000005722841} - q: {x: -0.0002753267, y: -0.17976472, z: -0.000011421973, w: 0.98370963} - s: {x: 1, y: 1.0000001, z: 1.0000001} - - t: {x: 0.000000067076826, y: 0.00000000257387, z: -0.000000065832864} - q: {x: 0.0002784026, y: 0.00046008814, z: -0.000036914105, w: -0.9999999} - s: {x: 1.0000008, y: 1.0000008, z: 1.0000011} - - t: {x: 0.00000010325148, y: 0.00000009111068, z: -0.00000116833} - q: {x: -0.00034421866, y: -0.00000008940312, z: -0.000000007621011, w: 0.99999994} - s: {x: 0.9999997, y: 1, z: 1.0000001} - - t: {x: 0.00000008089521, y: 0.000000109731694, z: -0.0000005722835} - q: {x: 0.0003545885, y: 0.09056162, z: -0.00002521045, w: 0.9958908} - s: {x: 0.99999994, y: 0.99999994, z: 1} - - t: {x: 0.000000012275649, y: 0.000000003306013, z: 0.000000020669177} - q: {x: -0.0003495343, y: -0.00035921476, z: -0.00003620913, w: -0.9999999} - s: {x: 1, y: 0.99999994, z: 1.0000001} - - t: {x: 0.00000008089521, y: 0.000000109731694, z: -0.0000005722835} - q: {x: -0.000004225848, y: -0.0000000894048, z: 0.000000076694484, w: 1} - s: {x: 1, y: 1.0000004, z: 1.0000005} - - t: {x: -0.03283036, y: 0.010835797, z: 0.14380059} - q: {x: 0.7925747, y: -0.06697429, z: -0.6038794, w: 0.051667} - s: {x: 0.99999964, y: 0.99999964, z: 0.9999999} - - t: {x: -0.00000006984919, y: -0.000027435564, z: -0.000000013395038} - q: {x: -0.00012683493, y: 0.0000002009328, z: 0.000000033527606, w: -1} - s: {x: 1.0001968, y: 1.0035329, z: 1.0035328} - - t: {x: -0.032830365, y: -0.010835715, z: 0.14380059} - q: {x: 0.79257464, y: 0.066974595, z: -0.6038795, w: -0.051666934} - s: {x: 0.9999998, y: 0.9999998, z: 0.9999998} - - t: {x: -0.00000008393545, y: 0.000027440221, z: 0.00000010083659} - q: {x: -0.00012638416, y: 0.000000047963095, z: 0.00000048801286, w: 1} - s: {x: 1.0001965, y: 1.0035336, z: 1.0035331} - - t: {x: -0.10751021, y: 0.0190231, z: 0.083702885} - q: {x: 0.77709675, y: -0.00000012301177, z: -0.6293812, w: -0.00000007944375} - s: {x: 1.0000001, y: 0.99999994, z: 0.9999998} - - t: {x: -0.000029352806, y: 0.00000000223472, z: -0.00004881392} - q: {x: -0.00000005665234, y: 0.00000005960465, z: 0.00000003493151, w: -1} - s: {x: 0.99999994, y: 0.9999997, z: 1.0000001} - - t: {x: -0.06767554, y: -0.00009390456, z: 0.14743026} - q: {x: -0.7066935, y: -0.000000005227299, z: 0.70751995, w: -0.00000025150896} - s: {x: 1, y: 0.9999999, z: 0.99999994} - - t: {x: -0.00009806863, y: 4.663e-12, z: 0.000097917335} - q: {x: 0.00000018294442, y: 0.0013798266, z: -0.000000043951403, w: 0.99999905} - s: {x: 0.9291962, y: 0.9811298, z: 0.9664092} - - t: {x: -0.030948676, y: 0.03773913, z: 0.10849106} - q: {x: -0.6591185, y: 0.2391581, z: 0.670226, w: -0.24323557} - s: {x: 0.9999996, y: 0.9999999, z: 0.9999998} - - t: {x: -0.00027455867, y: 0.000000007450581, z: 0.01600009} - q: {x: -0.000000044703473, y: -0.000000081956365, z: -0.00000020861621, - w: 1} - s: {x: 1.000002, y: 1.0000021, z: 1.0000013} - - t: {x: -0.03346425, y: -0.00009391148, z: 0.14560841} - q: {x: 0.7929806, y: -0.00000027194244, z: -0.6092469, w: -0.00000018440363} - s: {x: 1.0000001, y: 0.99999994, z: 1} - - t: {x: 0.00000001489442, y: 5.434e-12, z: 0.00000005769348} - q: {x: -0.00000072097384, y: 0.00000011920936, z: 0.000000009991907, w: 1} - s: {x: 1.0001968, y: 1.003533, z: 1.0035337} - - t: {x: -0.05766228, y: 0.02632502, z: 0.103262894} - q: {x: 0.70887077, y: -0.001181514, z: -0.7053235, w: -0.004424751} - s: {x: 0.99999946, y: 0.9999998, z: 0.9999998} - - t: {x: -0.00004905082, y: -0.000000016385457, z: 0.000048823622} - q: {x: -0.000002485234, y: 0.000000023964272, z: -0.000000041269228, w: -1} - s: {x: 1.0000001, y: 1.0000005, z: 1.0000001} - - t: {x: -0.051950034, y: 0.000000003922105, z: 0.000000033527613} - q: {x: -0.000000029801402, y: -0.000000014901158, z: -2.2618968e-10, w: 1} - s: {x: 1.0000001, y: 0.959976, z: 1} - - t: {x: -0.11220421, y: -0.036671754, z: 0.08122144} - q: {x: 0.7770956, y: -0.00000019629408, z: -0.62938267, w: 0.00000017990683} - s: {x: 0.99999976, y: 0.99999994, z: 0.9999999} - - t: {x: -0.00002940285, y: -3.56321e-10, z: -0.00010783993} - q: {x: -0.00000009624478, y: -0.000000059604606, z: 0.000000044068504, w: -1} - s: {x: 1.0000005, y: 1.000001, z: 1.0000007} - - t: {x: -0.07060859, y: -0.07847363, z: 0.053546168} - q: {x: -0.11281155, y: -0.57043844, z: 0.08211995, w: 0.8094009} - s: {x: 1, y: 0.9999999, z: 0.9999999} - - t: {x: 0.0013333301, y: 0.003999983, z: 0.0083137425} - q: {x: -0.00000018410877, y: 0.00000013294283, z: -0.090223566, w: 0.99592155} - s: {x: 0.9764205, y: 0.97642106, z: 0.9764207} - - t: {x: -0.10662578, y: -0.034980256, z: 0.117987506} - q: {x: 0.71245635, y: -0.0000031184868, z: -0.7017164, w: -0.0000042344564} - s: {x: 0.93172395, y: 0.9317242, z: 0.9317242} - - t: {x: 0.000000110966646, y: -0.0000001574491, z: -0.0000010318676} - q: {x: -0.00034413536, y: -0.0000001788317, z: -0.000000047118146, w: -0.99999994} - s: {x: 1.0000002, y: 1.0000004, z: 1.0000006} - - t: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - q: {x: -0.000004153084, y: -0.00000014901465, z: 0.00000000549653, w: -1} - s: {x: 0.99999994, y: 1, z: 1.0000002} - - t: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - q: {x: -0.00035462173, y: 0.09056213, z: 0.000024150295, w: 0.9958908} - s: {x: 1.0000001, y: 1.0000001, z: 1.0000001} - - t: {x: 0.000000021716517, y: -0.000000004901267, z: -0.000000053663825} - q: {x: -0.00034918456, y: 0.00035879752, z: -0.00003603795, w: 0.9999999} - s: {x: 1.0000006, y: 1.0000006, z: 1.0000007} - - t: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - q: {x: 0.00027554593, y: -0.17976484, z: 0.0000110231795, w: 0.98370963} - s: {x: 1, y: 1, z: 1} - - t: {x: 0.000000092167966, y: -0.000000005253241, z: -0.000000018746505} - q: {x: -0.0002785174, y: 0.00046665955, z: 0.000036992522, w: -0.9999999} - s: {x: 1.0000008, y: 1.0000008, z: 1.000001} - - t: {x: -0.057662286, y: -0.026324952, z: 0.10326293} - q: {x: 0.7088708, y: 0.001175211, z: -0.7053236, w: 0.0044189156} - s: {x: 0.9999998, y: 1.0000002, z: 1.0000001} - - t: {x: -0.00004896231, y: 0.000000024971087, z: 0.000048934347} - q: {x: 0.000010777495, y: -0.0000001141843, z: 0.000000041152806, w: -1} - s: {x: 1.0000005, y: 1.000001, z: 1.0000008} - - t: {x: -0.11778397, y: 0.00000004942573, z: 0.12102794} - q: {x: 0.7070856, y: 0.0062066345, z: -0.70708257, w: 0.0050717616} - s: {x: 1.0000005, y: 0.9999998, z: 0.99999994} - - t: {x: -0.000029324656, y: 8.95515e-10, z: -0.000049009494} - q: {x: -0.00004252278, y: 0.00000005476248, z: 0.00000006565823, w: -1} - s: {x: 1.0000005, y: 1.0000008, z: 1.0000004} - - t: {x: -0.08058888, y: 0.033353485, z: 0.11639312} - q: {x: 0.64207387, y: -0.30542296, z: -0.6339928, w: 0.3041566} - s: {x: 1.0000002, y: 0.9999999, z: 1.0000002} - - t: {x: 0.000000041325194, y: 0.000000012107193, z: 0.000117835225} - q: {x: -0.00000005960463, y: -0.00000010430811, z: 0.00000019371505, w: -1} - s: {x: 1.0041237, y: 1.0041233, z: 1.0041234} - - t: {x: -0.089603975, y: 0.000000049756913, z: 0.1414512} - q: {x: 0.7072902, y: 0.0011002349, z: -0.7069201, w: -0.0018578874} - s: {x: 0.9999998, y: 0.9999999, z: 1} - - t: {x: -0.000047065067, y: -0.000000010341424, z: 0.000058734793} - q: {x: -0.000027814876, y: -0.0005024864, z: 0.00091035536, w: -0.9999995} - s: {x: 0.95859826, y: 0.98290855, z: 0.99588066} - - t: {x: -0.044395097, y: -0.00009391423, z: 0.11719049} - q: {x: 0.7071071, y: 0.00000005338665, z: -0.7071065, w: 0.000000053386696} - s: {x: 0.99999994, y: 0.99999994, z: 0.99999994} - - t: {x: -0.000000013031427, y: -3.49e-13, z: 0.000008992247} - q: {x: -0.00000015128457, y: -0.000000059604616, z: -0.00000018214733, w: -1} - s: {x: 1.0000002, y: 1, z: 1} - - t: {x: -0.111640856, y: -0.05187969, z: 0.07084919} - q: {x: 0.7707361, y: -0.00087633455, z: -0.6371536, w: 0.00070964516} - s: {x: 0.9999997, y: 0.9999999, z: 0.99999994} - - t: {x: -0.000029511999, y: -3.4197e-10, z: -0.000023493698} - q: {x: 0.000000060419545, y: -6.7871035e-11, z: 0.000000022933815, w: -1} - s: {x: 1.0000007, y: 1.0000011, z: 1.000001} - - t: {x: -0.11164072, y: 0.05187975, z: 0.07084918} - q: {x: 0.7707363, y: 0.0008762584, z: -0.6371533, w: -0.0007097716} - s: {x: 0.99999994, y: 0.9999999, z: 0.99999994} - - t: {x: -0.000029419754, y: 0.000000007574272, z: -0.000023492226} - q: {x: -0.000000114319846, y: -0.00000011933912, z: 0.000000062340405, w: 1} - s: {x: 1.0000006, y: 1.0000008, z: 1.0000008} - - t: {x: -0.080588885, y: -0.033353455, z: 0.116393134} - q: {x: 0.64207375, y: 0.30542332, z: -0.63399243, w: -0.30415702} - s: {x: 0.99999976, y: 0.99999976, z: 0.9999998} - - t: {x: 0.00000004551967, y: 0.000000001862645, z: 0.000117586125} - q: {x: -0.00000013411044, y: -0.000000059604638, z: -0.0000000745058, w: -1} - s: {x: 1.0041221, y: 1.0041219, z: 1.004122} - - t: {x: -0.044175807, y: -0.00009392363, z: 0.053631864} - q: {x: -0.4972366, y: 0.00000016931602, z: 0.86761504, w: 0.00000009477948} - s: {x: 1.0006866, y: 1.000687, z: 1.0006868} - - t: {x: -0.084927976, y: 0.010402911, z: 0.028449215} - q: {x: -0.00920702, y: 0.16402113, z: -0.06609625, w: 0.98419696} - s: {x: 0.9999998, y: 0.9999999, z: 0.9999999} - - t: {x: -0.000000053318217, y: 0.000027448603, z: -0.000031365904} - q: {x: 0.0000005736945, y: -0.000000059604623, z: 0.000000009313222, w: 1} - s: {x: 1.0001968, y: 1.0035341, z: 1.0035329} - - t: {x: -0.029504841, y: -0.057597507, z: -0.027499013} - q: {x: -0.029741721, y: 0.105628826, z: -0.22734705, w: 0.96761113} - s: {x: 0.99999994, y: 1.0000001, z: 0.99999994} - - t: {x: 0.000000037252903, y: -0.00004905667, z: 0.000058704336} - q: {x: 0.0000003948807, y: -0.00000005960463, z: 0.000000072177485, w: 1} - s: {x: 1.0000006, y: 1.0000007, z: 0.9999994} - - t: {x: -0.075910136, y: -0.025586976, z: 0.024111979} - q: {x: 0.021914467, y: 0.26832202, z: 0.07839589, w: 0.9598839} - s: {x: 0.9999999, y: 1, z: 1} - - t: {x: -0.000000008140205, y: -0.00005881765, z: -0.00000016986974} - q: {x: -0.0000009927896, y: 0.000000029802315, z: -0.0000000018626447, w: 1} - s: {x: 1.0000014, y: 1.0000007, z: 1} - - t: {x: -0.086288534, y: 0.000000024458675, z: 0.02867835} - q: {x: 0.000000012695441, y: 0.17807616, z: -0.00000006888677, w: 0.9840167} - s: {x: 0.9999999, y: 1, z: 0.9999999} - - t: {x: 0.000000007439353, y: 2.858e-12, z: -0.0000313395} - q: {x: -0.00000039331678, y: 0.00000013411041, z: 0.000000030241612, w: 1} - s: {x: 1.0001963, y: 1.0039256, z: 1.0039251} - - t: {x: -0.00000011920712, y: 7.393e-12, z: 0.000029381012} - q: {x: -0.00000004828186, y: 0.000000029802308, z: -0.000000035736438, w: 1} - s: {x: 1.0007063, y: 1.0051053, z: 1.0000001} - - t: {x: -0.084927976, y: -0.010590785, z: 0.028449215} - q: {x: 0.009207051, y: 0.16402112, z: 0.066096246, w: 0.98419696} - s: {x: 0.99999976, y: 0.9999999, z: 0.9999999} - - t: {x: -0.000000044936314, y: -0.000027450465, z: -0.000031365915} - q: {x: -0.0000007441263, y: 0.00000011920922, z: -0.00000006856858, w: 1} - s: {x: 1.0001969, y: 1.0035335, z: 1.0035323} - - t: {x: -0.020923134, y: -0.000093799084, z: -0.017397886} - q: {x: 0.0000019340207, y: 0.24886589, z: -0.000000716172, w: 0.968538} - s: {x: 1.0000012, y: 1.000001, z: 1} - - t: {x: -0.02847365, y: 0.000000002149267, z: -0.00000007008269} - q: {x: 0.9989919, y: -0.000000041880856, z: -0.04489069, w: 0.0000072369353} - s: {x: 0.99999994, y: 1.0000001, z: 0.99999994} - - t: {x: -0.075910136, y: 0.025399094, z: 0.024111979} - q: {x: -0.021914452, y: 0.26832196, z: -0.07839588, w: 0.9598839} - s: {x: 0.9999999, y: 1.0000001, z: 0.9999999} - - t: {x: -0.000000010323419, y: 0.000058822483, z: -0.000000034016526} - q: {x: 0.00000083632744, y: 0.00000014901158, z: 0.000000044703473, w: 1} - s: {x: 1.0000008, y: 1.0000006, z: 0.99999946} - - t: {x: -0.02950471, y: 0.057409532, z: -0.027499085} - q: {x: 0.029741673, y: 0.10562913, z: 0.2273467, w: 0.9676112} - s: {x: 0.9999998, y: 1, z: 0.99999994} - - t: {x: -0.00000010430813, y: 0.000049087404, z: 0.00005890882} - q: {x: -0.00000049173815, y: 0.000000111758666, z: -0.000000050524232, w: 1} - s: {x: 1.0000008, y: 1.0000006, z: 0.9999998} - - t: {x: -0.1122042, y: 0.03667182, z: 0.08122143} - q: {x: 0.7770956, y: 0.00000008287696, z: -0.62938255, w: 0.00000008730825} - s: {x: 0.9999998, y: 0.99999994, z: 0.99999994} - - t: {x: -0.000029446084, y: 0.000000001299492, z: -0.00010786233} - q: {x: 0.0000002508521, y: -0.000000029802322, z: 0.00000003496133, w: 1} - s: {x: 1.0000001, y: 1, z: 1.0000001} - - t: {x: -0.030948685, y: -0.037739087, z: 0.1084911} - q: {x: -0.65911824, y: -0.23915756, z: 0.6702265, w: 0.24323519} - s: {x: 1.0000004, y: 1.0000001, z: 1.0000001} - - t: {x: -0.00027455122, y: -0.000000013038516, z: 0.016000055} - q: {x: 0.000000089406946, y: -0.00000013783571, z: 0.000000014901158, w: 1} - s: {x: 1.0000004, y: 1.0000007, z: 1.0000005} - - t: {x: -0.10751021, y: -0.019023033, z: 0.083702855} - q: {x: 0.77709675, y: -0.00000014916701, z: -0.6293812, w: 0.00000028182342} - s: {x: 1.0000001, y: 0.99999994, z: 0.9999998} - - t: {x: -0.000029469638, y: -0.000000001343547, z: -0.000048831236} - q: {x: -0.00000006366759, y: 0.00000005960466, z: 0.000000032427817, w: -1} - s: {x: 0.99999994, y: 0.9999997, z: 1.0000002} - - t: {x: -0.035558783, y: 0.000000002684608, z: 0.000000070780516} - q: {x: 0.00000041689458, y: 0.000000029802319, z: -0.00000014157611, w: 1} - s: {x: 1.0000002, y: 0.9402967, z: 0.91037256} - - t: {x: -0.043685723, y: 0.06515683, z: 0.115223125} - q: {x: -0.12444717, y: 0.7023361, z: -0.116329774, w: 0.69116163} - s: {x: 1.0062851, y: 1.006285, z: 1.0062854} - - t: {x: -0.058503173, y: 0.000000007450581, z: -0.00000013026875} - q: {x: -0.025524477, y: -0.0444962, z: -0.0058081434, w: 0.9986666} - s: {x: 1.0000006, y: 1.0000004, z: 1.0000006} - - t: {x: -0.18975337, y: 0.05661986, z: 0.0033298077} - q: {x: 0.039255124, y: 0.03201982, z: 0.8036261, w: -0.59297466} - s: {x: 1.000001, y: 1.000001, z: 1.0000001} - - t: {x: -0.034978125, y: -0.037129283, z: -0.03650741} - q: {x: 0.6946836, y: 0.069688484, z: -0.14096293, w: -0.7019172} - s: {x: 1.0106096, y: 1.0106097, z: 1.0106091} - - t: {x: -0.16176583, y: -0.00006621634, z: 0.000022994354} - q: {x: 0.023624524, y: 0.0479611, z: 0.1251226, w: 0.99069977} - s: {x: 1.0629773, y: 1.0629772, z: 1.0629762} - - t: {x: -0.069490775, y: 0.00000030826777, z: -0.00000016763806} - q: {x: -0.23796001, y: 0.000000055879347, z: -0.0000003056775, w: 0.971275} - s: {x: 1, y: 0.97192365, z: 0.9719234} - - t: {x: -0.2779641, y: -0.000000018626451, z: 0.00000000372529} - q: {x: -0.04411956, y: 0.041526236, z: 0.033263754, w: 0.9976084} - s: {x: 1.0078583, y: 1.0078588, z: 1.0078588} - - t: {x: -0.035068974, y: -0.00000021187589, z: -0.00000010803342} - q: {x: -0.00000018626449, y: 0.00000002235174, z: -0.000000061932944, w: 1} - s: {x: 1.0000005, y: 1.0012747, z: 1.0012745} - - t: {x: -0.14027604, y: -0.00000036379788, z: -0.000000063329935} - q: {x: -0.0000003613531, y: 0.000000029802319, z: -0.000000020954756, w: 1} - s: {x: 0.9999999, y: 1.0000002, z: 0.9999999} - - t: {x: -0.03506889, y: -0.00000013626413, z: -0.000000020489097} - q: {x: 0.00000009313224, y: 0.000000007450594, z: -0.00000003306194, w: 1} - s: {x: 1.0000006, y: 1.0006868, z: 1.0006864} - - t: {x: -0.28055203, y: -0.00000019872095, z: 0.000000020489097} - q: {x: 0.72038645, y: 0.0045559406, z: -0.016480954, w: 0.6933622} - s: {x: 0.9291198, y: 0.92912, z: 0.9291198} - - t: {x: -0.09688466, y: 0.012628757, z: 0.004193769} - q: {x: 0.079227865, y: -0.047999866, z: -0.015272714, w: 0.9955832} - s: {x: 1.0000007, y: 1.0000004, z: 1.0000006} - - t: {x: -0.05342067, y: -0.000000022351742, z: 0.000000056810677} - q: {x: -0.0093751, y: -0.036781717, z: 0.0147884125, w: 0.9991699} - s: {x: 0.9999998, y: 0.99999994, z: 0.99999917} - - t: {x: -0.042907912, y: 0.000000018626451, z: -0.00000012479722} - q: {x: -0.017374245, y: -0.04760415, z: -0.017481765, w: 0.9985622} - s: {x: 0.9999998, y: 0.99999946, z: 1.0000002} - - t: {x: -0.038593143, y: 0.041314624, z: -0.013678891} - q: {x: -0.46069258, y: 0.16832037, z: -0.39540824, w: 0.7765842} - s: {x: 1.0000013, y: 1.000001, z: 1.0000002} - - t: {x: -0.03329902, y: 0.000000015366822, z: -0.00000004284084} - q: {x: 0.04481694, y: -0.020407852, z: 0.021573808, w: 0.99855375} - s: {x: 1.0000005, y: 1.000001, z: 1.0000001} - - t: {x: -0.038922727, y: -0.000000038882717, z: 0.000000003026798} - q: {x: -0.0256544, y: -0.031652726, z: 0.02530853, w: 0.9988491} - s: {x: 1.0000006, y: 1, z: 1.0000005} - - t: {x: -0.09379445, y: 0.0395091, z: 0.0025051245} - q: {x: 0.036175013, y: -0.024784617, z: -0.03544047, w: 0.99840933} - s: {x: 1.0000007, y: 1.0000006, z: 1.0000005} - - t: {x: -0.060065866, y: -0.000000011175871, z: -0.000000070314854} - q: {x: -0.0015665218, y: -0.039195575, z: -0.0035614849, w: 0.99922407} - s: {x: 1.0000012, y: 1.0000005, z: 1.0000007} - - t: {x: -0.03607316, y: -0.000000007450581, z: -0.000000004190952} - q: {x: 0.0020313761, y: -0.072688654, z: 0.0070823417, w: 0.9973275} - s: {x: 1.0000002, y: 1, z: 0.9999997} - - t: {x: -0.09333068, y: -0.014842848, z: 0.001449341} - q: {x: 0.1464563, y: -0.04240491, z: -0.009140864, w: 0.9882656} - s: {x: 0.9999995, y: 1, z: 0.9999999} - - t: {x: -0.042821966, y: -0.000000014901161, z: -0.000000044703484} - q: {x: -0.0051184003, y: -0.039652158, z: -0.0020092607, w: 0.99919844} - s: {x: 1.000001, y: 1.0000007, z: 1.000001} - - t: {x: -0.035355955, y: 0, z: 0.00000014714897} - q: {x: -0.0078114183, y: -0.07866921, z: 0.0011297686, w: 0.99686956} - s: {x: 1.0000006, y: 0.9999998, z: 1.0000007} - - t: {x: -0.086030155, y: -0.035094876, z: -0.008257229} - q: {x: 0.21294314, y: -0.021714322, z: 0.004175842, w: 0.9768144} - s: {x: 1.0000004, y: 1.0000007, z: 1.0000006} - - t: {x: -0.040974, y: -0.000000044703484, z: 0.000000055879354} - q: {x: -0.0150128715, y: -0.037432693, z: 0.004991034, w: 0.999174} - s: {x: 1.0000007, y: 1.0000004, z: 1.000001} - - t: {x: -0.02452468, y: 0.000000037252903, z: -0.00000009685755} - q: {x: 0.031532526, y: -0.047115006, z: -0.003371842, w: 0.99838597} - s: {x: 1.0000005, y: 1.0000006, z: 0.99999976} - - t: {x: -0.040425763, y: 0.00000008009374, z: -0.000000029802322} - q: {x: -0.14658868, y: 0.000000067055225, z: 0.000000004656613, w: 0.98919755} - s: {x: 1.0000012, y: 1.0056945, z: 1.0056937} - - t: {x: -0.043685734, y: -0.06515668, z: 0.11522319} - q: {x: 0.12444672, y: 0.7023361, z: 0.116329275, w: 0.69116175} - s: {x: 1.0062852, y: 1.0062851, z: 1.0062855} - - t: {x: -0.05850321, y: 0.000000001862645, z: -0.000000018218998} - q: {x: 0.025524419, y: -0.044496294, z: 0.005808189, w: 0.9986665} - s: {x: 1.0000002, y: 1.0000004, z: 1.0000005} - - t: {x: -0.041975934, y: 0.000000003169064, z: -0.000000011823658} - q: {x: 5.6843412e-14, y: 0.0000000074505797, z: 0.000000014901156, w: 1} - s: {x: 1.0000005, y: 0.9010593, z: 0.70123535} - - t: {x: -0.18975337, y: -0.05661983, z: 0.0033298738} - q: {x: 0.039254665, y: -0.03201927, z: 0.80362606, w: 0.5929747} - s: {x: 0.99999976, y: 1, z: 1} - - t: {x: -0.04042585, y: -0.00000015398837, z: -0.000000022351742} - q: {x: 0.14658885, y: 0.000000055879347, z: -0.000000021420417, w: 0.9891975} - s: {x: 1, y: 1.0056936, z: 1.0056933} - - t: {x: -0.034978047, y: 0.037129175, z: -0.036507383} - q: {x: 0.69468355, y: -0.06968856, z: -0.14096293, w: 0.7019173} - s: {x: 1.0106091, y: 1.0106091, z: 1.0106089} - - t: {x: -0.16176572, y: 0.000066091015, z: 0.00002300553} - q: {x: -0.023624752, y: 0.047960315, z: -0.12512293, w: 0.99069977} - s: {x: 1.0629758, y: 1.0629759, z: 1.0629758} - - t: {x: -0.2779642, y: -0.000000110827386, z: -0.000000018626451} - q: {x: 0.044119455, y: 0.041526616, z: -0.03326411, w: 0.9976085} - s: {x: 1.0078585, y: 1.0078588, z: 1.0078591} - - t: {x: -0.280552, y: 0.000000037020072, z: 0} - q: {x: -0.72038645, y: 0.0045559183, z: 0.016481187, w: 0.6933622} - s: {x: 0.92912, y: 0.929121, z: 0.9291208} - - t: {x: -0.09379414, y: -0.039508693, z: 0.0025047294} - q: {x: -0.03617471, y: -0.024784591, z: 0.035439868, w: 0.99840933} - s: {x: 0.9999998, y: 1.0000004, z: 1.0000001} - - t: {x: -0.06006597, y: 0.000000040978193, z: -0.00000014388934} - q: {x: 0.0015665467, y: -0.039191827, z: 0.0035599873, w: 0.9992242} - s: {x: 1.0000001, y: 1.0000001, z: 0.99999994} - - t: {x: -0.036073178, y: 0, z: -0.00000004284084} - q: {x: -0.0020310907, y: -0.07268848, z: -0.007082337, w: 0.9973275} - s: {x: 0.9999999, y: 1.0000005, z: 1.0000007} - - t: {x: -0.086029895, y: 0.035095196, z: -0.008257618} - q: {x: 0.21294335, y: 0.021714617, z: 0.0041771624, w: -0.97681427} - s: {x: 0.99999994, y: 1.0000002, z: 0.9999997} - - t: {x: -0.040973976, y: -0.000000014901161, z: -0.000000018626451} - q: {x: 0.015013302, y: -0.037438624, z: -0.004989681, w: 0.99917376} - s: {x: 0.9999995, y: 0.9999996, z: 0.99999976} - - t: {x: -0.02452459, y: -0.000000007450581, z: -0.00000000372529} - q: {x: -0.03153322, y: -0.047115102, z: 0.0033719717, w: 0.99838597} - s: {x: 1, y: 1.0000001, z: 1.0000002} - - t: {x: -0.09333042, y: 0.014843221, z: 0.0014490108} - q: {x: -0.14645581, y: -0.042405065, z: 0.009140923, w: 0.98826563} - s: {x: 1.0000001, y: 1.0000004, z: 1.0000008} - - t: {x: -0.042821992, y: 0.000000029802322, z: 0.000000063329935} - q: {x: -0.005118502, y: 0.03964813, z: -0.0020089615, w: -0.9991986} - s: {x: 0.99999976, y: 0.9999994, z: 0.9999997} - - t: {x: -0.03535577, y: 0, z: 0.00000004656613} - q: {x: 0.0078114327, y: -0.07867044, z: -0.0011303273, w: 0.9968695} - s: {x: 1.0000001, y: 1.0000005, z: 1.0000007} - - t: {x: -0.09688435, y: -0.012628396, z: 0.004193525} - q: {x: -0.07922754, y: -0.04800106, z: 0.0152710425, w: 0.9955832} - s: {x: 1.0000001, y: 1.0000004, z: 1.0000004} - - t: {x: -0.053420693, y: 0.000000014901161, z: 0.00000010617077} - q: {x: 0.009375039, y: -0.03678105, z: -0.0147887, w: 0.99916995} - s: {x: 0.9999999, y: 0.99999994, z: 1.0000002} - - t: {x: -0.042907897, y: 0.000000007450581, z: 0.000000038184226} - q: {x: 0.017373888, y: -0.04760424, z: 0.017481951, w: 0.9985622} - s: {x: 0.99999964, y: 0.99999946, z: 1.0000001} - - t: {x: -0.038593136, y: -0.041314337, z: -0.013679172} - q: {x: 0.46069485, y: 0.16831599, z: 0.39540786, w: 0.77658397} - s: {x: 1, y: 0.99999964, z: 1} - - t: {x: -0.033299044, y: 0.000000069325324, z: 0} - q: {x: -0.04481925, y: -0.02040754, z: -0.021573417, w: 0.9985537} - s: {x: 1.0000001, y: 1.0000004, z: 0.99999934} - - t: {x: -0.038922455, y: 0.00000007642666, z: -0.00000006053597} - q: {x: 0.025656313, y: -0.031653535, z: -0.025309926, w: 0.998849} - s: {x: 1.0000005, y: 0.9999999, z: 0.99999994} - - t: {x: -0.1402761, y: -0.00000006449409, z: -0.000000074505806} - q: {x: 0.0000004209578, y: 0.000000007450581, z: 4.656613e-10, w: 1} - s: {x: 1.0000002, y: 0.99999976, z: 0.99999994} - - t: {x: -0.035069004, y: 0.00000009563519, z: -0.000000029802322} - q: {x: -0.000000040978247, y: -0.000000007450599, z: -0.000000045169134, - w: 1} - s: {x: 0.9999999, y: 1.0006864, z: 1.0006862} - - t: {x: -0.03506903, y: -0.000000095926225, z: -0.00000011920929} - q: {x: 0.00000028312203, y: -0, z: -0.00000002235174, w: 1} - s: {x: 1.0000001, y: 1.0012742, z: 1.0012745} - - t: {x: -0.06949084, y: -0.0000004498288, z: -0.00000018626451} - q: {x: 0.23795915, y: 0.00000005960463, z: 0.00000006231129, w: 0.9712752} - s: {x: 1, y: 0.97192377, z: 0.9719234} - - t: {x: -0.037511554, y: 0.000000002876673, z: -0.00009686686} - q: {x: -0.00000006253777, y: 0, z: -0.000000023019917, w: 1} - s: {x: 1.0000008, y: 0.90141255, z: 0.80094117} - - t: {x: 0.017579908, y: -0.101263635, z: 0.0031655827} - q: {x: -0.055877987, y: -0.07036913, z: 0.9958572, w: -0.0139422715} - s: {x: 1.0000013, y: 1.0000013, z: 1} - - t: {x: -0.4319558, y: 0.000000028871, z: 9.31323e-10} - q: {x: -0.043848146, y: -0.040393874, z: -0.02174867, w: 0.99798435} - s: {x: 1.0000001, y: 1.0000004, z: 0.99999976} - - t: {x: -0.11892719, y: 0.000000031199306, z: 0.000000044703484} - q: {x: 0.000000026077032, y: -0.000000026077032, z: -0.0000000041909516, - w: 1} - s: {x: 1.0000001, y: 1.0386349, z: 1.0190157} - - t: {x: -0.47571138, y: 0.00000003259629, z: 0.000000002328306} - q: {x: 0.837541, y: 0.036573015, z: -0.5291056, w: -0.13128173} - s: {x: 0.858255, y: 0.858255, z: 0.858255} - - t: {x: -0.18387146, y: 0.000000025844201, z: 0.000000009313226} - q: {x: -0.062467325, y: -0.2067471, z: -0.02363323, w: 0.9761122} - s: {x: 1.0000007, y: 1, z: 1.0000004} - - t: {x: -0.107989594, y: -0.000000041211024, z: -0.00000011920929} - q: {x: -0.033350065, y: 0.000000022351742, z: -0.0000000013969839, w: 0.99944377} - s: {x: 1.0000002, y: 0.90615153, z: 0.9061514} - - t: {x: -0.00000004861795, y: -0.000000020489097, z: -0.00000009126961} - q: {x: -0.08551703, y: 0.88385785, z: 0.037582923, w: -0.45833367} - s: {x: 0.52756983, y: 0.52756953, z: 0.5275701} - - t: {x: 0.01758384, y: 0.10126295, z: 0.0031659142} - q: {x: 0.055798277, y: -0.07043252, z: -0.9958723, w: -0.01281313} - s: {x: 1.0000005, y: 1.0000007, z: 0.99999994} - - t: {x: -0.000000059058948, y: 0.000000002328306, z: -0.000000055879354} - q: {x: 0.08551739, y: 0.883858, z: -0.03758245, w: -0.45833328} - s: {x: 0.5275694, y: 0.52756906, z: 0.52756906} - - t: {x: -0.4319558, y: 0.000000024680048, z: 9.31323e-10} - q: {x: 0.043845, y: -0.04039296, z: 0.02175176, w: 0.9979844} - s: {x: 0.99999994, y: 1.0000001, z: 1.0000001} - - t: {x: -0.4757285, y: 0.0000005217734, z: 0.000002105953} - q: {x: 0.8375387, y: -0.036570527, z: -0.52910906, w: 0.13128255} - s: {x: 0.85825455, y: 0.85825485, z: 0.85825473} - - t: {x: -0.18387152, y: -0.000000008847564, z: 0} - q: {x: 0.062466748, y: -0.20674692, z: 0.023633018, w: 0.97611225} - s: {x: 1.0000006, y: 1.0000004, z: 1.0000005} - - t: {x: -0.11892757, y: 0.000000030267984, z: -0.000000029802322} - q: {x: 0.000000096857555, y: -0.0000000037252907, z: 0.000000011525118, - w: 1} - s: {x: 1.0000007, y: 1.0386355, z: 1.0190154} - - t: {x: -0.10798966, y: 0.000000048195943, z: -0.0000002104789} - q: {x: 0.03335002, y: -0.000000042840842, z: -0.000000021886082, w: 0.99944377} - s: {x: 0.99999976, y: 0.90615094, z: 0.90615165} - m_SkeletonNameIDArray: 000000006556c6b6b58ea9efa3865abf1106d1de5c2438c9e2b743a8fee646abcbc10e534efa398f6d792380a259c1079c135d80be7c19d9020e95813180a6c7ad298fce60f43ed4ae76c128e17084e152dcc6372013358305cec54808e5b88e1611a573f5b8379eb61536b3ab3a6db9602026d79cc215bd462c9f1fbeef15bfa0b72e6f6c6367d27367f7c59209c6e6977fc1eadb06ca5d61ee6d00b401afd1fff3a5016a8988dc1ffb86ece35181f3ab186b3b7ca7e61ce741601430ddeb1110382a25c371a51be88ba775873e583146011b7a7b5a9c3396a4528e30322835cac712d4b1fff942f48c2ddfbb824f4a12cbfe49e6af4653fbec40ae18e6da5d026ae18348c6555f0d53738bfdd6681bc7311aa3d3609938efeb38e23200406bbcdd3329defee5366030d85282b4394c38e530d59b8f9660b03f44d86e0cae6bf7429752fce51165d7237268d1e555660c4470c596e7ea7ebc81c9fa410eb55f801dd4c13365c1cfe54706f60158fdb927f7b36b5df757e7aaa15772a084c0b89ab39f52e6c72e2d304df97552ec6f9ee8bd66077e8d61708eb304bb34e20d22a2d20a55ebd4b8035185b19ac7b5b6ed378bd3268ddadabf1beaddc8d924663463756fadf54568dafdd5d7743df08f158e889a1b5d43331ca860462db7bd38ae0b254bb1da0a83eb803ab9896cf375b60d936b95b7c2620c21f2657b3f63b5a28532bc3b1302bb4cd1cc00b06b9d0929fdad0e5eb4abbc080efab59198cab2e668f4d72dd2a5deb44495d9c346279be7ce31a320cb1e1037578ae1efed43d06df083611701f40d067c0aa0cc70889858e19450b9e37d8835e8ead57991127f75c2713b82fc093d862c36149bcb0fbe42767716c45e90d3e1 - m_Human: - data: - serializedVersion: 2 - m_RootX: - t: {x: 0.002519836, y: 1.0098633, z: -0.03425087} - q: {x: -0.04914983, y: 0.00000032846245, z: -0.0000006579365, w: 0.9987914} - s: {x: 1, y: 1, z: 1} - m_Skeleton: - data: - m_Node: - - m_ParentId: -1 - m_AxesId: -1 - - m_ParentId: 0 - m_AxesId: 0 - - m_ParentId: 1 - m_AxesId: 1 - - m_ParentId: 2 - m_AxesId: 2 - - m_ParentId: 3 - m_AxesId: 3 - - m_ParentId: 4 - m_AxesId: 4 - - m_ParentId: 5 - m_AxesId: 5 - - m_ParentId: 6 - m_AxesId: 6 - - m_ParentId: 6 - m_AxesId: 7 - - m_ParentId: 6 - m_AxesId: -1 - - m_ParentId: 9 - m_AxesId: -1 - - m_ParentId: 10 - m_AxesId: 8 - - m_ParentId: 4 - m_AxesId: 9 - - m_ParentId: 12 - m_AxesId: 10 - - m_ParentId: 13 - m_AxesId: 11 - - m_ParentId: 14 - m_AxesId: 12 - - m_ParentId: 15 - m_AxesId: 13 - - m_ParentId: 16 - m_AxesId: 14 - - m_ParentId: 17 - m_AxesId: 15 - - m_ParentId: 15 - m_AxesId: 16 - - m_ParentId: 19 - m_AxesId: 17 - - m_ParentId: 20 - m_AxesId: 18 - - m_ParentId: 15 - m_AxesId: 19 - - m_ParentId: 22 - m_AxesId: 20 - - m_ParentId: 23 - m_AxesId: 21 - - m_ParentId: 15 - m_AxesId: 22 - - m_ParentId: 25 - m_AxesId: 23 - - m_ParentId: 26 - m_AxesId: 24 - - m_ParentId: 15 - m_AxesId: 25 - - m_ParentId: 28 - m_AxesId: 26 - - m_ParentId: 29 - m_AxesId: 27 - - m_ParentId: 4 - m_AxesId: 28 - - m_ParentId: 31 - m_AxesId: 29 - - m_ParentId: 32 - m_AxesId: 30 - - m_ParentId: 33 - m_AxesId: 31 - - m_ParentId: 34 - m_AxesId: 32 - - m_ParentId: 35 - m_AxesId: 33 - - m_ParentId: 36 - m_AxesId: 34 - - m_ParentId: 34 - m_AxesId: 35 - - m_ParentId: 38 - m_AxesId: 36 - - m_ParentId: 39 - m_AxesId: 37 - - m_ParentId: 34 - m_AxesId: 38 - - m_ParentId: 41 - m_AxesId: 39 - - m_ParentId: 42 - m_AxesId: 40 - - m_ParentId: 34 - m_AxesId: 41 - - m_ParentId: 44 - m_AxesId: 42 - - m_ParentId: 45 - m_AxesId: 43 - - m_ParentId: 34 - m_AxesId: 44 - - m_ParentId: 47 - m_AxesId: 45 - - m_ParentId: 48 - m_AxesId: 46 - - m_ParentId: 1 - m_AxesId: 47 - - m_ParentId: 50 - m_AxesId: 48 - - m_ParentId: 51 - m_AxesId: 49 - - m_ParentId: 52 - m_AxesId: 50 - - m_ParentId: 1 - m_AxesId: 51 - - m_ParentId: 54 - m_AxesId: 52 - - m_ParentId: 55 - m_AxesId: 53 - - m_ParentId: 56 - m_AxesId: 54 - m_ID: 225d62603749eed6e82dbad4de611de980343191210288a75f67fefbec0727633609d60bf6ef68bfdc480717139d4a012a889f604feea533de044faa22db7ec1c07bd5e371287ff05d430f891c24bec60b1bcfbe0c2f7b1c7943027e60ecf8a3f443857ea51c695b1adf48eda52ff1eb4bb3dc49a7c610caad9af34ce22121bd357003bf22ae0cfdf14a7a15fd128eef06cbe572eaa3c42ccfe250d84cc018ad4a71b171214de5ca8ac6b3e72a3f6245442a5972c8c42ade0a05d3569875325744c97c4bca99753f448ae30aca8cc4857529a9d92436766f0de76eb9633148c6a20aee76505f7ab5 - m_AxesArray: - - m_PreQ: {x: 0.47160745, y: 0.5268647, z: -0.47160745, w: -0.52686477} - m_PostQ: {x: -0.000000078231096, y: -0.70710653, z: 0.70710707, w: 0.000000070780516} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: -0.6981317, y: -0.6981317, z: -0.6981317} - m_Max: {x: 0.6981317, y: 0.6981317, z: 0.6981317} - m_Length: 0.049083997 - m_Type: 1 - - m_PreQ: {x: -0.05623372, y: -0.70486706, z: 0.7048674, w: -0.05623359} - m_PostQ: {x: -0.00023009998, y: -0.70710653, z: 0.707107, w: -0.00022988764} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: -0.6981317, y: -0.6981317, z: -0.6981317} - m_Max: {x: 0.6981317, y: 0.6981317, z: 0.6981317} - m_Length: 0.17079408 - m_Type: 1 - - m_PreQ: {x: -0.061441965, y: -0.7044321, z: 0.70443255, w: -0.061441544} - m_PostQ: {x: -0.000041030336, y: -0.70710695, z: 0.7071066, w: -0.000040713687} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: -0.6981317, y: -0.6981317, z: -0.6981317} - m_Max: {x: 0.6981317, y: 0.6981317, z: 0.6981317} - m_Length: 0.16281639 - m_Type: 1 - - m_PreQ: {x: 0.07828752, y: -0.7027597, z: 0.70275944, w: 0.0782877} - m_PostQ: {x: -0.00000014528632, y: -0.7071066, z: 0.707107, w: 0.00000014528607} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: -0.34906584, y: -0.34906584, z: -0.34906584} - m_Max: {x: 0.34906584, y: 0.34906584, z: 0.34906584} - m_Length: 0.17463768 - m_Type: 1 - - m_PreQ: {x: -0.04996282, y: 0.7053392, z: -0.7053396, w: -0.049963005} - m_PostQ: {x: 0.000000251457, y: 0.7071069, z: -0.7071067, w: -0.00000023283056} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: -0.6981317, y: -0.6981317, z: -0.6981317} - m_Max: {x: 0.6981317, y: 0.6981317, z: 0.6981317} - m_Length: 0.09060275 - m_Type: 1 - - m_PreQ: {x: 0.049962707, y: 0.7053395, z: -0.70533943, w: 0.049962353} - m_PostQ: {x: -0.008866685, y: 0.70705116, z: -0.7070513, w: -0.008866944} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: -0.6981317, y: -0.6981317, z: -0.6981317} - m_Max: {x: 0.6981317, y: 0.6981317, z: 0.6981317} - m_Length: 0.09060275 - m_Type: 1 - - m_PreQ: {x: -0.5062306, y: -0.49369085, z: -0.49369097, w: 0.50623035} - m_PostQ: {x: -0.014236744, y: -0.7069672, z: 0.7069598, w: -0.0142358495} - m_Sgn: {x: 1, y: -1, z: -1} - m_Limit: - m_Min: {x: 0, y: -0.34906584, z: -0.17453292} - m_Max: {x: 0, y: 0.34906584, z: 0.2617994} - m_Length: 0.1 - m_Type: 1 - - m_PreQ: {x: -0.5062306, y: -0.49369085, z: -0.49369097, w: 0.50623035} - m_PostQ: {x: -0.014235402, y: -0.70695996, z: 0.706967, w: -0.014236773} - m_Sgn: {x: 1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: -0.34906584, z: -0.17453292} - m_Max: {x: 0, y: 0.34906584, z: 0.2617994} - m_Length: 0.1 - m_Type: 1 - - m_PreQ: {x: 0.011554824, y: 0.7070124, z: -0.70701253, w: 0.011554914} - m_PostQ: {x: -0.051866572, y: 0.7052022, z: -0.7052018, w: -0.051866483} - m_Sgn: {x: 1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: -0.17453292, z: -0.17453292} - m_Max: {x: 0, y: 0.17453292, z: 0.17453292} - m_Length: 0.1 - m_Type: 1 - - m_PreQ: {x: 0.030003373, y: -0.040655833, z: -0.59304357, w: -0.8035833} - m_PostQ: {x: 0.00007058678, y: 0.002446978, z: 0.999997, w: -0.00020474986} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: -0.2617994, z: -0.2617994} - m_Max: {x: 0, y: 0.2617994, z: 0.5235988} - m_Length: 0.14333263 - m_Type: 1 - - m_PreQ: {x: 0.28292423, y: 0.056166943, z: 0.93374383, w: 0.21194752} - m_PostQ: {x: 0.0000000013969835, y: 0.019221447, z: 0.9998153, w: 0.000000023719616} - m_Sgn: {x: -1, y: 1, z: 1} - m_Limit: - m_Min: {x: -1.5707964, y: -1.7453293, z: -1.0471976} - m_Max: {x: 1.5707964, y: 1.7453293, z: 1.7453293} - m_Length: 0.2618007 - m_Type: 1 - - m_PreQ: {x: -0.485101, y: 0.50554043, z: -0.5380007, w: -0.4686804} - m_PostQ: {x: -0.00000022538, y: 0.7243218, z: -0.6894621, w: 0.00000018096758} - m_Sgn: {x: -1, y: 1, z: 1} - m_Limit: - m_Min: {x: -1.5707964, y: 0, z: -1.3962634} - m_Max: {x: 1.5707964, y: 0, z: 1.3962634} - m_Length: 0.26631463 - m_Type: 1 - - m_PreQ: {x: 0.000000037252896, y: -0.023921069, z: 0.9997139, w: -0.00000028894277} - m_PostQ: {x: -0.0041601607, y: 0.7035943, z: 0.7103961, w: -0.016585393} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: -0.6981317, z: -1.3962634} - m_Max: {x: 0, y: 0.6981317, z: 1.3962634} - m_Length: 0.06657866 - m_Type: 1 - - m_PreQ: {x: 0.19251627, y: -0.63482475, z: -0.69649786, w: -0.273543} - m_PostQ: {x: -0.00000028032798, y: 0.75358814, z: 0.65734696, w: -0.00000026077024} - m_Sgn: {x: 1, y: -1, z: 1} - m_Limit: - m_Min: {x: 0, y: -0.1308997, z: -0.87266463} - m_Max: {x: 0, y: 0.1308997, z: 0.87266463} - m_Length: 0.047115486 - m_Type: 1 - - m_PreQ: {x: 0.26772562, y: -0.67635715, z: -0.64968896, w: -0.22083548} - m_PostQ: {x: -0.00000057183183, y: 0.7440745, z: 0.66809666, w: 0.0000009462234} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.037843503 - m_Type: 1 - - m_PreQ: {x: 0.23153417, y: -0.6817867, z: -0.6620723, w: -0.20789246} - m_PostQ: {x: 0.018795885, y: 0.73139703, z: 0.68006384, w: -0.04709958} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.021286972 - m_Type: 1 - - m_PreQ: {x: 0.14924243, y: 0.039504685, z: -0.83021307, w: -0.5356421} - m_PostQ: {x: -0.0000010132786, y: -0.49292535, z: 0.8700717, w: 0.000000014901156} - m_Sgn: {x: 1, y: -1, z: -1} - m_Limit: - m_Min: {x: 0, y: -0.43633232, z: -0.34906584} - m_Max: {x: 0, y: 0.43633232, z: 0.34906584} - m_Length: 0.029368743 - m_Type: 1 - - m_PreQ: {x: 0.1043041, y: 0.50056505, z: -0.83637154, w: 0.19758019} - m_PostQ: {x: -0.00000029802308, y: -0.4561007, z: 0.88992816, w: -0.0000002905725} - m_Sgn: {x: 1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.6981317} - m_Max: {x: 0, y: 0, z: 0.61086524} - m_Length: 0.034328707 - m_Type: 1 - - m_PreQ: {x: 0.08902884, y: 0.46413955, z: -0.86398685, w: 0.17370984} - m_PostQ: {x: 0.016625158, y: -0.47840643, z: 0.8772029, w: 0.036959287} - m_Sgn: {x: 1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.6981317} - m_Max: {x: 0, y: 0, z: 0.61086524} - m_Length: 0.019309897 - m_Type: 1 - - m_PreQ: {x: 0.13722655, y: -0.634842, z: -0.7004492, w: -0.2958306} - m_PostQ: {x: -0.0000002831219, y: 0.726124, z: 0.6875638, w: 0.00000007450576} - m_Sgn: {x: 1, y: -1, z: 1} - m_Limit: - m_Min: {x: 0, y: -0.34906584, z: -0.87266463} - m_Max: {x: 0, y: 0.34906584, z: 0.87266463} - m_Length: 0.052976307 - m_Type: 1 - - m_PreQ: {x: 0.24713351, y: -0.63679993, z: -0.68946934, w: -0.2409211} - m_PostQ: {x: 0.00000035949034, y: 0.7201366, z: 0.69383234, w: -0.00000063329907} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.031815503 - m_Type: 1 - - m_PreQ: {x: 0.22180818, y: -0.6437886, z: -0.70047647, w: -0.21370606} - m_PostQ: {x: 0.055534367, y: 0.71962136, z: 0.69051516, w: -0.047432415} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.01789622 - m_Type: 1 - - m_PreQ: {x: 0.24508809, y: -0.63623774, z: -0.69980705, w: -0.21308121} - m_PostQ: {x: -0.00000041164444, y: 0.7968792, z: 0.6041387, w: 0.00000019744031} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: -0.1308997, z: -0.87266463} - m_Max: {x: 0, y: 0.1308997, z: 0.87266463} - m_Length: 0.037767656 - m_Type: 1 - - m_PreQ: {x: 0.26859838, y: -0.7162778, z: -0.6060208, w: -0.21803677} - m_PostQ: {x: 0.0000014025713, y: 0.790425, z: 0.6125588, w: -0.0000017322594} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.031182857 - m_Type: 1 - - m_PreQ: {x: 0.24467617, y: -0.7207077, z: -0.62028986, w: -0.18961719} - m_PostQ: {x: 0.049083907, y: 0.7831656, z: 0.61681545, w: -0.06149179} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.017540356 - m_Type: 1 - - m_PreQ: {x: 0.26922417, y: -0.64332235, z: -0.69769317, w: -0.16394901} - m_PostQ: {x: 0.0000005736945, y: 0.83720934, z: 0.54688257, w: -0.0000013336535} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: -0.34906584, z: -0.87266463} - m_Max: {x: 0, y: 0.34906584, z: 0.87266463} - m_Length: 0.036137797 - m_Type: 1 - - m_PreQ: {x: 0.28450125, y: -0.7633806, z: -0.54550964, w: -0.19679624} - m_PostQ: {x: -0.00000008102503, y: 0.8265752, z: 0.5628263, w: 0.0000018402925} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.021630034 - m_Type: 1 - - m_PreQ: {x: 0.25708178, y: -0.7633468, z: -0.5661869, w: -0.17505208} - m_PostQ: {x: 0.023730338, y: 0.84298855, z: 0.53585386, w: -0.040840022} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.012166894 - m_Type: 1 - - m_PreQ: {x: 0.030002778, y: 0.04065538, z: -0.5930434, w: 0.8035836} - m_PostQ: {x: -0.000070599825, y: 0.0024470415, z: -0.999997, w: -0.00020431414} - m_Sgn: {x: 1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: -0.2617994, z: -0.2617994} - m_Max: {x: 0, y: 0.2617994, z: 0.5235988} - m_Length: 0.14333223 - m_Type: 1 - - m_PreQ: {x: -0.2829235, y: 0.056167074, z: -0.93374413, w: 0.21194737} - m_PostQ: {x: 0.000000026746411, y: 0.019221593, z: -0.9998152, w: 0.00000020911942} - m_Sgn: {x: 1, y: 1, z: -1} - m_Limit: - m_Min: {x: -1.5707964, y: -1.7453293, z: -1.0471976} - m_Max: {x: 1.5707964, y: 1.7453293, z: 1.7453293} - m_Length: 0.26179993 - m_Type: 1 - - m_PreQ: {x: -0.48510122, y: -0.5055406, z: -0.5380001, w: 0.4686806} - m_PostQ: {x: -0.00000006819024, y: -0.7243216, z: -0.68946224, w: -0.000000018626443} - m_Sgn: {x: 1, y: 1, z: -1} - m_Limit: - m_Min: {x: -1.5707964, y: 0, z: -1.3962634} - m_Max: {x: 1.5707964, y: 0, z: 1.3962634} - m_Length: 0.2663138 - m_Type: 1 - - m_PreQ: {x: -0.000000034022367, y: -0.023920862, z: -0.9997139, w: -0.000000058724233} - m_PostQ: {x: 0.004160304, y: 0.70359445, z: -0.71039593, w: -0.016585467} - m_Sgn: {x: 1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: -0.6981317, z: -1.3962634} - m_Max: {x: 0, y: 0.6981317, z: 1.3962634} - m_Length: 0.06657845 - m_Type: 1 - - m_PreQ: {x: 0.13722745, y: 0.6348422, z: -0.7004488, w: 0.29583055} - m_PostQ: {x: 0.0000007729973, y: 0.7261239, z: -0.68756396, w: 0.00000042872827} - m_Sgn: {x: -1, y: -1, z: -1} - m_Limit: - m_Min: {x: 0, y: -0.34906584, z: -0.87266463} - m_Max: {x: 0, y: 0.34906584, z: 0.87266463} - m_Length: 0.052976172 - m_Type: 1 - - m_PreQ: {x: 0.24713248, y: 0.6368016, z: -0.689469, w: 0.2409184} - m_PostQ: {x: -0.00000004097817, y: 0.720137, z: -0.693832, w: 0.0000001330117} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.031815328 - m_Type: 1 - - m_PreQ: {x: 0.2218088, y: 0.6437898, z: -0.70047486, w: 0.21370673} - m_PostQ: {x: -0.055533893, y: 0.71962166, z: -0.69051504, w: -0.047431573} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.017896121 - m_Type: 1 - - m_PreQ: {x: 0.26922578, y: 0.6433219, z: -0.69769263, w: 0.16395041} - m_PostQ: {x: -0.00000024214376, y: -0.83720946, z: 0.54688233, w: -0.00000053043345} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: -0.34906584, z: -0.87266463} - m_Max: {x: 0, y: 0.34906584, z: 0.87266463} - m_Length: 0.036137678 - m_Type: 1 - - m_PreQ: {x: -0.28450266, y: -0.76337963, z: 0.54550874, w: -0.19679953} - m_PostQ: {x: 0.0000006668266, y: -0.8265751, z: 0.5628265, w: 0.00000019117206} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.021629872 - m_Type: 1 - - m_PreQ: {x: -0.25708088, y: -0.76334655, z: 0.5661883, w: -0.17505026} - m_PostQ: {x: 0.023731116, y: -0.8429886, z: 0.53585356, w: 0.040842175} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.012166804 - m_Type: 1 - - m_PreQ: {x: 0.24508773, y: 0.6362384, z: -0.69980687, w: 0.21308027} - m_PostQ: {x: -0.00000025331963, y: 0.7968792, z: -0.60413885, w: -0.0000008121329} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: -0.1308997, z: -0.87266463} - m_Max: {x: 0, y: 0.1308997, z: 0.87266463} - m_Length: 0.037767578 - m_Type: 1 - - m_PreQ: {x: 0.26859665, y: 0.7162788, z: -0.6060211, w: 0.21803465} - m_PostQ: {x: 0.0000009089704, y: -0.79042506, z: 0.6125588, w: 0.0000007507548} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.03118257 - m_Type: 1 - - m_PreQ: {x: -0.2446768, y: -0.720708, z: 0.620289, w: -0.18961813} - m_PostQ: {x: 0.049084593, y: -0.7831656, z: 0.61681545, w: 0.061491452} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.017540196 - m_Type: 1 - - m_PreQ: {x: 0.19251782, y: 0.6348253, z: -0.6964972, w: 0.27354255} - m_PostQ: {x: -0.0000002495943, y: 0.7535881, z: -0.6573469, w: -0.00000054459053} - m_Sgn: {x: -1, y: -1, z: -1} - m_Limit: - m_Min: {x: 0, y: -0.1308997, z: -0.87266463} - m_Max: {x: 0, y: 0.1308997, z: 0.87266463} - m_Length: 0.04711528 - m_Type: 1 - - m_PreQ: {x: 0.26772487, y: 0.6763588, z: -0.64968824, w: 0.22083388} - m_PostQ: {x: -0.0000001862644, y: 0.74407476, z: -0.6680964, w: -0.00000030343637} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.037843343 - m_Type: 1 - - m_PreQ: {x: 0.23153362, y: 0.6817884, z: -0.6620712, w: 0.20789133} - m_PostQ: {x: -0.01879652, y: 0.73139745, z: -0.68006325, w: -0.047101043} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.7853982} - m_Max: {x: 0, y: 0, z: 0.7853982} - m_Length: 0.021286879 - m_Type: 1 - - m_PreQ: {x: 0.14924508, y: -0.039503336, z: -0.8302139, w: 0.53564024} - m_PostQ: {x: -0.00000045448513, y: -0.4929259, z: -0.87007123, w: -0.00000035762764} - m_Sgn: {x: -1, y: -1, z: 1} - m_Limit: - m_Min: {x: 0, y: -0.43633232, z: -0.34906584} - m_Max: {x: 0, y: 0.43633232, z: 0.34906584} - m_Length: 0.029368645 - m_Type: 1 - - m_PreQ: {x: 0.10430426, y: -0.5005673, z: -0.83637035, w: -0.19757947} - m_PostQ: {x: 0.00000045448513, y: -0.45609966, z: -0.88992876, w: -0.00000029802305} - m_Sgn: {x: -1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.6981317} - m_Max: {x: 0, y: 0, z: 0.61086524} - m_Length: 0.0343283 - m_Type: 1 - - m_PreQ: {x: 0.089028694, y: -0.4641398, z: -0.86398685, w: -0.17370981} - m_PostQ: {x: -0.016625127, y: -0.47840697, z: -0.8772026, w: 0.036960907} - m_Sgn: {x: -1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.6981317} - m_Max: {x: 0, y: 0, z: 0.61086524} - m_Length: 0.01930967 - m_Type: 1 - - m_PreQ: {x: -0.67369145, y: -0.22816992, z: -0.2148026, w: 0.66928196} - m_PostQ: {x: -0.000000011175868, y: 0.75556004, z: -0.65507936, w: 0.00000008009372} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: -1.0471976, y: -1.0471976, z: -1.5707964} - m_Max: {x: 1.0471976, y: 1.0471976, z: 0.87266463} - m_Length: 0.39351633 - m_Type: 1 - - m_PreQ: {x: -0.51718646, y: -0.5543349, z: 0.48596475, w: -0.43482143} - m_PostQ: {x: 0.000000016763805, y: -0.7834234, z: 0.6214884, w: -0.0000000074505797} - m_Sgn: {x: 1, y: 1, z: -1} - m_Limit: - m_Min: {x: -1.5707964, y: 0, z: -1.3962634} - m_Max: {x: 1.5707964, y: 0, z: 1.3962634} - m_Length: 0.4333781 - m_Type: 1 - - m_PreQ: {x: 0.03556, y: -0.78261375, z: 0.62106, w: 0.023146681} - m_PostQ: {x: 0.36731657, y: 0.64087456, z: 0.5874847, w: -0.33048466} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: -0.5235988, z: -0.87266463} - m_Max: {x: 0, y: 0.5235988, z: 0.87266463} - m_Length: 0.086463034 - m_Type: 1 - - m_PreQ: {x: 0.19343469, y: -0.7128988, z: -0.6491024, w: -0.18172653} - m_PostQ: {x: 0.060110025, y: -0.6883214, z: -0.7224165, w: -0.02673867} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.87266463} - m_Max: {x: 0, y: 0, z: 0.87266463} - m_Length: 0.03594133 - m_Type: 1 - - m_PreQ: {x: -0.6695746, y: -0.21545054, z: -0.22731097, w: 0.6734841} - m_PostQ: {x: -0.000000035390254, y: -0.65508205, z: 0.7555577, w: 0.000000027939674} - m_Sgn: {x: -1, y: -1, z: 1} - m_Limit: - m_Min: {x: -1.0471976, y: -1.0471976, z: -1.5707964} - m_Max: {x: 1.0471976, y: 1.0471976, z: 0.87266463} - m_Length: 0.39351586 - m_Type: 1 - - m_PreQ: {x: 0.43482754, y: 0.48482203, z: -0.55532724, w: 0.517189} - m_PostQ: {x: -0.0000013560057, y: 0.6214167, z: -0.7834803, w: -0.0000018291175} - m_Sgn: {x: -1, y: 1, z: -1} - m_Limit: - m_Min: {x: -1.5707964, y: 0, z: -1.3962634} - m_Max: {x: 1.5707964, y: 0, z: 1.3962634} - m_Length: 0.43339315 - m_Type: 1 - - m_PreQ: {x: -0.02236522, y: 0.62101877, z: -0.7826313, w: -0.03638441} - m_PostQ: {x: -0.32967073, y: -0.5871193, z: -0.6413065, w: 0.36787796} - m_Sgn: {x: 1, y: -1, z: 1} - m_Limit: - m_Min: {x: 0, y: -0.5235988, z: -0.87266463} - m_Max: {x: 0, y: 0.5235988, z: 0.87266463} - m_Length: 0.08644843 - m_Type: 1 - - m_PreQ: {x: -0.18204364, y: 0.64826846, z: 0.7136011, w: 0.19334319} - m_PostQ: {x: -0.02691716, y: 0.72163445, z: 0.68912727, w: 0.060190022} - m_Sgn: {x: 1, y: 1, z: 1} - m_Limit: - m_Min: {x: 0, y: 0, z: -0.87266463} - m_Max: {x: 0, y: 0, z: 0.87266463} - m_Length: 0.03594128 - m_Type: 1 - m_SkeletonPose: - data: - m_X: - - t: {x: 0, y: 0, z: 0} - q: {x: 0, y: 0, z: 0, w: 1} - s: {x: 1, y: 1, z: 1} - - t: {x: -0.00000028661222, y: 0.9279533, z: -0.018189056} - q: {x: -0.039073046, y: -0.0390726, z: 0.70602643, w: -0.7060265} - s: {x: 0.91100913, y: 0.9110093, z: 0.9110094} - - t: {x: -0.05387872, y: 0.0000000040891903, z: -0.0000000010222975} - q: {x: 0.00000007264316, y: -0.07920217, z: 0.000000048894435, w: 0.9968587} - s: {x: 0.972599, y: 0.9725993, z: 0.9725988} - - t: {x: -0.19275971, y: 0.000000016817575, z: -0.00012539608} - q: {x: -0.0000005858019, y: -0.08683424, z: -0.00000010605436, w: 0.99622303} - s: {x: 1.0000007, y: 1.0000005, z: 0.9999999} - - t: {x: -0.18375593, y: 0.000000016817568, z: -0.000021206968} - q: {x: 0.00000051409006, y: 0.11071544, z: 0.000000038660538, w: 0.9938525} - s: {x: 1.0000012, y: 1.0000014, z: 0.9999998} - - t: {x: -0.19709729, y: 0.000000016817543, z: -0.0000000070533455} - q: {x: -0.00000036035854, y: 0.070658304, z: 0.00000018812018, w: 0.9975011} - s: {x: 1.0000007, y: 1.0000005, z: 0.9999999} - - t: {x: -0.10225483, y: 0.000000008408767, z: -0.000000013664287} - q: {x: 0.00000008940697, y: -0.0831604, z: -0.00000008987263, w: 0.99653685} - s: {x: 1.0078582, y: 1.0078585, z: 1.007859} - - t: {x: -0.10662594, y: 0.03498038, z: 0.11798749} - q: {x: 0.7124571, y: 0.000003118068, z: -0.7017168, w: 0.0000040424056} - s: {x: 0.93172437, y: 0.9317242, z: 0.93172425} - - t: {x: -0.10662591, y: -0.034980312, z: 0.11798751} - q: {x: 0.71245694, y: -0.0000030747615, z: -0.70171696, w: -0.000004235655} - s: {x: 0.931724, y: 0.9317242, z: 0.93172425} - - t: {x: -0.044175908, y: -0.000093923605, z: 0.053631864} - q: {x: -0.49723694, y: 0.00000018253922, z: 0.86761564, w: 0.00000010523945} - s: {x: 1.0006868, y: 1.000687, z: 1.0006868} - - t: {x: -0.08628869, y: -0.00000003647645, z: 0.028678266} - q: {x: 0.000000029802322, y: 0.17807633, z: -0.000000074505806, w: 0.9840175} - s: {x: 0.9999999, y: 1, z: 0.99999994} - - t: {x: 0.000000016538582, y: 2.6461711e-11, z: -0.000031287913} - q: {x: -0.00000037252903, y: 0.00000013411045, z: 0.000000014901161, - w: 1.0000008} - s: {x: 1.0001963, y: 1.0039256, z: 1.0039252} - - t: {x: -0.18975343, y: 0.05661989, z: 0.0033298074} - q: {x: 0.03925514, y: 0.03201983, z: 0.8036264, w: -0.5929749} - s: {x: 1.0000008, y: 1.0000008, z: 1.0000001} - - t: {x: -0.16176613, y: -0.00006616858, z: 0.000023005005} - q: {x: 0.023624534, y: 0.047961123, z: 0.12512267, w: 0.99070024} - s: {x: 1.0629772, y: 1.0629773, z: 1.0629762} - - t: {x: -0.2779646, y: 0.000000017798802, z: 0.00000000188495} - q: {x: -0.044119578, y: 0.041526258, z: 0.03326377, w: 0.99760884} - s: {x: 1.0078583, y: 1.0078589, z: 1.0078588} - - t: {x: -0.28055248, y: -0.00000016482682, z: 0.0000000065305525} - q: {x: 0.7203868, y: 0.004555943, z: -0.016480956, w: 0.6933625} - s: {x: 0.9291199, y: 0.92912, z: 0.92911977} - - t: {x: -0.096884854, y: 0.012628763, z: 0.004193743} - q: {x: 0.07922788, y: -0.04799989, z: -0.015272722, w: 0.99558365} - s: {x: 1.0000007, y: 1.0000002, z: 1.0000006} - - t: {x: -0.053420868, y: -0.000000038014488, z: -0.000000004223848} - q: {x: -0.009375115, y: -0.036781743, z: 0.014788425, w: 0.99917054} - s: {x: 0.99999976, y: 1, z: 0.9999991} - - t: {x: -0.04290803, y: 0.000000022175119, z: -0.000000093980695} - q: {x: -0.017374206, y: -0.047604173, z: -0.017481778, w: 0.9985628} - s: {x: 0.99999976, y: 0.99999946, z: 1.0000002} - - t: {x: -0.03859319, y: 0.04131469, z: -0.01367895} - q: {x: -0.46069282, y: 0.16832045, z: -0.39540842, w: 0.7765847} - s: {x: 1.0000012, y: 1.0000008, z: 1.0000004} - - t: {x: -0.033299077, y: 0.000000036958504, z: -0.00000007814121} - q: {x: 0.044816963, y: -0.020407882, z: 0.021573834, w: 0.99855435} - s: {x: 1.0000005, y: 1.0000008, z: 1} - - t: {x: -0.0389228, y: -0.000000011615518, z: -0.00000005279811} - q: {x: -0.025654435, y: -0.03165281, z: 0.02530855, w: 0.99884987} - s: {x: 1.0000005, y: 0.99999994, z: 1.0000004} - - t: {x: -0.09379464, y: 0.039509133, z: 0.0025050647} - q: {x: 0.036175035, y: -0.024784623, z: -0.035440482, w: 0.99840987} - s: {x: 1.0000007, y: 1.0000005, z: 1.0000005} - - t: {x: -0.06006603, y: -0.000000015839364, z: -0.000000039070606} - q: {x: -0.0015665116, y: -0.0391956, z: -0.0035614856, w: 0.99922466} - s: {x: 1.0000012, y: 1.0000004, z: 1.0000008} - - t: {x: -0.03607328, y: -0.000000008447658, z: 0.00000004540634} - q: {x: 0.0020313736, y: -0.07268873, z: 0.007082342, w: 0.9973283} - s: {x: 1.0000002, y: 1.0000001, z: 0.99999964} - - t: {x: -0.09333091, y: -0.014842873, z: 0.0014493987} - q: {x: 0.14645636, y: -0.042404927, z: -0.009140862, w: 0.9882661} - s: {x: 0.99999946, y: 0.99999994, z: 0.99999994} - - t: {x: -0.042822067, y: -0.000000016367352, z: -0.000000036958696} - q: {x: -0.0051184557, y: -0.039652176, z: -0.0020092535, w: 0.99919903} - s: {x: 1.0000008, y: 1.0000007, z: 1.0000008} - - t: {x: -0.035356004, y: 0.0000000084476595, z: 0.00000015417042} - q: {x: -0.007811468, y: -0.078669265, z: 0.0011297781, w: 0.9968703} - s: {x: 1.0000005, y: 0.9999997, z: 1.0000006} - - t: {x: -0.086030364, y: -0.035094913, z: -0.008257213} - q: {x: 0.21294327, y: -0.021714333, z: 0.00417584, w: 0.97681487} - s: {x: 1.0000002, y: 1.0000007, z: 1.0000006} - - t: {x: -0.040974054, y: -0.000000019535213, z: 0.000000114571876} - q: {x: -0.015012864, y: -0.037432715, z: 0.0049910406, w: 0.9991745} - s: {x: 1.0000007, y: 1.0000002, z: 1.0000008} - - t: {x: -0.024524732, y: 0.00000004962999, z: -0.00000007919707} - q: {x: 0.031532567, y: -0.047115028, z: -0.0033718338, w: 0.99838674} - s: {x: 1.0000005, y: 1.0000007, z: 0.99999964} - - t: {x: -0.18975352, y: -0.056619875, z: 0.003329873} - q: {x: 0.039254677, y: -0.03201928, z: 0.8036264, w: 0.592975} - s: {x: 0.99999964, y: 0.9999999, z: 0.99999994} - - t: {x: -0.16176574, y: 0.000066067194, z: 0.00002301105} - q: {x: -0.023624763, y: 0.04796034, z: -0.125123, w: 0.9907003} - s: {x: 1.0629759, y: 1.0629758, z: 1.0629758} - - t: {x: -0.2779642, y: -0.000000106005075, z: -0.000000015635823} - q: {x: 0.044119485, y: 0.041526638, z: -0.033264134, w: 0.997609} - s: {x: 1.0078585, y: 1.0078588, z: 1.0078591} - - t: {x: -0.28055203, y: 0.000000029556064, z: 0.0000000026674094} - q: {x: -0.720387, y: 0.004555924, z: 0.016481198, w: 0.69336265} - s: {x: 0.92911994, y: 0.929121, z: 0.9291208} - - t: {x: -0.09379415, y: -0.039508764, z: 0.0025046568} - q: {x: -0.036174804, y: -0.024784612, z: 0.0354399, w: 0.99841005} - s: {x: 0.99999976, y: 1.0000002, z: 1} - - t: {x: -0.060065985, y: 0.00000003590261, z: -0.00000011087597} - q: {x: 0.0015665591, y: -0.039191857, z: 0.003559988, w: 0.9992251} - s: {x: 1.0000001, y: 1.0000001, z: 0.9999999} - - t: {x: -0.036073174, y: -0.000000003695857, z: -0.00000001161558} - q: {x: -0.002031058, y: -0.07268855, z: -0.0070823506, w: 0.99732846} - s: {x: 0.99999976, y: 1.0000006, z: 1.0000007} - - t: {x: -0.086029895, y: 0.03509524, z: -0.008257686} - q: {x: 0.21294352, y: 0.021714631, z: 0.0041771643, w: -0.976815} - s: {x: 0.9999999, y: 1.0000002, z: 0.99999964} - - t: {x: -0.040973987, y: -0.0000000060717653, z: -0.00000004963022} - q: {x: 0.015013337, y: -0.03743865, z: -0.0049896855, w: 0.9991744} - s: {x: 0.9999994, y: 0.9999996, z: 0.9999997} - - t: {x: -0.024524614, y: -0.000000019403256, z: 0.000000024287134} - q: {x: -0.03153327, y: -0.047115147, z: 0.0033719726, w: 0.99838674} - s: {x: 0.99999994, y: 1, z: 1.0000001} - - t: {x: -0.09333044, y: 0.014843234, z: 0.0014490325} - q: {x: -0.14645591, y: -0.042405102, z: 0.009140928, w: 0.98826647} - s: {x: 1.0000001, y: 1.0000002, z: 1.0000007} - - t: {x: -0.042822007, y: 0.000000028774885, z: 0.0000000623017} - q: {x: -0.0051184893, y: 0.039648175, z: -0.0020089662, w: -0.99919945} - s: {x: 0.99999964, y: 0.99999934, z: 0.9999997} - - t: {x: -0.035355743, y: -0.0000000124075274, z: 0.00000007602921} - q: {x: 0.007811457, y: -0.07867052, z: -0.0011303276, w: 0.99687046} - s: {x: 1.0000001, y: 1.0000005, z: 1.0000007} - - t: {x: -0.09688432, y: -0.012628428, z: 0.004193488} - q: {x: -0.07922763, y: -0.0480011, z: 0.015271061, w: 0.995584} - s: {x: 1.0000001, y: 1.0000002, z: 1.0000002} - - t: {x: -0.05342071, y: 0.000000021647162, z: 0.000000053854034} - q: {x: 0.009375036, y: -0.036781084, z: -0.014788719, w: 0.99917096} - s: {x: 0.99999976, y: 0.9999999, z: 1.0000002} - - t: {x: -0.04290792, y: 0.00000001267151, z: 0.00000002534307} - q: {x: 0.01737386, y: -0.047604285, z: 0.01748197, w: 0.99856323} - s: {x: 0.99999964, y: 0.99999946, z: 1.0000001} - - t: {x: -0.03859311, y: -0.04131441, z: -0.013679149} - q: {x: 0.4606952, y: 0.16831613, z: 0.3954082, w: 0.7765846} - s: {x: 1, y: 0.9999996, z: 0.99999994} - - t: {x: -0.033299066, y: 0.00000003959849, z: -0.000000009503656} - q: {x: -0.04481928, y: -0.020407587, z: -0.021573447, w: 0.9985546} - s: {x: 1.0000001, y: 1.0000002, z: 0.9999992} - - t: {x: -0.038922463, y: 0.000000010559594, z: -0.00000007391738} - q: {x: 0.025656343, y: -0.031653583, z: -0.025309965, w: 0.99885} - s: {x: 1.0000004, y: 0.9999998, z: 0.9999999} - - t: {x: 0.017579922, y: -0.10126366, z: 0.003165584} - q: {x: -0.05587799, y: -0.07036915, z: 0.99585736, w: -0.013942232} - s: {x: 1.0000014, y: 1.0000013, z: 1} - - t: {x: -0.4319561, y: 0.00000003271348, z: -0.000000012802678} - q: {x: -0.043848157, y: -0.04039388, z: -0.0217487, w: 0.9979845} - s: {x: 1.0000002, y: 1.0000004, z: 0.99999976} - - t: {x: -0.47571158, y: 0.00000006542694, z: -0.000000008178382} - q: {x: 0.83754116, y: 0.036573015, z: -0.5291057, w: -0.13128176} - s: {x: 0.858255, y: 0.8582551, z: 0.8582551} - - t: {x: -0.18387152, y: 0.00000009529064, z: -0.000000038116326} - q: {x: -0.062467396, y: -0.20674716, z: -0.023633242, w: 0.9761125} - s: {x: 1.0000007, y: 1, z: 1.0000004} - - t: {x: 0.017583838, y: 0.101262964, z: 0.0031659126} - q: {x: 0.055798277, y: -0.070432544, z: -0.9958723, w: -0.012813101} - s: {x: 1.0000005, y: 1.0000007, z: 0.99999994} - - t: {x: -0.43195584, y: 0.000000065426995, z: 3.9534165e-10} - q: {x: 0.043844998, y: -0.040392965, z: 0.021751761, w: 0.99798435} - s: {x: 1, y: 1.0000001, z: 1.0000001} - - t: {x: -0.47572848, y: 0.0000004907024, z: 0.0000021059327} - q: {x: 0.8375387, y: -0.036570538, z: -0.52910906, w: 0.13128252} - s: {x: 0.8582546, y: 0.85825485, z: 0.8582548} - - t: {x: -0.18387154, y: 0.00000002858722, z: -0.000000019058163} - q: {x: 0.0624668, y: -0.20674692, z: 0.023633003, w: 0.97611225} - s: {x: 1.0000006, y: 1.0000004, z: 1.0000005} - m_LeftHand: - data: - m_HandBoneIndex: 2f00000030000000310000002300000024000000250000002c0000002d0000002e000000290000002a0000002b000000260000002700000028000000 - m_RightHand: - data: - m_HandBoneIndex: 130000001400000015000000160000001700000018000000100000001100000012000000190000001a0000001b0000001c0000001d0000001e000000 - m_HumanBoneIndex: 0100000032000000360000003300000037000000340000003800000002000000030000000400000005000000060000001f0000000c000000200000000d000000210000000e000000220000000f000000350000003900000008000000070000000b000000 - m_HumanBoneMass: - - 0.14545456 - - 0.12121213 - - 0.12121213 - - 0.048484854 - - 0.048484854 - - 0.009696971 - - 0.009696971 - - 0.030303033 - - 0.14545456 - - 0.14545456 - - 0.012121214 - - 0.048484854 - - 0.006060607 - - 0.006060607 - - 0.024242427 - - 0.024242427 - - 0.01818182 - - 0.01818182 - - 0.006060607 - - 0.006060607 - - 0.0024242427 - - 0.0024242427 - - 0 - - 0 - - 0 - m_Scale: 1.0098633 - m_ArmTwist: 0.5 - m_ForeArmTwist: 0.5 - m_UpperLegTwist: 0.5 - m_LegTwist: 0.5 - m_ArmStretch: 0.05 - m_LegStretch: 0.056 - m_FeetSpacing: 0 - m_HasLeftHand: 1 - m_HasRightHand: 1 - m_HasTDoF: 0 - m_HumanSkeletonIndexArray: 03000000040000000500000008000000090000000a0000000b0000000e000000280000003f00000046000000470000005a0000005c0000005e00000062000000630000006400000065000000660000006700000068000000690000006a0000006b0000006c0000006d0000006e0000006f000000700000007100000076000000790000007a0000007b0000007c0000007d0000007e0000007f000000800000008100000082000000830000008400000085000000860000008700000088000000890000008a0000009000000091000000930000009400000097000000990000009a0000009b000000 - m_HumanSkeletonReverseIndexArray: ffffffffffffffffffffffff000000000100000002000000ffffffffffffffff03000000040000000500000006000000ffffffffffffffff07000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff08000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff09000000ffffffffffffffffffffffffffffffffffffffffffffffff0a0000000b000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0c000000ffffffff0d000000ffffffff0e000000ffffffffffffffffffffffff0f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e000000ffffffffffffffffffffffffffffffff1f000000ffffffffffffffff200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f0000003000000031000000ffffffffffffffffffffffffffffffffffffffff3200000033000000ffffffff3400000035000000ffffffffffffffff36000000ffffffff370000003800000039000000ffffffffffffffff - m_RootMotionBoneIndex: -1 - m_RootMotionBoneX: - t: {x: 0, y: 0, z: 0} - q: {x: 0, y: 0, z: 0, w: 1} - s: {x: 1, y: 1, z: 1} - m_RootMotionSkeleton: - data: - m_Node: [] - m_ID: - m_AxesArray: [] - m_RootMotionSkeletonPose: - data: - m_X: [] - m_RootMotionSkeletonIndexArray: - m_TOS: - 4245466658: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm - 512994644: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LipsSuperior - 1617059106: Root/Global/Position - 3911016926: Root/Global/Position/Hips/LowerBack/Spine - 2652031526: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/RightLowMaxilar - 2404260553: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEye/RightEyeGlobe - 891364321: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/RightLips - 3651742069: Root/Global/Position/Hips/LeftUpLeg/LeftLeg/LeftFoot - 299272970: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/NoseTop - 2660641802: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightOuterBreast - 3376823606: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/RightLipsInferior - 1839225688: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEye/RightLowerLid/RightLowerLidAdjust - 1064671690: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger05_01/LeftHandFinger05_02/LeftHandFinger05_03 - 879850986: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftCheek/LeftCheekAdjust - 3111053069: Root/Global/Position/Hips/RightUpLeg - 360336113: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand - 714344374: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftLipsSuperiorMiddle - 182684228: Root/Global/Position/Hips/LeftUpLeg - 715756407: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/LeftLips/LeftLipsAdjust - 2435921024: Root/Global/Position/Hips/LowerBack/Spine/Spine1 - 4019065597: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger04_01 - 536073790: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightForeArmAdjust - 1920487238: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/UpperLips - 2133739178: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEye/RightLowerLid - 988509136: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEyebrowMiddle/RightEyebrowMiddleAdjust - 793309915: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/LeftLipsInferior - 1609010662: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/HeadAdjust - 689321054: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEye/LeftEyeGlobe - 3769711243: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/NoseBase/NoseBaseAdjust - 3648415805: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEye/LeftLowerLid - 1523076325: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightForeArmTwist/RightForeArmTwistAdjust - 1291033261: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger01_01/RightHandFinger01_02/RightHandFinger01_03 - 1164066602: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger02_01/LeftHandFinger02_02/LeftHandFinger02_03 - 1266469188: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger05_01/LeftHandFinger05_02 - 3352536891: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftLowCheek - 1918446148: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger03_01 - 662132622: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightTrapezius - 1659837042: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEar - 1663502316: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEye - 1777662011: Root/Global/Position/Hips/RightUpLeg/RightGluteus - 1819021418: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/RightLowMaxilar/RightLowMaxilarAdjust - 3192850701: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEyebrowUp/RightEyebrowUpAdjust - 21667091: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/LipsInferior/LipsInferiorAdjust - 2289679091: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightCheek - 2810708513: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck - 3765766273: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEyebrowMiddle - 2903434439: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftForeArmTwist/LeftForeArmTwistAdjust - 2000019973: Root/Global/Position/Hips/LowerBack/Spine/SpineAdjust - 0: - 2503417370: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightNose - 3157372813: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftLowCheek/LeftLowCheekAdjust - 3044695888: Root/Global/Position/Hips/RightUpLeg/RightLeg/RightFoot/RightToeBase - 2046145451: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/NoseTop/NoseTopAdjust - 1239200587: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger01_01 - 751084522: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger04_01/LeftHandFinger04_02/LeftHandFinger04_03 - 2904080460: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger01_01/LeftHandFinger01_02 - 4082750686: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftNose - 3008255270: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEyebrowMiddle/LeftEyebrowMiddleAdjust - 2260767760: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightOuterBreast/RightInnerBreast - 3024113239: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEye/LeftLowerLid/LeftLowerLidAdjust - 477835020: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger05_01/RightHandFinger05_02/RightHandFinger05_03 - 3980975898: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger02_01/RightHandFinger02_02 - 3887318666: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger02_01/LeftHandFinger02_02 - 3605940535: Root/Global/Position/Hips - 3272509006: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEye/RightUpperLid/RightUpperLidAdjust - 2527973501: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/UpperLips/UpperLipsAdjust - 3975283866: Root/Global/Position/Hips/LeftUpLeg/LeftGluteus - 3201243915: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger05_01/RightHandFinger05_02 - 38228525: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/LeftLowMaxilar/LeftLowMaxilarAdjust - 476240682: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightShoulderAdjust - 3326620003: Root/Global/Position/Hips/RightUpLeg/RightLeg - 599672123: Root/Global/Position/Hips/RightUpLeg/RightLeg/RightLegAdjust - 2327698959: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/NoseMiddle - 3822418880: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger03_01 - 2299478877: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger03_01/RightHandFinger03_02/RightHandFinger03_03 - 224542192: Root/Global/Position/Hips/LeftUpLeg/LeftUpLegAdjust - 1378625489: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/LeftLips - 518646176: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/NoseMiddle/NoseMiddleAdjust - 1621067818: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder - 3404025121: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger02_01 - 2161737935: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEye/LeftUpperLid/LeftUpperLidAdjust - 4216412548: Root/Global/Position/Hips/LowerBack/LowerBackAdjust - 3535411670: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftNose/LeftNoseAdjust - 907124386: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEye/LeftUpperLid - 2244250826: Root/Global/Position/Hips/LeftUpLeg/LeftLeg - 4178474745: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftOuterBreast/LeftInnerBreast - 42431125: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEyebrowUp - 1462924696: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger05_01 - 3717621923: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEye/LeftEyeAdjust - 1286013684: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftShoulderAdjust - 3568971240: Root/Global/Position/Hips/LowerBack - 4227753823: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head - 2122521800: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/Tongue01 - 2458370017: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/MandibleAdjust - 2745092786: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightCheek/RightCheekAdjust - 945871846: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LipsSuperior/LipsSuperiorAdjust - 1379299844: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftOuterBreast - 386353372: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/LipsInferior - 2414024973: Root/Global/Position/Hips/RightUpLeg/RightUpLegAdjust - 1118404042: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEyebrowLow - 3334349852: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger05_01 - 3434993914: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEyebrowLow/LeftEyebrowLowAdjust - 3211325430: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible - 116083838: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightForeArmTwist - 1456669962: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger03_01/LeftHandFinger03_02/LeftHandFinger03_03 - 1995311778: Root/Global/Position/Hips/RightUpLeg/RightLeg/RightFoot - 4291181972: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEyebrowLow/RightEyebrowLowAdjust - 4251668408: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightLowCheek - 1980504295: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEyebrowUp - 2857305310: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm - 3944536773: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEyebrowMiddle - 4241942192: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEyebrowLow - 1870018084: Root/Global/Position/Hips/LeftUpLeg/LeftLeg/LeftFoot/LeftToeBase - 2750999648: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger04_01/RightHandFinger04_02 - 3390097063: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger01_01/RightHandFinger01_02 - 2188727985: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/RightLips/RightLipsAdjust - 1541354309: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/NoseBase - 1529683663: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEyebrowUp/LeftEyebrowUpAdjust - 3204673589: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm - 3629179599: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger01_01 - 2598818297: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEar/LeftEarAdjust - 4080949736: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/RightLipsInferior/RightLipsInferiorAdjust - 3009099370: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEye/RightEyeAdjust - 4231946274: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/NeckAdjust - 2897438087: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftForeArmAdjust - 4138130881: Root/Global/Position/Hips/LeftUpLeg/LeftLeg/LeftLegAdjust - 3727344840: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger03_01/LeftHandFinger03_02 - 1533615269: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger02_01 - 462876324: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightNose/RightNoseAdjust - 3958452133: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger02_01/RightHandFinger02_02/RightHandFinger02_03 - 3720766518: Root/Global/Position/Hips/LowerBack/LowerBackAdjust/LowerBackBelly - 337040016: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftCheek - 866512463: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm - 3066451557: Root - 2940772681: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightLipsSuperiorMiddle - 3491393075: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/LeftLowMaxilar - 2354315799: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Spine1Adjust - 2017219695: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightLowCheek/RightLowCheekAdjust - 2816949640: Root/Global - 1907454282: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger01_01/LeftHandFinger01_02/LeftHandFinger01_03 - 3246316322: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand - 1424207548: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEar/RightEarAdjust - 2420748341: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightEye/RightUpperLid - 169743528: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEar - 957575247: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/RightLipsSuperiorMiddle/RightLipsSuperiorMiddleAdjust - 1675052133: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftTrapezius - 2114077561: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger04_01 - 877460158: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftLipsSuperiorMiddle/LeftLipsSuperiorMiddleAdjust - 2122662900: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger04_01/RightHandFinger04_02/RightHandFinger04_03 - 539155334: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftForeArmTwist - 3173065186: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder - 198576438: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/LeftEye - 3047310428: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/LeftLipsInferior/LeftLipsInferiorAdjust - 179881168: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightArmAdjust - 1927662342: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftForeArm/LeftHand/LeftHandFinger04_01/LeftHandFinger04_02 - 2878241383: Root/Global/Position/Hips/LowerBack/Spine/Spine1/Neck/Head/Mandible/Tongue01/Tongue02 - 2226288596: Root/Global/Position/Hips/LowerBack/Spine/Spine1/LeftShoulder/LeftArm/LeftArmAdjust - 4034865265: Root/Global/Position/Hips/LowerBack/Spine/Spine1/RightShoulder/RightArm/RightForeArm/RightHand/RightHandFinger03_01/RightHandFinger03_02 - m_HumanDescription: - serializedVersion: 3 - m_Human: - - m_BoneName: Hips - m_HumanName: Hips - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftUpLeg - m_HumanName: LeftUpperLeg - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightUpLeg - m_HumanName: RightUpperLeg - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftLeg - m_HumanName: LeftLowerLeg - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightLeg - m_HumanName: RightLowerLeg - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftFoot - m_HumanName: LeftFoot - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightFoot - m_HumanName: RightFoot - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LowerBack - m_HumanName: Spine - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: Spine - m_HumanName: Chest - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: Neck - m_HumanName: Neck - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: Head - m_HumanName: Head - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftShoulder - m_HumanName: LeftShoulder - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightShoulder - m_HumanName: RightShoulder - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftArm - m_HumanName: LeftUpperArm - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightArm - m_HumanName: RightUpperArm - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftForeArm - m_HumanName: LeftLowerArm - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightForeArm - m_HumanName: RightLowerArm - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHand - m_HumanName: LeftHand - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHand - m_HumanName: RightHand - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftToeBase - m_HumanName: LeftToes - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightToeBase - m_HumanName: RightToes - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftEye - m_HumanName: LeftEye - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightEye - m_HumanName: RightEye - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LipsInferiorAdjust - m_HumanName: Jaw - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger05_01 - m_HumanName: Left Thumb Proximal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger05_02 - m_HumanName: Left Thumb Intermediate - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger05_03 - m_HumanName: Left Thumb Distal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger04_01 - m_HumanName: Left Index Proximal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger04_02 - m_HumanName: Left Index Intermediate - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger04_03 - m_HumanName: Left Index Distal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger03_01 - m_HumanName: Left Middle Proximal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger03_02 - m_HumanName: Left Middle Intermediate - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger03_03 - m_HumanName: Left Middle Distal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger02_01 - m_HumanName: Left Ring Proximal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger02_02 - m_HumanName: Left Ring Intermediate - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger02_03 - m_HumanName: Left Ring Distal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger01_01 - m_HumanName: Left Little Proximal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger01_02 - m_HumanName: Left Little Intermediate - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: LeftHandFinger01_03 - m_HumanName: Left Little Distal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger05_01 - m_HumanName: Right Thumb Proximal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger05_02 - m_HumanName: Right Thumb Intermediate - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger05_03 - m_HumanName: Right Thumb Distal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger04_01 - m_HumanName: Right Index Proximal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger04_02 - m_HumanName: Right Index Intermediate - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger04_03 - m_HumanName: Right Index Distal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger03_01 - m_HumanName: Right Middle Proximal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger03_02 - m_HumanName: Right Middle Intermediate - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger03_03 - m_HumanName: Right Middle Distal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger02_01 - m_HumanName: Right Ring Proximal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger02_02 - m_HumanName: Right Ring Intermediate - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger02_03 - m_HumanName: Right Ring Distal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger01_01 - m_HumanName: Right Little Proximal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger01_02 - m_HumanName: Right Little Intermediate - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: RightHandFinger01_03 - m_HumanName: Right Little Distal - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - - m_BoneName: Spine1 - m_HumanName: UpperChest - m_Limit: - m_Min: {x: 0, y: 0, z: 0} - m_Max: {x: 0, y: 0, z: 0} - m_Value: {x: 0, y: 0, z: 0} - m_Length: 0 - m_Modified: 0 - m_Skeleton: - - m_Name: UMADynamicCharacterAvatar - m_ParentName: - m_Position: {x: 0, y: 0, z: 0} - m_Rotation: {x: 0, y: 0, z: 0, w: 1} - m_Scale: {x: 1, y: 1, z: 1} - - m_Name: Root - m_ParentName: - m_Position: {x: 0, y: 0, z: 0} - m_Rotation: {x: 0.7071068, y: 0, z: 0, w: -0.7071068} - m_Scale: {x: 1, y: 1, z: 1} - - m_Name: Global - m_ParentName: - m_Position: {x: 6.15551e-10, y: 0.01051005, z: -0.011465508} - m_Rotation: {x: 0.5000003, y: 0.4999997, z: -0.50000006, w: 0.4999999} - m_Scale: {x: 1, y: 0.99999994, z: 1} - - m_Name: Position - m_ParentName: - m_Position: {x: 0.014117634, y: 3e-15, z: 0.000000008326849} - m_Rotation: {x: -0.000000004950124, y: 1.8325958e-16, z: -9.948377e-16, w: 1} - m_Scale: {x: 0.91100955, y: 0.91100955, z: 0.91100955} - - m_Name: Hips - m_ParentName: - m_Position: {x: -1.046681, y: 0.000000066209516, z: -0.00842917} - m_Rotation: {x: -0.000000024859764, y: 0.055257294, z: -0.00000020834274, w: 0.99847215} - m_Scale: {x: 0.9999995, y: 0.9999998, z: 0.9999998} - - m_Name: LeftUpLeg - m_ParentName: - m_Position: {x: 0.017579908, y: -0.101263635, z: 0.0031655827} - m_Rotation: {x: -0.055877987, y: -0.07036913, z: 0.9958572, w: -0.0139422715} - m_Scale: {x: 1.0000013, y: 1.0000013, z: 1} - - m_Name: LeftGluteus - m_ParentName: - m_Position: {x: -0.00000004861795, y: -0.000000020489097, z: -0.00000009126961} - m_Rotation: {x: -0.08551703, y: 0.88385785, z: 0.037582923, w: -0.45833367} - m_Scale: {x: 0.52756983, y: 0.52756953, z: 0.5275701} - - m_Name: LeftLeg - m_ParentName: - m_Position: {x: -0.4319558, y: 0.000000028871, z: 9.31323e-10} - m_Rotation: {x: -0.043848146, y: -0.040393874, z: -0.02174867, w: 0.99798435} - m_Scale: {x: 1.0000001, y: 1.0000004, z: 0.99999976} - - m_Name: LeftFoot - m_ParentName: - m_Position: {x: -0.47571138, y: 0.00000003259629, z: 0.000000002328306} - m_Rotation: {x: 0.837541, y: 0.036573015, z: -0.5291056, w: -0.13128173} - m_Scale: {x: 0.858255, y: 0.858255, z: 0.858255} - - m_Name: LeftToeBase - m_ParentName: - m_Position: {x: -0.18387146, y: 0.000000025844201, z: 0.000000009313226} - m_Rotation: {x: -0.062467325, y: -0.2067471, z: -0.02363323, w: 0.9761122} - m_Scale: {x: 1.0000007, y: 1, z: 1.0000004} - - m_Name: LeftLegAdjust - m_ParentName: - m_Position: {x: -0.11892719, y: 0.000000031199306, z: 0.000000044703484} - m_Rotation: {x: 0.000000026077032, y: -0.000000026077032, z: -0.0000000041909516, - w: 1} - m_Scale: {x: 1.0000001, y: 1.0386349, z: 1.0190157} - - m_Name: LeftUpLegAdjust - m_ParentName: - m_Position: {x: -0.107989594, y: -0.000000041211024, z: -0.00000011920929} - m_Rotation: {x: -0.033350065, y: 0.000000022351742, z: -0.0000000013969839, - w: 0.99944377} - m_Scale: {x: 1.0000002, y: 0.90615153, z: 0.9061514} - - m_Name: LowerBack - m_ParentName: - m_Position: {x: -0.053878736, y: 0.000000004067728, z: -0.000000003725286} - m_Rotation: {x: 0.000000072790776, y: -0.07920216, z: 0.00000006070385, w: 0.9968586} - m_Scale: {x: 0.97259897, y: 0.97259927, z: 0.97259873} - - m_Name: LowerBackAdjust - m_ParentName: - m_Position: {x: -0.053665183, y: 0.000000004051634, z: 0.00000000558794} - m_Rotation: {x: 0, y: 0, z: -1.3322677e-15, w: 1} - m_Scale: {x: 0.9739008, y: 0.9402905, z: 0.9739004} - - m_Name: LowerBackBelly - m_ParentName: - m_Position: {x: -0.034965567, y: 0.000000002639832, z: 0.000000022351745} - m_Rotation: {x: 0.000000059587457, y: -0.000000037252903, z: -0.0000000014303447, - w: 1} - m_Scale: {x: 0.7603117, y: 0.916217, z: 0.7002415} - - m_Name: Spine - m_ParentName: - m_Position: {x: -0.19275962, y: 0.000000011617576, z: -0.00012540072} - m_Rotation: {x: -0.0000005856389, y: -0.086834215, z: -0.00000010316014, w: 0.9962228} - m_Scale: {x: 1.0000007, y: 1.0000005, z: 1} - - m_Name: Spine1 - m_ParentName: - m_Position: {x: -0.18375577, y: 0.000000013882967, z: -0.00002123043} - m_Rotation: {x: 0.00000051022846, y: 0.110715404, z: 0.000000034567357, w: 0.9938522} - m_Scale: {x: 1.0000013, y: 1.0000013, z: 0.99999994} - - m_Name: LeftOuterBreast - m_ParentName: - m_Position: {x: -0.043685734, y: -0.06515668, z: 0.11522319} - m_Rotation: {x: 0.12444672, y: 0.7023361, z: 0.116329275, w: 0.69116175} - m_Scale: {x: 1.0062852, y: 1.0062851, z: 1.0062855} - - m_Name: LeftInnerBreast - m_ParentName: - m_Position: {x: -0.05850321, y: 0.000000001862645, z: -0.000000018218998} - m_Rotation: {x: 0.025524419, y: -0.044496294, z: 0.005808189, w: 0.9986665} - m_Scale: {x: 1.0000002, y: 1.0000004, z: 1.0000005} - - m_Name: LeftShoulder - m_ParentName: - m_Position: {x: -0.18975337, y: -0.05661983, z: 0.0033298738} - m_Rotation: {x: 0.039254665, y: -0.03201927, z: 0.80362606, w: 0.5929747} - m_Scale: {x: 0.99999976, y: 1, z: 1} - - m_Name: LeftArm - m_ParentName: - m_Position: {x: -0.16176572, y: 0.000066091015, z: 0.00002300553} - m_Rotation: {x: -0.023624752, y: 0.047960315, z: -0.12512293, w: 0.99069977} - m_Scale: {x: 1.0629758, y: 1.0629759, z: 1.0629758} - - m_Name: LeftArmAdjust - m_ParentName: - m_Position: {x: -0.06949084, y: -0.0000004498288, z: -0.00000018626451} - m_Rotation: {x: 0.23795915, y: 0.00000005960463, z: 0.00000006231129, w: 0.9712752} - m_Scale: {x: 1, y: 0.97192377, z: 0.9719234} - - m_Name: LeftForeArm - m_ParentName: - m_Position: {x: -0.2779642, y: -0.000000110827386, z: -0.000000018626451} - m_Rotation: {x: 0.044119455, y: 0.041526616, z: -0.03326411, w: 0.9976085} - m_Scale: {x: 1.0078585, y: 1.0078588, z: 1.0078591} - - m_Name: LeftForeArmAdjust - m_ParentName: - m_Position: {x: -0.03506903, y: -0.000000095926225, z: -0.00000011920929} - m_Rotation: {x: 0.00000028312203, y: -0, z: -0.00000002235174, w: 1} - m_Scale: {x: 1.0000001, y: 1.0012742, z: 1.0012745} - - m_Name: LeftForeArmTwist - m_ParentName: - m_Position: {x: -0.1402761, y: -0.00000006449409, z: -0.000000074505806} - m_Rotation: {x: 0.0000004209578, y: 0.000000007450581, z: 4.656613e-10, w: 1} - m_Scale: {x: 1.0000002, y: 0.99999976, z: 0.99999994} - - m_Name: LeftForeArmTwistAdjust - m_ParentName: - m_Position: {x: -0.035069004, y: 0.00000009563519, z: -0.000000029802322} - m_Rotation: {x: -0.000000040978247, y: -0.000000007450599, z: -0.000000045169134, - w: 1} - m_Scale: {x: 0.9999999, y: 1.0006864, z: 1.0006862} - - m_Name: LeftHand - m_ParentName: - m_Position: {x: -0.280552, y: 0.000000037020072, z: 0} - m_Rotation: {x: -0.72038645, y: 0.0045559183, z: 0.016481187, w: 0.6933622} - m_Scale: {x: 0.92912, y: 0.929121, z: 0.9291208} - - m_Name: LeftHandFinger01_01 - m_ParentName: - m_Position: {x: -0.086029895, y: 0.035095196, z: -0.008257618} - m_Rotation: {x: 0.21294335, y: 0.021714617, z: 0.0041771624, w: -0.97681427} - m_Scale: {x: 0.99999994, y: 1.0000002, z: 0.9999997} - - m_Name: LeftHandFinger01_02 - m_ParentName: - m_Position: {x: -0.040973976, y: -0.000000014901161, z: -0.000000018626451} - m_Rotation: {x: 0.015013302, y: -0.037438624, z: -0.004989681, w: 0.99917376} - m_Scale: {x: 0.9999995, y: 0.9999996, z: 0.99999976} - - m_Name: LeftHandFinger01_03 - m_ParentName: - m_Position: {x: -0.02452459, y: -0.000000007450581, z: -0.00000000372529} - m_Rotation: {x: -0.03153322, y: -0.047115102, z: 0.0033719717, w: 0.99838597} - m_Scale: {x: 1, y: 1.0000001, z: 1.0000002} - - m_Name: LeftHandFinger02_01 - m_ParentName: - m_Position: {x: -0.09333042, y: 0.014843221, z: 0.0014490108} - m_Rotation: {x: -0.14645581, y: -0.042405065, z: 0.009140923, w: 0.98826563} - m_Scale: {x: 1.0000001, y: 1.0000004, z: 1.0000008} - - m_Name: LeftHandFinger02_02 - m_ParentName: - m_Position: {x: -0.042821992, y: 0.000000029802322, z: 0.000000063329935} - m_Rotation: {x: -0.005118502, y: 0.03964813, z: -0.0020089615, w: -0.9991986} - m_Scale: {x: 0.99999976, y: 0.9999994, z: 0.9999997} - - m_Name: LeftHandFinger02_03 - m_ParentName: - m_Position: {x: -0.03535577, y: 0, z: 0.00000004656613} - m_Rotation: {x: 0.0078114327, y: -0.07867044, z: -0.0011303273, w: 0.9968695} - m_Scale: {x: 1.0000001, y: 1.0000005, z: 1.0000007} - - m_Name: LeftHandFinger03_01 - m_ParentName: - m_Position: {x: -0.09688435, y: -0.012628396, z: 0.004193525} - m_Rotation: {x: -0.07922754, y: -0.04800106, z: 0.0152710425, w: 0.9955832} - m_Scale: {x: 1.0000001, y: 1.0000004, z: 1.0000004} - - m_Name: LeftHandFinger03_02 - m_ParentName: - m_Position: {x: -0.053420693, y: 0.000000014901161, z: 0.00000010617077} - m_Rotation: {x: 0.009375039, y: -0.03678105, z: -0.0147887, w: 0.99916995} - m_Scale: {x: 0.9999999, y: 0.99999994, z: 1.0000002} - - m_Name: LeftHandFinger03_03 - m_ParentName: - m_Position: {x: -0.042907897, y: 0.000000007450581, z: 0.000000038184226} - m_Rotation: {x: 0.017373888, y: -0.04760424, z: 0.017481951, w: 0.9985622} - m_Scale: {x: 0.99999964, y: 0.99999946, z: 1.0000001} - - m_Name: LeftHandFinger04_01 - m_ParentName: - m_Position: {x: -0.09379414, y: -0.039508693, z: 0.0025047294} - m_Rotation: {x: -0.03617471, y: -0.024784591, z: 0.035439868, w: 0.99840933} - m_Scale: {x: 0.9999998, y: 1.0000004, z: 1.0000001} - - m_Name: LeftHandFinger04_02 - m_ParentName: - m_Position: {x: -0.06006597, y: 0.000000040978193, z: -0.00000014388934} - m_Rotation: {x: 0.0015665467, y: -0.039191827, z: 0.0035599873, w: 0.9992242} - m_Scale: {x: 1.0000001, y: 1.0000001, z: 0.99999994} - - m_Name: LeftHandFinger04_03 - m_ParentName: - m_Position: {x: -0.036073178, y: 0, z: -0.00000004284084} - m_Rotation: {x: -0.0020310907, y: -0.07268848, z: -0.007082337, w: 0.9973275} - m_Scale: {x: 0.9999999, y: 1.0000005, z: 1.0000007} - - m_Name: LeftHandFinger05_01 - m_ParentName: - m_Position: {x: -0.038593136, y: -0.041314337, z: -0.013679172} - m_Rotation: {x: 0.46069485, y: 0.16831599, z: 0.39540786, w: 0.77658397} - m_Scale: {x: 1, y: 0.99999964, z: 1} - - m_Name: LeftHandFinger05_02 - m_ParentName: - m_Position: {x: -0.033299044, y: 0.000000069325324, z: 0} - m_Rotation: {x: -0.04481925, y: -0.02040754, z: -0.021573417, w: 0.9985537} - m_Scale: {x: 1.0000001, y: 1.0000004, z: 0.99999934} - - m_Name: LeftHandFinger05_03 - m_ParentName: - m_Position: {x: -0.038922455, y: 0.00000007642666, z: -0.00000006053597} - m_Rotation: {x: 0.025656313, y: -0.031653535, z: -0.025309926, w: 0.998849} - m_Scale: {x: 1.0000005, y: 0.9999999, z: 0.99999994} - - m_Name: LeftShoulderAdjust - m_ParentName: - m_Position: {x: -0.04042585, y: -0.00000015398837, z: -0.000000022351742} - m_Rotation: {x: 0.14658885, y: 0.000000055879347, z: -0.000000021420417, w: 0.9891975} - m_Scale: {x: 1, y: 1.0056936, z: 1.0056933} - - m_Name: LeftTrapezius - m_ParentName: - m_Position: {x: -0.034978047, y: 0.037129175, z: -0.036507383} - m_Rotation: {x: 0.69468355, y: -0.06968856, z: -0.14096293, w: 0.7019173} - m_Scale: {x: 1.0106091, y: 1.0106091, z: 1.0106089} - - m_Name: Neck - m_ParentName: - m_Position: {x: -0.19709714, y: 0.000000014880397, z: -0.000000008546294} - m_Rotation: {x: -0.00000035964723, y: 0.070658274, z: 0.00000015052176, w: 0.99750066} - m_Scale: {x: 1.0000008, y: 1.0000006, z: 0.99999994} - - m_Name: Head - m_ParentName: - m_Position: {x: -0.10225469, y: 0.000000007720018, z: 0} - m_Rotation: {x: 0.00000008821572, y: -0.083160356, z: -0.000000050923394, w: 0.99653625} - m_Scale: {x: 1.0078583, y: 1.0078585, z: 1.007859} - - m_Name: HeadAdjust - m_ParentName: - m_Position: {x: -0.051950034, y: 0.000000003922105, z: 0.000000033527613} - m_Rotation: {x: -0.000000029801402, y: -0.000000014901158, z: -2.2618968e-10, - w: 1} - m_Scale: {x: 1.0000001, y: 0.959976, z: 1} - - m_Name: LeftCheek - m_ParentName: - m_Position: {x: -0.080588885, y: -0.033353455, z: 0.116393134} - m_Rotation: {x: 0.64207375, y: 0.30542332, z: -0.63399243, w: -0.30415702} - m_Scale: {x: 0.99999976, y: 0.99999976, z: 0.9999998} - - m_Name: LeftCheekAdjust - m_ParentName: - m_Position: {x: 0.00000004551967, y: 0.000000001862645, z: 0.000117586125} - m_Rotation: {x: -0.00000013411044, y: -0.000000059604638, z: -0.0000000745058, - w: -1} - m_Scale: {x: 1.0041221, y: 1.0041219, z: 1.004122} - - m_Name: LeftEar - m_ParentName: - m_Position: {x: -0.07060859, y: -0.07847363, z: 0.053546168} - m_Rotation: {x: -0.11281155, y: -0.57043844, z: 0.08211995, w: 0.8094009} - m_Scale: {x: 1, y: 0.9999999, z: 0.9999999} - - m_Name: LeftEarAdjust - m_ParentName: - m_Position: {x: 0.0013333301, y: 0.003999983, z: 0.0083137425} - m_Rotation: {x: -0.00000018410877, y: 0.00000013294283, z: -0.090223566, w: 0.99592155} - m_Scale: {x: 0.9764205, y: 0.97642106, z: 0.9764207} - - m_Name: LeftEye - m_ParentName: - m_Position: {x: -0.10662578, y: -0.034980256, z: 0.117987506} - m_Rotation: {x: 0.71245635, y: -0.0000031184868, z: -0.7017164, w: -0.0000042344564} - m_Scale: {x: 0.93172395, y: 0.9317242, z: 0.9317242} - - m_Name: LeftEyeAdjust - m_ParentName: - m_Position: {x: 0.000000110966646, y: -0.0000001574491, z: -0.0000010318676} - m_Rotation: {x: -0.00034413536, y: -0.0000001788317, z: -0.000000047118146, - w: -0.99999994} - m_Scale: {x: 1.0000002, y: 1.0000004, z: 1.0000006} - - m_Name: LeftEyeGlobe - m_ParentName: - m_Position: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - m_Rotation: {x: -0.000004153084, y: -0.00000014901465, z: 0.00000000549653, - w: -1} - m_Scale: {x: 0.99999994, y: 1, z: 1.0000002} - - m_Name: LeftLowerLid - m_ParentName: - m_Position: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - m_Rotation: {x: 0.00027554593, y: -0.17976484, z: 0.0000110231795, w: 0.98370963} - m_Scale: {x: 1, y: 1, z: 1} - - m_Name: LeftLowerLidAdjust - m_ParentName: - m_Position: {x: 0.000000092167966, y: -0.000000005253241, z: -0.000000018746505} - m_Rotation: {x: -0.0002785174, y: 0.00046665955, z: 0.000036992522, w: -0.9999999} - m_Scale: {x: 1.0000008, y: 1.0000008, z: 1.000001} - - m_Name: LeftUpperLid - m_ParentName: - m_Position: {x: 0.00000002900562, y: -0.000000101562605, z: -0.00000043582233} - m_Rotation: {x: -0.00035462173, y: 0.09056213, z: 0.000024150295, w: 0.9958908} - m_Scale: {x: 1.0000001, y: 1.0000001, z: 1.0000001} - - m_Name: LeftUpperLidAdjust - m_ParentName: - m_Position: {x: 0.000000021716517, y: -0.000000004901267, z: -0.000000053663825} - m_Rotation: {x: -0.00034918456, y: 0.00035879752, z: -0.00003603795, w: 0.9999999} - m_Scale: {x: 1.0000006, y: 1.0000006, z: 1.0000007} - - m_Name: LeftEyebrowLow - m_ParentName: - m_Position: {x: -0.10751021, y: -0.019023033, z: 0.083702855} - m_Rotation: {x: 0.77709675, y: -0.00000014916701, z: -0.6293812, w: 0.00000028182342} - m_Scale: {x: 1.0000001, y: 0.99999994, z: 0.9999998} - - m_Name: LeftEyebrowLowAdjust - m_ParentName: - m_Position: {x: -0.000029469638, y: -0.000000001343547, z: -0.000048831236} - m_Rotation: {x: -0.00000006366759, y: 0.00000005960466, z: 0.000000032427817, - w: -1} - m_Scale: {x: 0.99999994, y: 0.9999997, z: 1.0000002} - - m_Name: LeftEyebrowMiddle - m_ParentName: - m_Position: {x: -0.11220421, y: -0.036671754, z: 0.08122144} - m_Rotation: {x: 0.7770956, y: -0.00000019629408, z: -0.62938267, w: 0.00000017990683} - m_Scale: {x: 0.99999976, y: 0.99999994, z: 0.9999999} - - m_Name: LeftEyebrowMiddleAdjust - m_ParentName: - m_Position: {x: -0.00002940285, y: -3.56321e-10, z: -0.00010783993} - m_Rotation: {x: -0.00000009624478, y: -0.000000059604606, z: 0.000000044068504, - w: -1} - m_Scale: {x: 1.0000005, y: 1.000001, z: 1.0000007} - - m_Name: LeftEyebrowUp - m_ParentName: - m_Position: {x: -0.111640856, y: -0.05187969, z: 0.07084919} - m_Rotation: {x: 0.7707361, y: -0.00087633455, z: -0.6371536, w: 0.00070964516} - m_Scale: {x: 0.9999997, y: 0.9999999, z: 0.99999994} - - m_Name: LeftEyebrowUpAdjust - m_ParentName: - m_Position: {x: -0.000029511999, y: -3.4197e-10, z: -0.000023493698} - m_Rotation: {x: 0.000000060419545, y: -6.7871035e-11, z: 0.000000022933815, - w: -1} - m_Scale: {x: 1.0000007, y: 1.0000011, z: 1.000001} - - m_Name: LeftLipsSuperiorMiddle - m_ParentName: - m_Position: {x: -0.032830365, y: -0.010835715, z: 0.14380059} - m_Rotation: {x: 0.79257464, y: 0.066974595, z: -0.6038795, w: -0.051666934} - m_Scale: {x: 0.9999998, y: 0.9999998, z: 0.9999998} - - m_Name: LeftLipsSuperiorMiddleAdjust - m_ParentName: - m_Position: {x: -0.00000008393545, y: 0.000027440221, z: 0.00000010083659} - m_Rotation: {x: -0.00012638416, y: 0.000000047963095, z: 0.00000048801286, w: 1} - m_Scale: {x: 1.0001965, y: 1.0035336, z: 1.0035331} - - m_Name: LeftLowCheek - m_ParentName: - m_Position: {x: -0.030948685, y: -0.037739087, z: 0.1084911} - m_Rotation: {x: -0.65911824, y: -0.23915756, z: 0.6702265, w: 0.24323519} - m_Scale: {x: 1.0000004, y: 1.0000001, z: 1.0000001} - - m_Name: LeftLowCheekAdjust - m_ParentName: - m_Position: {x: -0.00027455122, y: -0.000000013038516, z: 0.016000055} - m_Rotation: {x: 0.000000089406946, y: -0.00000013783571, z: 0.000000014901158, - w: 1} - m_Scale: {x: 1.0000004, y: 1.0000007, z: 1.0000005} - - m_Name: LeftNose - m_ParentName: - m_Position: {x: -0.057662286, y: -0.026324952, z: 0.10326293} - m_Rotation: {x: 0.7088708, y: 0.001175211, z: -0.7053236, w: 0.0044189156} - m_Scale: {x: 0.9999998, y: 1.0000002, z: 1.0000001} - - m_Name: LeftNoseAdjust - m_ParentName: - m_Position: {x: -0.00004896231, y: 0.000000024971087, z: 0.000048934347} - m_Rotation: {x: 0.000010777495, y: -0.0000001141843, z: 0.000000041152806, w: -1} - m_Scale: {x: 1.0000005, y: 1.000001, z: 1.0000008} - - m_Name: LipsSuperior - m_ParentName: - m_Position: {x: -0.03346425, y: -0.00009391148, z: 0.14560841} - m_Rotation: {x: 0.7929806, y: -0.00000027194244, z: -0.6092469, w: -0.00000018440363} - m_Scale: {x: 1.0000001, y: 0.99999994, z: 1} - - m_Name: LipsSuperiorAdjust - m_ParentName: - m_Position: {x: 0.00000001489442, y: 5.434e-12, z: 0.00000005769348} - m_Rotation: {x: -0.00000072097384, y: 0.00000011920936, z: 0.000000009991907, - w: 1} - m_Scale: {x: 1.0001968, y: 1.003533, z: 1.0035337} - - m_Name: Mandible - m_ParentName: - m_Position: {x: -0.044175807, y: -0.00009392363, z: 0.053631864} - m_Rotation: {x: -0.4972366, y: 0.00000016931602, z: 0.86761504, w: 0.00000009477948} - m_Scale: {x: 1.0006866, y: 1.000687, z: 1.0006868} - - m_Name: LeftLips - m_ParentName: - m_Position: {x: -0.075910136, y: 0.025399094, z: 0.024111979} - m_Rotation: {x: -0.021914452, y: 0.26832196, z: -0.07839588, w: 0.9598839} - m_Scale: {x: 0.9999999, y: 1.0000001, z: 0.9999999} - - m_Name: LeftLipsAdjust - m_ParentName: - m_Position: {x: -0.000000010323419, y: 0.000058822483, z: -0.000000034016526} - m_Rotation: {x: 0.00000083632744, y: 0.00000014901158, z: 0.000000044703473, - w: 1} - m_Scale: {x: 1.0000008, y: 1.0000006, z: 0.99999946} - - m_Name: LeftLipsInferior - m_ParentName: - m_Position: {x: -0.084927976, y: 0.010402911, z: 0.028449215} - m_Rotation: {x: -0.00920702, y: 0.16402113, z: -0.06609625, w: 0.98419696} - m_Scale: {x: 0.9999998, y: 0.9999999, z: 0.9999999} - - m_Name: LeftLipsInferiorAdjust - m_ParentName: - m_Position: {x: -0.000000053318217, y: 0.000027448603, z: -0.000031365904} - m_Rotation: {x: 0.0000005736945, y: -0.000000059604623, z: 0.000000009313222, - w: 1} - m_Scale: {x: 1.0001968, y: 1.0035341, z: 1.0035329} - - m_Name: LeftLowMaxilar - m_ParentName: - m_Position: {x: -0.02950471, y: 0.057409532, z: -0.027499085} - m_Rotation: {x: 0.029741673, y: 0.10562913, z: 0.2273467, w: 0.9676112} - m_Scale: {x: 0.9999998, y: 1, z: 0.99999994} - - m_Name: LeftLowMaxilarAdjust - m_ParentName: - m_Position: {x: -0.00000010430813, y: 0.000049087404, z: 0.00005890882} - m_Rotation: {x: -0.00000049173815, y: 0.000000111758666, z: -0.000000050524232, - w: 1} - m_Scale: {x: 1.0000008, y: 1.0000006, z: 0.9999998} - - m_Name: LipsInferior - m_ParentName: - m_Position: {x: -0.086288534, y: 0.000000024458675, z: 0.02867835} - m_Rotation: {x: 0.000000012695441, y: 0.17807616, z: -0.00000006888677, w: 0.9840167} - m_Scale: {x: 0.9999999, y: 1, z: 0.9999999} - - m_Name: LipsInferiorAdjust - m_ParentName: - m_Position: {x: 0.000000007439353, y: 2.858e-12, z: -0.0000313395} - m_Rotation: {x: -0.00000039331678, y: 0.00000013411041, z: 0.000000030241612, - w: 1} - m_Scale: {x: 1.0001963, y: 1.0039256, z: 1.0039251} - - m_Name: MandibleAdjust - m_ParentName: - m_Position: {x: -0.00000011920712, y: 7.393e-12, z: 0.000029381012} - m_Rotation: {x: -0.00000004828186, y: 0.000000029802308, z: -0.000000035736438, - w: 1} - m_Scale: {x: 1.0007063, y: 1.0051053, z: 1.0000001} - - m_Name: RightLips - m_ParentName: - m_Position: {x: -0.075910136, y: -0.025586976, z: 0.024111979} - m_Rotation: {x: 0.021914467, y: 0.26832202, z: 0.07839589, w: 0.9598839} - m_Scale: {x: 0.9999999, y: 1, z: 1} - - m_Name: RightLipsAdjust - m_ParentName: - m_Position: {x: -0.000000008140205, y: -0.00005881765, z: -0.00000016986974} - m_Rotation: {x: -0.0000009927896, y: 0.000000029802315, z: -0.0000000018626447, - w: 1} - m_Scale: {x: 1.0000014, y: 1.0000007, z: 1} - - m_Name: RightLipsInferior - m_ParentName: - m_Position: {x: -0.084927976, y: -0.010590785, z: 0.028449215} - m_Rotation: {x: 0.009207051, y: 0.16402112, z: 0.066096246, w: 0.98419696} - m_Scale: {x: 0.99999976, y: 0.9999999, z: 0.9999999} - - m_Name: RightLipsInferiorAdjust - m_ParentName: - m_Position: {x: -0.000000044936314, y: -0.000027450465, z: -0.000031365915} - m_Rotation: {x: -0.0000007441263, y: 0.00000011920922, z: -0.00000006856858, - w: 1} - m_Scale: {x: 1.0001969, y: 1.0035335, z: 1.0035323} - - m_Name: RightLowMaxilar - m_ParentName: - m_Position: {x: -0.029504841, y: -0.057597507, z: -0.027499013} - m_Rotation: {x: -0.029741721, y: 0.105628826, z: -0.22734705, w: 0.96761113} - m_Scale: {x: 0.99999994, y: 1.0000001, z: 0.99999994} - - m_Name: RightLowMaxilarAdjust - m_ParentName: - m_Position: {x: 0.000000037252903, y: -0.00004905667, z: 0.000058704336} - m_Rotation: {x: 0.0000003948807, y: -0.00000005960463, z: 0.000000072177485, - w: 1} - m_Scale: {x: 1.0000006, y: 1.0000007, z: 0.9999994} - - m_Name: Tongue01 - m_ParentName: - m_Position: {x: -0.020923134, y: -0.000093799084, z: -0.017397886} - m_Rotation: {x: 0.0000019340207, y: 0.24886589, z: -0.000000716172, w: 0.968538} - m_Scale: {x: 1.0000012, y: 1.000001, z: 1} - - m_Name: Tongue02 - m_ParentName: - m_Position: {x: -0.02847365, y: 0.000000002149267, z: -0.00000007008269} - m_Rotation: {x: 0.9989919, y: -0.000000041880856, z: -0.04489069, w: 0.0000072369353} - m_Scale: {x: 0.99999994, y: 1.0000001, z: 0.99999994} - - m_Name: NoseBase - m_ParentName: - m_Position: {x: -0.06767554, y: -0.00009390456, z: 0.14743026} - m_Rotation: {x: -0.7066935, y: -0.000000005227299, z: 0.70751995, w: -0.00000025150896} - m_Scale: {x: 1, y: 0.9999999, z: 0.99999994} - - m_Name: NoseBaseAdjust - m_ParentName: - m_Position: {x: -0.00009806863, y: 4.663e-12, z: 0.000097917335} - m_Rotation: {x: 0.00000018294442, y: 0.0013798266, z: -0.000000043951403, w: 0.99999905} - m_Scale: {x: 0.9291962, y: 0.9811298, z: 0.9664092} - - m_Name: NoseMiddle - m_ParentName: - m_Position: {x: -0.089603975, y: 0.000000049756913, z: 0.1414512} - m_Rotation: {x: 0.7072902, y: 0.0011002349, z: -0.7069201, w: -0.0018578874} - m_Scale: {x: 0.9999998, y: 0.9999999, z: 1} - - m_Name: NoseMiddleAdjust - m_ParentName: - m_Position: {x: -0.000047065067, y: -0.000000010341424, z: 0.000058734793} - m_Rotation: {x: -0.000027814876, y: -0.0005024864, z: 0.00091035536, w: -0.9999995} - m_Scale: {x: 0.95859826, y: 0.98290855, z: 0.99588066} - - m_Name: NoseTop - m_ParentName: - m_Position: {x: -0.11778397, y: 0.00000004942573, z: 0.12102794} - m_Rotation: {x: 0.7070856, y: 0.0062066345, z: -0.70708257, w: 0.0050717616} - m_Scale: {x: 1.0000005, y: 0.9999998, z: 0.99999994} - - m_Name: NoseTopAdjust - m_ParentName: - m_Position: {x: -0.000029324656, y: 8.95515e-10, z: -0.000049009494} - m_Rotation: {x: -0.00004252278, y: 0.00000005476248, z: 0.00000006565823, w: -1} - m_Scale: {x: 1.0000005, y: 1.0000008, z: 1.0000004} - - m_Name: RightCheek - m_ParentName: - m_Position: {x: -0.08058888, y: 0.033353485, z: 0.11639312} - m_Rotation: {x: 0.64207387, y: -0.30542296, z: -0.6339928, w: 0.3041566} - m_Scale: {x: 1.0000002, y: 0.9999999, z: 1.0000002} - - m_Name: RightCheekAdjust - m_ParentName: - m_Position: {x: 0.000000041325194, y: 0.000000012107193, z: 0.000117835225} - m_Rotation: {x: -0.00000005960463, y: -0.00000010430811, z: 0.00000019371505, - w: -1} - m_Scale: {x: 1.0041237, y: 1.0041233, z: 1.0041234} - - m_Name: RightEar - m_ParentName: - m_Position: {x: -0.07060846, y: 0.07847385, z: 0.053546134} - m_Rotation: {x: 0.112811, y: -0.5704385, z: -0.08211961, w: 0.809401} - m_Scale: {x: 1, y: 0.99999994, z: 0.99999994} - - m_Name: RightEarAdjust - m_ParentName: - m_Position: {x: 0.0013332947, y: -0.003999993, z: 0.0083134975} - m_Rotation: {x: 0.0000002556218, y: 0.000000096539885, z: 0.090223595, w: 0.99592155} - m_Scale: {x: 0.9764207, y: 0.9764207, z: 0.9764208} - - m_Name: RightEye - m_ParentName: - m_Position: {x: -0.10662577, y: 0.034980323, z: 0.11798749} - m_Rotation: {x: 0.7124565, y: 0.0000031413288, z: -0.70171624, w: 0.0000040460623} - m_Scale: {x: 0.9317243, y: 0.9317242, z: 0.9317242} - - m_Name: RightEyeAdjust - m_ParentName: - m_Position: {x: 0.00000010325148, y: 0.00000009111068, z: -0.00000116833} - m_Rotation: {x: -0.00034421866, y: -0.00000008940312, z: -0.000000007621011, - w: 0.99999994} - m_Scale: {x: 0.9999997, y: 1, z: 1.0000001} - - m_Name: RightEyeGlobe - m_ParentName: - m_Position: {x: 0.00000008089521, y: 0.000000109731694, z: -0.0000005722835} - m_Rotation: {x: -0.000004225848, y: -0.0000000894048, z: 0.000000076694484, - w: 1} - m_Scale: {x: 1, y: 1.0000004, z: 1.0000005} - - m_Name: RightLowerLid - m_ParentName: - m_Position: {x: 0.000000058543428, y: 0.00000006502823, z: -0.0000005722841} - m_Rotation: {x: -0.0002753267, y: -0.17976472, z: -0.000011421973, w: 0.98370963} - m_Scale: {x: 1, y: 1.0000001, z: 1.0000001} - - m_Name: RightLowerLidAdjust - m_ParentName: - m_Position: {x: 0.000000067076826, y: 0.00000000257387, z: -0.000000065832864} - m_Rotation: {x: 0.0002784026, y: 0.00046008814, z: -0.000036914105, w: -0.9999999} - m_Scale: {x: 1.0000008, y: 1.0000008, z: 1.0000011} - - m_Name: RightUpperLid - m_ParentName: - m_Position: {x: 0.00000008089521, y: 0.000000109731694, z: -0.0000005722835} - m_Rotation: {x: 0.0003545885, y: 0.09056162, z: -0.00002521045, w: 0.9958908} - m_Scale: {x: 0.99999994, y: 0.99999994, z: 1} - - m_Name: RightUpperLidAdjust - m_ParentName: - m_Position: {x: 0.000000012275649, y: 0.000000003306013, z: 0.000000020669177} - m_Rotation: {x: -0.0003495343, y: -0.00035921476, z: -0.00003620913, w: -0.9999999} - m_Scale: {x: 1, y: 0.99999994, z: 1.0000001} - - m_Name: RightEyebrowLow - m_ParentName: - m_Position: {x: -0.10751021, y: 0.0190231, z: 0.083702885} - m_Rotation: {x: 0.77709675, y: -0.00000012301177, z: -0.6293812, w: -0.00000007944375} - m_Scale: {x: 1.0000001, y: 0.99999994, z: 0.9999998} - - m_Name: RightEyebrowLowAdjust - m_ParentName: - m_Position: {x: -0.000029352806, y: 0.00000000223472, z: -0.00004881392} - m_Rotation: {x: -0.00000005665234, y: 0.00000005960465, z: 0.00000003493151, - w: -1} - m_Scale: {x: 0.99999994, y: 0.9999997, z: 1.0000001} - - m_Name: RightEyebrowMiddle - m_ParentName: - m_Position: {x: -0.1122042, y: 0.03667182, z: 0.08122143} - m_Rotation: {x: 0.7770956, y: 0.00000008287696, z: -0.62938255, w: 0.00000008730825} - m_Scale: {x: 0.9999998, y: 0.99999994, z: 0.99999994} - - m_Name: RightEyebrowMiddleAdjust - m_ParentName: - m_Position: {x: -0.000029446084, y: 0.000000001299492, z: -0.00010786233} - m_Rotation: {x: 0.0000002508521, y: -0.000000029802322, z: 0.00000003496133, - w: 1} - m_Scale: {x: 1.0000001, y: 1, z: 1.0000001} - - m_Name: RightEyebrowUp - m_ParentName: - m_Position: {x: -0.11164072, y: 0.05187975, z: 0.07084918} - m_Rotation: {x: 0.7707363, y: 0.0008762584, z: -0.6371533, w: -0.0007097716} - m_Scale: {x: 0.99999994, y: 0.9999999, z: 0.99999994} - - m_Name: RightEyebrowUpAdjust - m_ParentName: - m_Position: {x: -0.000029419754, y: 0.000000007574272, z: -0.000023492226} - m_Rotation: {x: -0.000000114319846, y: -0.00000011933912, z: 0.000000062340405, - w: 1} - m_Scale: {x: 1.0000006, y: 1.0000008, z: 1.0000008} - - m_Name: RightLipsSuperiorMiddle - m_ParentName: - m_Position: {x: -0.03283036, y: 0.010835797, z: 0.14380059} - m_Rotation: {x: 0.7925747, y: -0.06697429, z: -0.6038794, w: 0.051667} - m_Scale: {x: 0.99999964, y: 0.99999964, z: 0.9999999} - - m_Name: RightLipsSuperiorMiddleAdjust - m_ParentName: - m_Position: {x: -0.00000006984919, y: -0.000027435564, z: -0.000000013395038} - m_Rotation: {x: -0.00012683493, y: 0.0000002009328, z: 0.000000033527606, w: -1} - m_Scale: {x: 1.0001968, y: 1.0035329, z: 1.0035328} - - m_Name: RightLowCheek - m_ParentName: - m_Position: {x: -0.030948676, y: 0.03773913, z: 0.10849106} - m_Rotation: {x: -0.6591185, y: 0.2391581, z: 0.670226, w: -0.24323557} - m_Scale: {x: 0.9999996, y: 0.9999999, z: 0.9999998} - - m_Name: RightLowCheekAdjust - m_ParentName: - m_Position: {x: -0.00027455867, y: 0.000000007450581, z: 0.01600009} - m_Rotation: {x: -0.000000044703473, y: -0.000000081956365, z: -0.00000020861621, - w: 1} - m_Scale: {x: 1.000002, y: 1.0000021, z: 1.0000013} - - m_Name: RightNose - m_ParentName: - m_Position: {x: -0.05766228, y: 0.02632502, z: 0.103262894} - m_Rotation: {x: 0.70887077, y: -0.001181514, z: -0.7053235, w: -0.004424751} - m_Scale: {x: 0.99999946, y: 0.9999998, z: 0.9999998} - - m_Name: RightNoseAdjust - m_ParentName: - m_Position: {x: -0.00004905082, y: -0.000000016385457, z: 0.000048823622} - m_Rotation: {x: -0.000002485234, y: 0.000000023964272, z: -0.000000041269228, - w: -1} - m_Scale: {x: 1.0000001, y: 1.0000005, z: 1.0000001} - - m_Name: UpperLips - m_ParentName: - m_Position: {x: -0.044395097, y: -0.00009391423, z: 0.11719049} - m_Rotation: {x: 0.7071071, y: 0.00000005338665, z: -0.7071065, w: 0.000000053386696} - m_Scale: {x: 0.99999994, y: 0.99999994, z: 0.99999994} - - m_Name: UpperLipsAdjust - m_ParentName: - m_Position: {x: -0.000000013031427, y: -3.49e-13, z: 0.000008992247} - m_Rotation: {x: -0.00000015128457, y: -0.000000059604616, z: -0.00000018214733, - w: -1} - m_Scale: {x: 1.0000002, y: 1, z: 1} - - m_Name: NeckAdjust - m_ParentName: - m_Position: {x: -0.035558783, y: 0.000000002684608, z: 0.000000070780516} - m_Rotation: {x: 0.00000041689458, y: 0.000000029802319, z: -0.00000014157611, - w: 1} - m_Scale: {x: 1.0000002, y: 0.9402967, z: 0.91037256} - - m_Name: RightOuterBreast - m_ParentName: - m_Position: {x: -0.043685723, y: 0.06515683, z: 0.115223125} - m_Rotation: {x: -0.12444717, y: 0.7023361, z: -0.116329774, w: 0.69116163} - m_Scale: {x: 1.0062851, y: 1.006285, z: 1.0062854} - - m_Name: RightInnerBreast - m_ParentName: - m_Position: {x: -0.058503173, y: 0.000000007450581, z: -0.00000013026875} - m_Rotation: {x: -0.025524477, y: -0.0444962, z: -0.0058081434, w: 0.9986666} - m_Scale: {x: 1.0000006, y: 1.0000004, z: 1.0000006} - - m_Name: RightShoulder - m_ParentName: - m_Position: {x: -0.18975337, y: 0.05661986, z: 0.0033298077} - m_Rotation: {x: 0.039255124, y: 0.03201982, z: 0.8036261, w: -0.59297466} - m_Scale: {x: 1.000001, y: 1.000001, z: 1.0000001} - - m_Name: RightArm - m_ParentName: - m_Position: {x: -0.16176583, y: -0.00006621634, z: 0.000022994354} - m_Rotation: {x: 0.023624524, y: 0.0479611, z: 0.1251226, w: 0.99069977} - m_Scale: {x: 1.0629773, y: 1.0629772, z: 1.0629762} - - m_Name: RightArmAdjust - m_ParentName: - m_Position: {x: -0.069490775, y: 0.00000030826777, z: -0.00000016763806} - m_Rotation: {x: -0.23796001, y: 0.000000055879347, z: -0.0000003056775, w: 0.971275} - m_Scale: {x: 1, y: 0.97192365, z: 0.9719234} - - m_Name: RightForeArm - m_ParentName: - m_Position: {x: -0.2779641, y: -0.000000018626451, z: 0.00000000372529} - m_Rotation: {x: -0.04411956, y: 0.041526236, z: 0.033263754, w: 0.9976084} - m_Scale: {x: 1.0078583, y: 1.0078588, z: 1.0078588} - - m_Name: RightForeArmAdjust - m_ParentName: - m_Position: {x: -0.035068974, y: -0.00000021187589, z: -0.00000010803342} - m_Rotation: {x: -0.00000018626449, y: 0.00000002235174, z: -0.000000061932944, - w: 1} - m_Scale: {x: 1.0000005, y: 1.0012747, z: 1.0012745} - - m_Name: RightForeArmTwist - m_ParentName: - m_Position: {x: -0.14027604, y: -0.00000036379788, z: -0.000000063329935} - m_Rotation: {x: -0.0000003613531, y: 0.000000029802319, z: -0.000000020954756, - w: 1} - m_Scale: {x: 0.9999999, y: 1.0000002, z: 0.9999999} - - m_Name: RightForeArmTwistAdjust - m_ParentName: - m_Position: {x: -0.03506889, y: -0.00000013626413, z: -0.000000020489097} - m_Rotation: {x: 0.00000009313224, y: 0.000000007450594, z: -0.00000003306194, - w: 1} - m_Scale: {x: 1.0000006, y: 1.0006868, z: 1.0006864} - - m_Name: RightHand - m_ParentName: - m_Position: {x: -0.28055203, y: -0.00000019872095, z: 0.000000020489097} - m_Rotation: {x: 0.72038645, y: 0.0045559406, z: -0.016480954, w: 0.6933622} - m_Scale: {x: 0.9291198, y: 0.92912, z: 0.9291198} - - m_Name: RightHandFinger01_01 - m_ParentName: - m_Position: {x: -0.086030155, y: -0.035094876, z: -0.008257229} - m_Rotation: {x: 0.21294314, y: -0.021714322, z: 0.004175842, w: 0.9768144} - m_Scale: {x: 1.0000004, y: 1.0000007, z: 1.0000006} - - m_Name: RightHandFinger01_02 - m_ParentName: - m_Position: {x: -0.040974, y: -0.000000044703484, z: 0.000000055879354} - m_Rotation: {x: -0.0150128715, y: -0.037432693, z: 0.004991034, w: 0.999174} - m_Scale: {x: 1.0000007, y: 1.0000004, z: 1.000001} - - m_Name: RightHandFinger01_03 - m_ParentName: - m_Position: {x: -0.02452468, y: 0.000000037252903, z: -0.00000009685755} - m_Rotation: {x: 0.031532526, y: -0.047115006, z: -0.003371842, w: 0.99838597} - m_Scale: {x: 1.0000005, y: 1.0000006, z: 0.99999976} - - m_Name: RightHandFinger02_01 - m_ParentName: - m_Position: {x: -0.09333068, y: -0.014842848, z: 0.001449341} - m_Rotation: {x: 0.1464563, y: -0.04240491, z: -0.009140864, w: 0.9882656} - m_Scale: {x: 0.9999995, y: 1, z: 0.9999999} - - m_Name: RightHandFinger02_02 - m_ParentName: - m_Position: {x: -0.042821966, y: -0.000000014901161, z: -0.000000044703484} - m_Rotation: {x: -0.0051184003, y: -0.039652158, z: -0.0020092607, w: 0.99919844} - m_Scale: {x: 1.000001, y: 1.0000007, z: 1.000001} - - m_Name: RightHandFinger02_03 - m_ParentName: - m_Position: {x: -0.035355955, y: 0, z: 0.00000014714897} - m_Rotation: {x: -0.0078114183, y: -0.07866921, z: 0.0011297686, w: 0.99686956} - m_Scale: {x: 1.0000006, y: 0.9999998, z: 1.0000007} - - m_Name: RightHandFinger03_01 - m_ParentName: - m_Position: {x: -0.09688466, y: 0.012628757, z: 0.004193769} - m_Rotation: {x: 0.079227865, y: -0.047999866, z: -0.015272714, w: 0.9955832} - m_Scale: {x: 1.0000007, y: 1.0000004, z: 1.0000006} - - m_Name: RightHandFinger03_02 - m_ParentName: - m_Position: {x: -0.05342067, y: -0.000000022351742, z: 0.000000056810677} - m_Rotation: {x: -0.0093751, y: -0.036781717, z: 0.0147884125, w: 0.9991699} - m_Scale: {x: 0.9999998, y: 0.99999994, z: 0.99999917} - - m_Name: RightHandFinger03_03 - m_ParentName: - m_Position: {x: -0.042907912, y: 0.000000018626451, z: -0.00000012479722} - m_Rotation: {x: -0.017374245, y: -0.04760415, z: -0.017481765, w: 0.9985622} - m_Scale: {x: 0.9999998, y: 0.99999946, z: 1.0000002} - - m_Name: RightHandFinger04_01 - m_ParentName: - m_Position: {x: -0.09379445, y: 0.0395091, z: 0.0025051245} - m_Rotation: {x: 0.036175013, y: -0.024784617, z: -0.03544047, w: 0.99840933} - m_Scale: {x: 1.0000007, y: 1.0000006, z: 1.0000005} - - m_Name: RightHandFinger04_02 - m_ParentName: - m_Position: {x: -0.060065866, y: -0.000000011175871, z: -0.000000070314854} - m_Rotation: {x: -0.0015665218, y: -0.039195575, z: -0.0035614849, w: 0.99922407} - m_Scale: {x: 1.0000012, y: 1.0000005, z: 1.0000007} - - m_Name: RightHandFinger04_03 - m_ParentName: - m_Position: {x: -0.03607316, y: -0.000000007450581, z: -0.000000004190952} - m_Rotation: {x: 0.0020313761, y: -0.072688654, z: 0.0070823417, w: 0.9973275} - m_Scale: {x: 1.0000002, y: 1, z: 0.9999997} - - m_Name: RightHandFinger05_01 - m_ParentName: - m_Position: {x: -0.038593143, y: 0.041314624, z: -0.013678891} - m_Rotation: {x: -0.46069258, y: 0.16832037, z: -0.39540824, w: 0.7765842} - m_Scale: {x: 1.0000013, y: 1.000001, z: 1.0000002} - - m_Name: RightHandFinger05_02 - m_ParentName: - m_Position: {x: -0.03329902, y: 0.000000015366822, z: -0.00000004284084} - m_Rotation: {x: 0.04481694, y: -0.020407852, z: 0.021573808, w: 0.99855375} - m_Scale: {x: 1.0000005, y: 1.000001, z: 1.0000001} - - m_Name: RightHandFinger05_03 - m_ParentName: - m_Position: {x: -0.038922727, y: -0.000000038882717, z: 0.000000003026798} - m_Rotation: {x: -0.0256544, y: -0.031652726, z: 0.02530853, w: 0.9988491} - m_Scale: {x: 1.0000006, y: 1, z: 1.0000005} - - m_Name: RightShoulderAdjust - m_ParentName: - m_Position: {x: -0.040425763, y: 0.00000008009374, z: -0.000000029802322} - m_Rotation: {x: -0.14658868, y: 0.000000067055225, z: 0.000000004656613, w: 0.98919755} - m_Scale: {x: 1.0000012, y: 1.0056945, z: 1.0056937} - - m_Name: RightTrapezius - m_ParentName: - m_Position: {x: -0.034978125, y: -0.037129283, z: -0.03650741} - m_Rotation: {x: 0.6946836, y: 0.069688484, z: -0.14096293, w: -0.7019172} - m_Scale: {x: 1.0106096, y: 1.0106097, z: 1.0106091} - - m_Name: Spine1Adjust - m_ParentName: - m_Position: {x: -0.041975934, y: 0.000000003169064, z: -0.000000011823658} - m_Rotation: {x: 5.6843412e-14, y: 0.0000000074505797, z: 0.000000014901156, - w: 1} - m_Scale: {x: 1.0000005, y: 0.9010593, z: 0.70123535} - - m_Name: SpineAdjust - m_ParentName: - m_Position: {x: -0.037511554, y: 0.000000002876673, z: -0.00009686686} - m_Rotation: {x: -0.00000006253777, y: 0, z: -0.000000023019917, w: 1} - m_Scale: {x: 1.0000008, y: 0.90141255, z: 0.80094117} - - m_Name: RightUpLeg - m_ParentName: - m_Position: {x: 0.01758384, y: 0.10126295, z: 0.0031659142} - m_Rotation: {x: 0.055798277, y: -0.07043252, z: -0.9958723, w: -0.01281313} - m_Scale: {x: 1.0000005, y: 1.0000007, z: 0.99999994} - - m_Name: RightGluteus - m_ParentName: - m_Position: {x: -0.000000059058948, y: 0.000000002328306, z: -0.000000055879354} - m_Rotation: {x: 0.08551739, y: 0.883858, z: -0.03758245, w: -0.45833328} - m_Scale: {x: 0.5275694, y: 0.52756906, z: 0.52756906} - - m_Name: RightLeg - m_ParentName: - m_Position: {x: -0.4319558, y: 0.000000024680048, z: 9.31323e-10} - m_Rotation: {x: 0.043845, y: -0.04039296, z: 0.02175176, w: 0.9979844} - m_Scale: {x: 0.99999994, y: 1.0000001, z: 1.0000001} - - m_Name: RightFoot - m_ParentName: - m_Position: {x: -0.4757285, y: 0.0000005217734, z: 0.000002105953} - m_Rotation: {x: 0.8375387, y: -0.036570527, z: -0.52910906, w: 0.13128255} - m_Scale: {x: 0.85825455, y: 0.85825485, z: 0.85825473} - - m_Name: RightToeBase - m_ParentName: - m_Position: {x: -0.18387152, y: -0.000000008847564, z: 0} - m_Rotation: {x: 0.062466748, y: -0.20674692, z: 0.023633018, w: 0.97611225} - m_Scale: {x: 1.0000006, y: 1.0000004, z: 1.0000005} - - m_Name: RightLegAdjust - m_ParentName: - m_Position: {x: -0.11892757, y: 0.000000030267984, z: -0.000000029802322} - m_Rotation: {x: 0.000000096857555, y: -0.0000000037252907, z: 0.000000011525118, - w: 1} - m_Scale: {x: 1.0000007, y: 1.0386355, z: 1.0190154} - - m_Name: RightUpLegAdjust - m_ParentName: - m_Position: {x: -0.10798966, y: 0.000000048195943, z: -0.0000002104789} - m_Rotation: {x: 0.03335002, y: -0.000000042840842, z: -0.000000021886082, w: 0.99944377} - m_Scale: {x: 0.99999976, y: 0.90615094, z: 0.90615165} - m_ArmTwist: 0.5 - m_ForeArmTwist: 0.5 - m_UpperLegTwist: 0.5 - m_LegTwist: 0.5 - m_ArmStretch: 0.05 - m_LegStretch: 0.056 - m_FeetSpacing: 0 - m_GlobalScale: 0 - m_RootMotionBoneName: - m_HasTranslationDoF: 0 - m_HasExtraRoot: 0 - m_SkeletonHasParents: 0 ---- !u!84 &1055940522 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 'UMA_Diffuse_Normal_Metallic Chan 2 frame: 58' - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - serializedVersion: 3 - m_Width: 2048 - m_Height: 2048 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthFormat: 0 - m_ColorFormat: 8 - m_MipMap: 1 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 1 - m_MipBias: 0 - m_WrapU: 0 - m_WrapV: 0 - m_WrapW: 0 - m_Dimension: 2 - m_VolumeDepth: 1 --- !u!1 &1061078474 GameObject: m_ObjectHideFlags: 0 @@ -9397,6 +3391,7 @@ MonoBehaviour: m_FallbackScreenDPI: 96 m_DefaultSpriteDPI: 96 m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 --- !u!223 &1061078477 Canvas: m_ObjectHideFlags: 0 @@ -9461,8 +3456,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1066984001} - m_LocalRotation: {x: -0.49723658, y: 0.0000001825391, z: 0.86761504, w: 0.00000010523937} - m_LocalPosition: {x: -0.044175908, y: -0.000093923605, z: 0.053631864} + m_LocalRotation: {x: -0.49723655, y: 0.00000016321414, z: 0.867615, w: 0.00000010186332} + m_LocalPosition: {x: -0.044175874, y: -0.00009392645, z: 0.053631864} m_LocalScale: {x: 1.0006866, y: 1.000687, z: 1.0006868} m_Children: - {fileID: 1461285710} @@ -9500,8 +3495,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1078680524} - m_LocalRotation: {x: -0.025889644, y: -0.13455741, z: -0.020687867, w: 0.9903515} - m_LocalPosition: {x: -0.10225483, y: 0.000000008408767, z: -0.000000013664287} + m_LocalRotation: {x: -0.025036018, y: -0.1345574, z: -0.021713216, w: 0.99035156} + m_LocalPosition: {x: -0.10225476, y: 0.0000000073997164, z: -0.000000003699869} m_LocalScale: {x: 1.0078583, y: 1.0078585, z: 1.007859} m_Children: - {fileID: 119981100} @@ -9678,8 +3673,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1095707859} - m_LocalRotation: {x: 0.8192223, y: 0.0651346, z: -0.56743413, w: -0.051486395} - m_LocalPosition: {x: -0.479926, y: 0.000000066006564, z: -0.000000008250836} + m_LocalRotation: {x: 0.8194815, y: 0.052928604, z: -0.5679517, w: -0.055494685} + m_LocalPosition: {x: -0.4798741, y: 0.000000058079486, z: -0.000000010889922} m_LocalScale: {x: 0.858255, y: 0.858255, z: 0.858255} m_Children: - {fileID: 406397463} @@ -9740,8 +3735,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1112687035} - m_LocalRotation: {x: -0.19666226, y: -0.19859937, z: 0.010263202, w: 0.9600922} - m_LocalPosition: {x: -0.09333044, y: 0.014843234, z: 0.0014490325} + m_LocalRotation: {x: -0.19666234, y: -0.19859934, z: 0.010263217, w: 0.9600922} + m_LocalPosition: {x: -0.09333043, y: 0.014843235, z: 0.0014490215} m_LocalScale: {x: 1.0000001, y: 1.0000004, z: 1.0000008} m_Children: - {fileID: 15965880} @@ -9802,48 +3797,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1130675998} - m_LocalRotation: {x: 0.006531234, y: -0.21526632, z: -0.14870104, w: 0.9651454} - m_LocalPosition: {x: -0.038922463, y: 0.000000010559594, z: -0.00000007391738} + m_LocalRotation: {x: 0.006531201, y: -0.21526633, z: -0.14870104, w: 0.96514547} + m_LocalPosition: {x: -0.038922485, y: 0.00000011522631, z: -0.000000048320853} m_LocalScale: {x: 1.0000005, y: 0.9999999, z: 0.99999994} m_Children: [] m_Father: {fileID: 1853417510} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!84 &1145242871 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 'UMA_Diffuse_Normal_Metallic Chan 1 frame: 58' - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - serializedVersion: 3 - m_Width: 2048 - m_Height: 2048 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthFormat: 0 - m_ColorFormat: 8 - m_MipMap: 1 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 1 - m_MipBias: 0 - m_WrapU: 0 - m_WrapV: 0 - m_WrapW: 0 - m_Dimension: 2 - m_VolumeDepth: 1 --- !u!1 &1145810085 GameObject: m_ObjectHideFlags: 0 @@ -9898,8 +3858,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1163367683} - m_LocalRotation: {x: -0.058843095, y: 0.1982322, z: -0.018510755, w: -0.9782121} - m_LocalPosition: {x: -0.03607328, y: -0.000000008447658, z: 0.00000004540634} + m_LocalRotation: {x: -0.05884298, y: 0.19823216, z: -0.018510845, w: -0.9782121} + m_LocalPosition: {x: -0.03607329, y: -0.000000013009394, z: -0.000000057613263} m_LocalScale: {x: 1.0000002, y: 1, z: 0.9999997} m_Children: [] m_Father: {fileID: 122230097} @@ -9928,8 +3888,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1190706977} - m_LocalRotation: {x: -0.02535897, y: 0.27393585, z: -0.0050094556, w: -0.9614005} - m_LocalPosition: {x: -0.04290803, y: 0.000000022175119, z: -0.000000093980695} + m_LocalRotation: {x: -0.025358893, y: 0.2739358, z: -0.0050094407, w: -0.9614005} + m_LocalPosition: {x: -0.04290795, y: 0.000000026948053, z: -0.00000012544841} m_LocalScale: {x: 0.9999998, y: 0.99999946, z: 1.0000002} m_Children: [] m_Father: {fileID: 1976673006} @@ -9978,17 +3938,20 @@ Texture2D: Hash: 00000000000000000000000000000000 m_ForcedFallbackFormat: 4 m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 serializedVersion: 2 m_Width: 128 m_Height: 128 m_CompleteImageSize: 65536 + m_MipsStripped: 0 m_TextureFormat: 5 m_MipCount: 1 m_IsReadable: 1 - m_IgnoreMasterTextureLimit: 0 m_IsPreProcessed: 0 + m_IgnoreMasterTextureLimit: 0 m_StreamingMipmaps: 0 m_StreamingMipmapsPriority: 0 + m_VTOnly: 0 m_AlphaIsTransparency: 0 m_ImageCount: 1 m_TextureDimension: 2 @@ -10002,9 +3965,11 @@ Texture2D: m_WrapW: 1 m_LightmapFormat: 0 m_ColorSpace: 1 + m_PlatformBlob: image data: 65536 _typelessdata: 001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f11001a0f1000190e0f00190e0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a001608090015080800150708001506070014060600140506001305050013040400130404001203030012020200120202001101010011010000110000001000000010000000100000000f0000000f0000000e0000000e0000000e0000000e0000000f0000000f0000001000000010000000110000001100000012010000120100001302010014030200140402001504030015050400160605001607050017070600170807001809070019090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001e100f001e110f001f1210001f121100201312002014120021141300221514002216140023171500231716002418170024191700251a1800251a1900261b1900271c1a00271d1b00281d1c00281e1c00291f1d0029201e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00352e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f11001a0f1000190e0f00190e0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0016080900150808001507080015060700140606001405060013050500130404001304040012030300120202001202020011010100110100001100000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000001000000010000000110000001100000012010000120100001302010014030200140402001504030015050400160605001607050017070600170807001809070019090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001e100f001e110f001f1210001f121100201312002014120021141300211514002216140023171500231716002418170024191700251a1800251a1900261b1900271c1a00271d1b00281d1c00281e1c00291f1d0029201e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00352e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0016080900150808001507080014060700140606001405060013050500130404001304040012030300120202001202020011010100110100001100000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000001000000010000000110000001100000012010000120100001302010013030200140402001504030015050400160605001607050017070600170807001809070019090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001e100f001e110f001f1210001f121100201312002014120021141300211514002216140023171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0016080900150808001507080014060700140606001405060013050500130404001304040012030300120202001202020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000001000000010000000110000001100000012010000120100001302010013030200140402001504030015050400160605001607050017070600170807001809070018090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001f1210001f121100201312002014120021141300211514002216140023171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002c2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001f1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001303040012030300120202001202020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000000f00000010000000110000001100000012010000120100001302010013030200140402001504030015050400160605001607050017070600170807001809070018090800190a09001a0b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001f1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001b1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00170a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001303040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000e0000000e0000000f0000000f00000010000000110000001100000012010000120100001302010013030200140402001404030015050400160605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001f1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00281d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260031292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001303040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000110000001100000012010000120100001302010013030200140402001404030015050400160605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322b2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001203040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000012010000120100001302010013030200140402001404030015050400150605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001b0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f121100201312002014120021141300211514002216140022171500231716002418170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002d2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001c1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00180c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001405060013050500130404001203040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000012010000120100001302010013030200140402001404030015050400150605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f121100201312002014120021141300211514002216140022171500231716002318170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a0015080900150808001507080014060700140606001305060013050500130404001203040012030300120202001102020011010100110100001000000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000011010000120100001302010013030200140402001404030015050400150605001607050017070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00291f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080015070800140607001406060013050600130505001304040012030400120303001202020011020200110101001101000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000011010000120100001302010013030200140402001404030015050400150605001607050016070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001c0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700251a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00190d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080015070800140607001406060013050600130505001304040012030400120303001202020011020200110101001101000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000e0000000e0000000f0000000f00000010000000100000001100000011010000120100001302010013030200140402001404030015050400150605001607050016070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001202020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000e0000000f0000000f00000010000000100000001100000011010000120100001202010013030200140402001404030015050400150605001607050016070600170807001809070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120021141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800322a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001202020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000e0000000f0000000f00000010000000100000001100000011010000120100001202010013030200140402001404030015050400150605001606050016070600170807001709070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001d0f0e001d100f001e110f001e1210001f1211001f1312002014120020141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e002a201e002a211f002b2220002b2221002c2321002c2422002d2523002e2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0036302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001d1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0016090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000e0000000e0000000f00000010000000100000001100000011010000120100001202010013030200140402001404030015050400150605001606050016070600170807001709070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001e110f001e1210001f1211001f1312002014120020141300211514002216140022171500231716002318170024191700241a1800251a1900261b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a1011001a0f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f00000010000000100000001100000011010000120100001202010013030200130402001404030015050400150605001606050016070600170807001709070018090800190a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001e110f001e1110001f1211001f1312002014120020141300211514002216140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001304040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f00000010000000100000001100000011010000120100001202010013030200130402001404030015050400150605001606050016070600170807001709070018090800180a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001e110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00170b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001204040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001100000011010000120100001202010013030200130402001404030014050400150605001606050016070600170807001709070018090800180a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00160b0c00160a0b0016090a0015090a00150809001508080014070800140607001406060013050600130505001204040012030400120303001102020011020200110101001001000010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001100000011010000120100001202010013030200130402001404030014050400150605001606050016070600170807001709070018090800180a0900190b0a001a0c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00271d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002b2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00160b0c00160a0b0016090a0015090a001508090015080800140708001406070013060600130506001305050012040400120304001203030011020200110202001101010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001100000011010000120100001202010013030200130402001404030014050400150605001606050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500231716002318170024191700241a1800251a1900251b1900261c1a00261d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002f2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f00373230003833300038333100393432003a3533003a3633001e1719001e1619001e1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001b1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00180c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090015080800140708001406070013060600130506001305050012040400120304001203030011020200110202001101010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000120100001202010013030200130402001404030014050400150605001506050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001f1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261d1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090015080800140708001406070013060600130506001305050012040400120304001203030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000120100001202010013030200130402001404030014050400150605001506050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001b0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261c1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001203030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000110100001202010013030200130402001404030014050400150605001506050016070600170807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261c1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900332c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001203030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000110100001202010013030200130402001404030014050400150605001506050016070600160807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312002014120020141300211514002116140022171500221716002318170024191700241a1800251a1900251b1900261c1a00261c1b00271d1c00281e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000d0000000e0000000e0000000f0000000f000000100000001000000011010000110100001202010013030200130402001404030014050400150605001506050016070600160807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001c0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002c2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000190e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0016090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000f0000000f000000100000001000000011010000110100001202010012030200130402001404030014050400150605001506050016070600160807001709070018090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001c1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a001508090014080800140708001406070013060600130506001305050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000f0000000f000000100000001000000011010000110100001202010012030200130402001404030014050400150605001506050016070600160807001709070017090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a001508090014080800140708001406070013060600130506001205050012040400120304001103030011020200110202001001010010000000100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000e0000000f000000100000001000000011010000110100001202010012030200130302001404030014050400150605001506050016070600160807001709070017090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001d100f001d110f001e1110001e1211001f1312001f14120020141300211514002116140022171500221716002318170023191700241a1800251a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826003028260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1517001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080014060700130606001305060012050500120404001203040011030300110202001102020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000e0000000f000000100000001000000011010000110100001202010012030200130302001304030014050400150605001506050016070600160807001709070017090800180a0900190b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001c100f001d110f001e1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00291f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00170b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080014060700130606001305060012050500120404001203040011030300110202001102020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000d0000000d0000000e0000000e0000000f000000100000001000000011010000110100001202010012030200130302001304030014050400150605001506050016070600160807001709070017090800180a0900180b0a00190c0a001a0c0b001a0d0c001b0e0c001b0f0d001c0f0e001c100f001d110f001e1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a1012001a101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080013060700130606001305060012050500120404001203040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000011010000110100001202010012030200130302001304030014050400140605001506050016070600160807001709070017090800180a0900180b0a00190c0a001a0c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001e1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002d2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080013060700130606001305060012050500120404001203040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000011010000110100001202010012030200130302001304030014050400140605001506050016070600160807001709070017090800180a0900180b0a00190c0a001a0c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140022171500221716002318170023191700241a1800241a1900251b1900261c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0037312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0015080900140808001407080013060700130606001305060012050500120404001203040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001202010012030200130302001304030014050400140605001506050016070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00180d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140808001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001202010012030200130302001304030014050400140605001506050015070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e002a211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001d1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140808001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000d0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001202010012030200130302001304030014050400140605001506050015070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001b0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001f1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2826002f28260030292700312a2800312a2900322b2900322c2a00332d2b00342d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140808001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001102010012030200130302001304030014050400140605001506050015070600160807001709070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f14120020141300201514002116140021171500221716002318170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700312a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001b1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00160a0b0015090a0015090a0014080900140708001407080013060700130606001305060012050500120404001103040011030300110202001002020010010100100000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001102010012030200130302001304030014050400140605001506050015070600160807001609070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f14120020141300201514002116140021171500221716002218170023191700241a1800241a1900251b1900251c1a00261c1b00271d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700312a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080014070800130607001306060012050600120505001204040011030400110303001102020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000d0000000e0000000e0000000f0000000f0000001000000010010000110100001102010012030200130302001304030014050400140605001506050015070600160807001609070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f1412002014130020151400211614002117150022171600221817002319170024191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080014070800130607001306060012050600120505001204040011030400110303001102020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f0000001000000010010000110100001102010012030200120302001304030014050400140605001506050015070600160807001609070017090800180a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001c0f0e001c100f001d110f001d1110001e1211001e1312001f1412002014130020151400211614002117150022171600221817002319170024191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002e2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100190f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080014070800130607001306060012050600120505001204040011030400110303001102020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f0000001000000010010000110100001102010012030200120302001304030014050400140605001506050015070600160807001609070017090800170a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001d110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170024191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001204040011030400110303001002020010020200100101000f0000000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000001000000010010000110100001102010012030200120302001304030014050400140605001506050015070600160807001609070017090800170a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001d110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002b2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00170c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001204040011030400110303001002020010020200100101000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000001000000010000000110100001102010012030200120302001304030013050400140605001506050015070600160807001609070017090800170a0900180b0a00190c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001d110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001204040011030400110303001002020010020200100101000f0000000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000001000000010000000110100001102010012030200120302001304030013050400140605001506050015070600160807001609070017090800170a0900180b0a00180c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400211614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00281f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0015090a00140809001407080013070800130607001306060012050600120505001104040011030400110303001002020010020200100101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000110100001102010012030200120302001304030013050400140605001406050015070600160807001609070017090800170a0900180b0a00180c0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a00140809001407080013070800130607001306060012050600120505001104040011030400110303001002020010020200100101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000110100001102010012030200120302001304030013050400140605001406050015070600160807001609070017090800170a0900180b0a00180b0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900251b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001e1619001d1618001d1517001c1417001c1416001c1315001b1315001b1214001a1213001a1113001a10120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a00140809001407080013070800130607001306060012050600120505001104040011030400110303001002020010020200100101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010012030200120302001304030013050400140605001406050015070600160807001609070017090800170a0900180b0a00180b0a00190c0b001a0d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001e1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1213001a1113001910120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a001408090014070800130708001306070013060600120506001205050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010012030200120302001304030013050400140605001406050015070600150807001609070017090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150022171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002f2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1213001a1113001910120019101100190f1100180f1000180e0f00180d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001205050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010012030200120302001304030013050400140605001406050015070600150807001609070017090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002c2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900322b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1213001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00160a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001205050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010011030200120302001304030013050400140605001406050015070600150807001609070017090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001b0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0029201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001204050011040400110304001103030010020200100202000f0101000f0000000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000e0000000e0000000f0000000f00000010000000100100001102010011030200120302001304030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001f1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00261c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090014070800130708001306070012060600120506001204050011040400110304001003030010020200100202000f0101000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f00000010000000100100001102010011030200120302001304030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00352f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001204050011040400110304001003030010020200100202000f0101000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f00000010000000100100001102010011030200120302001204030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002117150021171600221817002319170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001204050011040400110304001003030010020200100202000f0101000f0000000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000c0000000c0000000d0000000d0000000e0000000f0000000f00000010000000100100001102010011030200120302001204030013050400140605001406050015070600150807001609070016090800170a0900180b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001c100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001104050011040400110304001003030010020200100202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f00000010000000100100001102010011030200120302001204030013050400130605001406050015070600150807001609070016090800170a0900170b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f14130020151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001b1214001a1113001a1113001910120019101100190f1100180f1000180e0f00170d0f00170d0e00170c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001104050011040400110304001003030010020200100202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f00000010000000100100001102010011030200120302001204030013050400130605001406050015070600150807001609070016090800170a0900170b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f002a2220002a2221002b2321002b2422002c2523002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0015090a0014090a001408090013070800130708001306070012060600120506001104050011040400110304001003030010020200100202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001102010011030200120302001204030013050400130605001406050015070600150807001609070016090800170a0900170b0a00180b0a00190c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00271e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002d2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001d1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080013060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001102010011030200120302001204030013050400130605001406050014070600150807001609070016090800170a0900170b0a00180b0a00180c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001d1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800241a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080013060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001102010011030200120302001204030013050400130605001406050014070600150807001608070016090800170a0900170b0a00180b0a00180c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f28260030292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200120302001204030013050400130605001406050014070600150807001608070016090800170a0900170b0a00180b0a00180c0b00190d0c001a0e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002116150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001103040010030300100202000f0202000f0101000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200120302001204030013050400130605001406050014070600150807001608070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0202000f0101000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200120302001204030013050400130605001406050014070600150807001508070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001e1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000180e0f00170d0f00170d0e00160c0e00160c0d00160b0c00150a0c00150a0b0014090a0014090a0014080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0202000f0101000f0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200110302001204030013050400130605001406050014070600150807001508070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00281f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00332d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a1113001a1113001910120019101100180f1100180f1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f000000100100001002010011030200110302001204030013050400130605001406050014070600150807001508070016090800170a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001b0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600221817002219170023191800231a1900241b1900251c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002b2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000383330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180f1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001205060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f000000100100001002010011030200110302001204030013050400130605001406050014070600150807001508070016090800160a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001105060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f000000100100001002010011030200110302001204030012050400130605001406050014070600150807001508070016090800160a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1412001f1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002e2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a0013080900130708001307080012060700120606001105060011040500110404001003040010030300100202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f000000100100001002010011030200110302001204030012050400130605001406050014070600150807001508070016090800160a0900170b0a00180b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001c1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a00130809001307080013070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f000000100100001002010011030200110302001204030012050400130605001406050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001c110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00150a0b0014090a0014090a00130809001307080013070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f000000100100001002010011030200110302001204030012050400130605001306050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00170d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080013070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010011030200110302001204030012050400130605001306050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170023191800231a1900241b1900241c1a00251c1b00261d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120019101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001104040010030400100303000f0202000f0102000f0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010011030200110302001204030012050400130605001306050014070600150807001508070016090800160a0900170b0a00170b0a00180c0b00190d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f151400201614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0029211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000f0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010011030200110302001204030012050400130605001306050014070600140807001508070016090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001d1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292220002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800312a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001204030012050400130505001306050014070600140807001508070016090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002c2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001204030012050400130505001306050014070600140807001508070016090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c001a0e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001e1719001d1619001d1618001c1517001c1417001b1416001b1315001b1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0014090a00130809001307080012070800120607001206060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001204030012050400130505001306050014070600140807001508070015090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00160c0d00150b0c00150a0c00140a0b0014090a0013090a00130809001307080012070800120607001106060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001104030012050400130505001306050014070600140807001508070015090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150021171600211817002219170022191800231a1900241b1900241c1a00251c1b00251d1c00261e1c00271f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0036302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00150c0d00150b0c00150a0c00140a0b0014090a0013090a00130809001307080012070800120607001106060011050600110405001004040010030400100303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0000000f0100001002010010030200110302001104030012050400130505001306050014070600140807001508070015090800160a0900170b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001e1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100180e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f0100001002010010030200110302001104030012050400130505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001b100f001b110f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002f2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0000000f0100001002010010030200110302001104030012050400120505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b110f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f00292120002a2221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100001002010010030200110302001104030012050400120505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090013070800120708001206070011060600110506001104050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100001002010010030200110302001104030012050400120505001306050014070600140807001508070015090800160a0900160b0a00170b0a00180c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001f1514001f1614002016150020171600211817002219170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a1214001a111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00150a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000f0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100001002010010030200110302001104030012050400120505001306050013070600140807001508070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00251c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200110302001104030012050400120505001306050013070600140807001508070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001c1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002d2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00342e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001d1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00170d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200110302001104030012050400120505001306050013070600140807001508070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0028201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200110302001104030012050400120505001306050013070600140807001408070015090800160a0900160b0a00170b0a00170c0b00180d0c00190e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001206070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010030200100302001104030012050400120505001306050013070600140807001408070015090800160a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261f1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0014090a0013090a001308090012070800120708001106070011060600110506001004050010040400100304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000b0000000b0000000c0000000d0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030012050400120505001306050013070600140807001408070015090800160a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001d1312001d1312001e1413001e1514001f1614002016150020171600211817002119170022191800231a1900231b1900241c1a00241c1b00251d1c00261e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001910120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0013090a0013090a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000e0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030012050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00261e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002b2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900322c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030011050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d001a0f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00261e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00160c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000e0000000e0000000f0100000f02010010020200100302001104030011050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001c1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0100000f02010010020200100302001104030011050400120505001306050013070600140807001408070015090800150a0900160b0a00170b0a00170c0b00180d0c00180e0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001105060010040500100404000f0304000f0303000f0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000f0100000f02010010020200100302001104030011050400120505001206050013070600140807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180e0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001e1413001e1514001f1614001f16150020171600211817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f292700302a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0013080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000d0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f02010010020200100302001104030011050400120505001206050013070600140807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180d0c00190e0d00190f0e001a100f001b100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0029212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100180f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f02010010020200100302001104030011050400120505001206050013070600140807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900241c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00150b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f02010010020200100302001104030011050400120505001206050013070600130807001408070015090800150a0900160b0a00160b0a00170c0b00180d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002e2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001b1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000b0000000a0000000a0000000a0000000b0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001104030011050400120505001206050013070600130807001408070015090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001a1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a0012080900120708001207080011060700110606001005060010040500100404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001104030011050400120505001206050013070600130807001408070015090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001f1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00271f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001a1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a00120809001207080012070800110607001105060010050600100405000f0404000f0304000f0303000e0202000e0102000e0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000a0000000a0000000b0000000c0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001104030011050400120505001206050013070600130807001408070014090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001c1211001c1312001d1312001d1413001e1514001e1614001f16150020171600201817002119170022191800221a1900231b1900231c1a00241c1b00251d1c00251e1c00261e1d00261f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633001d1719001d1619001c1618001c1517001b1417001b1416001a1315001a1315001a12140019111300191113001810120018101100170f1100170e1000170e0f00160d0f00160d0e00150c0e00150b0d00140b0c00140a0c00140a0b0013090a0013080a00120809001207080011070800110607001105060010050600100405000f0404000f0304000f0303000e0202000e0102000d0101000d0000000d0000000c0000000c0000000c0000000b0000000b0000000a0000000a0000000a0000000a0000000a0000000b0000000b0000000c0000000d0000000d0000000e0000000e0100000f0201000f020200100302001004030011050400120505001206050013070600130807001408070014090800150a0900160b0a00160b0a00170c0b00170d0c00180d0c00190e0d00190f0e001a100f001a100f001b1110001b1211001c1312001d1312001d1413001e1514001e1614001f16150020171600201817002119170021191800221a1900231b1900231b1a00241c1b00251d1c00251e1c00261e1d00261f1e0027201e0028211f0028212000292221002a2321002a2422002b2423002c2523002c2624002d2725002d2726002e2826002f2927002f2a2800302a2900312b2900312c2a00322d2b00332d2b00332e2c00342f2d0035302e0035302e0036312f0037323000373330003833310039343200393533003a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011a12140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01140a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010f0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a0000010a0000010a0000010a0000010b0000010b0000010c0000010d0000010d0000010e0000010e0100010f0201010f020201100302011004030111050401120505011206050113070601130807011408070114090801150a0901160b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01251d1c01251e1c01261e1d01261f1e0127201e0128211f0128212001292221012a2321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011a12140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010f0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a0000010a0000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010e0000010e0100010f0201010f020201100302011004030111050401120505011206050113070601130807011408070114090801150a0901160b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01251d1c01251e1c01261e1d01261f1e0127201e0128211f0128212001292221012a2321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011a12140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010f0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010e0000010e0100010f0201010f020201100302011004030111050401110505011206050113070601130807011408070114090801150a0901150b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f0128212001292221012a2321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011912140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011105060110050601100405010f0404010f0304010e0303010e0202010e0102010d0101010d0000010d0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010d0000010e0100010f0201010f020201100302011004030111050401110505011206050113070601130807011408070114090801150a0901150b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e011a100f011a100f011b1110011b1211011c1312011d1312011d1413011e1514011e1614011f16150120171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f012821200129222101292321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011912140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01160d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011005060110050601100405010f0404010f0304010e0303010e0202010e0102010d0101010d0000010c0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010d0000010e0100010f0201010f020201100302011004030111050401110505011206050113070601130807011408070114090801150a0901150b0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e0119100f011a100f011b1110011b1211011c1312011c1312011d1413011e1514011e1614011f1615011f171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f012821200129222101292321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633011d1719011d1619011c1618011c1517011b1417011b1416011a1315011a1315011912140119111301191113011810120118101101170f1101170e1001160e0f01160d0f01150d0e01150c0e01150b0d01140b0c01140a0c01130a0b0113090a0113080a01120809011207080111070801110607011005060110050601100405010f0404010f0304010e0303010e0202010e0102010d0101010d0000010c0000010c0000010c0000010b0000010b0000010b0000010a0000010a000001090000010a0000010a0000010b0000010b0000010c0000010c0000010d0000010d0000010e0100010f0201010f020201100302011004030111050401110505011206050112070601130807011408070114090801150a0901150a0a01160b0a01170c0b01170d0c01180d0c01180e0d01190f0e0119100f011a100f011b1110011b1211011c1312011c1312011d1413011e1514011e1614011f1615011f171601201817012119170121191801221a1901231b1901231b1a01241c1b01241d1c01251e1c01261e1d01261f1e0127201e0128211f012821200129222101292321012a2422012b2423012b2523012c2624012d2725012d2726012e2826012f2927012f2a2801302a2901312b2901312c2a01322d2b01332d2b01332e2c01342f2d0135302e0135302e0136312f0137323001373330013833310139343201393533013a3633021d1719021d1619021c1618021c1517021b1417021b1416021a1315021a1315021912140219111302191113021810120218101102170f1102170e1002160e0f02160d0f02150d0e02150c0e02150b0d02140b0c02140a0c02130a0b0213090a0212080a02120809021207080211070802110607021005060210050602100405020f0404020f0304020e0303020e0202020e0102020d0101020d0000020c0000020c0000020c0000020b0000020b0000020a0000020a0000020a000002090000020a0000020a0000020b0000020b0000020c0000020c0000020d0000020d0000020e0100020e0201020f020202100302021004030211050402110505021206050212070602130807021408070214090802150a0902150a0a02160b0a02160c0b02170d0c02180d0c02180e0d02190f0e0219100f021a100f021b1110021b1211021c1312021c1312021d1413021e1514021e1614021f1615021f171602201817022119170221191802221a1902221b1902231b1a02241c1b02241d1c02251e1c02261e1d02261f1e0227201e0228211f022821200229222102292321022a2422022b2423022b2523022c2624022d2725022d2726022e2826022f2927022f2a2802302a2902312b2902312c2a02322d2b02332d2b02332e2c02342f2d0235302e0235302e0236312f0237323002373330023833310239343202393533023a3633021d1719021d1619021c1618021c1517021b1417021b1416021a1315021a1315021912140219111302191113021810120218101102170f1102170e1002160e0f02160d0f02150d0e02150c0e02150b0d02140b0c02140a0c02130a0b0213090a0212080a02120809021207080211070802110607021005060210050602100405020f0404020f0304020e0303020e0202020e0102020d0101020d0000020c0000020c0000020c0000020b0000020b0000020a0000020a0000020a00000209000002090000020a0000020b0000020b0000020c0000020c0000020d0000020d0000020e0100020e0201020f020202100302021004030211050402110505021206050212070602130807021408070214090802150a0902150a0a02160b0a02160c0b02170d0c02180d0c02180e0d02190f0e0219100f021a100f021b1110021b1211021c1312021c1312021d1413021e1514021e1614021f1615021f171602201817022119170221191802221a1902221b1902231b1a02241c1b02241d1c02251e1c02261e1d02261f1e0227201e0227211f022821200229222102292321022a2422022b2423022b2523022c2624022d2725022d2726022e2826022f2927022f2a2802302a2902312b2902312c2a02322d2b02332d2b02332e2c02342f2d0235302e0235302e0236312f0237323002373330023833310239343202393533023a3633031d1719031d1619031c1618031c1517031b1417031b1416031a1315031a1315031912140319111303181113031810120318101103170f1103170e1003160e0f03160d0f03150d0e03150c0e03150b0d03140b0c03140a0c03130a0b0313090a0312080a03120809031207080311070803110607031005060310050603100405030f0404030f0304030e0203030e0202030e0102030d0101030d0000030c0000030c0000030c0000030b0000030b0000030a0000030a0000030a00000309000003090000030a0000030b0000030b0000030c0000030c0000030d0000030d0000030e0100030e0201030f020203100302031004030311050403110505031206050312070603130807031308070314090803150a0903150a0a03160b0a03160c0b03170d0c03180d0c03180e0d03190f0e0319100f031a100f031b1110031b1211031c1312031c1312031d1413031e1514031e1614031f1615031f171603201817032119170321191803221a1903221b1903231b1a03241c1b03241d1c03251e1c03261e1d03261f1e0327201e0327211f032821200329222103292321032a2422032b2423032b2523032c2624032d2725032d2726032e2826032f2927032f2a2803302a2903312b2903312c2a03322d2b03332d2b03332e2c03342f2d0335302e0335302e0336312f0337323003373330033833310339343203393533033a3633031d1719031d1619031c1618031c1517031b1417031b1416031a1315031a1315031912140319111303181113031810120318101103170f1103170e1003160e0f03160d0f03150d0e03150c0e03150b0d03140b0c03140a0c03130a0b0313090a0312080a031208090312070803110708031106070310050603100506030f0405030f0404030f0304030e0203030e0202030d0102030d0101030d0000030c0000030c0000030b0000030b0000030b0000030a0000030a0000030a00000309000003090000030a0000030a0000030b0000030c0000030c0000030d0000030d0000030e0100030e0201030f0202030f0302031004030311050403110505031206050312070603130807031308070314090803150a0903150a0a03160b0a03160c0b03170d0c03180d0c03180e0d03190f0e0319100f031a100f031a1110031b1211031c1312031c1312031d1413031d1514031e1614031f1615031f171603201817032119170321191803221a1903221b1903231b1a03241c1b03241d1c03251e1c03261e1d03261f1e0327201e0327211f032821200329222103292321032a2422032b2423032b2523032c2624032d2725032d2726032e2826032f2927032f2a2803302a2903312b2903312c2a03322d2b03332d2b03332e2c03342f2d0335302e0335302e0336312f0337323003373330033833310339343203393533033a3633041d1719041d1619041c1618041c1517041b1417041b1416041a1315041a1315041912140419111304181113041810120418101104170f1104170e1004160e0f04160d0f04150d0e04150c0e04140b0d04140b0c04140a0c04130a0b0413090a0412080a041208090412070804110708041106070410050604100506040f0405040f0404040f0304040e0203040e0202040d0102040d0101040d0000040c0000040c0000040b0000040b0000040b0000040a0000040a0000040a00000409000004090000040a0000040a0000040b0000040c0000040c0000040d0000040d0000040e0100040e0201040f0202040f0302041004030411050404110505041206050412070604130807041308070414090804150a0904150a0a04160b0a04160c0b04170d0c04170d0c04180e0d04190f0e0419100f041a100f041a1110041b1211041c1312041c1312041d1413041d1514041e1614041f1615041f171604201817042018170421191804221a1904221b1904231b1a04241c1b04241d1c04251e1c04251e1d04261f1e0427201e0427211f042821200429222104292321042a2422042b2423042b2523042c2624042d2725042d2726042e2826042f2927042f2a2804302a2904302b2904312c2a04322d2b04322d2b04332e2c04342f2d0435302e0435302e0436312f0437323004373330043833310439343204393533043a3633051d1719051d1619051c1618051c1517051b1417051b1416051a1315051a1315051912140519111305181113051810120518101105170f1105170e1005160e0f05160d0f05150d0e05150c0e05140b0d05140b0c05140a0c05130a0b0513090a0512080a051208090511070805110708051106070510050605100506050f0405050f0404050f0304050e0203050e0202050d0102050d0101050d0000050c0000050c0000050b0000050b0000050b0000050a0000050a0000050900000509000005090000050a0000050a0000050b0000050b0000050c0000050d0000050d0000050e0100050e0201050f0202050f0302051004030511050405110505051206050512070605130807051308070514090805150a0905150a0a05160b0a05160c0b05170d0c05170d0c05180e0d05190f0e0519100f051a100f051a1110051b1211051c1312051c1312051d1413051d1514051e1614051f1615051f171605201817052018170521191805221a1905221b1905231b1a05241c1b05241d1c05251e1c05251e1d05261f1e0527201e0527211f052821200529222105292321052a2422052b2423052b2523052c2624052d2725052d2726052e2826052e2927052f2a2805302a2905302b2905312c2a05322d2b05322d2b05332e2c05342f2d0535302e0535302e0536312f0537323005373330053833310539343205393533053a3633061d1719061d1619061c1618061c1517061b1417061b1416061a1315061a1315061912140619111306181113061810120617101106170f1106170e1006160e0f06160d0f06150d0e06150c0e06140b0d06140b0c06140a0c06130a0b0613090a0612080a061208090611070806110708061106070610050606100506060f0405060f0404060f0304060e0203060e0202060d0102060d0101060d0000060c0000060c0000060b0000060b0000060b0000060a0000060a0000060900000609000006090000060a0000060a0000060b0000060b0000060c0000060d0000060d0000060e0100060e0201060f0202060f0302061004030610050406110505061206050612070606130807061308070614090806140a0906150a0a06160b0a06160c0b06170d0c06170d0c06180e0d06190f0e0619100f061a100f061a1110061b1211061c1312061c1312061d1413061d1514061e1614061f1615061f171606201817062018170621191806221a1906221b1906231b1a06241c1b06241d1c06251e1c06251e1d06261f1e0627201e0627211f062821200629222106292321062a2422062b2423062b2523062c2624062d2725062d2726062e2826062e2927062f2a2806302a2906302b2906312c2a06322d2b06322d2b06332e2c06342f2d0634302e0635302e0636312f0637323006373330063833310639343206393533063a3633071d1719071c1619071c1618071c1517071b1417071b1416071a1315071a1315071912140719111307181113071810120717101107170f1107170e1007160e0f07160d0f07150d0e07150c0e07140b0d07140b0c07140a0c07130a0b0713090a0712080a071208090711070807110708071106070710050607100506070f0405070f0404070f0304070e0203070e0202070d0102070d0101070d0000070c0000070c0000070b0000070b0000070b0000070a0000070a0000070900000709000007090000070a0000070a0000070b0000070b0000070c0000070d0000070d0000070e0100070e0201070f0202070f0302071004030710050407110505071206050712070607130807071308070714090807140a0907150a0a07160b0a07160c0b07170d0c07170d0c07180e0d07190f0e0719100f071a100f071a1110071b1211071c1312071c1312071d1413071d1514071e1614071f1615071f171607201817072018170721191807221a1907221b1907231b1a07241c1b07241d1c07251e1c07251e1d07261f1e0727201e0727211f072821200729222107292321072a2422072b2423072b2523072c2624072c2725072d2726072e2826072e2927072f2a2807302a2907302b2907312c2a07322d2b07322d2b07332e2c07342f2d0734302e0735302e0736312f0737323007373330073833310739343207393533073a3633081d1719081c1619081c1618081c1517081b1417081b1416081a1315081a1315081912140819111308181113081810120817101108170f1108170e1008160e0f08160d0f08150d0e08150c0e08140b0d08140b0c08130a0c08130a0b0813090a0812080a081208090811070808110708081106070810050608100506080f0405080f0404080e0304080e0203080e0202080d0102080d0101080c0000080c0000080c0000080b0000080b0000080b0000080a0000080a0000080900000809000008090000080a0000080a0000080b0000080b0000080c0000080c0000080d0000080e0100080e0201080f0202080f0302081004030810050408110505081206050812070608130807081308070814090808140a0908150a0a08160b0a08160c0b08170d0c08170d0c08180e0d08180f0e0819100f081a100f081a1110081b1211081b1312081c1312081d1413081d1514081e1614081f1615081f171608201817082018170821191808221a1908221b1908231b1a08231c1b08241d1c08251e1c08251e1d08261f1e0827201e0827211f082821200829222108292321082a2422082b2423082b2523082c2624082c2725082d2726082e2826082e2927082f2a2808302a2908302b2908312c2a08322d2b08322d2b08332e2c08342f2d0834302e0835302e0836312f0837323008373330083833310839343208393533083a36330a1d17190a1c16190a1c16180a1c15170a1b14170a1b14160a1a13150a1a13150a1912140a1911130a1811130a1810120a1710110a170f110a170e100a160e0f0a160d0f0a150d0e0a150c0e0a140b0d0a140b0c0a130a0c0a130a0b0a13090a0a12080a0a1208090a1107080a1107080a1006070a1005060a1005060a0f04050a0f04040a0e03040a0e02030a0e02020a0d01020a0d01010a0c00000a0c00000a0c00000a0b00000a0b00000a0a00000a0a00000a0a00000a0900000a0900000a0900000a0a00000a0a00000a0b00000a0b00000a0c00000a0c00000a0d00000a0e01000a0e02010a0f02020a0f03020a1004030a1005040a1105050a1106050a1207060a1308070a1308070a1409080a140a090a150a0a0a160b0a0a160c0b0a170d0c0a170d0c0a180e0d0a180f0e0a19100f0a1a100f0a1a11100a1b12110a1b13120a1c13120a1d14130a1d15140a1e16140a1e16150a1f17160a2018170a2018170a2119180a221a190a221b190a231b1a0a231c1b0a241d1c0a251e1c0a251e1d0a261f1e0a27201e0a27211f0a2821200a2922210a2923210a2a24220a2a24230a2b25230a2c26240a2c27250a2d27260a2e28260a2e29270a2f2a280a302a290a302b290a312c2a0a322d2b0a322d2b0a332e2c0a342f2d0a34302e0a35302e0a36312f0a3732300a3733300a3833310a3934320a3935330a3a36330b1d17190b1c16190b1c16180b1c15170b1b14170b1b14160b1a13150b1a13150b1912140b1911130b1811130b1810120b1710110b170f110b160e100b160e0f0b160d0f0b150d0e0b150c0e0b140b0d0b140b0c0b130a0c0b130a0b0b13090a0b12080a0b1208090b1107080b1107080b1006070b1005060b1005060b0f04050b0f04040b0e03040b0e02030b0e02020b0d01020b0d01010b0c00000b0c00000b0c00000b0b00000b0b00000b0a00000b0a00000b0a00000b0900000b0900000b0900000b0a00000b0a00000b0b00000b0b00000b0c00000b0c00000b0d00000b0d01000b0e02010b0f02020b0f03020b1004030b1005040b1105050b1106050b1207060b1308070b1308070b1409080b140a090b150a0a0b150b0a0b160c0b0b170d0c0b170d0c0b180e0d0b180f0e0b19100f0b1a100f0b1a11100b1b12110b1b13120b1c13120b1d14130b1d15140b1e16140b1e16150b1f17160b2018170b2018170b2119180b221a190b221b190b231b1a0b231c1b0b241d1c0b251e1c0b251e1d0b261f1e0b27201e0b27211f0b2821200b2922210b2923210b2a24220b2a24230b2b25230b2c26240b2c27250b2d27260b2e28260b2e29270b2f2a280b302a290b302b290b312c2a0b322d2b0b322d2b0b332e2c0b342f2d0b34302e0b35302e0b36312f0b3732300b3733300b3833310b3934320b3935330b3a36330e1d17190e1c16190e1c16180e1b15170e1b14170e1b14160e1a13150e1a13150e1912140e1911130e1811130e1810120e1710110e170f110e160e100e160e0f0e160d0f0e150d0e0e150c0e0e140b0d0e140b0c0e130a0c0e130a0b0e13090a0e12080a0e1208090e1107080e1107080e1006070e1005060e1005060e0f04050e0f04040e0e03040e0e02030e0e02020e0d01020e0d01010e0c00000e0c00000e0c00000e0b00000e0b00000e0a00000e0a00000e0a00000e0900000e0900000e0900000e0a00000e0a00000e0b00000e0b00000e0c00000e0c00000e0d00000e0d01000e0e02010e0f02020e0f03020e1004030e1005040e1105050e1106050e1207060e1308070e1308070e1409080e140a090e150a0a0e150b0a0e160c0b0e170d0c0e170d0c0e180e0d0e180f0e0e19100f0e1a100f0e1a11100e1b12110e1b13120e1c13120e1d14130e1d15140e1e16140e1e16150e1f17160e2018170e2018170e2119180e211a190e221b190e231b1a0e231c1b0e241d1c0e251e1c0e251e1d0e261f1e0e27201e0e27211f0e2821200e2822210e2923210e2a24220e2a24230e2b25230e2c26240e2c27250e2d27260e2e28260e2e29270e2f2a280e302a290e302b290e312c2a0e322d2b0e322d2b0e332e2c0e342f2d0e34302e0e35302e0e36312f0e3632300e3733300e3833310e3934320e3935330e3a3633101d1719101c1619101c1618101b1517101b1417101b1416101a1315101a1315101912141019111310181113101810121017101110170f1110160e1010160e0f10160d0f10150d0e10150c0e10140b0d10140b0c10130a0c10130a0b1013090a1012080a101208091011070810110708101006071010050610100506100f0405100f0404100e0304100e0203100e0202100d0102100d0101100c0000100c0000100c0000100b0000100b0000100a0000100a0000100a0000100900001009000010090000100a0000100a0000100b0000100b0000100c0000100c0000100d0000100d0100100e0201100f0202100f0302101004031010050410110505101106051012070610120707101308071014090810140a0910150a0a10150b0a10160c0b10170d0c10170d0c10180e0d10180f0e1019100f101a100f101a1110101b1211101b1312101c1312101d1413101d1514101e1614101e1615101f171610201817102018171021191810211a1910221b1910231b1a10231c1b10241d1c10251e1c10251e1d10261f1e1027201e1027211f102821201028222110292321102a2422102a2423102b2523102c2624102c2725102d2726102e2826102e2927102f2a2810302a2910302b2910312c2a10322d2b10322d2b10332e2c10342f2d1034302e1035302e1036312f1036323010373330103833311039343210393533103a3633131d1719131c1619131c1618131b1517131b1417131b1416131a1315131a1315131912141319111313181113131810121317101113170f1113160e1013160e0f13160d0f13150d0e13150c0e13140b0d13140b0c13130a0c13130a0b1312090a1312080a131208091311070813110708131006071310050613100506130f0405130f0404130e0304130e0203130d0202130d0102130d0101130c0000130c0000130b0000130b0000130b0000130a0000130a0000130a0000130900001309000013090000130a0000130a0000130b0000130b0000130c0000130c0000130d0000130d0100130e0201130e0202130f0302131004031310050413110505131106051312070613120707131308071314090813140a0913150a0a13150b0a13160c0b13170d0c13170d0c13180e0d13180f0e1319100f1319100f131a1110131b1211131b1312131c1312131c1413131d1514131e1614131e1615131f171613201817132018171321191813211a1913221b1913231b1a13231c1b13241d1c13251e1c13251e1d13261f1e1326201e1327211f132821201328222113292321132a2422132a2423132b2523132c2624132c2725132d2726132e2826132e2927132f2a2813302a2913302b2913312c2a13322d2b13322d2b13332e2c13342f2d1334302e1335302e1336312f1336323013373330133833311339343213393533133a3633171d1719171c1619171c1618171b1517171b1417171b1416171a1315171a1315171912141719111317181113171810121717101117170f1117160e1017160e0f17150d0f17150d0e17150c0e17140b0d17140b0c17130a0c17130a0b1712090a1712080a1712080917110708171107081710060717100506170f0506170f0405170f0404170e0304170e0203170d0202170d0102170d0101170c0000170c0000170b0000170b0000170b0000170a0000170a00001709000017090000170900001709000017090000170a0000170b0000170b0000170c0000170c0000170d0000170d0100170e0201170e0202170f0302171004031710050417110505171106051712070617120707171308071714090817140a0917150a0a17150b0a17160c0b17160d0c17170d0c17180e0d17180f0e1719100f1719100f171a1110171b1211171b1312171c1312171c1413171d1514171e1614171e1615171f171617201817172018171721191817211a1917221b1917231b1a17231c1b17241d1c17251e1c17251e1d17261f1e1726201e1727211f172821201728222117292321172a2422172a2423172b2523172c2624172c2725172d2726172e2826172e2927172f2a2817302a2917302b2917312c2a17322d2b17322d2b17332e2c17342f2d1734302e1735302e1736312f1736323017373330173833311739343217393533173a36331c1d17191c1c16191c1c16181c1b15171c1b14171c1a14161c1a13151c1a13151c1912141c1911131c1811131c1810121c1710111c170f111c160e101c160e0f1c150d0f1c150d0e1c150c0e1c140b0d1c140b0c1c130a0c1c130a0b1c12090a1c12080a1c1208091c1107081c1107081c1006071c1005061c0f05061c0f04051c0f04041c0e03041c0e02031c0d02021c0d01021c0d01011c0c00001c0c00001c0b00001c0b00001c0b00001c0a00001c0a00001c0900001c0900001c0900001c0900001c0900001c0a00001c0b00001c0b00001c0c00001c0c00001c0d00001c0d01001c0e02011c0e02021c0f03021c1004031c1005041c1105051c1106051c1207061c1207071c1308071c1409081c140a091c150a0a1c150b0a1c160c0b1c160d0c1c170d0c1c180e0d1c180f0e1c19100f1c19100f1c1a11101c1b12111c1b13121c1c13121c1c14131c1d15141c1e15141c1e16151c1f17161c1f18171c2018171c2119181c211a191c221b191c231b1a1c231c1b1c241d1c1c251e1c1c251e1d1c261f1e1c26201e1c27211f1c2821201c2822211c2923211c2a24221c2a24231c2b25231c2c26241c2c27251c2d27261c2e28261c2e29271c2f2a281c302a291c302b291c312c2a1c322d2b1c322d2b1c332e2c1c342f2d1c34302e1c35302e1c36312f1c3632301c3733301c3833311c3934321c3935331c3a3633211d1719211c1619211c1618211b1517211b1417211a1416211a1315211a1315211912142119111321181113211810122117101121170f1121160e1021160e0f21150d0f21150d0e21150c0e21140b0d21140b0c21130a0c21130a0b2112090a2112080a2112080921110708211107082110060721100506210f0506210f0405210f0404210e0304210e0203210d0202210d0102210d0101210c0000210c0000210b0000210b0000210b0000210a0000210a00002109000021090000210900002109000021090000210a0000210a0000210b0000210c0000210c0000210d0000210d0100210e0201210e0202210f0302210f04032110050421110505211106052112070621120707211308072113090821140a0921150a0a21150b0a21160c0b21160d0c21170d0c21180e0d21180f0e2119100f2119100f211a1110211b1211211b1312211c1312211c1413211d1514211e1514211e1615211f1716211f1817212018172121191821211a1921221b1921231b1a21231c1b21241d1c21241e1c21251e1d21261f1e2126201e2127211f212821202128222121292321212a2422212a2423212b2523212c2624212c2725212d2726212e2826212e2927212f2a2821302a2921302b2921312c2a21322d2b21322d2b21332e2c21342f2d2134302e2135302e2136312f2136323021373330213833312139343221393533213a3633271d1719271c1619271c1618271b1517271b1417271a1416271a1315271a1315271912142719111327181113271810122717101127170f1127160e1027160e0f27150d0f27150d0e27150c0e27140b0d27140b0c27130a0c27130a0b2712090a2712080a2711080927110708271107082710060727100506270f0506270f0405270f0404270e0304270e0203270d0202270d0102270d0101270c0000270c0000270b0000270b0000270b0000270a0000270a00002709000027090000270900002709000027090000270a0000270a0000270b0000270c0000270c0000270d0000270d0100270e0201270e0202270f0302270f04032710050427110505271106052712070627120707271308072713090827140a0927150a0a27150b0a27160c0b27160d0c27170d0c27180e0d27180f0e2719100f2719100f271a1110271b1211271b1312271c1312271c1413271d1514271e1514271e1615271f1716271f1817272018172721191827211a1927221b1927231b1a27231c1b27241d1c27241e1c27251e1d27261f1e2726201e2727211f272821202728222127292321272a2422272a2423272b2523272c2624272c2725272d2726272e2826272e2927272f2a2827302a2927302b2927312c2a27322d2b27322d2b27332e2c27342f2d2734302e2735302e2736312f2736323027373330273833312739343227393533273a36332e1d17192e1c16192e1c16182e1b15172e1b14172e1a14162e1a13152e1913152e1912142e1911132e1811132e1810122e1710112e170f112e160e102e160e0f2e150d0f2e150d0e2e140c0e2e140b0d2e140b0c2e130a0c2e130a0b2e12090a2e12080a2e1108092e1107082e1107082e1006072e1005062e0f05062e0f04052e0f04042e0e03042e0e02032e0d02022e0d01022e0c01012e0c00002e0c00002e0b00002e0b00002e0a00002e0a00002e0a00002e0900002e0900002e0900002e0900002e0900002e0a00002e0a00002e0b00002e0b00002e0c00002e0d00002e0d01002e0e02012e0e02022e0f03022e0f04032e1005042e1105052e1106052e1207062e1207072e1308072e1309082e140a092e150a0a2e150b0a2e160c0b2e160d0c2e170d0c2e170e0d2e180f0e2e19100f2e19100f2e1a11102e1a12112e1b13122e1c13122e1c14132e1d15142e1e15142e1e16152e1f17162e1f18172e2018172e2119182e211a192e221b192e231b1a2e231c1b2e241d1c2e241e1c2e251e1d2e261f1e2e26201e2e27211f2e2821202e2822212e2923212e2a24222e2a24232e2b25232e2c26242e2c27252e2d27262e2e28262e2e29272e2f2a282e302a292e302b292e312c2a2e322d2b2e322d2b2e332e2c2e342f2d2e34302e2e35302e2e36312f2e3632302e3733302e3833312e3934322e3935332e3a3633361d1719361c1619361c1618361b1517361b1417361a1416361a131536191315361912143619111336181113361810123617101136170f1136160e1036160e0f36150d0f36150d0e36140c0e36140b0d36140b0c36130a0c36130a0b3612090a3612080a3611080936110708361107083610060736100506360f0506360f0405360e0404360e0304360e0203360d0202360d0102360c0101360c0000360c0000360b0000360b0000360a0000360a0000360a00003609000036090000360900003609000036090000360a0000360a0000360b0000360b0000360c0000360d0000360d0100360e0201360e0202360f0302360f04033610050436100505361106053612070636120707361308073613090836140a0936140a0a36150b0a36160c0b36160d0c36170d0c36170e0d36180f0e3619100f3619100f361a1110361a1211361b1312361c1312361c1413361d1514361d1514361e1615361f1716361f1817362018173621191836211a1936221b1936221b1a36231c1b36241d1c36241e1c36251e1d36261f1e3626201e3627211f362821203628222136292321362a2422362a2423362b2523362c2624362c2725362d2726362e2826362e2927362f2a2836302a2936302b2936312c2a36322d2b36322d2b36332e2c36342f2d3634302e3635302e3636312f3636323036373330363833313639343236393533363a3633401d1719401c1619401c1618401b1517401b1417401a1416401a131540191315401912144019111340181113401810124017101140170f1140160e1040160e0f40150d0f40150d0e40140c0e40140b0d40140b0c40130a0c40130a0b4012090a4012080a4011080940110708401107084010060740100506400f0506400f0405400e0404400e0304400e0203400d0202400d0102400c0101400c0000400c0000400b0000400b0000400a0000400a0000400a00004009000040090000400800004009000040090000400a0000400a0000400b0000400b0000400c0000400c0000400d0100400e0201400e0202400f0302400f04034010050440100505401106054012070640120707401308074013090840140a0940140a0a40150b0a40160c0b40160d0c40170d0c40170e0d40180f0e4019100f4019100f401a1110401a1211401b1312401c1312401c1413401d1514401d1514401e1615401f1716401f1817402018174021191840211a1940221b1940221b1a40231c1b40241d1c40241e1c40251e1d40261f1e4026201e4027211f402821204028222140292321402a2422402a2423402b2523402c2624402c2725402d2726402e2826402e2927402f2a2840302a2940302b2940312c2a40322d2b40322d2b40332e2c40342f2d4034302e4035302e4036312f4036323040373330403833314039343240393533403a36334b1d17194b1c16194b1c16184b1b15174b1b14174b1a14164b1a13154b1913154b1912144b1811134b1811134b1810124b1710114b170f114b160e104b160e0f4b150d0f4b150d0e4b140c0e4b140b0d4b140b0c4b130a0c4b130a0b4b12090a4b12080a4b1108094b1107084b1007084b1006074b1005064b0f05064b0f04054b0e04044b0e03044b0e02034b0d02024b0d01024b0c01014b0c00004b0c00004b0b00004b0b00004b0a00004b0a00004b0a00004b0900004b0900004b0800004b0900004b0900004b0a00004b0a00004b0b00004b0b00004b0c00004b0c00004b0d01004b0e02014b0e02024b0f03024b0f04034b1005044b1005054b1106054b1207064b1207074b1308074b1309084b140a094b140a0a4b150b0a4b160c0b4b160d0c4b170d0c4b170e0d4b180f0e4b19100f4b19100f4b1a11104b1a12114b1b13124b1c13124b1c14134b1d15144b1d15144b1e16154b1f17164b1f18174b2018174b2119184b211a194b221b194b221b1a4b231c1b4b241d1c4b241e1c4b251e1d4b261f1e4b26201e4b27211f4b2821204b2822214b2923214b2a24224b2a24234b2b25234b2c26244b2c27254b2d27264b2e28264b2e29274b2f2a284b302a294b302b294b312c2a4b322d2b4b322d2b4b332e2c4b342f2d4b34302e4b35302e4b36312f4b3632304b3733304b3833314b3934324b3935334b3a3633591d1719591c1619591c1618591b1517591b1417591a1416591a131559191315591912145918111359181113591810125917101159170f1159160e1059160e0f59150d0f59150d0e59140c0e59140b0d59130b0c59130a0c59130a0b5912090a5912080a5911080959110708591007085910060759100506590f0506590f0405590e0404590e0304590e0203590d0202590d0102590c0101590c0000590c0000590b0000590b0000590a0000590a0000590a00005909000059090000590800005909000059090000590a0000590a0000590b0000590b0000590c0000590c0000590d0100590e0201590e0202590f0302590f04035910050459100505591106055911070659120707591308075913090859140a0959140a0a59150b0a59160c0b59160d0c59170d0c59170e0d59180f0e5919100f5919100f591a1110591a1211591b1312591c1312591c1413591d1514591d1514591e1615591f1716591f1817592018175920191859211a1959221b1959221b1a59231c1b59241d1c59241e1c59251e1d59261f1e5926201e5927211f59282120592822215929232159292422592a2423592b2523592b2624592c2725592d2726592d2826592e2927592f2a2859302a2959302b2959312c2a59322d2b59322d2b59332e2c59342f2d5934302e5935302e5936312f5936323059373330593833315939343259393533593a3633681d1719681c1619681c1618681b1517681b1417681a1416681a131568191315681912146818111368181113681810126817101168170f1168160e1068160e0f68150d0f68150d0e68140c0e68140b0d68130b0c68130a0c68130a0b6812090a6812080a6811080968110708681007086810060768100506680f0506680f0405680e0404680e0304680d0203680d0202680d0102680c0101680c0000680b0000680b0000680b0000680a0000680a0000680a00006809000068090000680800006809000068090000680a0000680a0000680b0000680b0000680c0000680c0000680d0100680d0201680e0202680f0302680f04036810050468100505681106056811070668120707681308076813090868140a0968140a0a68150b0a68150c0b68160d0c68170d0c68170e0d68180f0e6818100f6819100f681a1110681a1211681b1312681b1312681c1413681d1514681d1514681e1615681f1716681f1817682018176820191868211a1968221b1968221b1a68231c1b68241d1c68241e1c68251e1d68261f1e6826201e6827211f68282120682822216829232168292422682a2423682b2523682b2624682c2725682d2726682d2826682e2927682f2a2868302a2968302b2968312c2a68322d2b68322d2b68332e2c68342f2d6834302e6835302e6836312f6836323068373330683833316839343268393533683a3633 m_StreamData: + serializedVersion: 2 offset: 0 size: 0 path: @@ -10093,8 +4058,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1243118704} - m_LocalRotation: {x: -0.021397674, y: -0.19134402, z: -0.07597708, w: 0.9783441} - m_LocalPosition: {x: -0.040973987, y: -0.0000000060717653, z: -0.00000004963022} + m_LocalRotation: {x: -0.02139752, y: -0.19134401, z: -0.0759771, w: 0.9783441} + m_LocalPosition: {x: -0.040973965, y: -0.000000009989375, z: -0.000000035776004} m_LocalScale: {x: 0.9999995, y: 0.9999996, z: 0.99999976} m_Children: - {fileID: 1261016273} @@ -10213,8 +4178,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1255390823} - m_LocalRotation: {x: -0.005023144, y: 0.006642944, z: -0.0066470345, w: 0.99994326} - m_LocalPosition: {x: -0.05387872, y: 0.0000000040891903, z: -0.0000000010222975} + m_LocalRotation: {x: -0.0050232024, y: 0.0066429293, z: -0.0066470494, w: 0.9999433} + m_LocalPosition: {x: -0.053878784, y: 0.0000000035984873, z: -0.000000009446029} m_LocalScale: {x: 0.97259897, y: 0.97259927, z: 0.97259873} m_Children: - {fileID: 1864079936} @@ -10245,8 +4210,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1261016272} - m_LocalRotation: {x: -0.07405323, y: -0.28212893, z: -0.099212006, w: 0.95135504} - m_LocalPosition: {x: -0.024524614, y: -0.000000019403256, z: 0.000000024287134} + m_LocalRotation: {x: -0.07405319, y: -0.28212893, z: -0.099212, w: 0.95135504} + m_LocalPosition: {x: -0.024524594, y: 0.000000004181601, z: -0.000000027412788} m_LocalScale: {x: 1, y: 1.0000001, z: 1.0000002} m_Children: [] m_Father: {fileID: 1243118705} @@ -10320,6 +4285,7 @@ MonoBehaviour: 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: @@ -10380,8 +4346,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1321021623} - m_LocalRotation: {x: 0.06549118, y: -0.109753676, z: 0.026531275, w: 0.991444} - m_LocalPosition: {x: -0.18387154, y: 0.00000002858722, z: -0.000000019058163} + m_LocalRotation: {x: 0.06492513, y: -0.109798394, z: 0.028169312, w: 0.9914311} + m_LocalPosition: {x: -0.18387164, y: 0.00000005031351, z: -0.000000033542367} m_LocalScale: {x: 1.0000006, y: 1.0000004, z: 1.0000005} m_Children: [] m_Father: {fileID: 977725689} @@ -10503,8 +4469,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1371748541} - m_LocalRotation: {x: -0.021405239, y: 0.21453471, z: -0.08453146, w: -0.97281605} - m_LocalPosition: {x: -0.040974054, y: -0.000000019535213, z: 0.000000114571876} + m_LocalRotation: {x: -0.021405192, y: 0.2145347, z: -0.08453154, w: -0.97281605} + m_LocalPosition: {x: -0.040974077, y: -0.00000006458237, z: 0.000000006040104} m_LocalScale: {x: 1.0000007, y: 1.0000004, z: 1.000001} m_Children: - {fileID: 906817747} @@ -10627,8 +4593,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1421417916} - m_LocalRotation: {x: 0.076897465, y: -0.08679133, z: -0.99299943, w: -0.022500122} - m_LocalPosition: {x: 0.017584017, y: 0.10126312, z: 0.0031659235} + m_LocalRotation: {x: 0.07721691, y: -0.09104958, z: -0.99265563, w: -0.019553665} + m_LocalPosition: {x: 0.017584022, y: 0.10126313, z: 0.0031659266} m_LocalScale: {x: 1.0000005, y: 1.0000007, z: 0.99999994} m_Children: - {fileID: 250831393} @@ -10722,8 +4688,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1440748394} - m_LocalRotation: {x: 0.000000029802298, y: 0.17807618, z: -0.00000007450574, w: 0.98401666} - m_LocalPosition: {x: -0.08628869, y: -0.00000003647645, z: 0.028678266} + m_LocalRotation: {x: 0.000000014901147, y: 0.17807616, z: -0.00000008940688, w: 0.98401666} + m_LocalPosition: {x: -0.08628864, y: -0.000000023845178, z: 0.028678361} m_LocalScale: {x: 0.9999999, y: 1, z: 0.9999999} m_Children: - {fileID: 1661371858} @@ -10876,8 +4842,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1472801540} - m_LocalRotation: {x: 0.71245635, y: -0.000003054738, z: -0.7017164, w: -0.00000423193} - m_LocalPosition: {x: -0.10662591, y: -0.034980312, z: 0.11798751} + m_LocalRotation: {x: 0.71245635, y: -0.0000030579208, z: -0.70171654, w: -0.000004261732} + m_LocalPosition: {x: -0.10662593, y: -0.0349803, z: 0.117987506} m_LocalScale: {x: 0.93172395, y: 0.9317242, z: 0.9317242} m_Children: - {fileID: 183818386} @@ -11172,8 +5138,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1563447374} - m_LocalRotation: {x: 0.00653438, y: 0.21400109, z: -0.14787558, w: -0.96555364} - m_LocalPosition: {x: -0.0389228, y: -0.000000011615518, z: -0.00000005279811} + m_LocalRotation: {x: 0.0065343133, y: 0.21400109, z: -0.1478756, w: -0.9655536} + m_LocalPosition: {x: -0.038922824, y: -0.000000078056296, z: -0.000000033452892} m_LocalScale: {x: 1.0000006, y: 1, z: 1.0000005} m_Children: [] m_Father: {fileID: 396650949} @@ -11325,8 +5291,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1649615427} - m_LocalRotation: {x: 0.030485302, y: 0.10408801, z: -0.018479615, w: 0.9939291} - m_LocalPosition: {x: -0.2779642, y: -0.000000106005075, z: -0.000000015635823} + m_LocalRotation: {x: 0.030485287, y: 0.104088016, z: -0.01847956, w: 0.9939291} + m_LocalPosition: {x: -0.27796423, y: -0.000000058083554, z: -0.000000017892823} m_LocalScale: {x: 1.0078585, y: 1.0078588, z: 1.0078591} m_Children: - {fileID: 1926449834} @@ -11389,8 +5355,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1659745684} - m_LocalRotation: {x: -0.0954016, y: -0.038870413, z: 0.99452084, w: 0.017773218} - m_LocalPosition: {x: 0.017579801, y: -0.10126378, z: 0.00316559} + m_LocalRotation: {x: -0.09653566, y: -0.043323845, z: 0.99416524, w: 0.020963393} + m_LocalPosition: {x: 0.017579885, y: -0.10126376, z: 0.003165595} m_LocalScale: {x: 1.0000013, y: 1.0000013, z: 1} m_Children: - {fileID: 1989139333} @@ -11422,9 +5388,9 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1661371857} - m_LocalRotation: {x: -0.00000038786666, y: 0.00000012386587, z: 0.000000019557769, + m_LocalRotation: {x: -0.00000032791647, y: 0.00000013131647, z: -0.0000000228174, w: 1} - m_LocalPosition: {x: 0.000000016538582, y: 2.6461711e-11, z: -0.000031287913} + m_LocalPosition: {x: 0.0000000102334425, y: 3.582509e-11, z: -0.000031304935} m_LocalScale: {x: 1.0001963, y: 1.0039256, z: 1.0039251} m_Children: [] m_Father: {fileID: 1440748395} @@ -11453,8 +5419,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1786979008} - m_LocalRotation: {x: -0.054554097, y: -0.23594232, z: -0.012994377, w: 0.97014755} - m_LocalPosition: {x: -0.060065985, y: 0.00000003590261, z: -0.00000011087597} + m_LocalRotation: {x: -0.054554082, y: -0.2359423, z: -0.012994347, w: 0.9701476} + m_LocalPosition: {x: -0.060065947, y: 0.000000033452785, z: -0.00000020443422} m_LocalScale: {x: 1.0000001, y: 1.0000001, z: 0.99999994} m_Children: - {fileID: 689359631} @@ -11588,8 +5554,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1853417509} - m_LocalRotation: {x: -0.06402287, y: -0.17543055, z: -0.12357284, w: 0.974605} - m_LocalPosition: {x: -0.033299066, y: 0.00000003959849, z: -0.000000009503656} + m_LocalRotation: {x: -0.064022824, y: -0.17543058, z: -0.1235728, w: 0.9746051} + m_LocalPosition: {x: -0.033299066, y: 0.000000020443384, z: -0.000000011150958} m_LocalScale: {x: 1.0000001, y: 1.0000004, z: 0.99999934} m_Children: - {fileID: 1130675999} @@ -11750,152 +5716,6 @@ Transform: m_Father: {fileID: 1078680525} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!21 &1910961209 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Eyebrows Transparent - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _ALPHABLEND_ON _GLOSSYREFLECTIONS_OFF _NORMALMAP _SPECULARHIGHLIGHTS_OFF - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: 3000 - stringTagMap: - RenderType: Transparent - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BRDFTex: - m_Texture: {fileID: 2800000, guid: d19496e8182853844b5d89a7775259ca, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpMap: - m_Texture: {fileID: 1972437391} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _BumpTex: - m_Texture: {fileID: 2800000, guid: 3699db9bfcb3c6f44bfc58c2b16b3af0, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DispTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Illum: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _LookupDiffuseSpec: - m_Texture: {fileID: 2800000, guid: 2b455fb156396cb45b093d3778f3a4d7, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 215664650} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Ramp: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _RampTex: - m_Texture: {fileID: 2800000, guid: 5a489e05adb03794691d70bf1a642913, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecGlosDepthMap: - m_Texture: {fileID: 2800000, guid: 507eacf252a414d24aedda6559771839, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _SpecularTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ToonShade: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BackRimStrength: 0.05769229 - - _BackRimWidth: 0.96153843 - - _BumpScale: 1 - - _Bumpiness: 1 - - _BumpinessDB: 1 - - _BumpinessDG: 1 - - _BumpinessDR: 0.25 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DisplacementOffset: 0 - - _DisplacementScale: 0 - - _DstBlend: 10 - - _EdgeLength: 5 - - _EmissionLM: 0 - - _EmissionScaleUI: 0 - - _FrontRimStrength: 3.8461556 - - _FrontRimWidth: 0.25 - - _Gloss: 0.38552243 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 0 - - _Metallic: 0 - - _Mode: 2 - - _OcclusionStrength: 1 - - _Outline: 0.005 - - _Parallax: 0.02 - - _Phong: 0.5 - - _RimPower: 2.738806 - - _ScatteringOffset: 0.6730769 - - _ScatteringPower: 1.6923077 - - _Shininess: 0.00018430292 - - _SmoothnessTextureChannel: 0 - - _SpecIntensity: 7.6923065 - - _SpecRoughness: 0.875 - - _Specular: 1.3335822 - - _SpecularHighlights: 0 - - _SrcBlend: 5 - - _TranslucencyOffset: 0.34615386 - - _TranslucencyPower: 9.038462 - - _TranslucencyRadius: 0.65384614 - - _UVSec: 0 - - _ZWrite: 0 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 0} - - _EmissionColorUI: {r: 1, g: 1, b: 1, a: 1} - - _OutlineColor: {r: 0, g: 0, b: 0, a: 1} - - _RimColor: {r: 0.20588237, g: 0.13806231, b: 0.10899655, a: 0} - - _SpecColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} --- !u!1 &1912821605 GameObject: m_ObjectHideFlags: 0 @@ -11950,8 +5770,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1926449833} - m_LocalRotation: {x: -0.7436889, y: 0.041129604, z: -0.041768488, w: 0.665951} - m_LocalPosition: {x: -0.28055203, y: 0.000000029556064, z: 0.0000000026674094} + m_LocalRotation: {x: -0.7436887, y: 0.041129634, z: -0.041768476, w: 0.6659512} + m_LocalPosition: {x: -0.28055203, y: 0.00000004899685, z: -0.0000000033456062} m_LocalScale: {x: 0.92912, y: 0.929121, z: 0.9291208} m_Children: - {fileID: 1937035032} @@ -11992,81 +5812,6 @@ Transform: m_Father: {fileID: 471714982} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!21 &1932418181 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: UMA_Mat_Diffuse_Normal_Metallic - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _METALLICGLOSSMAP _NORMALMAP - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 1145242871} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 514393606} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 1055940522} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} --- !u!1 &1937035031 GameObject: m_ObjectHideFlags: 0 @@ -12090,8 +5835,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1937035031} - m_LocalRotation: {x: -0.030851271, y: -0.104957245, z: -0.1013747, w: 0.9888151} - m_LocalPosition: {x: -0.09379415, y: -0.039508764, z: 0.0025046568} + m_LocalRotation: {x: -0.030850898, y: -0.10495722, z: -0.10137465, w: 0.9888152} + m_LocalPosition: {x: -0.09379414, y: -0.03950876, z: 0.0025047653} m_LocalScale: {x: 0.9999998, y: 1.0000004, z: 1.0000001} m_Children: - {fileID: 1786979009} @@ -12121,8 +5866,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1946929459} - m_LocalRotation: {x: -0.2681414, y: 0.21990414, z: -0.0034979125, w: -0.93793935} - m_LocalPosition: {x: -0.086030364, y: -0.035094913, z: -0.008257213} + m_LocalRotation: {x: -0.26814166, y: 0.21990405, z: -0.0034980166, w: -0.9379393} + m_LocalPosition: {x: -0.08603032, y: -0.035094902, z: -0.008257211} m_LocalScale: {x: 1.0000004, y: 1.0000007, z: 1.0000006} m_Children: - {fileID: 1371748542} @@ -12160,41 +5905,6 @@ Transform: m_Father: {fileID: 771694335} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!84 &1972437391 -RenderTexture: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: 'Eyebrows Transparent 1 Chan 1 frame: 58' - m_ImageContentsHash: - serializedVersion: 2 - Hash: 00000000000000000000000000000000 - m_ForcedFallbackFormat: 4 - m_DownscaleFallback: 0 - serializedVersion: 3 - m_Width: 256 - m_Height: 256 - m_AntiAliasing: 1 - m_MipCount: -1 - m_DepthFormat: 0 - m_ColorFormat: 8 - m_MipMap: 1 - m_GenerateMips: 1 - m_SRGB: 0 - m_UseDynamicScale: 0 - m_BindMS: 0 - m_EnableCompatibleFormat: 1 - m_TextureSettings: - serializedVersion: 2 - m_FilterMode: 1 - m_Aniso: 1 - m_MipBias: 0 - m_WrapU: 0 - m_WrapV: 0 - m_WrapW: 0 - m_Dimension: 2 - m_VolumeDepth: 1 --- !u!1 &1976673005 GameObject: m_ObjectHideFlags: 0 @@ -12218,8 +5928,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1976673005} - m_LocalRotation: {x: -0.030660588, y: 0.28909403, z: -0.047623266, w: -0.9556237} - m_LocalPosition: {x: -0.053420868, y: -0.000000038014488, z: -0.000000004223848} + m_LocalRotation: {x: -0.030660585, y: 0.2890941, z: -0.047623273, w: -0.9556236} + m_LocalPosition: {x: -0.053420857, y: -0.00000003624048, z: 0} m_LocalScale: {x: 0.9999998, y: 0.99999994, z: 0.99999917} m_Children: - {fileID: 1190706978} @@ -12249,8 +5959,8 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1989139332} - m_LocalRotation: {x: -0.054671388, y: -0.18939595, z: -0.06390529, w: 0.9782925} - m_LocalPosition: {x: -0.43578368, y: 0.000000817837, z: 0.00000005724866} + m_LocalRotation: {x: -0.048331503, y: -0.19198957, z: -0.05850795, w: 0.97845846} + m_LocalPosition: {x: -0.43573636, y: 0.00000077727236, z: 0.00000004318185} m_LocalScale: {x: 1.0000001, y: 1.0000004, z: 0.99999976} m_Children: - {fileID: 58441081} diff --git a/UMAProject/Assets/UMA/Examples/Timeline Example/UMA Timeline ExampleSettings.lighting b/UMAProject/Assets/UMA/Examples/Timeline Example/UMA Timeline ExampleSettings.lighting new file mode 100644 index 000000000..6c99f09b7 --- /dev/null +++ b/UMAProject/Assets/UMA/Examples/Timeline Example/UMA Timeline ExampleSettings.lighting @@ -0,0 +1,63 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!850595691 &4890085278179872738 +LightingSettings: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: UMA Timeline ExampleSettings + serializedVersion: 3 + m_GIWorkflowMode: 1 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_RealtimeEnvironmentLighting: 1 + m_BounceScale: 1 + m_AlbedoBoost: 1 + m_IndirectOutputScale: 1 + m_UsingShadowmask: 1 + m_BakeBackend: 2 + m_LightmapMaxSize: 1024 + m_BakeResolution: 40 + m_Padding: 2 + m_TextureCompression: 1 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAO: 0 + m_MixedBakeMode: 2 + m_LightmapsBakeMode: 1 + m_FilterMode: 1 + m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_RealtimeResolution: 2 + m_ForceWhiteAlbedo: 0 + m_ForceUpdates: 0 + m_FinalGather: 0 + m_FinalGatherRayCount: 256 + m_FinalGatherFiltering: 1 + m_PVRCulling: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRMinBounces: 2 + m_PVREnvironmentMIS: 0 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 diff --git a/UMAProject/Assets/UMA/Examples/Timeline Example/UMA Timeline ExampleSettings.lighting.meta b/UMAProject/Assets/UMA/Examples/Timeline Example/UMA Timeline ExampleSettings.lighting.meta new file mode 100644 index 000000000..411f252a3 --- /dev/null +++ b/UMAProject/Assets/UMA/Examples/Timeline Example/UMA Timeline ExampleSettings.lighting.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f552fba85ff835a4f84eefcf620b7e33 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 4890085278179872738 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Favorites.meta b/UMAProject/Assets/UMA/Favorites.meta new file mode 100644 index 000000000..642f47e98 --- /dev/null +++ b/UMAProject/Assets/UMA/Favorites.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c2c9d290f6d50fe4bb884809dad14900 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Favorites/Docs.asset b/UMAProject/Assets/UMA/Favorites/Docs.asset new file mode 100644 index 000000000..100b8d1ae --- /dev/null +++ b/UMAProject/Assets/UMA/Favorites/Docs.asset @@ -0,0 +1,36 @@ +%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: a21b01507d5987b4689b5f16296f8eb8, type: 3} + m_Name: Docs + m_EditorClassIdentifier: + Favorites: + - path: Assets/UMA/Getting Started.pdf + GUID: f2e8c8d5b48eba54f824e1a6a6a5eb5a + name: Getting Started + asset: {fileID: 102900000, guid: f2e8c8d5b48eba54f824e1a6a6a5eb5a, type: 3} + favoriteList: {fileID: 11400000} + - path: Assets/UMA/UMA Documentation.pdf + GUID: bbdfae08c9471eb448d221eea7438364 + name: UMA Documentation + asset: {fileID: 102900000, guid: bbdfae08c9471eb448d221eea7438364, type: 3} + favoriteList: {fileID: 11400000} + - path: Assets/UMA/UMAContentCreation.pdf + GUID: 2ab5a83e02b653c48ac39da9f7d87ef8 + name: UMAContentCreation + asset: {fileID: 102900000, guid: 2ab5a83e02b653c48ac39da9f7d87ef8, type: 3} + favoriteList: {fileID: 11400000} + - path: Assets/UMA/Whats New in UMA.txt + GUID: 4a2b4f5d99601dc4496f8fd6838ed034 + name: Whats New in UMA + asset: {fileID: 4900000, guid: 4a2b4f5d99601dc4496f8fd6838ed034, type: 3} + favoriteList: {fileID: 11400000} + exPanded: 1 diff --git a/UMAProject/Assets/UMA/Favorites/Docs.asset.meta b/UMAProject/Assets/UMA/Favorites/Docs.asset.meta new file mode 100644 index 000000000..f9ca1a0d5 --- /dev/null +++ b/UMAProject/Assets/UMA/Favorites/Docs.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63e6e859123edbb4a81b6167c0ddd818 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Favorites/Folders.asset b/UMAProject/Assets/UMA/Favorites/Folders.asset new file mode 100644 index 000000000..b6576e74d --- /dev/null +++ b/UMAProject/Assets/UMA/Favorites/Folders.asset @@ -0,0 +1,26 @@ +%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: a21b01507d5987b4689b5f16296f8eb8, type: 3} + m_Name: Folders + m_EditorClassIdentifier: + Favorites: + - path: Assets/UMA/Getting Started + GUID: 6b42fb09b111b4ef5aae722f737fbcc8 + name: Getting Started + asset: {fileID: 102900000, guid: 6b42fb09b111b4ef5aae722f737fbcc8, type: 3} + favoriteList: {fileID: 11400000} + - path: Assets/UMA + GUID: 7cf95f87461580343ad9b57a70703cc6 + name: UMA + asset: {fileID: 102900000, guid: 7cf95f87461580343ad9b57a70703cc6, type: 3} + favoriteList: {fileID: 11400000} + exPanded: 1 diff --git a/UMAProject/Assets/UMA/Favorites/Folders.asset.meta b/UMAProject/Assets/UMA/Favorites/Folders.asset.meta new file mode 100644 index 000000000..fc18490e8 --- /dev/null +++ b/UMAProject/Assets/UMA/Favorites/Folders.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4de881f5c49921e478b0cf9e99c4ab55 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Favorites/Prefabs.asset b/UMAProject/Assets/UMA/Favorites/Prefabs.asset new file mode 100644 index 000000000..7b4037ef1 --- /dev/null +++ b/UMAProject/Assets/UMA/Favorites/Prefabs.asset @@ -0,0 +1,36 @@ +%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: a21b01507d5987b4689b5f16296f8eb8, type: 3} + m_Name: Prefabs + m_EditorClassIdentifier: + Favorites: + - path: Assets/UMA/Getting Started/UMADynamicCharacterAvatar.prefab + GUID: 5c80fc4442f8349969abea6c1a0f1faa + name: UMADynamicCharacterAvatar + asset: {fileID: 153068, guid: 5c80fc4442f8349969abea6c1a0f1faa, type: 3} + favoriteList: {fileID: 11400000} + - path: Assets/UMA/Getting Started/UMARandomGeneratedCharacter.prefab + GUID: 11b6342601a487e45a8ca8ed561a9b7a + name: UMARandomGeneratedCharacter + asset: {fileID: 2885161576785399288, guid: 11b6342601a487e45a8ca8ed561a9b7a, type: 3} + favoriteList: {fileID: 11400000} + - path: Assets/UMA/Getting Started/UMA_GLIB.prefab + GUID: a54fde34eec40964b94d71ee0aba9889 + name: UMA_GLIB + asset: {fileID: 6782112333398131213, guid: a54fde34eec40964b94d71ee0aba9889, type: 3} + favoriteList: {fileID: 11400000} + - path: Assets/UMA/Getting Started/Basic Sample Environment.prefab + GUID: 859f3fbf238606842b0a7127e5d73789 + name: Basic Sample Environment + asset: {fileID: 7572049267703359851, guid: 859f3fbf238606842b0a7127e5d73789, type: 3} + favoriteList: {fileID: 11400000} + exPanded: 1 diff --git a/UMAProject/Assets/UMA/Favorites/Prefabs.asset.meta b/UMAProject/Assets/UMA/Favorites/Prefabs.asset.meta new file mode 100644 index 000000000..30e37e9f2 --- /dev/null +++ b/UMAProject/Assets/UMA/Favorites/Prefabs.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5657505a9046ed244874c9233e85133b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Favorites/Races.asset b/UMAProject/Assets/UMA/Favorites/Races.asset new file mode 100644 index 000000000..727bd41d9 --- /dev/null +++ b/UMAProject/Assets/UMA/Favorites/Races.asset @@ -0,0 +1,36 @@ +%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: a21b01507d5987b4689b5f16296f8eb8, type: 3} + m_Name: Races + m_EditorClassIdentifier: + Favorites: + - path: Assets/UMA/Content/Core/HumanMale/RaceData/Human Male.asset + GUID: a88284a0175502f459c5496bda675fb1 + name: Human Male + asset: {fileID: 11400000, guid: a88284a0175502f459c5496bda675fb1, type: 2} + favoriteList: {fileID: 11400000} + - path: Assets/UMA/Content/Core/HumanFemale/RaceData/Human Female.asset + GUID: f8fea6f0ee17b3f42a4ae6cfb627bab3 + name: Human Female + asset: {fileID: 11400000, guid: f8fea6f0ee17b3f42a4ae6cfb627bab3, type: 2} + favoriteList: {fileID: 11400000} + - path: Assets/UMA/Content/Core/HumanMale/RaceData/Human Boy.asset + GUID: b57b35921e0f3d84aaafea12ef61470c + name: Human Boy + asset: {fileID: 11400000, guid: b57b35921e0f3d84aaafea12ef61470c, type: 2} + favoriteList: {fileID: 11400000} + - path: Assets/UMA/Content/Core/HumanFemale/RaceData/Human Girl.asset + GUID: 8f9fc622c08165a4297be9de525ccd1b + name: Human Girl + asset: {fileID: 11400000, guid: 8f9fc622c08165a4297be9de525ccd1b, type: 2} + favoriteList: {fileID: 11400000} + exPanded: 1 diff --git a/UMAProject/Assets/UMA/Favorites/Races.asset.meta b/UMAProject/Assets/UMA/Favorites/Races.asset.meta new file mode 100644 index 000000000..8afcb5c2a --- /dev/null +++ b/UMAProject/Assets/UMA/Favorites/Races.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 132b2f9d276530447a26978722ae3ce2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/InternalDataStore/InGame/Resources/AssetIndexer.asset b/UMAProject/Assets/UMA/InternalDataStore/InGame/Resources/AssetIndexer.asset index 6fcf1c184..5da2187ee 100644 Binary files a/UMAProject/Assets/UMA/InternalDataStore/InGame/Resources/AssetIndexer.asset and b/UMAProject/Assets/UMA/InternalDataStore/InGame/Resources/AssetIndexer.asset differ diff --git a/UMAProject/Assets/UMA/MyTestAnimation.anim b/UMAProject/Assets/UMA/MyTestAnimation.anim new file mode 100644 index 000000000..2ee8e117a --- /dev/null +++ b/UMAProject/Assets/UMA/MyTestAnimation.anim @@ -0,0 +1,53 @@ +%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: MyTestAnimation + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + 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: [] + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 1 + 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: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/UMAProject/Assets/UMA/MyTestAnimation.anim.meta b/UMAProject/Assets/UMA/MyTestAnimation.anim.meta new file mode 100644 index 000000000..3ce71b48c --- /dev/null +++ b/UMAProject/Assets/UMA/MyTestAnimation.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4ee3504791e9bc745bc0e6d74cb48692 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/SQL.meta b/UMAProject/Assets/UMA/SQL.meta new file mode 100644 index 000000000..9b3726caf --- /dev/null +++ b/UMAProject/Assets/UMA/SQL.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fc52a42e3c93b1b4db0c4201703ca013 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Assets/UMA/Whats New in UMA.txt b/UMAProject/Assets/UMA/Whats New in UMA.txt index 0c324a32a..b9fe32a01 100644 --- a/UMAProject/Assets/UMA/Whats New in UMA.txt +++ b/UMAProject/Assets/UMA/Whats New in UMA.txt @@ -1,3 +1,34 @@ +What's new in UMA 2.13b + +You can now enable/disable default wardrobe recipes without removing them from the list in the customization section. +The currently equipped wardrobe recipe is marked with a * in the list. +Enabled recipes are marked with a plus sign. +Disabled recipes are marked with a minus sign. +The Hair Smoosher has been updated and bugs fixed. +Clipping Plane offset - It will now allow you to tune the plane points on the clipping plane slot. +You can now scale and offset the smooshed hair to help adjust for different polygon densities on the hair slot. +Overlays can now have Photoshop-style blend modes applied to them. This allows for more control over how the overlay is blended with the underlying texture. +Blends are specified on the individual texture channel on the overlay. +Supported blend modes are: Normal, Multiply, Screen, Overlay, Darken, Lighten, Color Dodge, Color Burn, Hard Light, Soft Light, and Subtract. +Drag and drop support for merging recipes into other recipes, with slots/overlays/colors/options. +Mesh Hide asset editor can now export occlusion data to a texture, and load and apply occlusion data from a texture. +Fixed bug in Addressable preloader where it would not ask to load additive recipes, causing those not to work at all when using addressables. +Added new compositing shader for Diffuse/Normal/Metallic workflow, so you can drop it in most recipes. +Added favorites window so you can add whatever favorites you want +Colors can now be marked as "base colors" in the customization window, and filtered to those colors. +Added option to "average normals" on the slot welder. +Added ability on DCA to "force suppress" slots or overlays based on tag. For example, if you want to remove an eyebrow overlay off the face if you have used replacement texture for the face that already contains them. +Added preference to use the Burst Compiler to speed up mesh generation. Requires the burst compiler to be installed. +Added option to tile overlays when using the Keep Textures mode. +Added additional sanity checking in various functions for those times when things are going so well. :) +Disabled index healing (even when enabled in preferences) when playing in the editor +Added option to trigger various rebuild types in the editor, not just a full rebuild. +Added "Second pass" material to UMAMaterial. When present, will duplicate the submesh, and draw the submesh a second time with the second material. This is useful for simulating multi-pass in URP. +Added option to UMAMaterial to specify alternate materials for different SRP pipelines. +ConvertRenderTexture is now off by default on mobile. +Fixed various leaks/bugs in MeshHideAsset Inspector. + + What's new in UMA 2.13a4 diff --git a/UMAProject/Assets/UMA/screentest.png b/UMAProject/Assets/UMA/screentest.png new file mode 100644 index 000000000..01c37ed5b Binary files /dev/null and b/UMAProject/Assets/UMA/screentest.png differ diff --git a/UMAProject/Assets/UMA/screentest.png.meta b/UMAProject/Assets/UMA/screentest.png.meta new file mode 100644 index 000000000..5d588c174 --- /dev/null +++ b/UMAProject/Assets/UMA/screentest.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 3cf23d8204061b7449ff1901feba2e3e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + 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 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UMAProject/Logs/Packages-Update.log b/UMAProject/Logs/Packages-Update.log deleted file mode 100644 index 60e41a0d8..000000000 --- a/UMAProject/Logs/Packages-Update.log +++ /dev/null @@ -1,66 +0,0 @@ - -=== Fri Nov 13 19:58:07 2020 - -Packages were changed. -Update Mode: resetToDefaultDependencies - -The following packages were added: - com.unity.ide.rider@1.1.4 - com.unity.ide.vscode@1.2.2 - com.unity.modules.androidjni@1.0.0 - com.unity.test-framework@1.1.18 - com.unity.timeline@1.2.17 - com.unity.ugui@1.0.0 -The following packages were updated: - com.unity.collab-proxy from version 1.2.15 to 1.2.16 - com.unity.textmeshpro from version 1.4.1 to 2.1.1 -The following packages were removed: - com.unity.ads@2.0.8 - com.unity.analytics@3.2.2 - com.unity.memoryprofiler@0.2.1-preview.2 - com.unity.package-manager-ui@2.0.8 - com.unity.purchasing@2.0.3 - -=== Sat Dec 26 14:51:05 2020 - -Packages were changed. -Update Mode: updateDependencies - -The following packages were updated: - com.unity.ide.vscode from version 1.2.2 to 1.2.3 - com.unity.test-framework from version 1.1.18 to 1.1.19 - -=== Wed Apr 20 20:04:39 2022 - -Packages were changed. -Update Mode: updateDependencies - -The following packages were added: - com.unity.ide.visualstudio@2.0.9 -The following packages were updated: - com.unity.collab-proxy from version 1.2.16 to 1.6.0 - com.unity.ide.rider from version 1.1.4 to 1.2.1 - com.unity.test-framework from version 1.1.19 to 1.1.27 - com.unity.timeline from version 1.2.17 to 1.2.18 - -=== Fri Dec 16 21:43:59 2022 - -Packages were changed. -Update Mode: mergeDefaultDependencies - -The following packages were added: - com.unity.animation.rigging@1.0.3 - com.unity.collab-proxy@1.5.7 - com.unity.textmeshpro@3.0.6 -The following packages were updated: - com.unity.timeline from version 1.4.7 to 1.4.8 - -=== Wed Apr 12 13:31:03 2023 - -Packages were changed. -Update Mode: updateDependencies - -The following packages were updated: - com.unity.collab-proxy from version 1.5.7 to 1.15.15 - com.unity.ide.vscode from version 1.2.3 to 1.2.5 - com.unity.test-framework from version 1.1.27 to 1.1.31 diff --git a/UMAProject/Packages/manifest.json b/UMAProject/Packages/manifest.json index 83d01e790..c33c935d1 100644 --- a/UMAProject/Packages/manifest.json +++ b/UMAProject/Packages/manifest.json @@ -1,7 +1,8 @@ { "dependencies": { + "com.unity.addressables": "1.18.19", "com.unity.animation.rigging": "1.0.3", - "com.unity.burst": "1.4.11", + "com.unity.burst": "1.6.6", "com.unity.cinemachine": "2.6.17", "com.unity.collab-proxy": "1.15.15", "com.unity.ide.rider": "2.0.7", diff --git a/UMAProject/Packages/packages-lock.json b/UMAProject/Packages/packages-lock.json index d9703af62..e21d69951 100644 --- a/UMAProject/Packages/packages-lock.json +++ b/UMAProject/Packages/packages-lock.json @@ -1,5 +1,25 @@ { "dependencies": { + "com.jbooth.better-shaders": { + "version": "file:com.jbooth.better-shaders", + "depth": 0, + "source": "embedded", + "dependencies": {} + }, + "com.unity.addressables": { + "version": "1.18.19", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.scriptablebuildpipeline": "1.19.2", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.animation.rigging": { "version": "1.0.3", "depth": 0, @@ -11,7 +31,7 @@ "url": "https://packages.unity.com" }, "com.unity.burst": { - "version": "1.4.11", + "version": "1.6.6", "depth": 0, "source": "registry", "dependencies": { @@ -101,6 +121,13 @@ "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.scriptablebuildpipeline": { + "version": "1.19.2", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, "com.unity.services.core": { "version": "1.0.1", "depth": 1, diff --git a/UMAProject/UserSettings/EditorUserSettings.asset b/UMAProject/UserSettings/EditorUserSettings.asset index 2e44a53dd..d90122e53 100644 --- a/UMAProject/UserSettings/EditorUserSettings.asset +++ b/UMAProject/UserSettings/EditorUserSettings.asset @@ -6,34 +6,34 @@ EditorUserSettings: serializedVersion: 4 m_ConfigSettings: RecentlyUsedScenePath-0: - value: 224247031146466e202f4307082252001a120b65002d21312e305d16fae13928eee225a6d2171e7c1a0dfd39441a0432fd4a444bd519051c1540e80018eb09 + value: 224247031146466e202f4307082252001a120b65002d21312e305d16fae13928eee225a6d2171e7c1a0dfd39441a0432fd4a444bc20e121f041cf84e3dd0345d04cb11d103 flags: 0 RecentlyUsedScenePath-1: - value: 224247031146466e202f4307082252001a120b65002d21312e305d16fae13928eee225a6d2171e7c1a0dfd39441a0432fd4a444bd519051c154ecf0b12f60016028b0dcb13dc06 + value: 224247031146466e202f4307082252001a120b650831283120201e10eae12639e1f333fbd4232c283c0faf191c3f0c2ffe0f1a44c3262b4b352dce4e35fa1d1c518858e134e95f38ce1519c9cc09d4f09bc3dae3ccf2 flags: 0 RecentlyUsedScenePath-2: - value: 224247031146466e202f4307082252001a120b65002d21312e305d16fae13928eee225a6d2171e7c1a0dfd39441a0432fd4a444bc50e18021002f41414fb503019c40ac419dc1a0ed85709c0c409c8 + value: 224247031146466e202f4307082252001a120b650831283120201e10eae12639e1f333fbd4232c283c0faf191c3f0c2ffe0f1a44c3262b4b352dce4e35fa1d1c518858f71bc61b13c6593fc6cc0fd0e0c1d3c6f996fee9d1cac6 flags: 0 RecentlyUsedScenePath-3: - value: 224247031146466e202f4307082252001a120b65002d21312e305d16fae13928eee225a6d2171e7c1a0dfd39441a0432fd4a444bc20e121f041cf84e3dd0345d04cb11d103 + value: 224247031146466e202f4307082252001a120b650831283120201e10eae12639e1f333fbd4232c283c0faf191c3f0c2ffe0f1a44c3262b4b352dce4e35fa1d1c518858f037e95f3fca0b52dbc314c5fa flags: 0 RecentlyUsedScenePath-4: - value: 224247031146466e202f4307082252001a120b650831283120201e10eae12639e1f333fbd4232c283c0faf191c3f0c2ffe0f1a44c3262b4b352dce4e35fa1d1c518858e134e95f38ce1519c9cc09d4f09bc3dae3ccf2 + value: 224247031146466e202f4307082252001a120b651905070228271936f0e52678c7ff37e4f7363a2f7637c21d441a0432fd4a444bc3262b391400f90b03fa023202d61dd109860a12c20d05 flags: 0 RecentlyUsedScenePath-5: - value: 224247031146466e202f4307082252001a120b650831283120201e10eae12639e1f333fbd4232c283c0faf191c3f0c2ffe0f1a44c3262b4b352dce4e35fa1d1c518858f71bc61b13c6593fc6cc0fd0e0c1d3c6f996fee9d1cac6 + value: 224247031146466e202f4307082252001a120b650d2c2222283a0e32e0ec312badc632edf53f2c2f3800e339170d023afc0f471ef8021e12 flags: 0 RecentlyUsedScenePath-6: - value: 224247031146466e202f4307082252001a120b650831283120201e10eae12639e1f333fbd4232c283c0faf191c3f0c2ffe0f1a44c3262b4b352dce4e35fa1d1c518858f613c50f10ce592fcbd908c1adc0d8ddfec1 + value: 224247031146466e202f4307082252001a120b65042731042269382be3ed2434e7f479c1e82d7f283642cc330a2d152de7091d4bf74b2e28304efb1c1ef2500012d719d119c05109c51008d7 flags: 0 RecentlyUsedScenePath-7: - value: 224247031146466e202f4307082252001a120b650831283120201e10eae12639e1f333fbd4232c283c0faf191c3f0c2ffe0f1a44c3262b4b352dce4e35fa1d1c518858f037e95f3fca0b52dbc314c5fa + value: 224247031146466e202f4307082252001a120b6518212b3521201336a2c52c39eff73aeca80f121d7936e63101320831f74a2c13f7061a071440e80018eb09 flags: 0 RecentlyUsedScenePath-8: - value: 224247031146466e202f4307082252001a120b651905070228271936f0e52678c7ff37e4f7363a2f7637c21d441a0432fd4a444bc3262b391400f90b03fa023202d61dd109860a12c20d05 + value: 224247031146466e202f43011f315a5f3313113e233a69032e2c1336f1af1b2ee7f53ae8fe1b33353e0cea2e4a2b0f36e613 flags: 0 RecentlyUsedScenePath-9: - value: 224247031146466e202f4307082252001a120b6518212b3521201336a2c52c39eff73aeca80f121d7936e63101320831f74a2c13f7061a071440e80018eb09 + value: 224247031146466e202f4307082252001a120b650831283120201e10eae12639e1f333fbd4232c283c0faf191c3f0c2ffe0f1a44c3262b4b352dce4e35fa1d1c518858f613c50f10ce592fcbd908c1adc0d8ddfec1 flags: 0 vcSharedLogLevel: value: 0d5e400f0650 diff --git a/UMAProject/scratch.png b/UMAProject/scratch.png new file mode 100644 index 000000000..ba8d6181e Binary files /dev/null and b/UMAProject/scratch.png differ diff --git a/UMAProject/target.png b/UMAProject/target.png new file mode 100644 index 000000000..ba8d6181e Binary files /dev/null and b/UMAProject/target.png differ