DTM Trail

This commit is contained in:
SoulliesOfficial
2025-04-09 17:54:29 -04:00
parent d4e51999b1
commit 3dbfd6bf62
51 changed files with 47522 additions and 924 deletions

113
Assets/Shaders/Grid.shader Normal file
View File

@@ -0,0 +1,113 @@
Shader "Custom/Grid"
{
Properties
{
_LineColor("Line Color", Color) = (1,1,1,1)
_BackgroundColor("Background Color", Color) = (0,0,0,0)
_GridScale("Grid Scale", Float) = 1
_LineWidth("Line Width", Float) = 0.05
_Fade("Fade", Float) = 0.1
_Plane("Plane (0: XZ, 1: XY, 2: YZ)", Float) = 0
_DisappearStartDistance("Disappear Start Distance", Float) = 50
_DisappearEndDistance("Disappear End Distance", Float) = 100
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
LOD 100
Pass
{
Name "GridPass"
Cull Off
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// 内置变量:摄像机在世界空间中的位置
//float3 _WorldSpaceCameraPos;
struct Attributes
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 position : SV_POSITION;
float3 worldPos : TEXCOORD0;
};
CBUFFER_START(UnityPerMaterial)
float4 _LineColor;
float4 _BackgroundColor;
float _GridScale;
float _LineWidth;
float _Fade;
float _Plane;
float _DisappearStartDistance;
float _DisappearEndDistance;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.position = TransformObjectToHClip(IN.vertex);
OUT.worldPos = TransformObjectToWorld(IN.vertex).xyz;
return OUT;
}
// 根据 _Plane 选择二维坐标
float2 GetGridCoordinates(float3 pos)
{
if (_Plane < 0.5) // XZ 平面
return pos.xz;
else if (_Plane < 1.5) // XY 平面
return pos.xy;
else // YZ 平面
return pos.yz;
}
// 根据 _Plane 获取摄像机在网格平面上的位置
float2 GetCameraPlanePosition()
{
if (_Plane < 0.5) // XZ 平面:摄像机投影到 XZ
return _WorldSpaceCameraPos.xz;
else if (_Plane < 1.5) // XY 平面:摄像机投影到 XY
return _WorldSpaceCameraPos.xy;
else // YZ 平面:摄像机投影到 YZ
return _WorldSpaceCameraPos.yz;
}
half4 frag(Varyings IN) : SV_Target
{
// 计算二维网格坐标并乘以 _GridScale
float2 gridCoord = GetGridCoordinates(IN.worldPos) * _GridScale;
// 用 frac 与 fwidth 实现平滑网格线(抗锯齿)
float2 grid = abs(frac(gridCoord - 0.5) - 0.5) / fwidth(gridCoord);
float lineIntensity = 1.0 - smoothstep(0.0, _LineWidth, min(grid.x, grid.y));
// 计算摄像机在平面上的位置与当前片元的二维距离
float2 camPos2D = GetCameraPlanePosition();
float2 fragPos2D = GetGridCoordinates(IN.worldPos);
float dist = distance(fragPos2D, camPos2D);
// 超过 100 米开始淡出,到 200 米完全透明
float distanceFade = saturate((_DisappearEndDistance - dist) / _DisappearStartDistance);
// 最终 alpha 是网格线强度乘以距离淡出因子
float finalAlpha = lineIntensity * distanceFade;
// 背景颜色始终透明,所以直接输出网格线颜色与 alpha
return float4(_LineColor.rgb, finalAlpha);
}
ENDHLSL
}
}
FallBack "Diffuse"
}

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 3f7a07814aa8ca44e820255a68f2ca9f
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -9,7 +9,7 @@ Shader "Soullies/TrackShader"
[HDR]_BaseColor("BaseColor", Color) = (0,0,0,0)
[HDR]_EmissionColor("EmissionColor", Color) = (0,0,0,0)
[Toggle(_USEREDASALPHA_ON)] _UseRedAsAlpha("UseRedAsAlpha", Float) = 1
[Toggle(_EMISSION_ON)] _Emission("Emission", Float) = 1
[Toggle(_EMISSION_ON)] _Emission("Emission", Float) = 0
[HideInInspector] _texcoord( "", 2D ) = "white" {}
[HideInInspector][NoScaleOffset] unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {}
@@ -27,7 +27,7 @@ Shader "Soullies/TrackShader"
Cull Off
HLSLINCLUDE
#pragma target 3.0
#pragma target 3.5
#pragma prefer_hlslcc gles
// ensure rendering platforms toggle list is visible
@@ -43,7 +43,7 @@ Shader "Soullies/TrackShader"
Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
ZTest LEqual
ZWrite On
ZWrite Off
Offset 0 , 0
ColorMask RGBA
@@ -159,12 +159,12 @@ Shader "Soullies/TrackShader"
float4 appendResult13 = (float4(break10.r , break10.g , break10.b , staticSwitch28));
float4 temp_cast_0 = (1.0).xxxx;
#ifdef _EMISSION_ON
float4 staticSwitch29 = _EmissionColor;
float4 staticSwitch31 = _EmissionColor;
#else
float4 staticSwitch29 = temp_cast_0;
float4 staticSwitch31 = temp_cast_0;
#endif
float4 Color = ( ( appendResult13 * _BaseColor ) * staticSwitch29 );
float4 Color = ( ( appendResult13 * _BaseColor ) * staticSwitch31 );
#if ETC1_EXTERNAL_ALPHA
float4 alpha = SAMPLE_TEXTURE2D( _AlphaTex, sampler_AlphaTex, IN.texCoord0.xy );
@@ -201,7 +201,7 @@ Shader "Soullies/TrackShader"
Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
ZTest LEqual
ZWrite On
ZWrite Off
Offset 0 , 0
ColorMask RGBA
@@ -317,12 +317,12 @@ Shader "Soullies/TrackShader"
float4 appendResult13 = (float4(break10.r , break10.g , break10.b , staticSwitch28));
float4 temp_cast_0 = (1.0).xxxx;
#ifdef _EMISSION_ON
float4 staticSwitch29 = _EmissionColor;
float4 staticSwitch31 = _EmissionColor;
#else
float4 staticSwitch29 = temp_cast_0;
float4 staticSwitch31 = temp_cast_0;
#endif
float4 Color = ( ( appendResult13 * _BaseColor ) * staticSwitch29 );
float4 Color = ( ( appendResult13 * _BaseColor ) * staticSwitch31 );
#if ETC1_EXTERNAL_ALPHA
float4 alpha = SAMPLE_TEXTURE2D( _AlphaTex, sampler_AlphaTex, IN.texCoord0.xy );
@@ -459,12 +459,12 @@ Shader "Soullies/TrackShader"
float4 appendResult13 = (float4(break10.r , break10.g , break10.b , staticSwitch28));
float4 temp_cast_0 = (1.0).xxxx;
#ifdef _EMISSION_ON
float4 staticSwitch29 = _EmissionColor;
float4 staticSwitch31 = _EmissionColor;
#else
float4 staticSwitch29 = temp_cast_0;
float4 staticSwitch31 = temp_cast_0;
#endif
float4 Color = ( ( appendResult13 * _BaseColor ) * staticSwitch29 );
float4 Color = ( ( appendResult13 * _BaseColor ) * staticSwitch31 );
half4 outColor = half4(_ObjectId, _PassValue, 1.0, 1.0);
return outColor;
@@ -579,12 +579,12 @@ Shader "Soullies/TrackShader"
float4 appendResult13 = (float4(break10.r , break10.g , break10.b , staticSwitch28));
float4 temp_cast_0 = (1.0).xxxx;
#ifdef _EMISSION_ON
float4 staticSwitch29 = _EmissionColor;
float4 staticSwitch31 = _EmissionColor;
#else
float4 staticSwitch29 = temp_cast_0;
float4 staticSwitch31 = temp_cast_0;
#endif
float4 Color = ( ( appendResult13 * _BaseColor ) * staticSwitch29 );
float4 Color = ( ( appendResult13 * _BaseColor ) * staticSwitch31 );
half4 outColor = _SelectionID;
return outColor;
}
@@ -599,20 +599,20 @@ Shader "Soullies/TrackShader"
}
/*ASEBEGIN
Version=19501
Node;AmplifyShaderEditor.SamplerNode;6;-992,-272;Inherit;True;Property;_MainTexture;MainTexture;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;6;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT3;5
Node;AmplifyShaderEditor.SamplerNode;6;-992,-272;Inherit;True;Property;_MainTexture;MainTexture;0;0;Create;True;0;0;0;False;0;False;-1;None;f4c14c8a739195b49ae7277a44426f2a;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;6;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT3;5
Node;AmplifyShaderEditor.BreakToComponentsNode;10;-672,-272;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15
Node;AmplifyShaderEditor.StaticSwitch;28;-512,-160;Inherit;False;Property;_UseRedAsAlpha;UseRedAsAlpha;3;0;Create;True;0;0;0;False;0;False;0;1;1;True;;Toggle;2;Key0;Key1;Create;True;True;All;9;1;FLOAT;0;False;0;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.StaticSwitch;28;-496,-160;Inherit;False;Property;_UseRedAsAlpha;UseRedAsAlpha;3;0;Create;True;0;0;0;False;0;False;0;1;1;True;;Toggle;2;Key0;Key1;Create;True;True;All;9;1;FLOAT;0;False;0;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.DynamicAppendNode;13;-192,-288;Inherit;False;COLOR;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.RangedFloatNode;30;-48,0;Inherit;False;Constant;_Float0;Float 0;6;0;Create;True;0;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.ColorNode;8;-368,-16;Inherit;False;Property;_BaseColor;BaseColor;1;1;[HDR];Create;True;0;0;0;False;0;False;0,0,0,0;0,0,0,0;True;True;0;6;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT3;5
Node;AmplifyShaderEditor.ColorNode;20;-96,128;Inherit;False;Property;_EmissionColor;EmissionColor;2;1;[HDR];Create;True;0;0;0;False;0;False;0,0,0,0;0,0,0,0;True;True;0;6;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT3;5
Node;AmplifyShaderEditor.ColorNode;8;-368,-16;Inherit;False;Property;_BaseColor;BaseColor;1;1;[HDR];Create;True;0;0;0;False;0;False;0,0,0,0;1,1,1,1;True;True;0;6;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT3;5
Node;AmplifyShaderEditor.ColorNode;20;-96,128;Inherit;False;Property;_EmissionColor;EmissionColor;2;1;[HDR];Create;True;0;0;0;False;0;False;0,0,0,0;0.9999999,0.9999999,0.9999999,1;True;True;0;6;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT3;5
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;14;-16,-192;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.StaticSwitch;29;144,-32;Inherit;False;Property;_Emission;Emission;4;0;Create;True;0;0;0;False;0;False;0;1;1;True;;Toggle;2;Key0;Key1;Create;True;True;All;9;1;COLOR;0,0,0,0;False;0;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;COLOR;0,0,0,0;False;4;COLOR;0,0,0,0;False;5;COLOR;0,0,0,0;False;6;COLOR;0,0,0,0;False;7;COLOR;0,0,0,0;False;8;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.StaticSwitch;31;192,-16;Inherit;False;Property;_Emission;Emission;4;0;Create;True;0;0;0;False;0;False;0;0;1;True;;Toggle;2;Key0;Key1;Create;True;True;All;9;1;COLOR;0,0,0,0;False;0;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;COLOR;0,0,0,0;False;4;COLOR;0,0,0,0;False;5;COLOR;0,0,0,0;False;6;COLOR;0,0,0,0;False;7;COLOR;0,0,0,0;False;8;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;21;416,-144;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;3;0,0;Float;False;False;-1;2;ASEMaterialInspector;0;1;New Amplify Shader;cf964e524c8e69742b1d21fbe2ebcc4a;True;Sprite Unlit Forward;0;1;Sprite Unlit Forward;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;0;True;12;all;0;False;True;2;5;False;;10;False;;3;1;False;;10;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;;False;False;False;False;False;False;False;True;False;0;False;;255;False;;255;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;False;True;1;False;;True;3;False;;True;True;0;False;;0;False;;True;1;LightMode=UniversalForward;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;4;0,0;Float;False;False;-1;2;ASEMaterialInspector;0;1;New Amplify Shader;cf964e524c8e69742b1d21fbe2ebcc4a;True;SceneSelectionPass;0;2;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;0;True;12;all;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;5;0,0;Float;False;False;-1;2;ASEMaterialInspector;0;1;New Amplify Shader;cf964e524c8e69742b1d21fbe2ebcc4a;True;ScenePickingPass;0;3;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;0;True;12;all;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;2;704,-160;Float;False;True;-1;2;ASEMaterialInspector;0;17;Soullies/TrackShader;cf964e524c8e69742b1d21fbe2ebcc4a;True;Sprite Unlit;0;0;Sprite Unlit;4;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;2;True;12;all;0;False;True;2;5;False;;10;False;;3;1;False;;10;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;;False;False;False;False;False;False;False;True;False;0;False;;255;False;;255;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;True;True;1;False;;True;3;False;;True;True;0;False;;0;False;;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;3;Vertex Position;1;0;Debug Display;0;0;External Alpha;0;0;0;4;True;True;True;True;False;;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;46;704,-160;Float;False;True;-1;2;ASEMaterialInspector;0;17;Soullies/TrackShader;cf964e524c8e69742b1d21fbe2ebcc4a;True;Sprite Unlit;0;0;Sprite Unlit;4;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;3;True;12;all;0;False;True;2;5;False;;10;False;;3;1;False;;10;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;;False;False;False;False;False;False;False;True;False;0;False;;255;False;;255;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;False;True;2;False;;True;3;False;;True;True;0;False;;0;False;;True;1;LightMode=Universal2D;False;False;0;Hidden/InternalErrorShader;0;0;Standard;3;Vertex Position;1;0;Debug Display;0;0;External Alpha;0;0;0;4;True;True;True;True;False;;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;47;704,-160;Float;False;False;-1;2;ASEMaterialInspector;0;1;New Amplify Shader;cf964e524c8e69742b1d21fbe2ebcc4a;True;Sprite Unlit Forward;0;1;Sprite Unlit Forward;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;0;True;12;all;0;False;True;2;5;False;;10;False;;3;1;False;;10;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;;False;False;False;False;False;False;False;True;False;0;False;;255;False;;255;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;0;False;;False;True;2;False;;True;3;False;;True;True;0;False;;0;False;;True;1;LightMode=UniversalForward;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;48;704,-160;Float;False;False;-1;2;ASEMaterialInspector;0;1;New Amplify Shader;cf964e524c8e69742b1d21fbe2ebcc4a;True;SceneSelectionPass;0;2;SceneSelectionPass;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;0;True;12;all;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=SceneSelectionPass;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;49;704,-160;Float;False;False;-1;2;ASEMaterialInspector;0;1;New Amplify Shader;cf964e524c8e69742b1d21fbe2ebcc4a;True;ScenePickingPass;0;3;ScenePickingPass;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;0;True;12;all;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0
WireConnection;10;0;6;0
WireConnection;28;1;10;3
WireConnection;28;0;10;0
@@ -622,10 +622,10 @@ WireConnection;13;2;10;2
WireConnection;13;3;28;0
WireConnection;14;0;13;0
WireConnection;14;1;8;0
WireConnection;29;1;30;0
WireConnection;29;0;20;0
WireConnection;31;1;30;0
WireConnection;31;0;20;0
WireConnection;21;0;14;0
WireConnection;21;1;29;0
WireConnection;2;1;21;0
WireConnection;21;1;31;0
WireConnection;46;1;21;0
ASEEND*/
//CHKSM=40C28A86E8CC0AB370CE278DE6A8EB09B052B98B
//CHKSM=917D3EA6A6EC5810E40C08DE02DAAE07B356CD36