浏览代码

Merge remote-tracking branch 'refs/remotes/origin/master' into shadows

# Conflicts:
#	Assets/ScriptableRenderPipeline/HDRenderPipeline/HDRenderPipeline.cs
#	Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.hlsl
/main
Sebastien Lagarde 7 年前
当前提交
58f36f39
共有 169 个文件被更改,包括 5413 次插入1041 次删除
  1. 1
      Assets/ScriptableRenderPipeline/AdditionalLightData.cs
  2. 5
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/Resources/DebugViewMaterialGBuffer.shader
  3. 2
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/Resources/DebugViewMaterialGBuffer.shader.meta
  4. 10
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/Resources/DebugViewTiles.shader
  5. 236
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Editor/HDRenderPipelineInspector.cs
  6. 21
      Assets/ScriptableRenderPipeline/HDRenderPipeline/HDRenderPipeline.asset
  7. 150
      Assets/ScriptableRenderPipeline/HDRenderPipeline/HDRenderPipeline.cs
  8. 5
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/LightDefinition.cs
  9. 16
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/LightDefinition.cs.hlsl
  10. 8
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/LightLoop.cs
  11. 10
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/Resources/Deferred.shader
  12. 2
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/FeatureFlags.hlsl
  13. 1
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/lightlistbuild-clustered.compute
  14. 7
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/shadeopaque.compute
  15. 73
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePass.cs
  16. 8
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePass.hlsl
  17. 19
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePassLoop.hlsl
  18. 6
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePassResources.cs
  19. 39
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/LayeredLit/LayeredLit.shader
  20. 40
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/LayeredLit/LayeredLitTessellation.shader
  21. 9
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Editor/BaseLitUI.cs
  22. 22
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Editor/LitUI.cs
  23. 20
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.cs
  24. 31
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.cs.hlsl
  25. 405
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.hlsl
  26. 51
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.shader
  27. 2
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/LitData.hlsl
  28. 13
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/LitDataInternal.hlsl
  29. 16
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/LitProperties.hlsl
  30. 54
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/LitTessellation.shader
  31. 8
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Resources/CombineSubsurfaceScattering.shader
  32. 4
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/ShaderPass/LitSharePass.hlsl
  33. 2
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/SubsurfaceScatteringProfile.cs
  34. 4
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/MaterialUtilities.hlsl
  35. 106
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Unlit/Editor/BaseUnlitUI.cs
  36. 61
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Unlit/Unlit.shader
  37. 4
      Assets/ScriptableRenderPipeline/HDRenderPipeline/SceneSettings/SceneSettings.cs
  38. 2
      Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/FragInputs.hlsl
  39. 3
      Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/ShaderPass.cs
  40. 1
      Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/ShaderPass.cs.hlsl
  41. 21
      Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/ShaderPassForward.hlsl
  42. 65
      Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderVariables.hlsl
  43. 1
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Utilities.cs
  44. 36
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Wind/3DNoise.psd.meta
  45. 146
      Assets/ScriptableRenderPipeline/ShaderLibrary/AreaLighting.hlsl
  46. 18
      Assets/ScriptableRenderPipeline/ShaderLibrary/CommonLighting.hlsl
  47. 8
      Assets/ScriptableRenderPipeline/ShaderLibrary/NormalSurfaceGradient.hlsl
  48. 9
      Assets/ScriptableRenderPipeline/ShaderLibrary/Packing.hlsl
  49. 14
      Assets/ScriptableRenderPipeline/ShaderLibrary/SampleUVMappingInternal.hlsl
  50. 12
      Assets/ScriptableRenderPipeline/ShaderLibrary/Wind.hlsl
  51. 103
      Assets/ScriptableRenderPipeline/common/Camera/CameraSwitcher.cs
  52. 22
      Assets/ScriptableRenderPipeline/common/TextureCache.cs
  53. 1
      Assets/ScriptableRenderPipeline/fptl/lightlistbuild-clustered.compute
  54. 28
      Assets/TestScenes/HDTest/GraphicTest/Common/Dragon/DragonStatue.mat
  55. 890
      Assets/TestScenes/HDTest/HDRenderLoopTest.unity
  56. 3
      ProjectSettings/EditorBuildSettings.asset
  57. 96
      ProjectSettings/InputManager.asset
  58. 14
      ProjectSettings/ProjectSettings.asset
  59. 14
      ProjectSettings/QualitySettings.asset
  60. 1
      Assets/ScriptableRenderPipeline/ShaderGenerator/Editor/ShaderGeneratorMenu.cs
  61. 378
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.cs
  62. 37
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.cs.hlsl
  63. 9
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.cs.hlsl.meta
  64. 12
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.cs.meta
  65. 12
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.hlsl
  66. 9
      Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.hlsl.meta
  67. 9
      Assets/ScriptableRenderPipeline/HDRenderPipeline/SSSProfile.meta
  68. 9
      Assets/ScriptableRenderPipeline/PostProcessing.meta
  69. 9
      Assets/ScriptableRenderPipeline/common/Debugging.meta
  70. 9
      Assets/TestScenes/Common.meta
  71. 221
      Assets/TestScenes/HDTest/GraphicTest/Common/Dragon/DragonStatueSpecular.mat
  72. 8
      Assets/TestScenes/HDTest/GraphicTest/Common/Dragon/DragonStatueSpecular.mat.meta
  73. 610
      Assets/TestScenes/HDTest/GraphicTest/Common/Dragon/Dragon_specular.psd
  74. 88
      Assets/TestScenes/HDTest/GraphicTest/Common/Dragon/Dragon_specular.psd.meta
  75. 9
      Assets/TestScenes/HDTest/GraphicTest/SSS.meta
  76. 197
      Assets/TestScenes/HDTest/GraphicTest/Two Sided/Material/GroundLeaf_DoubleSidedFlipSSS.mat
  77. 8
      Assets/TestScenes/HDTest/GraphicTest/Two Sided/Material/GroundLeaf_DoubleSidedFlipSSS.mat.meta
  78. 8
      Assets/TestScenes/HDTest/NewBatcherBench1.unity.meta
  79. 9
      Assets/TestScenes/HDTest/NewBatcherTest.meta
  80. 37
      Assets/ScriptableRenderPipeline/HDRenderPipeline/SSSProfile/FoliageSSSProfile.asset
  81. 9
      Assets/ScriptableRenderPipeline/HDRenderPipeline/SSSProfile/FoliageSSSProfile.asset.meta
  82. 37
      Assets/ScriptableRenderPipeline/HDRenderPipeline/SSSProfile/SkinSSSProfile.asset
  83. 9
      Assets/ScriptableRenderPipeline/HDRenderPipeline/SSSProfile/SkinSSSProfile.asset.meta
  84. 288
      Assets/ScriptableRenderPipeline/common/Debugging/DebugActionManager.cs
  85. 12
      Assets/ScriptableRenderPipeline/common/Debugging/DebugActionManager.cs.meta
  86. 292
      Assets/ScriptableRenderPipeline/common/Debugging/DebugItemDrawer.cs
  87. 12
      Assets/ScriptableRenderPipeline/common/Debugging/DebugItemDrawer.cs.meta
  88. 267
      Assets/ScriptableRenderPipeline/common/Debugging/DebugMenu.cs
  89. 12
      Assets/ScriptableRenderPipeline/common/Debugging/DebugMenu.cs.meta
  90. 453
      Assets/ScriptableRenderPipeline/common/Debugging/DebugMenuItemUI.cs
  91. 12
      Assets/ScriptableRenderPipeline/common/Debugging/DebugMenuItemUI.cs.meta
  92. 194
      Assets/ScriptableRenderPipeline/common/Debugging/DebugMenuManager.cs
  93. 12
      Assets/ScriptableRenderPipeline/common/Debugging/DebugMenuManager.cs.meta
  94. 178
      Assets/ScriptableRenderPipeline/common/Debugging/DebugMenuUI.cs

1
Assets/ScriptableRenderPipeline/AdditionalLightData.cs


public bool affectSpecular = true;
public LightArchetype archetype = LightArchetype.Punctual;
public bool isDoubleSided = false; // Rectangular area lights only
[Range(0.0f, 20.0f)]
public float lightLength = 0.0f; // Area & projector lights

5
Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/Resources/DebugViewMaterialGBuffer.shader


#define UNITY_MATERIAL_LIT // Need to be define before including Material.hlsl
#include "../../ShaderConfig.cs.hlsl"
#include "../../ShaderVariables.hlsl"
#include "../../Debug/DebugViewMaterial.cs.hlsl"
#define DEBUG_DISPLAY
#include "../../Debug/DebugDisplay.hlsl"
int _DebugViewMaterial;
struct Attributes
{

2
Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/Resources/DebugViewMaterialGBuffer.shader.meta


fileFormatVersion: 2
guid: 439949ea1bfa91b4ba0d04269fcde33d
timeCreated: 1476053153
timeCreated: 1492803708
licenseType: Pro
ShaderImporter:
defaultTextures: []

10
Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/Resources/DebugViewTiles.shader


UpdatePositionInput(depth, _InvViewProjMatrix, _ViewProjMatrix, posInput);
int2 pixelCoord = posInput.unPositionSS.xy;
int2 tileCoord = (float2)pixelCoord / TILE_SIZE;
int2 mouseTileCoord = _MousePixelCoord / TILE_SIZE;
int2 offsetInTile = pixelCoord - tileCoord * TILE_SIZE;
int2 tileCoord = (float2)pixelCoord / GetTileSize();
int2 mouseTileCoord = _MousePixelCoord / GetTileSize();
int2 offsetInTile = pixelCoord - tileCoord * GetTileSize();
int n = 0;
#ifdef SHOW_LIGHT_CATEGORIES

// Tile overlap counter
if (n >= 0)
{
result = OverlayHeatMap(int2(posInput.unPositionSS.xy) & (TILE_SIZE - 1), n);
result = OverlayHeatMap(int2(posInput.unPositionSS.xy) & (GetTileSize() - 1), n);
}
#ifdef SHOW_LIGHT_CATEGORIES

bool border = any(offsetInTile == 0 || offsetInTile == TILE_SIZE - 1);
bool border = any(offsetInTile == 0 || offsetInTile == GetTileSize() - 1);
float4 result2 = float4(1.0, 1.0, 1.0, border ? 1.0 : 0.5);
result = AlphaBlend(result, result2);
}

236
Assets/ScriptableRenderPipeline/HDRenderPipeline/Editor/HDRenderPipelineInspector.cs


// Sky Settings
public readonly GUIContent skyParams = new GUIContent("Sky Settings");
// Global debug Settings
// Debug Display Settings
public readonly GUIContent debugging = new GUIContent("Debugging");
public readonly GUIContent debugOverlayRatio = new GUIContent("Overlay Ratio");

public bool isDebugViewMaterialInit = false;
public GUIContent[] debugViewMaterialStrings = null;
public int[] debugViewMaterialValues = null;
public readonly GUIContent debugViewEngine = new GUIContent("DebugView Engine", "Display various properties of Materials.");
public readonly GUIContent debugViewMaterialVarying = new GUIContent("DebugView Attributes", "Display varying input of Materials.");
public readonly GUIContent debugViewMaterialGBuffer = new GUIContent("DebugView GBuffer", "Display GBuffer properties.");
// Rendering Debug
public readonly GUIContent renderingDebugSettings = new GUIContent("Rendering Debug");

// Lighting Debug
public readonly GUIContent lightingDebugSettings = new GUIContent("Lighting Debug");
public readonly GUIContent shadowDebugEnable = new GUIContent("Enable Shadows");
public readonly GUIContent lightingVisualizationMode = new GUIContent("Lighting Debug Mode");
public readonly GUIContent[] debugViewLightingStrings = { new GUIContent("None"), new GUIContent("Diffuse Lighting"), new GUIContent("Specular Lighting"), new GUIContent("Visualize Cascades") };
public readonly int[] debugViewLightingValues = { (int)DebugLightingMode.None, (int)DebugLightingMode.DiffuseLighting, (int)DebugLightingMode.SpecularLighting, (int)DebugLightingMode.VisualizeCascade };
public readonly GUIContent shadowDebugVisualizeShadowIndex = new GUIContent("Visualize Shadow Index");
public readonly GUIContent lightingDebugMode = new GUIContent("Lighting Debug Mode");
public readonly GUIContent shadowDebugVisualizeShadowIndex = new GUIContent("Visualize Shadow Index");
public readonly GUIContent lightingDebugOverrideSmoothness = new GUIContent("Override Smoothness");
public readonly GUIContent lightingDebugOverrideSmoothnessValue = new GUIContent("Smoothness Value");
public readonly GUIContent lightingDebugAlbedo = new GUIContent("Lighting Debug Albedo");

}
}
// Global debug
// Display Debug
// Material Debug
SerializedProperty m_MaterialDebugMode = null;
// Rendering Debug
SerializedProperty m_DisplayOpaqueObjects = null;

SerializedProperty m_DebugShadowEnabled = null;
SerializedProperty m_ShadowDebugMode = null;
SerializedProperty m_ShadowDebugShadowMapIndex = null;
SerializedProperty m_LightingDebugMode = null;
SerializedProperty m_LightingDebugOverrideSmoothness = null;
SerializedProperty m_LightingDebugOverrideSmoothnessValue = null;
SerializedProperty m_LightingDebugAlbedo = null;

private void InitializeProperties()
{
// Global debug
m_DebugOverlayRatio = FindProperty(x => x.globalDebugSettings.debugOverlayRatio);
m_ShowLightingDebug = FindProperty(x => x.globalDebugSettings.displayLightingDebug);
m_ShowRenderingDebug = FindProperty(x => x.globalDebugSettings.displayRenderingDebug);
m_ShowMaterialDebug = FindProperty(x => x.globalDebugSettings.displayMaterialDebug);
// Material debug
m_MaterialDebugMode = FindProperty(x => x.globalDebugSettings.materialDebugSettings.debugViewMaterial);
// DebugDisplay debug
m_DebugOverlayRatio = FindProperty(x => x.debugDisplaySettings.debugOverlayRatio);
m_ShowLightingDebug = FindProperty(x => x.debugDisplaySettings.displayLightingDebug);
m_ShowRenderingDebug = FindProperty(x => x.debugDisplaySettings.displayRenderingDebug);
m_ShowMaterialDebug = FindProperty(x => x.debugDisplaySettings.displayMaterialDebug);
m_DisplayOpaqueObjects = FindProperty(x => x.globalDebugSettings.renderingDebugSettings.displayOpaqueObjects);
m_DisplayTransparentObjects = FindProperty(x => x.globalDebugSettings.renderingDebugSettings.displayTransparentObjects);
m_EnableDistortion = FindProperty(x => x.globalDebugSettings.renderingDebugSettings.enableDistortion);
m_EnableSSS = FindProperty(x => x.globalDebugSettings.renderingDebugSettings.enableSSS);
m_DisplayOpaqueObjects = FindProperty(x => x.debugDisplaySettings.renderingDebugSettings.displayOpaqueObjects);
m_DisplayTransparentObjects = FindProperty(x => x.debugDisplaySettings.renderingDebugSettings.displayTransparentObjects);
m_EnableDistortion = FindProperty(x => x.debugDisplaySettings.renderingDebugSettings.enableDistortion);
m_EnableSSS = FindProperty(x => x.debugDisplaySettings.renderingDebugSettings.enableSSS);
m_DebugShadowEnabled = FindProperty(x => x.globalDebugSettings.lightingDebugSettings.enableShadows);
m_ShadowDebugMode = FindProperty(x => x.globalDebugSettings.lightingDebugSettings.shadowDebugMode);
m_ShadowDebugShadowMapIndex = FindProperty(x => x.globalDebugSettings.lightingDebugSettings.shadowMapIndex);
m_LightingDebugMode = FindProperty(x => x.globalDebugSettings.lightingDebugSettings.lightingDebugMode);
m_LightingDebugOverrideSmoothness = FindProperty(x => x.globalDebugSettings.lightingDebugSettings.overrideSmoothness);
m_LightingDebugOverrideSmoothnessValue = FindProperty(x => x.globalDebugSettings.lightingDebugSettings.overrideSmoothnessValue);
m_LightingDebugAlbedo = FindProperty(x => x.globalDebugSettings.lightingDebugSettings.debugLightingAlbedo);
m_LightingDebugDisplaySkyReflection = FindProperty(x => x.globalDebugSettings.lightingDebugSettings.displaySkyReflection);
m_LightingDebugDisplaySkyReflectionMipmap = FindProperty(x => x.globalDebugSettings.lightingDebugSettings.skyReflectionMipmap);
m_DebugShadowEnabled = FindProperty(x => x.debugDisplaySettings.lightingDebugSettings.enableShadows);
m_ShadowDebugMode = FindProperty(x => x.debugDisplaySettings.lightingDebugSettings.shadowDebugMode);
m_ShadowDebugShadowMapIndex = FindProperty(x => x.debugDisplaySettings.lightingDebugSettings.shadowMapIndex);
m_LightingDebugOverrideSmoothness = FindProperty(x => x.debugDisplaySettings.lightingDebugSettings.overrideSmoothness);
m_LightingDebugOverrideSmoothnessValue = FindProperty(x => x.debugDisplaySettings.lightingDebugSettings.overrideSmoothnessValue);
m_LightingDebugAlbedo = FindProperty(x => x.debugDisplaySettings.lightingDebugSettings.debugLightingAlbedo);
m_LightingDebugDisplaySkyReflection = FindProperty(x => x.debugDisplaySettings.lightingDebugSettings.displaySkyReflection);
m_LightingDebugDisplaySkyReflectionMipmap = FindProperty(x => x.debugDisplaySettings.lightingDebugSettings.skyReflectionMipmap);
// Rendering settings
m_RenderingUseForwardOnly = FindProperty(x => x.renderingSettings.useForwardRenderingOnly);

return serializedObject.FindProperty(path);
}
string GetSubNameSpaceName(Type type)
{
return type.Namespace.Substring(type.Namespace.LastIndexOf((".")) + 1) + "/";
}
void FillWithProperties(Type type, GUIContent[] debugViewMaterialStrings, int[] debugViewMaterialValues, bool isBSDFData, string strSubNameSpace, ref int index)
{
var attributes = type.GetCustomAttributes(true);
// Get attribute to get the start number of the value for the enum
var attr = attributes[0] as GenerateHLSL;
if (!attr.needParamDebug)
{
return;
}
var fields = type.GetFields();
var localIndex = 0;
foreach (var field in fields)
{
var fieldName = field.Name;
// Check if the display name have been override by the users
if (Attribute.IsDefined(field, typeof(SurfaceDataAttributes)))
{
var propertyAttr = (SurfaceDataAttributes[])field.GetCustomAttributes(typeof(SurfaceDataAttributes), false);
if (propertyAttr[0].displayName != "")
{
fieldName = propertyAttr[0].displayName;
}
}
fieldName = (isBSDFData ? "Engine/" : "") + strSubNameSpace + fieldName;
debugViewMaterialStrings[index] = new GUIContent(fieldName);
debugViewMaterialValues[index] = attr.paramDefinesStart + (int)localIndex;
index++;
localIndex++;
}
}
void FillWithPropertiesEnum(Type type, GUIContent[] debugViewMaterialStrings, int[] debugViewMaterialValues, string prefix, bool isBSDFData, ref int index)
{
var names = Enum.GetNames(type);
var localIndex = 0;
foreach (var value in Enum.GetValues(type))
{
var valueName = (isBSDFData ? "Engine/" : "" + prefix) + names[localIndex];
debugViewMaterialStrings[index] = new GUIContent(valueName);
debugViewMaterialValues[index] = (int)value;
index++;
localIndex++;
}
}
static void HackSetDirty(RenderPipelineAsset asset)
{
EditorUtility.SetDirty(asset);

{
EditorGUILayout.LabelField(styles.debugging);
// Global debug settings
// Debug Display settings
MaterialDebugSettingsUI(renderContext);
MaterialDebugSettingsUI(renderContext);
LightingDebugSettingsUI(renderContext, renderpipelineInstance);
EditorGUILayout.Space();

private void MaterialDebugSettingsUI(HDRenderPipeline renderContext)
{
HDRenderPipeline hdPipe = target as HDRenderPipeline;
bool dirty = false;
if (!styles.isDebugViewMaterialInit)
int value = EditorGUILayout.IntPopup(styles.debugViewMaterial, hdPipe.debugDisplaySettings.materialDebugSettings.debugViewMaterial, DebugDisplaySettings.debugViewMaterialStrings, DebugDisplaySettings.debugViewMaterialValues);
if (EditorGUI.EndChangeCheck())
var varyingNames = Enum.GetNames(typeof(Attributes.DebugViewVarying));
var gbufferNames = Enum.GetNames(typeof(Attributes.DebugViewGbuffer));
// +1 for the zero case
var num = 1 + varyingNames.Length
+ gbufferNames.Length
+ typeof(Builtin.BuiltinData).GetFields().Length * 2 // BuildtinData are duplicated for each material
+ typeof(Lit.SurfaceData).GetFields().Length
+ typeof(Lit.BSDFData).GetFields().Length
+ typeof(Unlit.SurfaceData).GetFields().Length
+ typeof(Unlit.BSDFData).GetFields().Length;
hdPipe.debugDisplaySettings.SetDebugViewMaterial(value);
dirty = true;
}
styles.debugViewMaterialStrings = new GUIContent[num];
styles.debugViewMaterialValues = new int[num];
var index = 0;
// 0 is a reserved number
styles.debugViewMaterialStrings[0] = new GUIContent("None");
styles.debugViewMaterialValues[0] = 0;
index++;
FillWithPropertiesEnum(typeof(Attributes.DebugViewVarying), styles.debugViewMaterialStrings, styles.debugViewMaterialValues, GetSubNameSpaceName(typeof(Attributes.DebugViewVarying)), false, ref index);
FillWithProperties(typeof(Builtin.BuiltinData), styles.debugViewMaterialStrings, styles.debugViewMaterialValues, false, GetSubNameSpaceName(typeof(Lit.SurfaceData)), ref index);
FillWithProperties(typeof(Lit.SurfaceData), styles.debugViewMaterialStrings, styles.debugViewMaterialValues, false, GetSubNameSpaceName(typeof(Lit.SurfaceData)), ref index);
FillWithProperties(typeof(Builtin.BuiltinData), styles.debugViewMaterialStrings, styles.debugViewMaterialValues, false, GetSubNameSpaceName(typeof(Unlit.SurfaceData)), ref index);
FillWithProperties(typeof(Unlit.SurfaceData), styles.debugViewMaterialStrings, styles.debugViewMaterialValues, false, GetSubNameSpaceName(typeof(Unlit.SurfaceData)), ref index);
// Engine
FillWithPropertiesEnum(typeof(Attributes.DebugViewGbuffer), styles.debugViewMaterialStrings, styles.debugViewMaterialValues, "", true, ref index);
FillWithProperties(typeof(Lit.BSDFData), styles.debugViewMaterialStrings, styles.debugViewMaterialValues, true, "", ref index);
FillWithProperties(typeof(Unlit.BSDFData), styles.debugViewMaterialStrings, styles.debugViewMaterialValues, true, "", ref index);
styles.isDebugViewMaterialInit = true;
EditorGUI.BeginChangeCheck();
value = EditorGUILayout.IntPopup(styles.debugViewEngine, hdPipe.debugDisplaySettings.materialDebugSettings.debugViewEngine, DebugDisplaySettings.debugViewEngineStrings, DebugDisplaySettings.debugViewEngineValues);
if (EditorGUI.EndChangeCheck())
{
hdPipe.debugDisplaySettings.SetDebugViewEngine(value);
dirty = true;
EditorGUI.showMixedValue = m_MaterialDebugMode.hasMultipleDifferentValues;
m_MaterialDebugMode.intValue = EditorGUILayout.IntPopup(styles.debugViewMaterial, m_MaterialDebugMode.intValue, styles.debugViewMaterialStrings, styles.debugViewMaterialValues);
EditorGUI.showMixedValue = false;
EditorGUI.BeginChangeCheck();
value = EditorGUILayout.IntPopup(styles.debugViewMaterialVarying, (int)hdPipe.debugDisplaySettings.materialDebugSettings.debugViewVarying, DebugDisplaySettings.debugViewMaterialVaryingStrings, DebugDisplaySettings.debugViewMaterialVaryingValues);
if (EditorGUI.EndChangeCheck())
{
hdPipe.debugDisplaySettings.SetDebugViewVarying((Attributes.DebugViewVarying)value);
dirty = true;
}
EditorGUI.BeginChangeCheck();
value = EditorGUILayout.IntPopup(styles.debugViewMaterialGBuffer, (int)hdPipe.debugDisplaySettings.materialDebugSettings.debugViewGBuffer, DebugDisplaySettings.debugViewMaterialGBufferStrings, DebugDisplaySettings.debugViewMaterialGBufferValues);
HackSetDirty(renderContext); // Repaint
hdPipe.debugDisplaySettings.SetDebugViewGBuffer(value);
dirty = true;
if(dirty)
HackSetDirty(renderContext); // Repaint
EditorGUI.indentLevel--;
}

if (!m_ShowLightingDebug.boolValue)
return;
EditorGUI.BeginChangeCheck();
HDRenderPipeline hdPipe = target as HDRenderPipeline;
bool dirty = false;
EditorGUI.BeginChangeCheck();
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_DebugShadowEnabled, styles.shadowDebugEnable);
EditorGUILayout.PropertyField(m_ShadowDebugMode, styles.shadowDebugVisualizationMode);

EditorGUILayout.IntSlider(m_ShadowDebugShadowMapIndex, 0, renderpipelineInstance.GetCurrentShadowCount() - 1, styles.shadowDebugVisualizeShadowIndex);
}
}
EditorGUILayout.PropertyField(m_LightingDebugMode, styles.lightingDebugMode);
if (!m_LightingDebugMode.hasMultipleDifferentValues)
if (EditorGUI.EndChangeCheck())
{
dirty = true;
}
EditorGUI.BeginChangeCheck();
int value = EditorGUILayout.IntPopup(styles.lightingVisualizationMode, (int)hdPipe.debugDisplaySettings.lightingDebugSettings.debugLightingMode, styles.debugViewLightingStrings, styles.debugViewLightingValues);
if (EditorGUI.EndChangeCheck())
{
hdPipe.debugDisplaySettings.SetDebugLightingMode((DebugLightingMode)value);
dirty = true;
}
EditorGUI.BeginChangeCheck();
if (hdPipe.debugDisplaySettings.GetDebugLightingMode() == DebugLightingMode.DiffuseLighting)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_LightingDebugAlbedo, styles.lightingDebugAlbedo);
EditorGUI.indentLevel--;
}
if (hdPipe.debugDisplaySettings.GetDebugLightingMode() == DebugLightingMode.SpecularLighting)
if ((LightingDebugMode)m_LightingDebugMode.intValue != LightingDebugMode.None)
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_LightingDebugOverrideSmoothness, styles.lightingDebugOverrideSmoothness);
if (!m_LightingDebugOverrideSmoothness.hasMultipleDifferentValues && m_LightingDebugOverrideSmoothness.boolValue == true)
EditorGUILayout.PropertyField(m_LightingDebugAlbedo, styles.lightingDebugAlbedo);
EditorGUILayout.PropertyField(m_LightingDebugOverrideSmoothness, styles.lightingDebugOverrideSmoothness);
if (!m_LightingDebugOverrideSmoothness.hasMultipleDifferentValues && m_LightingDebugOverrideSmoothness.boolValue == true)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_LightingDebugOverrideSmoothnessValue, styles.lightingDebugOverrideSmoothnessValue);
EditorGUI.indentLevel--;
}
EditorGUILayout.PropertyField(m_LightingDebugOverrideSmoothnessValue, styles.lightingDebugOverrideSmoothnessValue);
EditorGUI.indentLevel--;
}
EditorGUILayout.PropertyField(m_LightingDebugDisplaySkyReflection, styles.lightingDisplaySkyReflection);

if (EditorGUI.EndChangeCheck())
{
dirty = true;
}
if(dirty)
}
}
private void SettingsUI(HDRenderPipeline renderContext)

21
Assets/ScriptableRenderPipeline/HDRenderPipeline/HDRenderPipeline.asset


m_EditorClassIdentifier:
m_LightLoopProducer: {fileID: 11400000, guid: bf8cd9ae03ff7d54c89603e67be0bfc5,
type: 2}
globalDebugSettings:
debugDisplaySettings:
displayRenderingDebug: 1
displayRenderingDebug: 0
debugDisplayMode: 0
debugViewMaterial: 0
debugViewMaterial: 1002
lightingDebugMode: 0
overrideSmoothness: 0
overrideSmoothnessValue: 0.5
debugLightingAlbedo: {r: 0.5, g: 0.5, b: 0.5, a: 1}

useForwardRenderingOnly: 0
useDepthPrepass: 0
sssSettings:
numProfiles: 0
texturingMode: 0
transmissionFlags: 0
profiles: []
numProfiles: 7
profiles:
- {fileID: 11400000, guid: d6ee4403015766f4093158d69216c0bf, type: 2}
- {fileID: 11400000, guid: 906339bac2066fc4aa22a3652e1283ef, type: 2}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
m_ShadowSettings:
enabled: 1
shadowAtlasWidth: 4096

150
Assets/ScriptableRenderPipeline/HDRenderPipeline/HDRenderPipeline.cs


using UnityEngine.Rendering;
using System;
using System.Linq;
using UnityEngine.Experimental.PostProcessing;
using UnityEngine.Experimental.Rendering.HDPipeline.TilePass;
#if UNITY_EDITOR

// Those that are not will be refatored later.
// Debugging
public GlobalDebugSettings globalDebugSettings = new GlobalDebugSettings();
public DebugDisplaySettings debugDisplaySettings = new DebugDisplaySettings();
// Renderer Settings (per project)
public RenderingSettings renderingSettings = new RenderingSettings();

}
}
public void ApplyDebugSettings()
public void ApplyDebugDisplaySettings()
m_ShadowSettings.enabled = globalDebugSettings.lightingDebugSettings.enableShadows;
m_ShadowSettings.enabled = debugDisplaySettings.lightingDebugSettings.enableShadows;
LightingDebugSettings lightingDebugSettings = debugDisplaySettings.lightingDebugSettings;
Vector4 debugAlbedo = new Vector4(lightingDebugSettings.debugLightingAlbedo.r, lightingDebugSettings.debugLightingAlbedo.g, lightingDebugSettings.debugLightingAlbedo.b, 0.0f);
Vector4 debugSmoothness = new Vector4(lightingDebugSettings.overrideSmoothness ? 1.0f : 0.0f, lightingDebugSettings.overrideSmoothnessValue, 0.0f, 0.0f);
LightingDebugSettings lightDebugSettings = globalDebugSettings.lightingDebugSettings;
Vector4 debugModeAndAlbedo = new Vector4((float)lightDebugSettings.lightingDebugMode, lightDebugSettings.debugLightingAlbedo.r, lightDebugSettings.debugLightingAlbedo.g, lightDebugSettings.debugLightingAlbedo.b);
Vector4 debugSmoothness = new Vector4(lightDebugSettings.overrideSmoothness ? 1.0f : 0.0f, lightDebugSettings.overrideSmoothnessValue, 0.0f, 0.0f);
Shader.SetGlobalVector("_DebugLightModeAndAlbedo", debugModeAndAlbedo);
Shader.SetGlobalInt("_DebugViewMaterial", (int)debugDisplaySettings.GetDebugMaterialIndex());
Shader.SetGlobalInt("_DebugLightingMode", (int)debugDisplaySettings.GetDebugLightingMode());
Shader.SetGlobalVector("_DebugLightingAlbedo", debugAlbedo);
Shader.SetGlobalVector("_DebugLightingSmoothness", debugSmoothness);
}

public void OnValidate()
{
globalDebugSettings.OnValidate();
debugDisplaySettings.OnValidate();
}
void OnEnable()
{
debugDisplaySettings.RegisterDebug();
}
}

private RenderTargetIdentifier m_CameraDepthStencilBufferRT;
private RenderTargetIdentifier m_CameraDepthStencilBufferCopyRT;
// Post-processing context (recycled on every frame to avoid GC alloc)
readonly PostProcessRenderContext m_PostProcessContext;
// Detect when windows size is changing
int m_CurrentWidth;
int m_CurrentHeight;

readonly SkyManager m_SkyManager = new SkyManager();
private readonly BaseLightLoop m_LightLoop;
private GlobalDebugSettings globalDebugSettings
private DebugDisplaySettings debugDisplaySettings
get { return m_Owner.globalDebugSettings; }
get { return m_Owner.debugDisplaySettings; }
}
public SubsurfaceScatteringSettings sssSettings

m_CameraFilteringBufferRT = new RenderTargetIdentifier(m_CameraFilteringBuffer);
m_FilterSubsurfaceScattering = Utilities.CreateEngineMaterial("Hidden/HDRenderPipeline/CombineSubsurfaceScattering");
m_FilterSubsurfaceScattering.DisableKeyword("FILTER_HORIZONTAL_AND_COMBINE");
m_FilterSubsurfaceScattering.DisableKeyword("SSS_FILTER_HORIZONTAL_AND_COMBINE");
m_FilterAndCombineSubsurfaceScattering.EnableKeyword("FILTER_HORIZONTAL_AND_COMBINE");
m_FilterAndCombineSubsurfaceScattering.EnableKeyword("SSS_FILTER_HORIZONTAL_AND_COMBINE");
m_FilterAndCombineSubsurfaceScattering.SetFloat("_DstBlend", (float)BlendMode.One);
InitializeDebugMaterials();

m_SkyManager.Build();
m_SkyManager.skySettings = owner.skySettingsToUse;
m_PostProcessContext = new PostProcessRenderContext();
}
void InitializeDebugMaterials()

m_LitRenderLoop.Cleanup();
Utilities.Destroy(m_DebugDisplayShadowMap);
Utilities.Destroy(m_DebugDisplayShadowMap);
Utilities.Destroy(m_DebugDisplayLatlong);
m_SkyManager.Cleanup();

}
// Broadcast SSS parameters to all shaders.
Shader.SetGlobalInt("_EnableSSS", globalDebugSettings.renderingDebugSettings.enableSSS ? 1 : 0);
Shader.SetGlobalInt("_EnableSSS", debugDisplaySettings.renderingDebugSettings.enableSSS ? 1 : 0);
Shader.SetGlobalInt("_TransmissionFlags", sssParameters.transmissionFlags);
Shader.SetGlobalInt("_TexturingModeFlags", sssParameters.texturingModeFlags);
cmd.SetGlobalFloatArray("_ThicknessRemaps", sssParameters.thicknessRemaps);

private void CopyDepthBufferIfNeeded(ScriptableRenderContext renderContext)
{
var cmd = new CommandBuffer();
var cmd = new CommandBuffer() { name = NeedDepthBufferCopy() ? "Copy DepthBuffer" : "Set DepthBuffer"};
if (NeedDepthBufferCopy())
{
using (new Utilities.ProfilingSample("Copy depth-stencil buffer", renderContext))

if (m_LightLoop != null)
m_LightLoop.NewFrame();
m_Owner.ApplyDebugSettings();
m_Owner.ApplyDebugDisplaySettings();
m_Owner.UpdateCommonSettings();
// Set Frame constant buffer

CopyDepthBufferIfNeeded(renderContext);
}
if (globalDebugSettings.materialDebugSettings.debugViewMaterial != 0)
if (debugDisplaySettings.IsDebugMaterialDisplayEnabled())
{
RenderDebugViewMaterial(cullResults, hdCamera, renderContext);
}

// TODO: Try to arrange code so we can trigger this call earlier and use async compute here to run sky convolution during other passes (once we move convolution shader to compute).
UpdateSkyEnvironment(hdCamera, renderContext);
RenderDeferredLighting(hdCamera, renderContext, m_Owner.globalDebugSettings.renderingDebugSettings.enableSSS);
RenderDeferredLighting(hdCamera, renderContext);
// We compute subsurface scattering here. Therefore, no objects rendered afterwards will exhibit SSS.
// Currently, there is no efficient way to switch between SRT and MRT for the forward pass;

// Instead we chose to apply distortion at the end after we cumulate distortion vector and desired blurriness. This
RenderDistortion(cullResults, camera, renderContext);
FinalPass(camera, renderContext);
RenderPostProcesses(camera, renderContext);
}
}

void RenderOpaqueRenderList(CullResults cull, Camera camera, ScriptableRenderContext renderContext, string passName, RendererConfiguration rendererConfiguration = 0)
{
if (!globalDebugSettings.renderingDebugSettings.displayOpaqueObjects)
if (!debugDisplaySettings.renderingDebugSettings.displayOpaqueObjects)
return;
var settings = new DrawRendererSettings(cull, camera, new ShaderPassName(passName))

void RenderTransparentRenderList(CullResults cull, Camera camera, ScriptableRenderContext renderContext, string passName, RendererConfiguration rendererConfiguration = 0)
{
if (!globalDebugSettings.renderingDebugSettings.displayTransparentObjects)
if (!debugDisplaySettings.renderingDebugSettings.displayTransparentObjects)
return;
var settings = new DrawRendererSettings(cull, camera, new ShaderPassName(passName))

return;
}
using (new Utilities.ProfilingSample("GBuffer Pass", renderContext))
{
bool debugLighting = globalDebugSettings.lightingDebugSettings.lightingDebugMode != LightingDebugMode.None;
string passName = debugDisplaySettings.IsDebugDisplayEnabled() ? "GBufferDebugDisplay" : "GBuffer";
using (new Utilities.ProfilingSample(passName, renderContext))
{
RenderOpaqueRenderList(cull, camera, renderContext, debugLighting ? "GBufferDebugLighting" : "GBuffer", Utilities.kRendererConfigurationBakedLighting);
RenderOpaqueRenderList(cull, camera, renderContext, passName, Utilities.kRendererConfigurationBakedLighting);
}
}

void RenderDebugViewMaterial(CullResults cull, HDCamera hdCamera, ScriptableRenderContext renderContext)
{
using (new Utilities.ProfilingSample("DebugView Material Mode Pass", renderContext))
using (new Utilities.ProfilingSample("DisplayDebug ViewMaterial", renderContext))
Shader.SetGlobalInt("_DebugViewMaterial", (int)globalDebugSettings.materialDebugSettings.debugViewMaterial);
RenderOpaqueRenderList(cull, hdCamera.camera, renderContext, "DebugViewMaterial", Utilities.kRendererConfigurationBakedLighting);
RenderOpaqueRenderList(cull, hdCamera.camera, renderContext, "ForwardDisplayDebug", Utilities.kRendererConfigurationBakedLighting);
}
// Render GBuffer opaque

m_DebugViewMaterialGBuffer.SetFloat("_DebugViewMaterial", (float)globalDebugSettings.materialDebugSettings.debugViewMaterial);
var cmd = new CommandBuffer { name = "GBuffer Debug Pass" };
var cmd = new CommandBuffer { name = "DebugViewMaterialGBuffer" };
cmd.Blit(null, m_CameraColorBufferRT, m_DebugViewMaterialGBuffer, 0);
renderContext.ExecuteCommandBuffer(cmd);
cmd.Dispose();

{
RenderTransparentRenderList(cull, hdCamera.camera, renderContext, "DebugViewMaterial", Utilities.kRendererConfigurationBakedLighting);
RenderTransparentRenderList(cull, hdCamera.camera, renderContext, "ForwardDisplayDebug", Utilities.kRendererConfigurationBakedLighting);
}
// Last blit

}
}
void RenderDeferredLighting(HDCamera hdCamera, ScriptableRenderContext renderContext, bool enableSSS)
void RenderDeferredLighting(HDCamera hdCamera, ScriptableRenderContext renderContext)
{
if (m_Owner.renderingSettings.ShouldUseForwardRenderingOnly() || m_LightLoop == null)
{

RenderTargetIdentifier[] colorRTs = { m_CameraColorBufferRT, m_CameraSubsurfaceBufferRT };
if (enableSSS)
if (debugDisplaySettings.renderingDebugSettings.enableSSS)
m_LightLoop.RenderDeferredLighting(hdCamera, renderContext, globalDebugSettings.lightingDebugSettings, colorRTs, m_CameraDepthStencilBufferRT, new RenderTargetIdentifier(GetDepthTexture()), true, enableSSS);
m_LightLoop.RenderDeferredLighting(hdCamera, renderContext, debugDisplaySettings, colorRTs, m_CameraDepthStencilBufferRT, new RenderTargetIdentifier(GetDepthTexture()), true);
m_LightLoop.RenderDeferredLighting(hdCamera, renderContext, globalDebugSettings.lightingDebugSettings, colorRTs, m_CameraDepthStencilBufferRT, new RenderTargetIdentifier(GetDepthTexture()), false, enableSSS);
m_LightLoop.RenderDeferredLighting(hdCamera, renderContext, debugDisplaySettings, colorRTs, m_CameraDepthStencilBufferRT, new RenderTargetIdentifier(GetDepthTexture()), false);
}
// Combines specular lighting and diffuse lighting with subsurface scattering.

if (m_Owner.renderingSettings.ShouldUseForwardRenderingOnly()) return;
if (!globalDebugSettings.renderingDebugSettings.enableSSS) return;
if (!debugDisplaySettings.renderingDebugSettings.enableSSS) return;
var cmd = new CommandBuffer() { name = "Subsurface Scattering Pass" };
var cmd = new CommandBuffer() { name = "Subsurface Scattering" };
// Perform the vertical SSS filtering pass.
m_FilterSubsurfaceScattering.SetVectorArray("_FilterKernels", sssParameters.filterKernels);

if (!m_Owner.renderingSettings.ShouldUseForwardRenderingOnly() && renderOpaque)
return;
using (new Utilities.ProfilingSample("Forward Pass", renderContext))
string passName = debugDisplaySettings.IsDebugDisplayEnabled() ? "ForwardDisplayDebug" : "Forward";
using (new Utilities.ProfilingSample(passName, renderContext))
{
Utilities.SetRenderTarget(renderContext, m_CameraColorBufferRT, m_CameraDepthStencilBufferRT);

bool debugLighting = globalDebugSettings.lightingDebugSettings.lightingDebugMode != LightingDebugMode.None;
string forwardPassName = debugLighting ? "ForwardDebugLighting" : "Forward";
RenderOpaqueRenderList(cullResults, camera, renderContext, forwardPassName, Utilities.kRendererConfigurationBakedLighting);
RenderOpaqueRenderList(cullResults, camera, renderContext, passName, Utilities.kRendererConfigurationBakedLighting);
RenderTransparentRenderList(cullResults, camera, renderContext, forwardPassName, Utilities.kRendererConfigurationBakedLighting);
RenderTransparentRenderList(cullResults, camera, renderContext, passName, Utilities.kRendererConfigurationBakedLighting);
}
}
}

{
using (new Utilities.ProfilingSample("Forward Only Pass", renderContext))
string passName = debugDisplaySettings.IsDebugDisplayEnabled() ? "ForwardOnlyOpaqueDisplayDebug" : "ForwardOnlyOpaque";
using (new Utilities.ProfilingSample(passName, renderContext))
{
Utilities.SetRenderTarget(renderContext, m_CameraColorBufferRT, m_CameraDepthStencilBufferRT);

bool debugLighting = globalDebugSettings.lightingDebugSettings.lightingDebugMode != LightingDebugMode.None;
RenderOpaqueRenderList(cullResults, camera, renderContext, debugLighting ? "ForwardOnlyOpaqueDebugLighting" : "ForwardOnlyOpaque", Utilities.kRendererConfigurationBakedLighting);
RenderOpaqueRenderList(cullResults, camera, renderContext, passName, Utilities.kRendererConfigurationBakedLighting);
using (new Utilities.ProfilingSample("Velocity Pass", renderContext))
using (new Utilities.ProfilingSample("Velocity", renderContext))
{
// If opaque velocity have been render during GBuffer no need to render it here
if ((ShaderConfig.s_VelocityInGbuffer == 1) || m_Owner.renderingSettings.ShouldUseForwardRenderingOnly())

void RenderDistortion(CullResults cullResults, Camera camera, ScriptableRenderContext renderContext)
{
if (!globalDebugSettings.renderingDebugSettings.enableDistortion)
if (!debugDisplaySettings.renderingDebugSettings.enableDistortion)
using (new Utilities.ProfilingSample("Distortion Pass", renderContext))
using (new Utilities.ProfilingSample("Distortion", renderContext))
{
int w = camera.pixelWidth;
int h = camera.pixelHeight;

}
}
void FinalPass(Camera camera, ScriptableRenderContext renderContext)
void RenderPostProcesses(Camera camera, ScriptableRenderContext renderContext)
using (new Utilities.ProfilingSample("Final Pass", renderContext))
using (new Utilities.ProfilingSample("Post-processing", renderContext))
// All of this is temporary, sub-optimal and quickly hacked together but is necessary
// for artists to do lighting work until the fully-featured framework is ready
var postProcessLayer = camera.GetComponent<PostProcessLayer>();
var cmd = new CommandBuffer { name = "" };
var localPostProcess = camera.GetComponent<PostProcessingSRP>();
if (postProcessLayer != null && postProcessLayer.enabled)
{
cmd.SetGlobalTexture("_CameraDepthTexture", GetDepthTexture());
bool localActive = localPostProcess != null && localPostProcess.enabled;
var context = m_PostProcessContext;
context.Reset();
context.source = m_CameraColorBufferRT;
context.destination = BuiltinRenderTextureType.CameraTarget;
context.command = cmd;
context.camera = camera;
context.sourceFormat = RenderTextureFormat.ARGBHalf; // ?
context.flip = true;
if (!localActive)
postProcessLayer.Render(context);
}
else
var cmd = new CommandBuffer { name = "" };
renderContext.ExecuteCommandBuffer(cmd);
cmd.Dispose();
return;
localPostProcess.Render(camera, renderContext, m_CameraColorBufferRT, BuiltinRenderTextureType.CameraTarget);
renderContext.ExecuteCommandBuffer(cmd);
cmd.Dispose();
}
}

debugCB.name = "Debug Overlay";
float x = 0;
float overlayRatio = globalDebugSettings.debugOverlayRatio;
float overlayRatio = debugDisplaySettings.debugOverlayRatio;
LightingDebugSettings lightingDebug = globalDebugSettings.lightingDebugSettings;
LightingDebugSettings lightingDebug = debugDisplaySettings.lightingDebugSettings;
if (lightingDebug.shadowDebugMode != ShadowMapDebugMode.None)
{

5
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/LightDefinition.cs


public int IESIndex;
public int cookieIndex;
public Vector2 size; // Used by area, projector and spot lights; x = cot(outerHalfAngle) for spot lights
public Vector2 size; // Used by area, projector and spot lights; x = cot(outerHalfAngle) for spot lights
public bool twoSided; // Used by rectangular area lights only
public float unused;
};
[GenerateHLSL]

16
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/LightDefinition.cs.hlsl


int shadowIndex;
int IESIndex;
int cookieIndex;
int lightType;
bool twoSided;
int lightType;
float unused;
};
// Generated from UnityEngine.Experimental.Rendering.HDPipeline.DirectionalLightData

{
return value.cookieIndex;
}
int GetLightType(LightData value)
{
return value.lightType;
}
bool GetTwoSided(LightData value)
int GetLightType(LightData value)
return value.twoSided;
return value.lightType;
}
float GetUnused(LightData value)
{
return value.unused;
}
//

8
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/LightLoop.cs


// TODO: this should not be part of the interface but for now make something working
public virtual void BuildGPULightLists(Camera camera, ScriptableRenderContext loop, RenderTargetIdentifier cameraDepthBufferRT) {}
public virtual void RenderDeferredLighting(HDCamera hdCamera, ScriptableRenderContext renderContext,
LightingDebugSettings lightDebugParameters,
RenderTargetIdentifier[] colorBuffers, RenderTargetIdentifier depthStencilBuffer, RenderTargetIdentifier depthStencilTexture,
bool outputSplitLightingForSSS, bool enableSSS) {}
public virtual void RenderDeferredLighting( HDCamera hdCamera, ScriptableRenderContext renderContext,
DebugDisplaySettings debugDisplaySettings,
RenderTargetIdentifier[] colorBuffers, RenderTargetIdentifier depthStencilBuffer, RenderTargetIdentifier depthStencilTexture,
bool outputSplitLightingForSSS) { }
public virtual void RenderForward(Camera camera, ScriptableRenderContext renderContext, bool renderOpaque) {}

10
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/Resources/Deferred.shader


// Split lighting is utilized during the SSS pass.
#pragma multi_compile _ OUTPUT_SPLIT_LIGHTING
// #ifdef OUTPUT_SPLIT_LIGHTING
#pragma shader_feature _ SSS_PRE_SCATTER_TEXTURING SSS_POST_SCATTER_TEXTURING
// #endif
#pragma multi_compile _ LIGHTING_DEBUG
#pragma multi_compile _ DEBUG_DISPLAY
//-------------------------------------------------------------------------------------
// Include

#include "../../Debug/HDRenderPipelineDebug.cs.hlsl"
#include "../../Debug/DebugLighting.hlsl"
#include "../../Debug/DebugDisplay.hlsl"
// Note: We have fix as guidelines that we have only one deferred material (with control of GBuffer enabled). Mean a users that add a new
// deferred material must replace the old one here. If in the future we want to support multiple layout (cause a lot of consistency problem),

#else
outputs.combinedLighting = float4(diffuseLighting + specularLighting, 1.0);
#endif
return outputs;
}

2
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/FeatureFlags.hlsl


#ifndef __FEATURE_FLAGS_H__
#define __FEATURE_FLAGS_H__
static const uint FEATURE_FLAG_ALL_MATERIALS = FEATURE_FLAG_MATERIAL_LIT_STANDARD | FEATURE_FLAG_MATERIAL_LIT_SSS | FEATURE_FLAG_MATERIAL_LIT_CLEAR_COAT | FEATURE_FLAG_MATERIAL_LIT_SPECULAR | FEATURE_FLAG_MATERIAL_LIT_ANISO;
static const uint FEATURE_FLAG_ALL_MATERIALS = FEATURE_FLAG_MATERIAL_LIT_STANDARD | FEATURE_FLAG_MATERIAL_LIT_SSS | FEATURE_FLAG_MATERIAL_LIT_SPECULAR | FEATURE_FLAG_MATERIAL_LIT_ANISO;
static const uint FeatureVariantFlags[NUM_FEATURE_VARIANTS] =
{

1
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/lightlistbuild-clustered.compute


GroupMemoryBarrierWithGroupSync();
#endif
dpt_ma = asfloat(ldsZMax);
if(dpt_ma<=0.0) dpt_ma = VIEWPORT_SCALE_Z; // assume sky pixel
#endif
float2 vTileLL = float2(viTilLL.x/(float) iWidth, viTilLL.y/(float) iHeight);

7
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/Resources/shadeopaque.compute


#pragma kernel ShadeOpaque_Direct_Fptl SHADE_OPAQUE_ENTRY=ShadeOpaque_Direct_Fptl USE_FPTL_LIGHTLIST
#pragma kernel ShadeOpaque_Direct_Fptl_DebugLighting SHADE_OPAQUE_ENTRY=ShadeOpaque_Direct_Fptl_DebugLighting USE_FPTL_LIGHTLIST LIGHTING_DEBUG
#pragma kernel ShadeOpaque_Direct_Fptl_DebugDisplay SHADE_OPAQUE_ENTRY=ShadeOpaque_Direct_Fptl_DebugDisplay USE_FPTL_LIGHTLIST DEBUG_DISPLAY
#pragma kernel ShadeOpaque_Direct_Clustered_DebugLighting SHADE_OPAQUE_ENTRY=ShadeOpaque_Direct_Clustered_DebugLighting USE_CLUSTERED_LIGHTLIST LIGHTING_DEBUG
#pragma kernel ShadeOpaque_Direct_Clustered_DebugDisplay SHADE_OPAQUE_ENTRY=ShadeOpaque_Direct_Clustered_DebugDisplay USE_CLUSTERED_LIGHTLIST DEBUG_DISPLAY
#pragma kernel ShadeOpaque_Indirect_Fptl_Variant0 SHADE_OPAQUE_ENTRY=ShadeOpaque_Indirect_Fptl_Variant0 USE_FPTL_LIGHTLIST USE_INDIRECT VARIANT=0
#pragma kernel ShadeOpaque_Indirect_Fptl_Variant1 SHADE_OPAQUE_ENTRY=ShadeOpaque_Indirect_Fptl_Variant1 USE_FPTL_LIGHTLIST USE_INDIRECT VARIANT=1

//-------------------------------------------------------------------------------------
#include "../../../../ShaderLibrary/Common.hlsl"
#include "../../../Debug/HDRenderPipelineDebug.cs.hlsl"
#include "../../../Debug/DebugLighting.hlsl"
#include "../../../Debug/DebugDisplay.hlsl"
// Note: We have fix as guidelines that we have only one deferred material (with control of GBuffer enabled). Mean a users that add a new
// deferred material must replace the old one here. If in the future we want to support multiple layout (cause a lot of consistency problem),

73
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePass.cs


static int s_ClearDispatchIndirectKernel;
static int s_shadeOpaqueDirectClusteredKernel;
static int s_shadeOpaqueDirectFptlKernel;
static int s_shadeOpaqueDirectClusteredDebugLightingKernel;
static int s_shadeOpaqueDirectFptlDebugLightingKernel;
static int s_shadeOpaqueDirectClusteredDebugDisplayKernel;
static int s_shadeOpaqueDirectFptlDebugDisplayKernel;
static int[] s_shadeOpaqueIndirectClusteredKernels = new int[LightDefinitions.NUM_FEATURE_VARIANTS];
static int[] s_shadeOpaqueIndirectFptlKernels = new int[LightDefinitions.NUM_FEATURE_VARIANTS];

s_shadeOpaqueDirectClusteredKernel = shadeOpaqueShader.FindKernel("ShadeOpaque_Direct_Clustered");
s_shadeOpaqueDirectFptlKernel = shadeOpaqueShader.FindKernel("ShadeOpaque_Direct_Fptl");
s_shadeOpaqueDirectClusteredDebugLightingKernel = shadeOpaqueShader.FindKernel("ShadeOpaque_Direct_Clustered_DebugLighting");
s_shadeOpaqueDirectFptlDebugLightingKernel = shadeOpaqueShader.FindKernel("ShadeOpaque_Direct_Fptl_DebugLighting");
s_shadeOpaqueDirectClusteredDebugDisplayKernel = shadeOpaqueShader.FindKernel("ShadeOpaque_Direct_Clustered_DebugDisplay");
s_shadeOpaqueDirectFptlDebugDisplayKernel = shadeOpaqueShader.FindKernel("ShadeOpaque_Direct_Fptl_DebugDisplay");
for (int variant = 0; variant < LightDefinitions.NUM_FEATURE_VARIANTS; variant++)
{

}
if (additionalData.archetype != LightArchetype.Punctual)
{
lightData.twoSided = additionalData.isDoubleSided;
lightData.size = new Vector2(additionalData.lightLength, additionalData.lightWidth);
}

Vector3 dimensions = new Vector3(lightData.size.x * 0.5f + radius, lightData.size.y * 0.5f + radius, radius);
if (!lightData.twoSided)
{
centerVS += zAxisVS * radius * 0.5f;
dimensions.z *= 0.5f;
}
dimensions.z *= 0.5f;
centerVS += zAxisVS * radius * 0.5f;
bound.center = centerVS;
bound.boxAxisX = dimensions.x * xAxisVS;

m_ShadowMgr.RenderShadows(m_FrameId, renderContext, cullResults, cullResults.visibleLights);
}
private void SetupRenderingForDebug(LightingDebugSettings lightDebugSettings)
private void SetupDebugDisplayMode(bool debugDisplayEnable)
Utilities.SetKeyword(m_DeferredDirectMaterialSRT, "LIGHTING_DEBUG", lightDebugSettings.lightingDebugMode != LightingDebugMode.None);
Utilities.SetKeyword(m_DeferredDirectMaterialMRT, "LIGHTING_DEBUG", lightDebugSettings.lightingDebugMode != LightingDebugMode.None);
Utilities.SetKeyword(m_DeferredIndirectMaterialSRT, "LIGHTING_DEBUG", lightDebugSettings.lightingDebugMode != LightingDebugMode.None);
Utilities.SetKeyword(m_DeferredIndirectMaterialMRT, "LIGHTING_DEBUG", lightDebugSettings.lightingDebugMode != LightingDebugMode.None);
Utilities.SetKeyword(m_DeferredAllMaterialSRT, "LIGHTING_DEBUG", lightDebugSettings.lightingDebugMode != LightingDebugMode.None);
Utilities.SetKeyword(m_DeferredAllMaterialMRT, "LIGHTING_DEBUG", lightDebugSettings.lightingDebugMode != LightingDebugMode.None);
Utilities.SetKeyword(m_SingleDeferredMaterialSRT, "LIGHTING_DEBUG", lightDebugSettings.lightingDebugMode != LightingDebugMode.None);
Utilities.SetKeyword(m_SingleDeferredMaterialMRT, "LIGHTING_DEBUG", lightDebugSettings.lightingDebugMode != LightingDebugMode.None);
Utilities.SetKeyword(m_DeferredDirectMaterialSRT, "DEBUG_DISPLAY", debugDisplayEnable);
Utilities.SetKeyword(m_DeferredDirectMaterialMRT, "DEBUG_DISPLAY", debugDisplayEnable);
Utilities.SetKeyword(m_DeferredIndirectMaterialSRT, "DEBUG_DISPLAY", debugDisplayEnable);
Utilities.SetKeyword(m_DeferredIndirectMaterialMRT, "DEBUG_DISPLAY", debugDisplayEnable);
Utilities.SetKeyword(m_DeferredAllMaterialSRT, "DEBUG_DISPLAY", debugDisplayEnable);
Utilities.SetKeyword(m_DeferredAllMaterialMRT, "DEBUG_DISPLAY", debugDisplayEnable);
Utilities.SetKeyword(m_SingleDeferredMaterialSRT, "DEBUG_DISPLAY", debugDisplayEnable);
Utilities.SetKeyword(m_SingleDeferredMaterialMRT, "DEBUG_DISPLAY", debugDisplayEnable);
LightingDebugSettings lightDebugSettings,
RenderTargetIdentifier[] colorBuffers, RenderTargetIdentifier depthStencilBuffer, RenderTargetIdentifier depthStencilTexture,
bool outputSplitLightingForSSS, bool enableSSS)
DebugDisplaySettings debugDisplaySettings,
RenderTargetIdentifier[] colorBuffers, RenderTargetIdentifier depthStencilBuffer, RenderTargetIdentifier depthStencilTexture,
bool outputSplitLightingForSSS)
{
var bUseClusteredForDeferred = !usingFptl;

}
#endif
using (new Utilities.ProfilingSample(m_PassSettings.enableTileAndCluster ? "TilePass - Deferred Lighting Pass" : "SinglePass - Deferred Lighting Pass", renderContext))
using (new Utilities.ProfilingSample((m_PassSettings.enableTileAndCluster ? "TilePass - Deferred Lighting Pass" : "SinglePass - Deferred Lighting Pass") + (outputSplitLightingForSSS ? " MRT" : ""), renderContext))
{
var cmd = new CommandBuffer();
cmd.name = bUseClusteredForDeferred ? "Clustered pass" : "Tiled pass";

// Must be done after setting up the compute shader above.
SetupRenderingForDebug(lightDebugSettings);
SetupDebugDisplayMode(debugDisplaySettings.IsDebugDisplayEnabled());
if (!m_PassSettings.enableTileAndCluster)
{

}
else
{
m_SingleDeferredMaterialSRT.SetInt("_StencilRef", (int)(enableSSS ? StencilBits.Standard : StencilBits.SSS));
// Note: in the enum StencilBits, Standard is before SSS and the stencil is setup to greater equal. So the code below is draw all stencil bit except SSS
m_SingleDeferredMaterialSRT.SetInt("_StencilRef", (int)(debugDisplaySettings.renderingDebugSettings.enableSSS ? StencilBits.Standard : StencilBits.SSS));
Utilities.DrawFullScreen(cmd, m_SingleDeferredMaterialSRT, hdCamera, colorBuffers[0], depthStencilBuffer);
}
}

if (m_PassSettings.enableComputeLightEvaluation)
{
bool enableFeatureVariants = GetFeatureVariantsEnabled() && lightDebugSettings.lightingDebugMode == LightingDebugMode.None;
bool enableFeatureVariants = GetFeatureVariantsEnabled() && !debugDisplaySettings.IsDebugDisplayEnabled();
int numVariants = 1;
if (enableFeatureVariants)

}
else
{
if (lightDebugSettings.lightingDebugMode == LightingDebugMode.None)
kernel = usingFptl ? s_shadeOpaqueDirectFptlKernel : s_shadeOpaqueDirectClusteredKernel;
if (debugDisplaySettings.IsDebugDisplayEnabled())
{
kernel = usingFptl ? s_shadeOpaqueDirectFptlDebugDisplayKernel : s_shadeOpaqueDirectClusteredDebugDisplayKernel;
}
kernel = usingFptl ? s_shadeOpaqueDirectFptlDebugLightingKernel : s_shadeOpaqueDirectClusteredDebugLightingKernel;
{
kernel = usingFptl ? s_shadeOpaqueDirectFptlKernel : s_shadeOpaqueDirectClusteredKernel;
}
// TODO: Update value like in ApplyDebugDisplaySettings() call. Sadly it is high likely that this will not be keep in sync. we really need to get rid of this by making global parameters visible to compute shaders
cmd.SetComputeIntParam(shadeOpaqueShader, "_DebugViewMaterial", Shader.GetGlobalInt("_DebugViewMaterial"));
cmd.SetComputeVectorParam(shadeOpaqueShader, "_DebugLightingAlbedo", Shader.GetGlobalVector("_DebugLightingAlbedo"));
cmd.SetComputeVectorParam(shadeOpaqueShader, "_DebugLightingSmoothness", Shader.GetGlobalVector("_DebugLightingSmoothness"));
cmd.SetComputeBufferParam(shadeOpaqueShader, kernel, "g_vLightListGlobal", bUseClusteredForDeferred ? s_PerVoxelLightLists : s_LightList);

}
else
{
m_DeferredDirectMaterialSRT.SetInt("_StencilRef", (int)(enableSSS ? StencilBits.Standard : StencilBits.SSS));
// Note: in the enum StencilBits, Standard is before SSS and the stencil is setup to greater equal. So the code below is draw all stencil bit except SSS
m_DeferredDirectMaterialSRT.SetInt("_StencilRef", (int)(debugDisplaySettings.renderingDebugSettings.enableSSS ? StencilBits.Standard : StencilBits.SSS));
m_DeferredIndirectMaterialSRT.SetInt("_StencilRef", (int)(enableSSS ? StencilBits.Standard : StencilBits.SSS));
m_DeferredIndirectMaterialSRT.SetInt("_StencilRef", (int)(debugDisplaySettings.renderingDebugSettings.enableSSS ? StencilBits.Standard : StencilBits.SSS));
Utilities.SelectKeyword(m_DeferredIndirectMaterialSRT, "USE_CLUSTERED_LIGHTLIST", "USE_FPTL_LIGHTLIST", bUseClusteredForDeferred);
Utilities.DrawFullScreen(cmd, m_DeferredIndirectMaterialSRT, hdCamera, colorBuffers[0], depthStencilBuffer);
}

}
else
{
m_DeferredAllMaterialSRT.SetInt("_StencilRef", (int)(enableSSS ? StencilBits.Standard : StencilBits.SSS));
// Note: in the enum StencilBits, Standard is before SSS and the stencil is setup to greater equal. So the code below is draw all stencil bit except SSS
m_DeferredAllMaterialSRT.SetInt("_StencilRef", (int)(debugDisplaySettings.renderingDebugSettings.enableSSS ? StencilBits.Standard : StencilBits.SSS));
Utilities.SelectKeyword(m_DeferredAllMaterialSRT, "USE_CLUSTERED_LIGHTLIST", "USE_FPTL_LIGHTLIST", bUseClusteredForDeferred);
Utilities.DrawFullScreen(cmd, m_DeferredAllMaterialSRT, hdCamera, colorBuffers[0], depthStencilBuffer);
}

8
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePass.hlsl


StructuredBuffer<uint> g_vLightListGlobal; // don't support Buffer yet in unity
#ifdef USE_FPTL_LIGHTLIST
#define TILE_SIZE TILE_SIZE_FPTL
#endif
// Don't do a "#else" so we can catch error if including call don't setup thing correctly
#ifdef USE_CLUSTERED_LIGHTLIST
#define TILE_SIZE TILE_SIZE_CLUSTERED
#endif
#define DWORD_PER_TILE 16 // See dwordsPerTile in TilePass.cs, we have roomm for 31 lights and a number of light value all store on 16 bit (ushort)
// these uniforms are only needed for when OPAQUES_ONLY is NOT defined

19
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePassLoop.hlsl


void ApplyDebug(LightLoopContext lightLoopContext, float3 positionWS, inout float3 diffuseLighting, inout float3 specularLighting)
{
#ifdef LIGHTING_DEBUG
int lightDebugMode = (int)_DebugLightModeAndAlbedo.x;
if (lightDebugMode == LIGHTINGDEBUGMODE_DIFFUSE_LIGHTING)
#ifdef DEBUG_DISPLAY
if (_DebugLightingMode == DEBUGLIGHTINGMODE_DIFFUSE_LIGHTING)
specularLighting = float3(0.0, 0.0, 0.0);
specularLighting = float3(0.0, 0.0, 0.0); // Disable specular lighting
else if (lightDebugMode == LIGHTINGDEBUGMODE_SPECULAR_LIGHTING)
else if (_DebugLightingMode == DEBUGLIGHTINGMODE_SPECULAR_LIGHTING)
diffuseLighting = float3(0.0, 0.0, 0.0);
diffuseLighting = float3(0.0, 0.0, 0.0); // Disable diffuse lighting
else if (lightDebugMode == LIGHTINGDEBUGMODE_VISUALIZE_CASCADE)
else if (_DebugLightingMode == DEBUGLIGHTINGMODE_VISUALIZE_CASCADE)
{
specularLighting = float3(0.0, 0.0, 0.0);

uint GetTileSize()
{
return TILE_SIZE_CLUSTERED;
if (_UseTileLightList)
return TILE_SIZE_FPTL;
else
return TILE_SIZE_CLUSTERED;
}
void GetCountAndStartCluster(PositionInputs posInput, uint lightCategory, out uint start, out uint lightCount)

6
Assets/ScriptableRenderPipeline/HDRenderPipeline/Lighting/TilePass/TilePassResources.cs


public ComputeShader buildPerVoxelLightListShader = null; // clustered
public ComputeShader clearDispatchIndirectShader = null;
public ComputeShader shadeOpaqueShader = null;
// Various set of material use in render loop
public Shader m_DebugViewMaterialGBuffer;
// For image based lighting
public Shader m_InitPreFGD;
}
}

39
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/LayeredLit/LayeredLit.shader


Pass
{
Name "GBufferDebugLighting" // Name is not used
Tags{ "LightMode" = "GBufferDebugLighting" } // This will be only for opaque object based on the RenderQueue index
Name "GBufferDebugDisplay" // Name is not used
Tags{ "LightMode" = "GBufferDebugDisplay" } // This will be only for opaque object based on the RenderQueue index
Cull [_CullMode]

HLSLPROGRAM
#define LIGHTING_DEBUG
#define DEBUG_DISPLAY
#include "../../Debug/HDRenderPipelineDebug.cs.hlsl"
#include "../../Debug/DebugLighting.hlsl"
#include "../../Debug/DebugDisplay.hlsl"
ENDHLSL
}
Pass
{
Name "Debug"
Tags{ "LightMode" = "DebugViewMaterial" }
Cull[_CullMode]
HLSLPROGRAM
#define SHADERPASS SHADERPASS_DEBUG_VIEW_MATERIAL
#include "../../Material/Material.hlsl"
#include "../Lit/ShaderPass/LitSharePass.hlsl"
#include "../Lit/LitData.hlsl"
#include "../../ShaderPass/ShaderPassDebugViewMaterial.hlsl"
ENDHLSL
}

Pass
{
Name "ForwardDebugLighting" // Name is not used
Tags{ "LightMode" = "ForwardDebugLighting" } // This will be only for transparent object based on the RenderQueue index
Name "ForwardDisplayDebug" // Name is not used
Tags{ "LightMode" = "ForwardDisplayDebug" } // This will be only for transparent object based on the RenderQueue index
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]

#define LIGHTING_DEBUG
#define DEBUG_DISPLAY
#include "../../Lighting/Forward.hlsl"
#include "../../Debug/HDRenderPipelineDebug.cs.hlsl"
#include "../../Debug/DebugLighting.hlsl"
#include "../../Debug/DebugDisplay.hlsl"
#include "../../Lighting/Forward.hlsl"
// TEMP until pragma work in include
#pragma multi_compile LIGHTLOOP_SINGLE_PASS LIGHTLOOP_TILE_PASS

40
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/LayeredLit/LayeredLitTessellation.shader


Pass
{
Name "GBufferDebugLighting" // Name is not used
Tags{ "LightMode" = "GBufferDebugLighting" } // This will be only for opaque object based on the RenderQueue index
Name "GBufferDebugDisplay" // Name is not used
Tags{ "LightMode" = "GBufferDebugDisplay" } // This will be only for opaque object based on the RenderQueue index
Cull [_CullMode]

#pragma hull Hull
#pragma domain Domain
#define LIGHTING_DEBUG
#define DEBUG_DISPLAY
#include "../../Debug/HDRenderPipelineDebug.cs.hlsl"
#include "../../Debug/DebugLighting.hlsl"
#include "../../Debug/DebugDisplay.hlsl"
ENDHLSL
}
Pass
{
Name "Debug"
Tags{ "LightMode" = "DebugViewMaterial" }
Cull[_CullMode]
HLSLPROGRAM
#pragma hull Hull
#pragma domain Domain
#define SHADERPASS SHADERPASS_DEBUG_VIEW_MATERIAL
#include "../../Material/Material.hlsl"
#include "../Lit/ShaderPass/LitSharePass.hlsl"
#include "../Lit/LitData.hlsl"
#include "../../ShaderPass/ShaderPassDebugViewMaterial.hlsl"
ENDHLSL
}

Pass
{
Name "ForwardDebugLighting" // Name is not used
Tags{ "LightMode" = "ForwardDebugLighting" } // This will be only for transparent object based on the RenderQueue index
Name "ForwardDisplayDebug" // Name is not used
Tags{ "LightMode" = "ForwardDisplayDebug" } // This will be only for transparent object based on the RenderQueue index
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]

#pragma hull Hull
#pragma domain Domain
#define LIGHTING_DEBUG
#define DEBUG_DISPLAY
#include "../../Debug/DebugDisplay.hlsl"
#include "../../Debug/HDRenderPipelineDebug.cs.hlsl"
#include "../../Debug/DebugLighting.hlsl"
// TEMP until pragma work in include
#pragma multi_compile LIGHTLOOP_SINGLE_PASS LIGHTLOOP_TILE_PASS

9
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Editor/BaseLitUI.cs


if (distortionEnable && distortionOnly)
{
// Disable all passes except debug material
// Disable all passes except distortion (setup in BaseUnlitUI.cs) and debug passes (to visualize distortion)
material.SetShaderPassEnabled("DebugViewMaterial", true);
material.SetShaderPassEnabled("GBufferDisplayDebug", true);
material.SetShaderPassEnabled("ForwardDisplayDebug", true);
// Enable all passes except distortion (setup in BaseUnlitUI.cs)
material.SetShaderPassEnabled("DebugViewMaterial", true);
material.SetShaderPassEnabled("GBufferDisplayDebug", true);
material.SetShaderPassEnabled("ForwardDisplayDebug", true);
}
}
}

22
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Editor/LitUI.cs


public static GUIContent maskMapSText = new GUIContent("Mask Map - M(R), AO(G), S(A)", "Mask map");
public static GUIContent normalMapSpaceText = new GUIContent("Normal/Tangent Map space", "");
public static GUIContent normalMapText = new GUIContent("Normal Map", "Normal Map (DXT5) - Need to implement BC5");
public static GUIContent normalMapText = new GUIContent("Normal Map", "Normal Map (BC7/BC5/DXT5(nm))");
public static GUIContent specularOcclusionMapText = new GUIContent("Specular Occlusion Map (RGBA)", "Specular Occlusion Map");
public static GUIContent horizonFadeText = new GUIContent("Horizon Fade (Spec occlusion)", "horizon fade is use to control specular occlusion");

// Details
public static string detailText = "Inputs Detail";
public static GUIContent detailMapModeText = new GUIContent("Detail Map with Normal", "Detail Map with AO / Height");
public static GUIContent UVDetailMappingText = new GUIContent("Detail UV mapping", "");
public static GUIContent detailMapNormalText = new GUIContent("Detail Map A(R) Ny(G) S(B) Nx(A)", "Detail Map");
public static GUIContent detailMaskText = new GUIContent("Detail Mask (G)", "Mask for detailMap");

public static GUIContent subsurfaceRadiusMapText = new GUIContent("Subsurface radius map", "Determines the range of the blur.");
public static GUIContent thicknessText = new GUIContent("Thickness", "If subsurface scattering is enabled, low values allow some light to be transmitted through the object.");
public static GUIContent thicknessMapText = new GUIContent("Thickness map", "If subsurface scattering is enabled, low values allow some light to be transmitted through the object.");
// Specular color
public static GUIContent specularColorText = new GUIContent("Specular Color", "Specular color (RGB)");
// Emissive
public static string lightingText = "Inputs Lighting";

{
Standard = 0,
SubsurfaceScattering = 1,
ClearCoat = 2,
SpecularColor = 3
SpecularColor = 2
}
protected MaterialProperty UVBase = null;

protected const string kAnisotropy = "_Anisotropy";
protected MaterialProperty anisotropyMap = null;
protected const string kAnisotropyMap = "_AnisotropyMap";
protected MaterialProperty specularColor = null;
protected const string kSpecularColor = "_SpecularColor";
protected MaterialProperty specularColorMap = null;
protected const string kSpecularColorMap = "_SpecularColorMap";
protected MaterialProperty UVDetail = null;
protected const string kUVDetail = "_UVDetail";

tangentMap = FindProperty(kTangentMap, props);
anisotropy = FindProperty(kAnisotropy, props);
anisotropyMap = FindProperty(kAnisotropyMap, props);
specularColor = FindProperty(kSpecularColor, props);
specularColorMap = FindProperty(kSpecularColorMap, props);
// Details
UVDetail = FindProperty(kUVDetail, props);

{
ShaderSSSInputGUI(material);
}
else if ((MaterialIDType)materialID.floatValue == MaterialIDType.SpecularColor)
{
m_MaterialEditor.TexturePropertySingleLine(Styles.specularColorText, specularColorMap, specularColor);
}
EditorGUILayout.Space();
GUILayout.Label(" " + Styles.textureControlText, EditorStyles.label);

SetKeyword(material, "_ANISOTROPYMAP", material.GetTexture(kAnisotropyMap));
SetKeyword(material, "_DETAIL_MAP", material.GetTexture(kDetailMap));
SetKeyword(material, "_SUBSURFACE_RADIUS_MAP", material.GetTexture(kSubsurfaceRadiusMap));
SetKeyword(material, "_THICKNESS_MAP", material.GetTexture(kThicknessMap));
SetKeyword(material, "_THICKNESSMAP", material.GetTexture(kThicknessMap));
SetKeyword(material, "_SPECULARCOLORMAP", material.GetTexture(kSpecularColorMap));
bool needUV2 = (UVDetailMapping)material.GetFloat(kUVDetail) == UVDetailMapping.UV2 && (UVBaseMapping)material.GetFloat(kUVBase) == UVBaseMapping.UV0;
bool needUV3 = (UVDetailMapping)material.GetFloat(kUVDetail) == UVDetailMapping.UV3 && (UVBaseMapping)material.GetFloat(kUVBase) == UVBaseMapping.UV0;

20
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.cs


{
LitStandard = 0,
LitSSS = 1,
LitClearCoat = 2,
LitSpecular = 3,
LitSpecular = 2,
LitUnused = 3,
LitAniso = 4 // Should be the last as it is not setup by the users but generated based on anisotropy property
};

public static uint FEATURE_FLAG_MATERIAL_LIT_STANDARD = 1 << 12;
public static uint FEATURE_FLAG_MATERIAL_LIT_SSS = 1 << 13;
public static uint FEATURE_FLAG_MATERIAL_LIT_CLEAR_COAT = 1 << 14;
public static uint FEATURE_FLAG_MATERIAL_LIT_SPECULAR = 1 << 15;
public static uint FEATURE_FLAG_MATERIAL_LIT_ANISO = 1 << 16;
public static uint FEATURE_FLAG_MATERIAL_LIT_SPECULAR = 1 << 14;
public static uint FEATURE_FLAG_MATERIAL_LIT_ANISO = 1 << 15;
}
//-----------------------------------------------------------------------------

[SurfaceDataAttributes("Subsurface Profile")]
public int subsurfaceProfile;
// Clearcoat
[SurfaceDataAttributes("Coat Normal", true)]
public Vector3 coatNormalWS;
[SurfaceDataAttributes("Coat Smoothness")]
public float coatPerceptualSmoothness;
// SpecColor
[SurfaceDataAttributes("Specular Color", false, true)]
public Vector3 specularColor;

public int subsurfaceProfile;
public bool enableTransmission; // Read from the SSS profile
public Vector3 transmittance;
// Clearcoat
[SurfaceDataAttributes("", true)]
public Vector3 coatNormalWS;
public float coatRoughness;
// SpecColor
// fold into fresnel0

31
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.cs.hlsl


//
#define MATERIALID_LIT_STANDARD (0)
#define MATERIALID_LIT_SSS (1)
#define MATERIALID_LIT_CLEAR_COAT (2)
#define MATERIALID_LIT_SPECULAR (3)
#define MATERIALID_LIT_SPECULAR (2)
#define MATERIALID_LIT_UNUSED (3)
#define MATERIALID_LIT_ANISO (4)
//

#define FEATURE_FLAG_MATERIAL_LIT_SSS (8192)
#define FEATURE_FLAG_MATERIAL_LIT_CLEAR_COAT (16384)
#define FEATURE_FLAG_MATERIAL_LIT_SPECULAR (32768)
#define FEATURE_FLAG_MATERIAL_LIT_ANISO (65536)
#define FEATURE_FLAG_MATERIAL_LIT_SPECULAR (16384)
#define FEATURE_FLAG_MATERIAL_LIT_ANISO (32768)
//
// UnityEngine.Experimental.Rendering.HDPipeline.Lit.SurfaceData: static fields

#define DEBUGVIEW_LIT_SURFACEDATA_SUBSURFACE_RADIUS (1010)
#define DEBUGVIEW_LIT_SURFACEDATA_THICKNESS (1011)
#define DEBUGVIEW_LIT_SURFACEDATA_SUBSURFACE_PROFILE (1012)
#define DEBUGVIEW_LIT_SURFACEDATA_COAT_NORMAL_WS (1013)
#define DEBUGVIEW_LIT_SURFACEDATA_COAT_PERCEPTUAL_SMOOTHNESS (1014)
#define DEBUGVIEW_LIT_SURFACEDATA_SPECULAR_COLOR (1015)
#define DEBUGVIEW_LIT_SURFACEDATA_SPECULAR_COLOR (1013)
//
// UnityEngine.Experimental.Rendering.HDPipeline.Lit.BSDFData: static fields

#define DEBUGVIEW_LIT_BSDFDATA_SUBSURFACE_PROFILE (1044)
#define DEBUGVIEW_LIT_BSDFDATA_ENABLE_TRANSMISSION (1045)
#define DEBUGVIEW_LIT_BSDFDATA_TRANSMITTANCE (1046)
#define DEBUGVIEW_LIT_BSDFDATA_COAT_NORMAL_WS (1047)
#define DEBUGVIEW_LIT_BSDFDATA_COAT_ROUGHNESS (1048)
//
// UnityEngine.Experimental.Rendering.HDPipeline.Lit.GBufferMaterial: static fields

float subsurfaceRadius;
float thickness;
int subsurfaceProfile;
float3 coatNormalWS;
float coatPerceptualSmoothness;
float3 specularColor;
};

int subsurfaceProfile;
bool enableTransmission;
float3 transmittance;
float3 coatNormalWS;
float coatRoughness;
};
//

case DEBUGVIEW_LIT_SURFACEDATA_SUBSURFACE_PROFILE:
result = GetIndexColor(surfacedata.subsurfaceProfile);
break;
case DEBUGVIEW_LIT_SURFACEDATA_COAT_NORMAL_WS:
result = surfacedata.coatNormalWS * 0.5 + 0.5;
break;
case DEBUGVIEW_LIT_SURFACEDATA_COAT_PERCEPTUAL_SMOOTHNESS:
result = surfacedata.coatPerceptualSmoothness.xxx;
break;
case DEBUGVIEW_LIT_SURFACEDATA_SPECULAR_COLOR:
result = surfacedata.specularColor;
needLinearToSRGB = true;

break;
case DEBUGVIEW_LIT_BSDFDATA_TRANSMITTANCE:
result = bsdfdata.transmittance;
break;
case DEBUGVIEW_LIT_BSDFDATA_COAT_NORMAL_WS:
result = bsdfdata.coatNormalWS * 0.5 + 0.5;
break;
case DEBUGVIEW_LIT_BSDFDATA_COAT_ROUGHNESS:
result = bsdfdata.coatRoughness.xxx;
break;
}
}

405
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.hlsl


//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// SurfaceData and BSDFData
//-----------------------------------------------------------------------------

#define LTC_GGX_MATRIX_INDEX 0 // RGBA
#define LTC_DISNEY_DIFFUSE_MATRIX_INDEX 1 // RGBA
#define LTC_MULTI_GGX_FRESNEL_DISNEY_DIFFUSE_INDEX 2 // RGB, A unused
#define LTC_LUT_SIZE 64
#define LTC_LUT_SCALE ((LTC_LUT_SIZE - 1) * rcp(LTC_LUT_SIZE))
#define LTC_LUT_OFFSET (0.5 * rcp(LTC_LUT_SIZE))
#define SSS_N_PROFILES 8
#define SSS_N_PROFILES 8
#define SSS_LOW_THICKNESS 0.002 // 2 mm
uint _EnableSSS; // Globally toggles subsurface scattering on/off
uint _TransmissionFlags; // 1 bit/profile; 0 = inf. thick, 1 = supports transmission
uint _TexturingModeFlags; // 1 bit/profile; 0 = PreAndPostScatter, 1 = PostScatter

void ApplyDebugToBSDFData(inout BSDFData bsdfData)
{
#ifdef LIGHTING_DEBUG
int lightDebugMode = (int)_DebugLightModeAndAlbedo.x;
float3 lightDebugAlbedo = _DebugLightModeAndAlbedo.yzw;
bool overrideSmoothness = _DebugLightingSmoothness.x != 0.0f;
float overrideSmoothnessValue = _DebugLightingSmoothness.y;
#ifdef DEBUG_DISPLAY
if (_DebugLightingMode == DEBUGLIGHTINGMODE_SPECULAR_LIGHTING)
{
bool overrideSmoothness = _DebugLightingSmoothness.x != 0.0;
float overrideSmoothnessValue = _DebugLightingSmoothness.y;
if (overrideSmoothness)
{
bsdfData.perceptualRoughness = PerceptualSmoothnessToPerceptualRoughness(overrideSmoothnessValue);
bsdfData.roughness = PerceptualRoughnessToRoughness(bsdfData.perceptualRoughness);
if (overrideSmoothness)
{
bsdfData.perceptualRoughness = PerceptualSmoothnessToPerceptualRoughness(overrideSmoothnessValue);
bsdfData.roughness = PerceptualRoughnessToRoughness(bsdfData.perceptualRoughness);
}
if (lightDebugMode == LIGHTINGDEBUGMODE_DIFFUSE_LIGHTING)
if (_DebugLightingMode == DEBUGLIGHTINGMODE_DIFFUSE_LIGHTING)
bsdfData.diffuseColor = lightDebugAlbedo;
bsdfData.diffuseColor = _DebugLightingAlbedo.xyz;
}
void ConfigureTexturingForSSS(inout BSDFData bsdfData)
{
bool performPostScatterTexturing = IsBitSet(_TexturingModeFlags, bsdfData.subsurfaceProfile);
// It's either post-scatter, or pre- and post-scatter texturing.
bsdfData.diffuseColor = performPostScatterTexturing ? float3(1, 1, 1)
: sqrt(bsdfData.diffuseColor);
}
// Evaluates transmittance for a linear combination of two normalized 2D Gaussians.

return transmittance * tintColor;
}
void FillMaterialIdStandardData(float3 baseColor, float specular, float metallic, float roughness, float3 normalWS, float3 tangentWS, float anisotropy, inout BSDFData bsdfData)
{
bsdfData.diffuseColor = baseColor * (1.0 - metallic);
bsdfData.fresnel0 = lerp(float3(specular.xxx), baseColor, metallic);
// TODO: encode specular
bsdfData.tangentWS = tangentWS;
bsdfData.bitangentWS = cross(normalWS, tangentWS);
ConvertAnisotropyToRoughness(roughness, anisotropy, bsdfData.roughnessT, bsdfData.roughnessB);
bsdfData.anisotropy = anisotropy;
}
void FillMaterialIdSSSData(float3 baseColor, int subsurfaceProfile, float subsurfaceRadius, float thickness, inout BSDFData bsdfData)
{
bsdfData.diffuseColor = baseColor;
// TODO take from subsurfaceProfile
bsdfData.fresnel0 = 0.04; // Should be 0.028 for the skin
bsdfData.subsurfaceProfile = subsurfaceProfile;
// Make the Std. Dev. of 1 correspond to the effective radius of 1 cm (three-sigma rule).
bsdfData.subsurfaceRadius = SSS_UNIT_CONVERSION * subsurfaceRadius + 0.0001;
bsdfData.thickness = SSS_UNIT_CONVERSION * (_ThicknessRemaps[subsurfaceProfile][0] +
_ThicknessRemaps[subsurfaceProfile][1] * thickness);
bsdfData.enableTransmission = IsBitSet(_TransmissionFlags, subsurfaceProfile);
if (bsdfData.enableTransmission)
{
bsdfData.transmittance = ComputeTransmittance( _HalfRcpVariancesAndLerpWeights[subsurfaceProfile][0].xyz,
_HalfRcpVariancesAndLerpWeights[subsurfaceProfile][0].w,
_HalfRcpVariancesAndLerpWeights[subsurfaceProfile][1].xyz,
_HalfRcpVariancesAndLerpWeights[subsurfaceProfile][1].w,
_TintColors[subsurfaceProfile].rgb, bsdfData.thickness, bsdfData.subsurfaceRadius);
}
#ifndef SSS_FILTER_HORIZONTAL_AND_COMBINE // When doing the SSS comine pass, we must not apply the modification of diffuse color
// Handle post-scatter, or pre- and post-scatter texturing.
// We modify diffuseColor here so it affect all the lighting + GI (lightprobe / lightmap) (Need to be done also in GBuffer pass) + transmittance
// diffuseColor will be solely use during lighting pass. The other contribution will be apply in subsurfacescattering convolution.
bool performPostScatterTexturing = IsBitSet(_TexturingModeFlags, subsurfaceProfile);
bsdfData.diffuseColor = performPostScatterTexturing ? float3(1.0, 1.0, 1.0) : sqrt(bsdfData.diffuseColor);
#endif
}
//-----------------------------------------------------------------------------
// conversion function for forward
//-----------------------------------------------------------------------------

if (bsdfData.materialId == MATERIALID_LIT_STANDARD)
{
bsdfData.diffuseColor = surfaceData.baseColor * (1.0 - surfaceData.metallic);
bsdfData.fresnel0 = lerp(float3(surfaceData.specular, surfaceData.specular, surfaceData.specular), surfaceData.baseColor, surfaceData.metallic);
bsdfData.tangentWS = surfaceData.tangentWS;
bsdfData.bitangentWS = cross(surfaceData.normalWS, surfaceData.tangentWS);
ConvertAnisotropyToRoughness(bsdfData.roughness, surfaceData.anisotropy, bsdfData.roughnessT, bsdfData.roughnessB);
bsdfData.anisotropy = surfaceData.anisotropy;
bsdfData.materialId = surfaceData.anisotropy > 0 ? MATERIALID_LIT_ANISO : bsdfData.materialId;
FillMaterialIdStandardData(surfaceData.baseColor, surfaceData.specular, surfaceData.metallic, bsdfData.roughness, surfaceData.normalWS, surfaceData.tangentWS, surfaceData.anisotropy, bsdfData);
bsdfData.materialId = surfaceData.anisotropy > 0.0 ? MATERIALID_LIT_ANISO : bsdfData.materialId;
bsdfData.diffuseColor = surfaceData.baseColor;
// TODO take from subsurfaceProfile
bsdfData.fresnel0 = 0.04; /* 0.028 ? */
bsdfData.subsurfaceProfile = surfaceData.subsurfaceProfile;
// Make the Std. Dev. of 1 correspond to the effective radius of 1 cm (three-sigma rule).
bsdfData.subsurfaceRadius = SSS_UNIT_CONVERSION * surfaceData.subsurfaceRadius + 0.0001;
bsdfData.thickness = SSS_UNIT_CONVERSION * (_ThicknessRemaps[bsdfData.subsurfaceProfile][0] +
_ThicknessRemaps[bsdfData.subsurfaceProfile][1] * surfaceData.thickness);
bsdfData.enableTransmission = IsBitSet(_TransmissionFlags, bsdfData.subsurfaceProfile);
if (bsdfData.enableTransmission)
{
bsdfData.transmittance = ComputeTransmittance(_HalfRcpVariancesAndLerpWeights[bsdfData.subsurfaceProfile][0].xyz,
_HalfRcpVariancesAndLerpWeights[bsdfData.subsurfaceProfile][0].w,
_HalfRcpVariancesAndLerpWeights[bsdfData.subsurfaceProfile][1].xyz,
_HalfRcpVariancesAndLerpWeights[bsdfData.subsurfaceProfile][1].w,
_TintColors[bsdfData.subsurfaceProfile].rgb, bsdfData.thickness, bsdfData.subsurfaceRadius);
}
}
else if (bsdfData.materialId == MATERIALID_LIT_CLEAR_COAT)
{
bsdfData.diffuseColor = surfaceData.baseColor * (1.0 - surfaceData.metallic);
bsdfData.fresnel0 = lerp(float3(surfaceData.specular, surfaceData.specular, surfaceData.specular), surfaceData.baseColor, surfaceData.metallic);
bsdfData.coatNormalWS = surfaceData.coatNormalWS;
bsdfData.coatRoughness = PerceptualSmoothnessToRoughness(surfaceData.coatPerceptualSmoothness);
FillMaterialIdSSSData(surfaceData.baseColor, surfaceData.subsurfaceProfile, surfaceData.subsurfaceRadius, surfaceData.thickness, bsdfData);
}
else if (bsdfData.materialId == MATERIALID_LIT_SPECULAR)
{

#ifdef OUTPUT_SPLIT_LIGHTING
ConfigureTexturingForSSS(bsdfData);
#endif
ApplyDebugToBSDFData(bsdfData);
return bsdfData;

// conversion function for deferred
//-----------------------------------------------------------------------------
#define USE_NORMAL_TETRAHEDRON_ENCODING
#ifdef USE_NORMAL_TETRAHEDRON_ENCODING
// To generate the basisNormal below we use these 4 vertex of a regular tetrahedron
// v0 = float3(1.0, 0.0, -1.0 / sqrt(2.0));
// v1 = float3(-1.0, 0.0, -1.0 / sqrt(2.0));
// v2 = float3(0.0, 1.0, 1.0 / sqrt(2.0));
// v3 = float3(0.0, -1.0, 1.0 / sqrt(2.0));
// Then we normalize the average of each face's vertices
// normalize(v0 + v1 + v2), etc...
static const float3 basisNormal[4] =
{
float3(0.816497, 0., -0.57735),
float3(-0.816497, 0., -0.57735),
float3(0., 0.816497, 0.57735),
float3(0., -0.816497, 0.57735)
};
// Then to get the local matrix (with z axis rotate to basisNormal) use GetLocalFrame(basisNormal[xxx])
static const float3x3 basisArray[4] =
{
float3x3(0., 1., 0., 0.57735, 0., 0.816497, 0.816497, 0., -0.57735),
float3x3(0., -1., 0., -0.57735, 0., 0.816497, -0.816497, 0., -0.57735),
float3x3(-1., 0., 0., 0., -0.57735, 0.816497, 0., 0.816497, 0.57735),
float3x3(1., 0., 0., 0., 0.57735, 0.816497, 0., -0.816497, 0.57735)
};
// Return [-1..1] vector2 oriented in plane of the faceIndex of a regular tetrahedron
float2 PackNormalTetraEncode(float3 n, out uint faceIndex)
{
// Retrieve the tetrahedra's face for the normal direction
// It is the one with the greatest dot value with face normal
float dot0 = dot(n, basisNormal[0]);
float dot1 = dot(n, basisNormal[1]);
float dot2 = dot(n, basisNormal[2]);
float dot3 = dot(n, basisNormal[3]);
float maxi0 = max(dot0, dot1);
float maxi1 = max(dot2, dot3);
float maxi = max(maxi0, maxi1);
// Get the index from the greatest dot
if (maxi == dot0)
faceIndex = 0;
else if (maxi == dot1)
faceIndex = 1;
else if (maxi == dot2)
faceIndex = 2;
else //(maxi == dot3)
faceIndex = 3;
// Rotate n into this local basis
n = mul(basisArray[faceIndex], n);
// Project n onto the local plane
return n.xy;
}
// Assume f [-1..1]
float3 UnpackNormalTetraEncode(float2 f, uint faceIndex)
{
// Recover n from local plane
float3 n = float3(f.xy, sqrt(1.0 - dot(f.xy, f.xy)));
// Inverse of transform PackNormalTetraEncode (just swap order in mul as we have a rotation)
return mul(n, basisArray[faceIndex]);
}
#endif
// Encode SurfaceData (BSDF parameters) into GBuffer
// Must be in sync with RT declared in HDRenderPipeline.cs ::Rebuild
void EncodeIntoGBuffer( SurfaceData surfaceData,

outGBuffer0 = float4(surfaceData.baseColor, surfaceData.specularOcclusion);
// RT1 - 10:10:10:2
// We store perceptualRoughness instead of roughness because it save a sqrt ALU when decoding
// (as we want both perceptualRoughness and roughness for the lighting due to Disney Diffuse model)
#ifdef USE_NORMAL_TETRAHEDRON_ENCODING
// Encode normal on 20bit + 2bit (faceIndex) with tetrahedal compression
uint faceIndex;
float2 tetraNormalWS = PackNormalTetraEncode(surfaceData.normalWS, faceIndex);
// Store faceIndex on two bits with perceptualRoughness
outGBuffer1 = float4(tetraNormalWS * 0.5 + 0.5, PackFloatInt10bit(PerceptualSmoothnessToPerceptualRoughness(surfaceData.perceptualSmoothness), faceIndex, 4.0), PackMaterialId(surfaceData.materialId));
#else
// We store perceptualRoughness instead of roughness because it save a sqrt ALU when decoding
// (as we want both perceptualRoughness and roughness for the lighting due to Disney Diffuse model)
// TODO: Store 2 bit of flag into perceptualSmoothness (one for SSR, other is free (deferred planar reflection ID ? / MatID extension ?)
#endif
// RT2 - 8:8:8:8
if (surfaceData.materialId == MATERIALID_LIT_STANDARD)

else if (surfaceData.materialId == MATERIALID_LIT_SSS)
{
outGBuffer2 = float4(surfaceData.subsurfaceRadius, surfaceData.thickness, 0.0, surfaceData.subsurfaceProfile * rcp(SSS_N_PROFILES - 1));
}
else if (surfaceData.materialId == MATERIALID_LIT_CLEAR_COAT)
{
// Encode coat normal on 16bit with oct compression
float2 octCoatNormalWS = PackNormalOctEncode(surfaceData.coatNormalWS);
// TODO: store metal and specular together, specular should be an enum (fixed value)
outGBuffer2 = float4(octCoatNormalWS * 0.5 + 0.5, PerceptualSmoothnessToRoughness(surfaceData.coatPerceptualSmoothness), surfaceData.metallic);
}
else if (surfaceData.materialId == MATERIALID_LIT_SPECULAR)
{

float3 baseColor = inGBuffer0.rgb;
bsdfData.specularOcclusion = inGBuffer0.a;
#ifdef USE_NORMAL_TETRAHEDRON_ENCODING
uint faceIndex;
UnpackFloatInt10bit(inGBuffer1.b, 4.0, bsdfData.perceptualRoughness, faceIndex);
bsdfData.normalWS = UnpackNormalTetraEncode(inGBuffer1.xy * 2.0 - 1.0, faceIndex);
#else
#endif
int supportsClearCoat = (featureFlags & (MATERIALID_LIT_CLEAR_COAT)) != 0;
if(supportsStandard + supportsSSS + supportsClearCoat + supportsSpecular > 1)
if(supportsStandard + supportsSSS + supportsSpecular > 1)
{
bsdfData.materialId = UnpackMaterialId(inGBuffer1.a); // only fetch materialid if it is not statically known from feature flags
}

if(supportsStandard) bsdfData.materialId = MATERIALID_LIT_STANDARD;
else if(supportsSSS) bsdfData.materialId = MATERIALID_LIT_SSS;
else if(supportsClearCoat) bsdfData.materialId = MATERIALID_LIT_CLEAR_COAT;
else bsdfData.materialId = MATERIALID_LIT_SPECULAR;
}

// TODO extract spec
float specular = 0.04;
float specular = 0.04; // TODO extract spec
bsdfData.diffuseColor = baseColor * (1.0 - metallic);
bsdfData.fresnel0 = lerp(float3(specular, specular, specular), baseColor, metallic);
bsdfData.tangentWS = UnpackNormalOctEncode(float2(inGBuffer2.rg * 2.0 - 1.0));
bsdfData.bitangentWS = cross(bsdfData.normalWS, bsdfData.tangentWS);
ConvertAnisotropyToRoughness(bsdfData.roughness, anisotropy, bsdfData.roughnessT, bsdfData.roughnessB);
bsdfData.anisotropy = anisotropy;
float3 tangentWS = UnpackNormalOctEncode(float2(inGBuffer2.rg * 2.0 - 1.0));
FillMaterialIdStandardData(baseColor, specular, metallic, bsdfData.roughness, bsdfData.normalWS, tangentWS, anisotropy, bsdfData);
if ((featureFlags & FEATURE_FLAG_MATERIAL_LIT_ANISO) && (featureFlags & FEATURE_FLAG_MATERIAL_LIT_STANDARD) == 0 || anisotropy > 0)
{

else if (supportsSSS && bsdfData.materialId == MATERIALID_LIT_SSS)
{
bsdfData.diffuseColor = baseColor;
// TODO take from subsurfaceProfile
bsdfData.fresnel0 = 0.04; /* 0.028 ? */
bsdfData.subsurfaceProfile = (SSS_N_PROFILES - 1) * inGBuffer2.a;
// Make the Std. Dev. of 1 correspond to the effective radius of 1 cm (three-sigma rule).
bsdfData.subsurfaceRadius = SSS_UNIT_CONVERSION * inGBuffer2.r + 0.0001;
bsdfData.thickness = SSS_UNIT_CONVERSION * (_ThicknessRemaps[bsdfData.subsurfaceProfile][0] +
_ThicknessRemaps[bsdfData.subsurfaceProfile][1] * inGBuffer2.g);
bsdfData.enableTransmission = IsBitSet(_TransmissionFlags, bsdfData.subsurfaceProfile);
if (bsdfData.enableTransmission)
{
bsdfData.transmittance = ComputeTransmittance(_HalfRcpVariancesAndLerpWeights[bsdfData.subsurfaceProfile][0].xyz,
_HalfRcpVariancesAndLerpWeights[bsdfData.subsurfaceProfile][0].w,
_HalfRcpVariancesAndLerpWeights[bsdfData.subsurfaceProfile][1].xyz,
_HalfRcpVariancesAndLerpWeights[bsdfData.subsurfaceProfile][1].w,
_TintColors[bsdfData.subsurfaceProfile].rgb, bsdfData.thickness, bsdfData.subsurfaceRadius);
}
}
else if (supportsClearCoat && bsdfData.materialId == MATERIALID_LIT_CLEAR_COAT)
{
float metallic = inGBuffer2.a;
// TODO extract spec
float specular = 0.04;
bsdfData.diffuseColor = baseColor * (1.0 - metallic);
bsdfData.fresnel0 = lerp(float3(specular, specular, specular), baseColor, metallic);
bsdfData.coatNormalWS = UnpackNormalOctEncode(float2(inGBuffer2.rg * 2.0 - 1.0));
bsdfData.coatRoughness = inGBuffer2.b;
int subsurfaceProfile = (SSS_N_PROFILES - 0.9) * inGBuffer2.a;
float subsurfaceRadius = inGBuffer2.r;
float thickness = inGBuffer2.g;
FillMaterialIdSSSData(baseColor, subsurfaceProfile, subsurfaceRadius, thickness, bsdfData);
}
else if (supportsSpecular && bsdfData.materialId == MATERIALID_LIT_SPECULAR)
{

bakeDiffuseLighting = inGBuffer3.rgb;
#ifdef OUTPUT_SPLIT_LIGHTING
ConfigureTexturingForSSS(bsdfData);
#endif
ApplyDebugToBSDFData(bsdfData);
}

{
featureFlags |= FEATURE_FLAG_MATERIAL_LIT_SSS;
}
else if (materialId == MATERIALID_LIT_CLEAR_COAT)
{
featureFlags |= FEATURE_FLAG_MATERIAL_LIT_CLEAR_COAT;
}
else if (materialId == MATERIALID_LIT_SPECULAR)
{
featureFlags |= FEATURE_FLAG_MATERIAL_LIT_SPECULAR;

// Precomputed lighting data to send to the various lighting functions
struct PreLightData
{
// General
// GGX iso
// Aniso
// GGX Aniso
// IBL
float3 iblDirWS; // Dominant specular direction, used for IBL in EvaluateBSDF_Env()
float iblMipLevel;

{
PreLightData preLightData;
// We have handle the case of NdotV being negative in GetData() function with GetShiftedNdotV.
// So we don't need to saturate or take the abs here.
// In case a material use negative normal for double sided lighting like speedtree this will be handle in the GetData() code too.
preLightData.NdotV = dot(bsdfData.normalWS, V);
// General
float3 iblNormalWS = bsdfData.normalWS;
// GetShiftedNdotV return a positive NdotV
// In case a material use negative normal for double sided lighting like Speedtree they need to do a new calculation
preLightData.NdotV = GetShiftedNdotV(iblNormalWS, V); // Handle artificat for specular lighting
// GGX iso
float iblNdotV = preLightData.NdotV;
float3 iblNormalWS = bsdfData.normalWS;
// Check if we precompute anisotropy too
// GGX aniso
if (bsdfData.materialId == MATERIALID_LIT_ANISO)
{
preLightData.TdotV = dot(bsdfData.tangentWS, V);

iblNormalWS = GetAnisotropicModifiedNormal(bsdfData.bitangentWS, bsdfData.normalWS, V, bsdfData.anisotropy);
iblNormalWS = GetAnisotropicModifiedNormal(bsdfData.bitangentWS, iblNormalWS, V, bsdfData.anisotropy);
// NOTE: If we follow the theory we should use the modified normal for the different calculation implying a normal (like NDotV) and use iblNormalWS
// NOTE: If we follow the theory we should use the modified normal for the different calculation implying a normal (like NdotV) and use iblNormalWS
GetPreIntegratedFGD(iblNdotV, bsdfData.perceptualRoughness, bsdfData.fresnel0, preLightData.specularFGD, preLightData.diffuseFGD);
// IBL
GetPreIntegratedFGD(preLightData.NdotV, bsdfData.perceptualRoughness, bsdfData.fresnel0, preLightData.specularFGD, preLightData.diffuseFGD);
// Area light specific
// Area light
// Scale and bias for the current precomputed table - the constant use here are the one that have been use when the table in LtcData.DisneyDiffuse.cs and LtcData.GGX.cs was use
float2 uv = 0.0078125 + 0.984375 * float2(bsdfData.perceptualRoughness, theta * INV_HALF_PI);
float2 uv = LTC_LUT_OFFSET + LTC_LUT_SCALE * float2(bsdfData.perceptualRoughness, theta * INV_HALF_PI);
// Get the inverse LTC matrix for GGX
// Note we load the matrix transpose (avoid to have to transpose it in shader)

float NdotL = saturate(dot(bsdfData.normalWS, L));
float NdotV = preLightData.NdotV;
float LdotV = dot(L, V);
float invLenLV = rsqrt(abs(2 + 2 * LdotV)); // invLenLV = rcp(length(L + V))
// GCN Optimization: reference PBR Diffuse Lighting for GGX + Smith Microsurfaces
float invLenLV = rsqrt(abs(2.0 * LdotV + 2.0)); // invLenLV = rcp(length(L + V))
float LdotH = saturate(invLenLV + invLenLV * LdotV);
float LdotH = saturate(invLenLV * LdotV + invLenLV);
float3 F = F_Schlick(bsdfData.fresnel0, LdotH);

diffuseLighting = float3(0.0, 0.0, 0.0);
specularLighting = float3(0.0, 0.0, 0.0);
float4 cookie = float4(1.0, 1.0, 1.0, 1.0);
float shadow = 1;
[branch] if (lightData.shadowIndex >= 0 && illuminance > 0.0)
[branch] if (lightData.shadowIndex >= 0)
[branch] if (lightData.cookieIndex >= 0 && illuminance > 0.0)
[branch] if (lightData.cookieIndex >= 0)
{
float3 lightToSurface = positionWS - lightData.positionWS;

[branch] if (bsdfData.enableTransmission)
{
// Reverse the normal.
illuminance = saturate(dot(-bsdfData.normalWS, L));
// Apply the cookie. Do not apply shadows.
illuminance *= cookie.a;
// Reverse the normal + do some wrap lighting to have a nicer transition between regular lighting and transmittance
// Ref: Steve McAuley - Energy-Conserving Wrapped Diffuse
const float w = 0.15;
float illuminance = saturate((dot(-bsdfData.normalWS, L) + w) / ((1.0 + w) * (1.0 + w)));
// For low thickness, we can reuse the shadowing status for the back of the object.
shadow = (bsdfData.thickness <= SSS_LOW_THICKNESS) ? shadow : 1;
illuminance *= shadow * cookie.a;
// The difference between the Disney Diffuse and the Lambertian BRDF for transmittance is negligible.
// The difference between the Disney Diffuse and the Lambertian BRDF for transmission is negligible.
float3 backLight = (cookie.rgb * lightData.color) * (illuminance * lightData.diffuseScale * Lambert());
// TODO: multiplication by 'diffuseColor' and 'transmittance' is the same for each light.
float3 transmittedLight = backLight * bsdfData.diffuseColor * bsdfData.transmittance;

diffuseLighting = float3(0.0, 0.0, 0.0);
specularLighting = float3(0.0, 0.0, 0.0);
float4 cookie = float4(1.0, 1.0, 1.0, 1.0);
float shadow = 1;
// TODO: measure impact of having all these dynamic branch here and the gain (or not) of testing illuminace > 0

// illuminance *= SampleIES(lightLoopContext, lightData.IESIndex, sphericalCoord, 0).r;
//}
[branch] if (lightData.shadowIndex >= 0 && illuminance > 0.0)
[branch] if (lightData.shadowIndex >= 0)
{
float3 offset = float3(0.0, 0.0, 0.0); // GetShadowPosOffset(nDotL, normal);
float shadow = GetPunctualShadowAttenuation(lightLoopContext.shadowContext, positionWS + offset, bsdfData.normalWS, lightData.shadowIndex, L, posInput.unPositionSS);

}
[branch] if (lightData.cookieIndex >= 0 && illuminance > 0.0)
[branch] if (lightData.cookieIndex >= 0)
{
float3x3 lightToWorld = float3x3(lightData.right, lightData.up, lightData.forward);

[branch] if (bsdfData.enableTransmission)
{
// Reverse the normal.
illuminance = saturate(dot(-bsdfData.normalWS, L)) * attenuation;
// Apply the cookie. Do not apply shadows.
illuminance *= cookie.a;
// Reverse the normal + do some wrap lighting to have a nicer transition between regular lighting and transmittance
// Ref: Steve McAuley - Energy-Conserving Wrapped Diffuse
const float w = 0.15;
float illuminance = saturate((dot(-bsdfData.normalWS, L) + w) / ((1.0 + w) * (1.0 + w)));
illuminance *= attenuation;
// For low thickness, we can reuse the shadowing status for the back of the object.
shadow = (bsdfData.thickness <= SSS_LOW_THICKNESS) ? shadow : 1;
illuminance *= shadow * cookie.a;
// The difference between the Disney Diffuse and the Lambertian BRDF for transmittance is negligible.
// The difference between the Disney Diffuse and the Lambertian BRDF for transmission is negligible.
float3 backLight = (cookie.rgb * lightData.color) * (illuminance * lightData.diffuseScale * Lambert());
// TODO: multiplication by 'diffuseColor' and 'transmittance' is the same for each light.
float3 transmittedLight = backLight * bsdfData.diffuseColor * bsdfData.transmittance;

diffuseLighting = float3(0.0, 0.0, 0.0);
specularLighting = float3(0.0, 0.0, 0.0);
float4 cookie = float4(1.0, 1.0, 1.0, 1.0);
float shadow = 1;
[branch] if (lightData.shadowIndex >= 0 && illuminance > 0.0)
[branch] if (lightData.shadowIndex >= 0)
[branch] if (lightData.cookieIndex >= 0 && illuminance > 0.0)
[branch] if (lightData.cookieIndex >= 0)
{
// Compute the texture coordinates in [0, 1]^2.
float2 coord = positionNDC * 0.5 + 0.5;

[branch] if (bsdfData.enableTransmission)
{
// Reverse the normal.
illuminance = saturate(dot(-bsdfData.normalWS, L) * clipFactor);
// Apply the cookie. Do not apply shadows.
illuminance *= cookie.a;
// Reverse the normal + do some wrap lighting to have a nicer transition between regular lighting and transmittance
// Ref: Steve McAuley - Energy-Conserving Wrapped Diffuse
const float w = 0.15;
float illuminance = saturate((dot(-bsdfData.normalWS, L) + w) / ((1.0 + w) * (1.0 + w)));
illuminance *= clipFactor;
// The difference between the Disney Diffuse and the Lambertian BRDF for transmittance is negligible.
// For low thickness, we can reuse the shadowing status for the back of the object.
shadow = (bsdfData.thickness <= SSS_LOW_THICKNESS) ? shadow : 1;
illuminance *= shadow * cookie.a;
// The difference between the Disney Diffuse and the Lambertian BRDF for transmission is negligible.
float3 backLight = (cookie.rgb * lightData.color) * (illuminance * lightData.diffuseScale * Lambert());
// TODO: multiplication by 'diffuseColor' and 'transmittance' is the same for each light.
float3 transmittedLight = backLight * bsdfData.diffuseColor * bsdfData.transmittance;

float3 L = normalize(unL);
// Cosine of the angle between the light direction and the normal of the light's surface.
float cosLNs = dot(-L, Ns);
cosLNs = lightData.twoSided ? abs(cosLNs) : saturate(cosLNs);
float cosLNs = saturate(dot(-L, Ns));
// We calculate area reference light with the area integral rather than the solid angle one.
float illuminance = cosLNs * saturate(dot(bsdfData.normalWS, L)) / (sqrDist * lightPdf);

diffuseLighting = float3(0.0, 0.0, 0.0);
specularLighting = float3(0.0, 0.0, 0.0);
// TODO: This could be precomputed.
float halfWidth = lightData.size.x * 0.5;
float halfHeight = lightData.size.y * 0.5;
float3 unL = lightData.positionWS - positionWS;
float3 unL = lightData.positionWS - positionWS;
[branch]
if (dot(lightData.forward, unL) >= 0)
{
// The light is back-facing.
return;
}
// TODO: This could be precomputed.
float halfWidth = lightData.size.x * 0.5;
float halfHeight = lightData.size.y * 0.5;
// Define the dimensions of the attenuation volume.
// TODO: This could be precomputed.
float radius = rsqrt(lightData.invSqrAttenuationRadius);

// Evaluate the diffuse part.
{
#ifdef LIT_DIFFUSE_LAMBERT_BRDF
ltcValue = LTCEvaluate(matL, V, bsdfData.normalWS, preLightData.NdotV, lightData.twoSided,
k_identity3x3);
ltcValue = LTCEvaluate(matL, V, bsdfData.normalWS, preLightData.NdotV, k_identity3x3);
ltcValue = LTCEvaluate(matL, V, bsdfData.normalWS, preLightData.NdotV, lightData.twoSided,
preLightData.ltcXformDisneyDiffuse);
ltcValue = LTCEvaluate(matL, V, bsdfData.normalWS, preLightData.NdotV, preLightData.ltcXformDisneyDiffuse);
#endif
if (ltcValue == 0.0)

float3 fresnelTerm = bsdfData.fresnel0 * preLightData.ltcGGXFresnelMagnitudeDiff
+ (float3)preLightData.ltcGGXFresnelMagnitude;
ltcValue = LTCEvaluate(matL, V, bsdfData.normalWS, preLightData.NdotV, lightData.twoSided,
preLightData.ltcXformGGX);
ltcValue = LTCEvaluate(matL, V, bsdfData.normalWS, preLightData.NdotV, preLightData.ltcXformGGX);
ltcValue *= lightData.specularScale;
specularLighting = fresnelTerm * lightData.color * ltcValue;
}

51
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Lit.shader


_Thickness("Thickness", Range(0.0, 1.0)) = 1.0
_ThicknessMap("Thickness Map", 2D) = "white" {}
_SpecularColor("SpecularColor", Color) = (1, 1, 1, 1)
_SpecularColorMap("SpecularColorMap", 2D) = "white" {}
// Wind
[ToggleOff] _EnableWind("Enable Wind", Float) = 0.0
_InitialBend("Initial Bend", float) = 1.0

_ShiverDirectionality("Shiver Directionality", Range(0.0, 1.0)) = 0.5
//_CoatCoverage("CoatCoverage", Range(0.0, 1.0)) = 0
//_CoatCoverageMap("CoatCoverageMapMap", 2D) = "white" {}
//_CoatRoughness("CoatRoughness", Range(0.0, 1.0)) = 0
//_CoatRoughnessMap("CoatRoughnessMap", 2D) = "white" {}
_DistortionVectorMap("DistortionVectorMap", 2D) = "black" {}
// Following options are for the GUI inspector and different from the input parameters above

[HideInInspector] _UVMappingMask("_UVMappingMask", Color) = (1, 0, 0, 0)
[Enum(TangentSpace, 0, ObjectSpace, 1)] _NormalMapSpace("NormalMap space", Float) = 0
[Enum(Standard, 0, Subsurface Scattering, 1, Clear Coat, 2, Specular Color, 3)] _MaterialID("MaterialId", Int) = 0
[Enum(Standard, 0, Subsurface Scattering, 1, Specular Color, 2)] _MaterialID("MaterialId", Int) = 0
[ToggleOff] _EnablePerPixelDisplacement("Enable per pixel displacement", Float) = 0.0
_PPDMinSamples("Min sample for POM", Range(1.0, 64.0)) = 5

#pragma shader_feature _ANISOTROPYMAP
#pragma shader_feature _DETAIL_MAP
#pragma shader_feature _SUBSURFACE_RADIUS_MAP
#pragma shader_feature _THICKNESS_MAP
#pragma shader_feature _THICKNESSMAP
#pragma shader_feature _SPECULARCOLORMAP
#pragma shader_feature _VERTEX_WIND
#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON

Pass
{
Name "GBufferDebugLighting" // Name is not used
Tags{ "LightMode" = "GBufferDebugLighting" } // This will be only for opaque object based on the RenderQueue index
Name "GBufferDebugDisplay" // Name is not used
Tags{ "LightMode" = "GBufferDebugDisplay" } // This will be only for opaque object based on the RenderQueue index
Cull [_CullMode]

HLSLPROGRAM
#define LIGHTING_DEBUG
#define DEBUG_DISPLAY
#include "../../Debug/HDRenderPipelineDebug.cs.hlsl"
#include "../../Debug/DebugLighting.hlsl"
#include "../../Debug/DebugDisplay.hlsl"
#include "../../Material/Material.hlsl"
#include "ShaderPass/LitSharePass.hlsl"
#include "LitData.hlsl"

}
Pass
{
Name "Debug"
Tags { "LightMode" = "DebugViewMaterial" }
Cull[_CullMode]
HLSLPROGRAM
#define SHADERPASS SHADERPASS_DEBUG_VIEW_MATERIAL
#include "../../Material/Material.hlsl"
#include "ShaderPass/LitSharePass.hlsl"
#include "LitData.hlsl"
#include "../../ShaderPass/ShaderPassDebugViewMaterial.hlsl"
ENDHLSL
}
// Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass it not used during regular rendering.
Pass

Pass
{
Name "ForwardDebugLighting" // Name is not used
Tags{ "LightMode" = "ForwardDebugLighting" } // This will be only for transparent object based on the RenderQueue index
Name "ForwardDisplayDebug" // Name is not used
Tags{ "LightMode" = "ForwardDisplayDebug" } // This will be only for transparent object based on the RenderQueue index
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]

#define LIGHTING_DEBUG
#define DEBUG_DISPLAY
#include "../../Debug/DebugDisplay.hlsl"
#include "../../Debug/HDRenderPipelineDebug.cs.hlsl"
#include "../../Debug/DebugLighting.hlsl"
// TEMP until pragma work in include
#pragma multi_compile LIGHTLOOP_SINGLE_PASS LIGHTLOOP_TILE_PASS

2
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/LitData.hlsl


surfaceData.subsurfaceRadius = 1.0;
surfaceData.thickness = 0.0;
surfaceData.subsurfaceProfile = 0;
surfaceData.coatNormalWS = float3(1.0, 0.0, 0.0);
surfaceData.coatPerceptualSmoothness = 1.0;
surfaceData.specularColor = float3(0.0, 0.0, 0.0);
GetNormalAndTangentWS(input, V, normalTS, surfaceData.normalWS, surfaceData.tangentWS);

13
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/LitDataInternal.hlsl


#endif
surfaceData.normalWS = float3(0.0, 0.0, 0.0); // Need to init this to keep quiet the compiler, but this is overriden later (0, 0, 0) so if we forget to override the compiler may comply.
// TODO: think about using BC5
normalTS = ADD_IDX(GetNormalTS)(input, layerTexCoord, detailNormalTS, detailMask, false, 0.0);
#if defined(_MASKMAP_IDX)

surfaceData.materialId = (_EnableSSS || _MaterialID != MATERIALID_LIT_SSS) ? _MaterialID : MATERIALID_LIT_STANDARD;
// TODO: think about using BC5
#ifdef _TANGENTMAP
#ifdef _NORMALMAP_TANGENT_SPACE_IDX // Normal and tangent use same space
float3 tangentTS = SAMPLE_UVMAPPING_NORMALMAP(_TangentMap, sampler_TangentMap, layerTexCoord.base, 1.0);

surfaceData.subsurfaceRadius *= SAMPLE_UVMAPPING_TEXTURE2D(_SubsurfaceRadiusMap, sampler_SubsurfaceRadiusMap, layerTexCoord.base).r;
#endif
#ifdef _THICKNESS_MAP
#ifdef _THICKNESSMAP
surfaceData.coatNormalWS = float3(1.0, 0.0, 0.0);
surfaceData.coatPerceptualSmoothness = 1.0;
surfaceData.specularColor = float3(0.0, 0.0, 0.0);
surfaceData.specularColor = _SpecularColor.rgb;
#ifdef _SPECULARCOLORMAP
surfaceData.specularColor *= SAMPLE_UVMAPPING_TEXTURE2D(_SpecularColorMap, sampler_SpecularColorMap, layerTexCoord.base).rgb;
#endif
#else // #if !defined(LAYERED_LIT_SHADER)

surfaceData.thickness = 0.0;
surfaceData.subsurfaceProfile = 0;
surfaceData.coatNormalWS = float3(1.0, 0.0, 0.0);
surfaceData.coatPerceptualSmoothness = 0.0;
surfaceData.specularColor = float3(0.0, 0.0, 0.0);
#endif // #if !defined(LAYERED_LIT_SHADER)

16
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/LitProperties.hlsl


CBUFFER_START(_PerMaterial)
// shared constant between lit and layered lit
float _AlphaCutoff;
float4 _DoubleSidedConstants;

float3 _EmissionColor;
// Wind
float _InitialBend;
float _InitialBend;
float _Stiffness;
float _Drag;
float _ShiverDrag;

TEXTURE2D(_ThicknessMap);
SAMPLER2D(sampler_ThicknessMap);
// float _CoatCoverage;
//TEXTURE2D(_CoatCoverageMap);
//SAMPLER2D(sampler_CoatCoverageMap);
// float _CoatRoughness;
//TEXTURE2D(_CoatRoughnessMap);
//SAMPLER2D(sampler_CoatRoughnessMap);
float4 _SpecularColor;
TEXTURE2D(_SpecularColorMap);
SAMPLER2D(sampler_SpecularColorMap);
float _TexWorldScale;
float4 _UVMappingMask;

float _TessellationObjectScale;
float _TessellationTilingScale;
#endif
CBUFFER_END

54
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/LitTessellation.shader


_Thickness("Thickness", Range(0.0, 1.0)) = 1.0
_ThicknessMap("Thickness Map", 2D) = "white" {}
_SpecularColor("SpecularColor", Color) = (1, 1, 1, 1)
_SpecularColorMap("SpecularColorMap", 2D) = "white" {}
// Wind
[ToggleOff] _EnableWind("Enable Wind", Float) = 0.0
_InitialBend("Initial Bend", float) = 1.0

_ShiverDirectionality("Shiver Directionality", Range(0.0, 1.0)) = 0.5
//_CoatCoverage("CoatCoverage", Range(0.0, 1.0)) = 0
//_CoatCoverageMap("CoatCoverageMapMap", 2D) = "white" {}
//_CoatRoughness("CoatRoughness", Range(0.0, 1.0)) = 0
//_CoatRoughnessMap("CoatRoughnessMap", 2D) = "white" {}
_DistortionVectorMap("DistortionVectorMap", 2D) = "black" {}

[HideInInspector] _UVMappingMask("_UVMappingMask", Color) = (1, 0, 0, 0)
[Enum(TangentSpace, 0, ObjectSpace, 1)] _NormalMapSpace("NormalMap space", Float) = 0
[Enum(Standard, 0, Subsurface Scattering, 1, Clear Coat, 2, Specular Color, 3)] _MaterialID("MaterialId", Int) = 0
[Enum(Standard, 0, Subsurface Scattering, 1, Specular Color, 2)] _MaterialID("MaterialId", Int) = 0
[ToggleOff] _EnablePerPixelDisplacement("Enable per pixel displacement", Float) = 0.0
_PPDMinSamples("Min sample for POM", Range(1.0, 64.0)) = 5

#pragma shader_feature _ANISOTROPYMAP
#pragma shader_feature _DETAIL_MAP
#pragma shader_feature _SUBSURFACE_RADIUS_MAP
#pragma shader_feature _THICKNESS_MAP
#pragma shader_feature _THICKNESSMAP
#pragma shader_feature _SPECULARCOLORMAP
#pragma shader_feature _VERTEX_WIND
#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON

Pass
{
Name "GBufferDebugLighting" // Name is not used
Tags{ "LightMode" = "GBufferDebugLighting" } // This will be only for opaque object based on the RenderQueue index
Name "GBufferDebugDisplay" // Name is not used
Tags{ "LightMode" = "GBufferDebugDisplay" } // This will be only for opaque object based on the RenderQueue index
Cull [_CullMode]

#pragma hull Hull
#pragma domain Domain
#define LIGHTING_DEBUG
#define DEBUG_DISPLAY
#include "../../Debug/HDRenderPipelineDebug.cs.hlsl"
#include "../../Debug/DebugLighting.hlsl"
#include "../../Debug/DebugDisplay.hlsl"
#include "../../Material/Material.hlsl"
#include "ShaderPass/LitSharePass.hlsl"
#include "LitData.hlsl"

}
Pass
{
Name "Debug"
Tags { "LightMode" = "DebugViewMaterial" }
Cull[_CullMode]
HLSLPROGRAM
#pragma hull Hull
#pragma domain Domain
#define SHADERPASS SHADERPASS_DEBUG_VIEW_MATERIAL
#include "../../Material/Material.hlsl"
#include "ShaderPass/LitSharePass.hlsl"
#include "LitData.hlsl"
#include "../../ShaderPass/ShaderPassDebugViewMaterial.hlsl"
ENDHLSL
}
// Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass it not used during regular rendering.
Pass

Pass
{
Name "ForwardDebugLighting" // Name is not used
Tags{ "LightMode" = "ForwardDebugLighting" } // This will be only for transparent object based on the RenderQueue index
Name "ForwardDisplayDebug" // Name is not used
Tags{ "LightMode" = "ForwardDisplayDebug" } // This will be only for transparent object based on the RenderQueue index
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]

#pragma hull Hull
#pragma domain Domain
#define LIGHTING_DEBUG
#define DEBUG_DISPLAY
#include "../../Debug/DebugDisplay.hlsl"
#include "../../Debug/HDRenderPipelineDebug.cs.hlsl"
#include "../../Debug/DebugLighting.hlsl"
// TEMP until pragma work in include
#pragma multi_compile LIGHTLOOP_SINGLE_PASS LIGHTLOOP_TILE_PASS

8
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/Resources/CombineSubsurfaceScattering.shader


#pragma vertex Vert
#pragma fragment Frag
#pragma shader_feature _ SSS_PRE_SCATTER_TEXTURING SSS_POST_SCATTER_TEXTURING
#pragma multi_compile _ FILTER_HORIZONTAL_AND_COMBINE
#pragma multi_compile _ SSS_FILTER_HORIZONTAL_AND_COMBINE
//-------------------------------------------------------------------------------------
// Include

float stepSizeY = rcp(fragheight);
// Compute the filtering direction.
#ifdef FILTER_HORIZONTAL_AND_COMBINE
#ifdef SSS_FILTER_HORIZONTAL_AND_COMBINE
float stepSize = stepSizeX;
float2 unitDirection = float2(1, 0);
#else

totalWeight += sampleWeight;
}
#ifdef FILTER_HORIZONTAL_AND_COMBINE
#ifdef SSS_FILTER_HORIZONTAL_AND_COMBINE
bool performPostScatterTexturing = IsBitSet(_TexturingModeFlags, profileID);
// It's either post-scatter, or pre- and post-scatter texturing.

4
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/ShaderPass/LitSharePass.hlsl


#define ATTRIBUTES_NEED_TEXCOORD1
#define ATTRIBUTES_NEED_COLOR
#if defined(_REQUIRE_UV2) || defined(_REQUIRE_UV3) || defined(DYNAMICLIGHTMAP_ON) || (SHADERPASS == SHADERPASS_DEBUG_VIEW_MATERIAL)
#if defined(_REQUIRE_UV2) || defined(_REQUIRE_UV3) || defined(DYNAMICLIGHTMAP_ON) || defined(DEBUG_DISPLAY)
#if defined(_REQUIRE_UV3) || (SHADERPASS == SHADERPASS_DEBUG_VIEW_MATERIAL)
#if defined(_REQUIRE_UV3) || defined(DEBUG_DISPLAY)
#define ATTRIBUTES_NEED_TEXCOORD3
#endif

2
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Lit/SubsurfaceScatteringProfile.cs


public class SubsurfaceScatteringSettings : ISerializationCallbackReceiver
{
public const int maxNumProfiles = 8;
public const int neutralProfileID = 7;
public const int neutralProfileID = maxNumProfiles - 1;
public int numProfiles;
public SubsurfaceScatteringProfile[] profiles;

4
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/MaterialUtilities.hlsl


}
// This function convert the tangent space normal/tangent to world space and orthonormalize it + apply a correction of the normal if it is not pointing towards the near plane
void GetNormalAndTangentWS(FragInputs input, float3 V, float3 normalTS, inout float3 normalWS, inout float3 tangentWS, bool wantNegativeNormal = false)
void GetNormalAndTangentWS(FragInputs input, float3 V, float3 normalTS, inout float3 normalWS, inout float3 tangentWS)
{
#ifdef SURFACE_GRADIENT
normalWS = SurfaceGradientResolveNormal(input.worldToTangent[2], normalTS);

GetShiftedNdotV(normalWS, V, wantNegativeNormal);
// Orthonormalize the basis vectors using the Gram-Schmidt process.
// We assume that the length of the surface normal is sufficiently close to 1.

106
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Unlit/Editor/BaseUnlitUI.cs


alphaCutoff = FindProperty(kAlphaCutoff, props);
doubleSidedEnable = FindProperty(kDoubleSidedEnable, props);
blendMode = FindProperty(kBlendMode, props);
distortionEnable = FindProperty(kDistortionEnable, props);
distortionOnly = FindProperty(kDistortionOnly, props);
distortionDepthTest = FindProperty(kDistortionDepthTest, props);
distortionEnable = FindProperty(kDistortionEnable, props, false);
distortionOnly = FindProperty(kDistortionOnly, props, false);
distortionDepthTest = FindProperty(kDistortionDepthTest, props, false);
}
void SurfaceTypePopup()

if ((SurfaceType)surfaceType.floatValue == SurfaceType.Transparent)
{
BlendModePopup();
m_MaterialEditor.ShaderProperty(distortionEnable, StylesBaseUnlit.distortionEnableText);
if (distortionEnable.floatValue == 1.0f)
if (distortionEnable != null)
m_MaterialEditor.ShaderProperty(distortionOnly, StylesBaseUnlit.distortionOnlyText);
m_MaterialEditor.ShaderProperty(distortionDepthTest, StylesBaseUnlit.distortionDepthTestText);
m_MaterialEditor.ShaderProperty(distortionEnable, StylesBaseUnlit.distortionEnableText);
if (distortionEnable.floatValue == 1.0f)
{
m_MaterialEditor.ShaderProperty(distortionOnly, StylesBaseUnlit.distortionOnlyText);
m_MaterialEditor.ShaderProperty(distortionDepthTest, StylesBaseUnlit.distortionDepthTestText);
}
}
}
m_MaterialEditor.ShaderProperty(alphaCutoffEnable, StylesBaseUnlit.alphaCutoffEnableText);

SetKeyword(material, "_DOUBLESIDED_ON", doubleSidedEnable);
SetKeyword(material, "_ALPHATEST_ON", alphaTestEnable);
bool distortionEnable = material.GetFloat(kDistortionEnable) > 0.0f;
if (distortionEnable)
if (material.HasProperty(kDistortionEnable))
material.SetShaderPassEnabled("DistortionVectors", true);
}
else
{
material.SetShaderPassEnabled("DistortionVectors", false);
}
bool distortionEnable = material.GetFloat(kDistortionEnable) > 0.0f;
if (distortionEnable)
{
material.SetShaderPassEnabled("DistortionVectors", true);
}
else
{
material.SetShaderPassEnabled("DistortionVectors", false);
}
bool distortionDepthTest = material.GetFloat(kDistortionDepthTest) > 0.0f;
if (distortionDepthTest)
{
material.SetInt("_ZTestMode", (int)UnityEngine.Rendering.CompareFunction.LessEqual);
}
else
{
material.SetInt("_ZTestMode", (int)UnityEngine.Rendering.CompareFunction.Always);
}
bool distortionDepthTest = material.GetFloat(kDistortionDepthTest) > 0.0f;
if (distortionDepthTest)
{
material.SetInt("_ZTestMode", (int)UnityEngine.Rendering.CompareFunction.LessEqual);
}
else
{
material.SetInt("_ZTestMode", (int)UnityEngine.Rendering.CompareFunction.Always);
}
SetKeyword(material, "_DISTORTION_ON", distortionEnable);
SetKeyword(material, "_DISTORTION_ON", distortionEnable);
}
// A material's GI flag internally keeps track of whether emission is enabled at all, it's enabled but has no effect
// or is enabled and may be modified at runtime. This state depends on the values of the current flag and emissive color.

static public void SetupBaseUnlitMaterialPass(Material material)
{
bool distortionEnable = material.GetFloat(kDistortionEnable) > 0.0f;
bool distortionOnly = material.GetFloat(kDistortionOnly) > 0.0f;
if (material.HasProperty(kDistortionEnable))
{
bool distortionEnable = material.GetFloat(kDistortionEnable) > 0.0f;
bool distortionOnly = material.GetFloat(kDistortionOnly) > 0.0f;
if (distortionEnable && distortionOnly)
{
// Disable all passes except debug material
material.SetShaderPassEnabled("GBuffer", false);
material.SetShaderPassEnabled("DebugViewMaterial", true);
material.SetShaderPassEnabled("Meta", false);
material.SetShaderPassEnabled("ShadowCaster", false);
material.SetShaderPassEnabled("DepthOnly", false);
material.SetShaderPassEnabled("MotionVectors", false);
material.SetShaderPassEnabled("Forward", false);
}
else
{
material.SetShaderPassEnabled("GBuffer", true);
material.SetShaderPassEnabled("DebugViewMaterial", true);
material.SetShaderPassEnabled("Meta", true);
material.SetShaderPassEnabled("ShadowCaster", true);
material.SetShaderPassEnabled("DepthOnly", true);
material.SetShaderPassEnabled("MotionVectors", true);
material.SetShaderPassEnabled("Forward", true);
if (distortionEnable && distortionOnly)
{
// Disable all passes except debug material
material.SetShaderPassEnabled("GBuffer", false);
material.SetShaderPassEnabled("DebugViewMaterial", true);
material.SetShaderPassEnabled("Meta", false);
material.SetShaderPassEnabled("ShadowCaster", false);
material.SetShaderPassEnabled("DepthOnly", false);
material.SetShaderPassEnabled("MotionVectors", false);
material.SetShaderPassEnabled("Forward", false);
}
else
{
material.SetShaderPassEnabled("GBuffer", true);
material.SetShaderPassEnabled("DebugViewMaterial", true);
material.SetShaderPassEnabled("Meta", true);
material.SetShaderPassEnabled("ShadowCaster", true);
material.SetShaderPassEnabled("DepthOnly", true);
material.SetShaderPassEnabled("MotionVectors", true);
material.SetShaderPassEnabled("Forward", true);
}
}
}

EditorGUILayout.Space();
VertexAnimationPropertiesGUI();
EditorGUILayout.Space();
MaterialPropertiesGUI(material);

61
Assets/ScriptableRenderPipeline/HDRenderPipeline/Material/Unlit/Unlit.shader


Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
LOD 300
Pass
{
Name "Debug"
Tags { "LightMode" = "DebugViewMaterial" }
Cull[_CullMode]
HLSLPROGRAM
#define SHADERPASS SHADERPASS_DEBUG_VIEW_MATERIAL
#include "../../Material/Material.hlsl"
#include "ShaderPass/UnlitSharePass.hlsl"
#include "UnlitData.hlsl"
#include "../../ShaderPass/ShaderPassDebugViewMaterial.hlsl"
ENDHLSL
}
// Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass it not used during regular rendering.
Pass

ENDHLSL
}
Pass
{
Name "ForwardUnlit"
Tags { "LightMode" = "ForwardDisplayDebug" }
Blend [_SrcBlend] [_DstBlend]
ZWrite [_ZWrite]
Cull [_CullMode]
HLSLPROGRAM
#define DEBUG_DISPLAY
#define SHADERPASS SHADERPASS_FORWARD_UNLIT
#include "../../Debug/DebugDisplay.hlsl"
#include "../../Material/Material.hlsl"
#include "ShaderPass/UnlitSharePass.hlsl"
#include "UnlitData.hlsl"
#include "../../ShaderPass/ShaderPassForwardUnlit.hlsl"
ENDHLSL
}
// Unlit opaque material need to be render with ForwardOnlyOpaque. Unlike Lit that can be both deferred and forward,
// unlit require to be forward only, that's why we need this pass. Unlit transparent will use regular Forward pass
// (Code is exactly the same as "Forward", it simply allow our system to filter objects correctly)

HLSLPROGRAM
#define SHADERPASS SHADERPASS_FORWARD_UNLIT
#include "../../Material/Material.hlsl"
#include "ShaderPass/UnlitSharePass.hlsl"
#include "UnlitData.hlsl"
#include "../../ShaderPass/ShaderPassForwardUnlit.hlsl"
ENDHLSL
}
Pass
{
Name "ForwardUnlit"
Tags { "LightMode" = "ForwardOnlyOpaqueDisplayDebug" }
Blend [_SrcBlend] [_DstBlend]
ZWrite [_ZWrite]
Cull [_CullMode]
HLSLPROGRAM
#define SHADERPASS SHADERPASS_FORWARD_UNLIT
#include "../../Debug/DebugDisplay.hlsl"
#include "../../Material/Material.hlsl"
#include "ShaderPass/UnlitSharePass.hlsl"
#include "UnlitData.hlsl"

4
Assets/ScriptableRenderPipeline/HDRenderPipeline/SceneSettings/SceneSettings.cs


get { return m_SkySettings; }
}
[SerializeField] private CommonSettings m_CommonSettings;
[SerializeField] private SkySettings m_SkySettings;
[SerializeField] private CommonSettings m_CommonSettings = null;
[SerializeField] private SkySettings m_SkySettings = null;
// Use this for initialization
void OnEnable()

2
Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/FragInputs.hlsl


// This structure gather all possible varying/interpolator for this shader.
//-------------------------------------------------------------------------------------
#include "../Debug/DebugViewMaterial.cs.hlsl"
#include "../Debug/DebugDisplay.cs.hlsl"
struct FragInputs
{

3
Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/ShaderPass.cs


DepthOnly,
Velocity,
Distortion,
LightTransport,
DebugViewMaterial
LightTransport
}
}

1
Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/ShaderPass.cs.hlsl


#define SHADERPASS_VELOCITY (4)
#define SHADERPASS_DISTORTION (5)
#define SHADERPASS_LIGHT_TRANSPORT (6)
#define SHADERPASS_DEBUG_VIEW_MATERIAL (7)
#endif

21
Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderPass/ShaderPassForward.hlsl


#ifdef _DEPTHOFFSET_ON
outputDepth = posInput.depthRaw;
#endif
#ifdef DEBUG_DISPLAY
if (_DebugViewMaterial != 0)
{
float3 result = float3(1.0, 0.0, 1.0);
bool needLinearToSRGB = false;
GetVaryingsDataDebug(_DebugViewMaterial, input, result, needLinearToSRGB);
GetBuiltinDataDebug(_DebugViewMaterial, builtinData, result, needLinearToSRGB);
GetSurfaceDataDebug(_DebugViewMaterial, surfaceData, result, needLinearToSRGB);
GetBSDFDataDebug(_DebugViewMaterial, bsdfData, result, needLinearToSRGB); // TODO: This required to initialize all field from BSDFData...
// TEMP!
// For now, the final blit in the backbuffer performs an sRGB write
// So in the meantime we apply the inverse transform to linear data to compensate.
if (!needLinearToSRGB)
result = SRGBToLinear(max(0, result));
outColor = float4(result, 1.0);
}
#endif
}

65
Assets/ScriptableRenderPipeline/HDRenderPipeline/ShaderVariables.hlsl


// ----------------------------------------------------------------------------
CBUFFER_START(UnityPerDraw)
CBUFFER_START(UnityPerDraw : register(b0))
float4x4 glstate_matrix_mvp;
float4x4 glstate_matrix_modelview0;
float4x4 glstate_matrix_invtrans_modelview0;
float4x4 glstate_matrix_mvp;
float4x4 glstate_matrix_modelview0;
float4x4 glstate_matrix_invtrans_modelview0;
float4x4 unity_ObjectToWorld;
float4x4 unity_WorldToObject;
float4 unity_LODFade; // x is the fade value ranging within [0,1]. y is x quantized into 16 levels
float4 unity_WorldTransformParams; // w is usually 1.0, or -1.0 for odd-negative scale transforms
float4x4 unity_ObjectToWorld;
float4x4 unity_WorldToObject;
float4 unity_LODFade; // x is the fade value ranging within [0,1]. y is x quantized into 16 levels
float4 unity_WorldTransformParams; // w is usually 1.0, or -1.0 for odd-negative scale transforms
float4 unity_LightmapST;
float4 unity_DynamicLightmapST;
// SH lighting environment
float4 unity_SHAr;
float4 unity_SHAg;
float4 unity_SHAb;
float4 unity_SHBr;
float4 unity_SHBg;
float4 unity_SHBb;
float4 unity_SHC;
// x = Disabled(0)/Enabled(1)
// y = Computation are done in global space(0) or local space(1)
// z = Texel size on U texture coordinate
float4 unity_ProbeVolumeParams;
float4x4 unity_ProbeVolumeWorldToObject;
float3 unity_ProbeVolumeSizeInv;
float3 unity_ProbeVolumeMin;
CBUFFER_END
#if defined(USING_STEREO_MATRICES)

CBUFFER_END
CBUFFER_START(UnityLighting)
// SH lighting environment
float4 unity_SHAr;
float4 unity_SHAg;
float4 unity_SHAb;
float4 unity_SHBr;
float4 unity_SHBg;
float4 unity_SHBb;
float4 unity_SHC;
CBUFFER_END
TEXTURE2D_FLOAT(_MainDepthTexture);
SAMPLER2D(sampler_MainDepthTexture);

TEXTURE2D(unity_DynamicDirectionality);
CBUFFER_START(UnityLightmaps)
float4 unity_LightmapST;
float4 unity_DynamicLightmapST;
CBUFFER_END
CBUFFER_START(UnityProbeVolume)
// x = Disabled(0)/Enabled(1)
// y = Computation are done in global space(0) or local space(1)
// z = Texel size on U texture coordinate
float4 unity_ProbeVolumeParams;
float4x4 unity_ProbeVolumeWorldToObject;
float3 unity_ProbeVolumeSizeInv;
float3 unity_ProbeVolumeMin;
CBUFFER_END
CBUFFER_START(UnityVelocityPass)
float4x4 _NonJitteredVP;

1
Assets/ScriptableRenderPipeline/HDRenderPipeline/Utilities.cs


None = 0,
SSS = 0 + Lit.MaterialId.LitSSS, // 1
Standard = 2 + Lit.MaterialId.LitStandard, // 2
ClearCoat = 1 + Lit.MaterialId.LitClearCoat, // 3
All = 255 // 0xff
}

36
Assets/ScriptableRenderPipeline/HDRenderPipeline/Wind/3DNoise.psd.meta


fileFormatVersion: 2
guid: fcecce6d2c9be8d418a27f0658a2210d
timeCreated: 1490775966
timeCreated: 1493292037
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}

linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:

allowsAlphaSplitting: 0
overridden: 0
- buildTarget: PS4
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: iPhone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: tvOS
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0

146
Assets/ScriptableRenderPipeline/ShaderLibrary/AreaLighting.hlsl


#ifndef UNITY_AREA_LIGHTING_INCLUDED
#define UNITY_AREA_LIGHTING_INCLUDED
float IntegrateEdge(float3 v1, float3 v2)
#define SPHERE_LIGHT_APPROXIMATION
// Not normalized by the factor of 1/TWO_PI.
float3 ComputeEdgeFactor(float3 V1, float3 V2)
float cosTheta = dot(v1, v2);
// Clamp to avoid artifacts. This particular constant gives the best results.
cosTheta = Clamp(cosTheta, -0.9999, 0.9999);
float theta = FastACos(cosTheta);
float res = cross(v1, v2).z * theta * rsqrt(1.0 - cosTheta * cosTheta); // optimization from * 1 / sin(theta)
float V1oV2 = dot(V1, V2);
float3 V1xV2 = cross(V1, V2);
#if 0
return V1xV2 * (rsqrt(1.0 - V1oV2 * V1oV2) * acos(V1oV2));
#else
// Approximate: { y = rsqrt(1.0 - V1oV2 * V1oV2) * acos(V1oV2) } on [0, 1].
// Fit: HornerForm[MiniMaxApproximation[ArcCos[x]/Sqrt[1 - x^2], {x, {0, 1 - $MachineEpsilon}, 6, 0}][[2, 1]]].
// Maximum relative error: 2.6855360216340534 * 10^-6. Intensities up to 1000 are artifact-free.
float x = abs(V1oV2);
float y = 1.5707921083647782 + x * (-0.9995697178013095 + x * (0.778026455830408 + x * (-0.6173111361273548 + x * (0.4202724111150622 + x * (-0.19452783598217288 + x * 0.04232040013661036)))));
if (V1oV2 < 0)
{
// Undo range reduction.
y = PI * rsqrt(saturate(1 - V1oV2 * V1oV2)) - y;
}
return res;
return V1xV2 * y;
#endif
}
// Not normalized by the factor of 1/TWO_PI.
// Ref: Improving radiosity solutions through the use of analytically determined form-factors.
float IntegrateEdge(float3 V1, float3 V2)
{
// 'V1' and 'V2' are represented in a coordinate system with N = (0, 0, 1).
return ComputeEdgeFactor(V1, V2).z;
// Baum's equation
// Expects non-normalized vertex positions
float PolygonRadiance(float4x3 L, bool twoSided)
// 'sinSqSigma' is the sine^2 of the half of the opening angle of the sphere as seen from the shaded point.
// 'cosOmega' is the cosine of the angle between the normal and the direction to the center of the light.
// N.b.: this function accounts for horizon clipping.
float DiffuseSphereLightIrradiance(float sinSqSigma, float cosOmega)
float irradiance;
#if 0 // Ref: Area Light Sources for Real-Time Graphics, page 4 (1996).
float sinSqOmega = saturate(1 - cosOmega * cosOmega);
float cosSqSigma = saturate(1 - sinSqSigma);
float sinSqGamma = saturate(cosSqSigma / sinSqOmega);
float cosSqGamma = saturate(1 - sinSqGamma);
float sinSigma = sqrt(sinSqSigma);
float sinGamma = sqrt(sinSqGamma);
float cosGamma = sqrt(cosSqGamma);
float sigma = asin(sinSigma);
float omega = acos(cosOmega);
float gamma = asin(sinGamma);
if (omega < 0 || omega >= HALF_PI + sigma)
{
// Full horizon occlusion (case #4).
return 0;
}
float e = sinSqSigma * cosOmega;
[branch]
if (omega < HALF_PI - sigma)
{
// No horizon occlusion (case #1).
irradiance = e;
}
else
{
float g = (-2 * sqrt(sinSqOmega * cosSqSigma) + sinGamma) * cosGamma + (HALF_PI - gamma);
float h = cosOmega * (cosGamma * sqrt(saturate(sinSqSigma - cosSqGamma)) + sinSqSigma * asin(saturate(cosGamma / sinSigma)));
if (omega < HALF_PI)
{
// Partial horizon occlusion (case #2).
irradiance = e + INV_PI * (g - h);
}
else
{
// Partial horizon occlusion (case #3).
irradiance = INV_PI * (g + h);
}
}
#else // Ref: Moving Frostbite to Physically Based Rendering, page 47 (2015).
float cosSqOmega = cosOmega * cosOmega;
[branch]
if (cosSqOmega > sinSqSigma)
{
irradiance = sinSqSigma * saturate(cosOmega);
}
else
{
float cotanOmega = cosOmega * rsqrt(1 - cosSqOmega);
float x = rcp(sinSqSigma) - 1;
float y = -cotanOmega * sqrt(x);
float z = sqrt(1 - cosSqOmega * rcp(sinSqSigma));
irradiance = INV_PI * ((cosOmega * acos(y) - z * sqrt(x)) * sinSqSigma + atan(z * rsqrt(x)));
}
#endif
return max(irradiance, 0);
}
// Expects non-normalized vertex positions.
float PolygonIrradiance(float4x3 L)
{
#ifdef SPHERE_LIGHT_APPROXIMATION
for (int i = 0; i < 4; i++)
{
L[i] = normalize(L[i]);
}
float3 F = float3(0, 0, 0);
for (uint edge = 0; edge < 4; edge++)
{
float3 V1 = L[edge];
float3 V2 = L[(edge + 1) % 4];
F += INV_TWO_PI * ComputeEdgeFactor(V1, V2);
}
float f2 = saturate(dot(F, F));
float sinSqSigma = sqrt(f2);
float cosOmega = clamp(F.z * rsqrt(f2), -1, 1);
return DiffuseSphereLightIrradiance(sinSqSigma, cosOmega);
#else
// 1. ClipQuadToHorizon
// detect clipping config

sum *= INV_TWO_PI; // Normalization
sum = twoSided ? abs(sum) : max(sum, 0.0);
sum = max(sum, 0.0);
#endif
float LTCEvaluate(float4x3 L, float3 V, float3 N, float NdotV, bool twoSided, float3x3 invM)
float LTCEvaluate(float4x3 L, float3 V, float3 N, float NdotV, float3x3 invM)
{
// Construct a view-dependent orthonormal basis around N.
// TODO: it could be stored in PreLightData, since all LTC lights compute it more than once.

invM = mul(transpose(basis), invM);
L = mul(L, invM);
// Polygon radiance in transformed configuration - specular
return PolygonRadiance(L, twoSided);
// Polygon irradiance in the transformed configuration
return PolygonIrradiance(L);
}
float LineFpo(float tLDDL, float lrcpD, float rcpD)

18
Assets/ScriptableRenderPipeline/ShaderLibrary/CommonLighting.hlsl


// Helper functions
//-----------------------------------------------------------------------------
// NdotV should not be negative for visible pixels, but it can happen due to the
// perspective projection and the normal mapping + decals. In that case, the normal
// should be modified to become valid (i.e facing the camera) to avoid weird artifacts.
// Note: certain applications (e.g. SpeedTree) require to still have negative normal to perform their own two sided lighting, they can use wantNegativeNormal
// This will potentially reduce the length of the normal at edges of geometry.
float GetShiftedNdotV(inout float3 N, float3 V, bool wantNegativeNormal)
// NdotV can be negative for visible pixels due to the perspective projection, the normal mapping and decals.
// This can produce visible artifacts with direct specular lighting (white point, black point) and indirect specular (artifact with cubemap fetch)
// A way to reduce artifact is to limit NdotV value to not be negative and calculate reflection vector for cubemap with a shifted normal (i.e what depends on the view)
// This is what provide this function
// Note: NdotV return by this function is always positive, no need for saturate
float GetShiftedNdotV(inout float3 N, float3 V)
float limit = rcp(256.0); // Determined mostly by the quality of the G-buffer normal encoding
const float limit = 0.0001; // Epsilon value that avoid divide by 0 (several BSDF divide by NdotV)
if (!wantNegativeNormal && NdotV < limit)
if (NdotV < limit)
// We do not renormalize the normal because { abs(length(N) - 1.0) < limit }.
// We do not renormalize the normal because { abs(length(N) - 1.0) < limit } + It is use for cubemap
N += (-NdotV + limit) * V;
NdotV = limit;
}

8
Assets/ScriptableRenderPipeline/ShaderLibrary/NormalSurfaceGradient.hlsl


return deriv * scale;
}
// Unpack normal as DXT5nm (1, y, 0, x) or BC5 (x, y, 0, 1)
float2 UnpackDerivativeNormalRGorAG(float4 packedNormal, float scale = 1.0)
{
// This do the trick
packedNormal.w *= packedNormal.x;
return UnpackDerivativeNormalAG(packedNormal, scale);
}
float2 UnpackDerivativeNormalRGB(float4 packedNormal, float scale = 1.0)
{
const float fS = 1.0 / (128.0 * 128.0);

9
Assets/ScriptableRenderPipeline/ShaderLibrary/Packing.hlsl


float3 UnpackNormalmapRGorAG(float4 packedNormal, float scale = 1.0)
{
// This do the trick
packedNormal.x *= packedNormal.w;
float3 normal;
normal.xy = packedNormal.xy * 2.0 - 1.0;
normal.xy *= scale;
normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy)));
return normal;
packedNormal.w *= packedNormal.x;
return UnpackNormalAG(packedNormal, scale);
}
//-----------------------------------------------------------------------------

14
Assets/ScriptableRenderPipeline/ShaderLibrary/SampleUVMappingInternal.hlsl


// Nested multiple includes of the file to handle all variations of normal map (AG, RG or RGB)
// TODO: Handle BC5 format, currently this code is for DXT5nm - After the change, rename this function UnpackNormalmapRGorAG
// This version is use for the base normal map
// This version is use for the base normal map (BC5 or DXT5nm)
#define UNPACK_NORMAL_FUNC UnpackNormalAG
#define UNPACK_DERIVATIVE_FUNC UnpackDerivativeNormalAG
#define UNPACK_NORMAL_FUNC UnpackNormalmapRGorAG
#define UNPACK_DERIVATIVE_FUNC UnpackDerivativeNormalRGorAG
#endif
#include "SampleUVMappingNormalInternal.hlsl"
#undef ADD_NORMAL_FUNC_SUFFIX

// This version is for normalmap with AG encoding only. Mainly use with details map.
// This version is for normalmap with AG encoding only. Use with details map encoded with others properties (like smoothness).
#if defined(UNITY_NO_DXT5nm)
#define UNPACK_NORMAL_FUNC UnpackNormalRGB
#define UNPACK_DERIVATIVE_FUNC UnpackDerivativeNormalRGB
#else
#endif
#include "SampleUVMappingNormalInternal.hlsl"
#undef ADD_NORMAL_FUNC_SUFFIX
#undef UNPACK_NORMAL_FUNC

12
Assets/ScriptableRenderPipeline/ShaderLibrary/Wind.hlsl


float AttenuateTrunk(float x, float s)
{
float r = (x / s);
return pow(r,1/s);
return PositivePow(r,1/s);
}

gust = pow(gust, 2) * WIND_SETTINGS_GustScale;
}
float3 trunkNoise =
float3 trunkNoise =
(normalizedDir * WIND_SETTINGS_WorldDirectionAndSpeed.w)
+ (gust * normalizedDir * WIND_SETTINGS_GustSpeed)
(normalizedDir * WIND_SETTINGS_WorldDirectionAndSpeed.w)
+ (gust * normalizedDir * WIND_SETTINGS_GustSpeed)
+ (trunk * WIND_SETTINGS_Turbulence)
) * drag;

void ApplyWind( inout float3 worldPos,
void ApplyWind( inout float3 worldPos,
inout float3 worldNormal,
float3 rootWP,
float stiffness,

float3 rotAxis = cross(float3(0, 1, 0), wind.Direction);
worldPos = Rotate(rootWP, worldPos, rotAxis, (wind.Strength) * 0.001 * att);
float3 shiverDirection = normalize(lerp(worldNormal, normalize(wind.Direction + wind.ShiverDirection), shiverDirectionality));
worldPos += wind.ShiverStrength * shiverDirection * shiverMask;
}

103
Assets/ScriptableRenderPipeline/common/Camera/CameraSwitcher.cs


private Quaternion m_OriginalCameraRotation;
private Camera m_CurrentCamera = null;
private float m_MessageDuration = 1.0f;
private float m_MessageTimer = 1000.0f;
private static string kDebugNext = "Debug Next";
private static string kDebugPrevious = "Debug Previous";
private string[] m_RequiredInputButtons = { kDebugNext, kDebugPrevious };
private bool m_Valid = true;
GUIContent[] m_CameraNames = null;
int[] m_CameraIndices = null;
void OnEnable()
{

m_Valid = Debugging.CheckRequiredInputButtonMapping(m_RequiredInputButtons);
}
if(m_OriginalCamera == null)
{
Debug.LogError("Camera Switcher needs a Camera component attached");
return;
}
int GetCameraCount()
{
return m_Cameras.Length + 1; // We need +1 for handling the original camera.
}
m_CurrentCameraIndex = GetCameraCount() - 1;
void NextCamera()
{
m_CurrentCameraIndex = (m_CurrentCameraIndex + 1) % GetCameraCount();
m_CameraNames = new GUIContent[GetCameraCount()];
m_CameraIndices = new int[GetCameraCount()];
for (int i = 0; i < m_Cameras.Length; ++i)
{
Camera cam = m_Cameras[i];
if (cam != null)
{
m_CameraNames[i] = new GUIContent(cam.name);
}
else
{
m_CameraNames[i] = new GUIContent("null");
}
m_CameraIndices[i] = i;
}
m_CameraNames[GetCameraCount() - 1] = new GUIContent("Original Camera");
m_CameraIndices[GetCameraCount() - 1] = GetCameraCount() - 1;
DebugMenuManager.instance.AddDebugItem<int>("Camera", "Camera Switcher", () => m_CurrentCameraIndex, (value) => SetCameraIndex((int)value), false, new DebugItemDrawerIntEnum(m_CameraNames, m_CameraIndices));
void PreviousCamera()
int GetCameraCount()
m_CurrentCameraIndex = m_CurrentCameraIndex - 1;
if (m_CurrentCameraIndex == -1)
m_CurrentCameraIndex = m_Cameras.Length;
return m_Cameras.Length + 1; // We need +1 for handling the original camera.
}
Camera GetNextCamera()

return m_Cameras[m_CurrentCameraIndex];
}
void Update()
void SetCameraIndex(int index)
if (m_Valid && Debugging.debugControlEnabled && m_OriginalCamera != null)
if(index > 0 || index < GetCameraCount())
m_MessageTimer += Time.deltaTime;
bool needUpdateCamera = false;
if (Input.GetButtonDown(kDebugNext))
{
NextCamera();
needUpdateCamera = true;
}
m_CurrentCameraIndex = index;
if (Input.GetButtonDown(kDebugPrevious))
if (m_CurrentCamera == m_OriginalCamera)
PreviousCamera();
needUpdateCamera = true;
m_OriginalCameraPosition = m_OriginalCamera.transform.position;
m_OriginalCameraRotation = m_OriginalCamera.transform.rotation;
if (needUpdateCamera)
m_CurrentCamera = GetNextCamera();
if (m_CurrentCamera != null)
m_MessageTimer = 0.0f;
// If we witch back to the original camera, put back the transform in it.
m_OriginalCameraPosition = m_OriginalCamera.transform.position;
m_OriginalCameraRotation = m_OriginalCamera.transform.rotation;
m_OriginalCamera.transform.position = m_OriginalCameraPosition;
m_OriginalCamera.transform.rotation = m_OriginalCameraRotation;
m_CurrentCamera = GetNextCamera();
if (m_CurrentCamera != null)
{
// If we witch back to the original camera, put back the transform in it.
if (m_CurrentCamera == m_OriginalCamera)
{
m_OriginalCamera.transform.position = m_OriginalCameraPosition;
m_OriginalCamera.transform.rotation = m_OriginalCameraRotation;
}
transform.position = m_CurrentCamera.transform.position;
transform.rotation = m_CurrentCamera.transform.rotation;
}
}
if (m_MessageTimer < m_MessageDuration)
{
string cameraName = m_CurrentCamera != null ? m_CurrentCamera.name : "NULL";
string message = string.Format("Switching to camera : {0}", cameraName);
Debugging.PushDebugMessage(message);
transform.position = m_CurrentCamera.transform.position;
transform.rotation = m_CurrentCamera.transform.rotation;
}
}
}

22
Assets/ScriptableRenderPipeline/common/TextureCache.cs


private static uint g_MaxFrameCount = unchecked((uint)(-1));
private static uint g_InvalidTexID = (uint)0;
public int FetchSlice(Texture texture)
public int FetchSlice(Texture texture, bool forceReinject=false)
var sliceIndex = -1;
if (texture == null)
return sliceIndex;
var bSwapSlice = false;
var bSwapSlice = forceReinject;
var sliceIndex = -1;
if (m_TextureCacheVersion != s_GlobalTextureCacheVersion)
sliceIndex = m_LocatorInSliceArray[texId];
bFoundAvailOrExistingSlice = true;
if(m_TextureCacheVersion!=s_GlobalTextureCacheVersion)
m_LocatorInSliceArray.Remove(texId);
}
else
{
sliceIndex = m_LocatorInSliceArray[texId];
bFoundAvailOrExistingSlice = true;
bSwapSlice = true; // force a reinject.
}
//assert(m_SliceArray[sliceIndex].TexID==TexID);
}

1
Assets/ScriptableRenderPipeline/fptl/lightlistbuild-clustered.compute


GroupMemoryBarrierWithGroupSync();
#endif
dpt_ma = asfloat(ldsZMax);
if(dpt_ma<=0.0) dpt_ma = VIEWPORT_SCALE_Z; // assume sky pixel
#endif
float2 vTileLL = float2(viTilLL.x/(float) iWidth, viTilLL.y/(float) iHeight);

28
Assets/TestScenes/HDTest/GraphicTest/Common/Dragon/DragonStatue.mat


m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecularColorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecularOcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}

m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SubsurfaceRadiusMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ThicknessMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}

- _DistortionDepthTest: 0
- _DistortionEnable: 0
- _DistortionOnly: 0
- _DoubleSidedEnable: 0
- _DoubleSidedMirrorEnable: 1
- _Drag: 1
- _EnableWind: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1

- _InitialBend: 1
- _StencilRef: 1
- _Metallic: 0
- _Mode: 0
- _NormalDetailMul: 0.347

- _PPDLodThreshold: 5
- _ShiverDirectionality: 0.5
- _ShiverDrag: 0.2
- _Smoothness: 1
- _SmoothnessAO: 0
- _SmoothnessAv: 0.499

- _SrcBlend: 1
- _StencilRef: 2
- _Stiffness: 1
- _SubsurfaceProfile: 0
- _SubsurfaceRadius: 1
- _SurfaceType: 0
- _Tess: 8
- _TessFar: 1

- _TessellationObjectScale: 1
- _TessellationShapeFactor: 0.75
- _TexWorldScale: 1
- _Thickness: 1
- _Tiling: 1
- _TilingDetail: 6
- _UVBase: 0

m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 0.9862069, g: 0.9862069, b: 0.9862069, a: 1}
- _DoubleSidedConstants: {r: 1, g: 1, b: -1, a: 0}
- _SpecularColor: {r: 1, g: 1, b: 1, a: 1}
- _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0}
- _UVMappingMask: {r: 1, g: 0, b: 0, a: 0}

890
Assets/TestScenes/HDTest/HDRenderLoopTest.unity
文件差异内容过多而无法显示
查看文件

3
ProjectSettings/EditorBuildSettings.asset


- enabled: 1
path: Assets/TestScenes/HDTest/HDRenderLoopTest.unity
guid: 0b16df2ba8fd0f244a826da853bc2d3b
- enabled: 0
path: Assets/TestScenes/HDTest/NewBatcherBench1.unity
guid: efeef759b5144ef4fa1cfc182ddbaea5

96
ProjectSettings/InputManager.asset


type: 0
axis: 0
joyNum: 0
- serializedVersion: 3
m_Name: Debug Horizontal
descriptiveName:
descriptiveNegativeName:
negativeButton: left
positiveButton: right
altNegativeButton:
altPositiveButton:
gravity: 1000
dead: 0.001
sensitivity: 1000
snap: 0
invert: 0
type: 2
axis: 5
joyNum: 0
- serializedVersion: 3
m_Name: Debug Vertical
descriptiveName:
descriptiveNegativeName:
negativeButton: down
positiveButton: up
altNegativeButton:
altPositiveButton:
gravity: 1000
dead: 0.001
sensitivity: 1000
snap: 0
invert: 0
type: 2
axis: 6
joyNum: 0
- serializedVersion: 3
m_Name: Debug Horizontal
descriptiveName:
descriptiveNegativeName:
negativeButton: left
positiveButton: right
altNegativeButton:
altPositiveButton:
gravity: 1000
dead: 0.001
sensitivity: 1000
snap: 0
invert: 0
type: 0
axis: 6
joyNum: 0
- serializedVersion: 3
m_Name: Debug Vertical
descriptiveName:
descriptiveNegativeName:
negativeButton: down
positiveButton: up
altNegativeButton:
altPositiveButton:
gravity: 1000
dead: 0.001
sensitivity: 1000
snap: 0
invert: 0
type: 0
axis: 6
joyNum: 0
- serializedVersion: 3
m_Name: Debug Validate
descriptiveName:
descriptiveNegativeName:
negativeButton: return
positiveButton:
altNegativeButton: joystick button 0
altPositiveButton:
gravity: 1000
dead: 0.001
sensitivity: 1000
snap: 0
invert: 0
type: 0
axis: 6
joyNum: 0
- serializedVersion: 3
m_Name: Debug Persistent
descriptiveName:
descriptiveNegativeName:
negativeButton: right shift
positiveButton:
altNegativeButton: joystick button 2
altPositiveButton:
gravity: 1000
dead: 0.001
sensitivity: 1000
snap: 0
invert: 0
type: 0
axis: 6
joyNum: 0

14
ProjectSettings/ProjectSettings.asset


captureSingleScreen: 0
muteOtherAudioSources: 0
Prepare IOS For Recording: 0
Force IOS Speakers When Recording: 0
submitAnalytics: 1
usePlayerLog: 1
bakeCollisionMeshes: 0

macAppStoreCategory: public.app-category.games
gpuSkinning: 0
graphicsJobs: 1
xboxPIXTextureCapture: 0

m_Height: 128
m_BuildTargetBatching:
- m_BuildTarget: Standalone
m_StaticBatching: 0
m_StaticBatching: 1
m_DynamicBatching: 0
- m_BuildTarget: iPhone
m_StaticBatching: 0

wiiUGamePadStartupScreen: {fileID: 0}
wiiUDrcBufferDisabled: 0
wiiUProfilerLibPath:
playModeTestRunnerEnabled: 0
actionOnDotNetUnhandledException: 1
enableInternalProfiler: 0
logObjCUncaughtExceptions: 1

ps4GarlicHeapSize: 2048
ps4ProGarlicHeapSize: 2560
ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ
ps4UseDebugIl2cppLibs: 0
ps4pnSessions: 1
ps4pnPresence: 1
ps4pnFriends: 1

psp2UseLibLocation: 0
psp2InfoBarOnStartup: 0
psp2InfoBarColor: 0
psp2UseDebugIl2cppLibs: 0
psp2ScriptOptimizationLevel: 0
psmSplashimage: {fileID: 0}
splashScreenBackgroundSourceLandscape: {fileID: 0}
splashScreenBackgroundSourcePortrait: {fileID: 0}

incrementalIl2cppBuild:
iOS: 0
additionalIl2CppArgs:
scriptingRuntimeVersion: 0
apiCompatibilityLevelPerPlatform: {}
m_RenderingPath: 1
m_MobileRenderingPath: 1

tizenMicrophonePermissions: 0
tizenDeploymentTarget:
tizenDeploymentTargetType: 0
tizenMinOSVersion: 0
tizenMinOSVersion: 1
n3dsUseExtSaveData: 0
n3dsCompressStaticMem: 1
n3dsExtSaveDataNumber: 0x12345

projectName:
organizationId:
cloudEnabled: 0
enableNewInputSystem: 0
enableNativePlatformBackendsForNewInputSystem: 0
disableOldInputManagerSupport: 0

14
ProjectSettings/QualitySettings.asset


shadowNearPlaneOffset: 2
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 0
blendWeights: 1
textureQuality: 1
anisotropicTextures: 0

particleRaycastBudget: 4
asyncUploadTimeSlice: 2
asyncUploadBufferSize: 4
resolutionScalingFixedDPIFactor: 1
excludedTargetPlatforms: []
- serializedVersion: 2
name: Fast

shadowNearPlaneOffset: 2
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 0
blendWeights: 2
textureQuality: 0
anisotropicTextures: 0

particleRaycastBudget: 16
asyncUploadTimeSlice: 2
asyncUploadBufferSize: 4
resolutionScalingFixedDPIFactor: 1
excludedTargetPlatforms: []
- serializedVersion: 2
name: Simple

shadowNearPlaneOffset: 2
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 0
blendWeights: 2
textureQuality: 0
anisotropicTextures: 1

particleRaycastBudget: 64
asyncUploadTimeSlice: 2
asyncUploadBufferSize: 4
resolutionScalingFixedDPIFactor: 1
excludedTargetPlatforms: []
- serializedVersion: 2
name: Good

shadowNearPlaneOffset: 2
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 1
blendWeights: 2
textureQuality: 0
anisotropicTextures: 1

particleRaycastBudget: 256
asyncUploadTimeSlice: 2
asyncUploadBufferSize: 4
resolutionScalingFixedDPIFactor: 1
excludedTargetPlatforms: []
- serializedVersion: 2
name: Beautiful

shadowNearPlaneOffset: 2
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 1
blendWeights: 4
textureQuality: 0
anisotropicTextures: 2

particleRaycastBudget: 1024
asyncUploadTimeSlice: 2
asyncUploadBufferSize: 4
resolutionScalingFixedDPIFactor: 1
excludedTargetPlatforms: []
- serializedVersion: 2
name: Fantastic

shadowNearPlaneOffset: 2
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.021409363, y: 0.051549375, z: 0.07213539}
shadowmaskMode: 1
blendWeights: 4
textureQuality: 0
anisotropicTextures: 1

realtimeReflectionProbes: 1
billboardsFaceCameraPosition: 1
vSyncCount: 1
vSyncCount: 0
resolutionScalingFixedDPIFactor: 1
excludedTargetPlatforms: []
m_PerPlatformDefaultQuality:
Android: 2

1
Assets/ScriptableRenderPipeline/ShaderGenerator/Editor/ShaderGeneratorMenu.cs


static void GenerateShaderIncludes()
{
CSharpToHLSL.GenerateAll();
UnityEditor.AssetDatabase.Refresh();
}
}
}

378
Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
namespace UnityEngine.Experimental.Rendering.HDPipeline
{
[GenerateHLSL]
public enum DebugLightingMode
{
None,
DiffuseLighting,
SpecularLighting,
VisualizeCascade
}
[Serializable]
public class DebugDisplaySettings
{
public float debugOverlayRatio = 0.33f;
public bool displayMaterialDebug = false;
public bool displayRenderingDebug = false;
public bool displayLightingDebug = false;
public MaterialDebugSettings materialDebugSettings = new MaterialDebugSettings();
public LightingDebugSettings lightingDebugSettings = new LightingDebugSettings();
public RenderingDebugSettings renderingDebugSettings = new RenderingDebugSettings();
private static bool isDebugViewMaterialInit = false;
public static GUIContent[] debugViewMaterialStrings = null;
public static int[] debugViewMaterialValues = null;
public static GUIContent[] debugViewEngineStrings = null;
public static int[] debugViewEngineValues = null;
public static GUIContent[] debugViewMaterialVaryingStrings = null;
public static int[] debugViewMaterialVaryingValues = null;
public static GUIContent[] debugViewMaterialGBufferStrings = null;
public static int[] debugViewMaterialGBufferValues = null;
public DebugDisplaySettings()
{
BuildDebugRepresentation();
}
public int GetDebugMaterialIndex()
{
return materialDebugSettings.GetDebugMaterialIndex();
}
public DebugLightingMode GetDebugLightingMode()
{
return lightingDebugSettings.debugLightingMode;
}
public bool IsDebugDisplayEnabled()
{
return materialDebugSettings.IsDebugDisplayEnabled() || lightingDebugSettings.IsDebugDisplayEnabled();
}
public bool IsDebugMaterialDisplayEnabled()
{
return materialDebugSettings.IsDebugDisplayEnabled();
}
public void SetDebugViewMaterial(int value)
{
if (value != 0)
lightingDebugSettings.debugLightingMode = DebugLightingMode.None;
materialDebugSettings.SetDebugViewMaterial(value);
}
public void SetDebugViewEngine(int value)
{
if (value != 0)
lightingDebugSettings.debugLightingMode = DebugLightingMode.None;
materialDebugSettings.SetDebugViewEngine(value);
}
public void SetDebugViewVarying(Attributes.DebugViewVarying value)
{
if (value != 0)
lightingDebugSettings.debugLightingMode = DebugLightingMode.None;
materialDebugSettings.SetDebugViewVarying(value);
}
public void SetDebugViewGBuffer(int value)
{
if (value != 0)
lightingDebugSettings.debugLightingMode = DebugLightingMode.None;
materialDebugSettings.SetDebugViewGBuffer(value);
}
public void SetDebugLightingMode(DebugLightingMode value)
{
if(value != 0)
materialDebugSettings.DisableMaterialDebug();
lightingDebugSettings.debugLightingMode = value;
}
public void RegisterDebug()
{
DebugMenuManager.instance.AddDebugItem<float>("Display Stats", "Frame Rate", () => 1.0f / Time.deltaTime, null, true);
DebugMenuManager.instance.AddDebugItem<float>("Display Stats", "Frame Time", () => Time.deltaTime * 1000.0f, null, true);
DebugMenuManager.instance.AddDebugItem<int>("Material", "Material",() => materialDebugSettings.debugViewMaterial, (value) => SetDebugViewMaterial((int)value), false, new DebugItemDrawerIntEnum(DebugDisplaySettings.debugViewMaterialStrings, DebugDisplaySettings.debugViewMaterialValues));
DebugMenuManager.instance.AddDebugItem<int>("Material", "Engine",() => materialDebugSettings.debugViewEngine, (value) => SetDebugViewEngine((int)value), false, new DebugItemDrawerIntEnum(DebugDisplaySettings.debugViewEngineStrings, DebugDisplaySettings.debugViewEngineValues));
DebugMenuManager.instance.AddDebugItem<Attributes.DebugViewVarying>("Material", "Attributes",() => materialDebugSettings.debugViewVarying, (value) => SetDebugViewVarying((Attributes.DebugViewVarying)value));
DebugMenuManager.instance.AddDebugItem<int>("Material", "GBuffer",() => materialDebugSettings.debugViewGBuffer, (value) => SetDebugViewGBuffer((int)value), false, new DebugItemDrawerIntEnum(DebugDisplaySettings.debugViewMaterialGBufferStrings, DebugDisplaySettings.debugViewMaterialGBufferValues));
DebugMenuManager.instance.AddDebugItem<LightingDebugMenu, bool>("Enable Shadows", () => lightingDebugSettings.enableShadows, (value) => lightingDebugSettings.enableShadows = (bool)value);
DebugMenuManager.instance.AddDebugItem<LightingDebugMenu, ShadowMapDebugMode>("Shadow Debug Mode", () => lightingDebugSettings.shadowDebugMode, (value) => lightingDebugSettings.shadowDebugMode = (ShadowMapDebugMode)value);
DebugMenuManager.instance.AddDebugItem<LightingDebugMenu, uint>("Shadow Map Index", () => lightingDebugSettings.shadowMapIndex, (value) => lightingDebugSettings.shadowMapIndex = (uint)value);
DebugMenuManager.instance.AddDebugItem<LightingDebugMenu, DebugLightingMode>("Lighting Debug Mode", () => lightingDebugSettings.debugLightingMode, (value) => SetDebugLightingMode((DebugLightingMode)value));
DebugMenuManager.instance.AddDebugItem<LightingDebugMenu, bool>("Override Smoothness", () => lightingDebugSettings.overrideSmoothness, (value) => lightingDebugSettings.overrideSmoothness = (bool)value);
DebugMenuManager.instance.AddDebugItem<LightingDebugMenu, float>("Override Smoothness Value", () => lightingDebugSettings.overrideSmoothnessValue, (value) => lightingDebugSettings.overrideSmoothnessValue = (float)value, false, new DebugItemDrawFloatMinMax(0.0f, 1.0f));
DebugMenuManager.instance.AddDebugItem<LightingDebugMenu, Color>("Debug Lighting Albedo", () => lightingDebugSettings.debugLightingAlbedo, (value) => lightingDebugSettings.debugLightingAlbedo = (Color)value);
DebugMenuManager.instance.AddDebugItem<bool>("Lighting", "Display Sky Reflection", () => lightingDebugSettings.displaySkyReflection, (value) => lightingDebugSettings.displaySkyReflection = (bool)value);
DebugMenuManager.instance.AddDebugItem<LightingDebugMenu, float>("Sky Reflection Mipmap", () => lightingDebugSettings.skyReflectionMipmap, (value) => lightingDebugSettings.skyReflectionMipmap = (float)value, false, new DebugItemDrawFloatMinMax(0.0f, 1.0f));
DebugMenuManager.instance.AddDebugItem<bool>("Rendering", "Display Opaque",() => renderingDebugSettings.displayOpaqueObjects, (value) => renderingDebugSettings.displayOpaqueObjects = (bool)value);
DebugMenuManager.instance.AddDebugItem<bool>("Rendering", "Display Transparency",() => renderingDebugSettings.displayTransparentObjects, (value) => renderingDebugSettings.displayTransparentObjects = (bool)value);
DebugMenuManager.instance.AddDebugItem<bool>("Rendering", "Enable Distortion",() => renderingDebugSettings.enableDistortion, (value) => renderingDebugSettings.enableDistortion = (bool)value);
DebugMenuManager.instance.AddDebugItem<bool>("Rendering", "Enable Subsurface Scattering",() => renderingDebugSettings.enableSSS, (value) => renderingDebugSettings.enableSSS = (bool)value);
}
public void OnValidate()
{
lightingDebugSettings.OnValidate();
}
void FillWithProperties(Type type, GUIContent[] debugViewMaterialStrings, int[] debugViewMaterialValues, string strSubNameSpace, ref int index)
{
var attributes = type.GetCustomAttributes(true);
// Get attribute to get the start number of the value for the enum
var attr = attributes[0] as GenerateHLSL;
if (!attr.needParamDebug)
{
return;
}
var fields = type.GetFields();
var localIndex = 0;
foreach (var field in fields)
{
var fieldName = field.Name;
// Check if the display name have been override by the users
if (Attribute.IsDefined(field, typeof(SurfaceDataAttributes)))
{
var propertyAttr = (SurfaceDataAttributes[])field.GetCustomAttributes(typeof(SurfaceDataAttributes), false);
if (propertyAttr[0].displayName != "")
{
fieldName = propertyAttr[0].displayName;
}
}
fieldName = strSubNameSpace + fieldName;
debugViewMaterialStrings[index] = new GUIContent(fieldName);
debugViewMaterialValues[index] = attr.paramDefinesStart + (int)localIndex;
index++;
localIndex++;
}
}
void FillWithPropertiesEnum(Type type, GUIContent[] debugViewMaterialStrings, int[] debugViewMaterialValues, string prefix, ref int index)
{
var names = Enum.GetNames(type);
var localIndex = 0;
foreach (var value in Enum.GetValues(type))
{
var valueName = prefix + names[localIndex];
debugViewMaterialStrings[index] = new GUIContent(valueName);
debugViewMaterialValues[index] = (int)value;
index++;
localIndex++;
}
}
string GetSubNameSpaceName(Type type)
{
return type.Namespace.Substring(type.Namespace.LastIndexOf((".")) + 1) + "/";
}
void BuildDebugRepresentation()
{
if (!isDebugViewMaterialInit)
{
var varyingNames = Enum.GetNames(typeof(Attributes.DebugViewVarying));
debugViewMaterialVaryingStrings = new GUIContent[varyingNames.Length];
debugViewMaterialVaryingValues = new int[varyingNames.Length];
var gbufferNames = Enum.GetNames(typeof(Attributes.DebugViewGbuffer));
debugViewMaterialGBufferStrings = new GUIContent[gbufferNames.Length + typeof(Lit.BSDFData).GetFields().Length];
debugViewMaterialGBufferValues = new int[gbufferNames.Length + typeof(Lit.BSDFData).GetFields().Length];
var num = typeof(Builtin.BuiltinData).GetFields().Length * 2 // BuildtinData are duplicated for each material
+ typeof(Lit.SurfaceData).GetFields().Length
+ typeof(Unlit.SurfaceData).GetFields().Length
+ 1; // None
debugViewMaterialStrings = new GUIContent[num];
debugViewMaterialValues = new int[num];
num = typeof(Lit.BSDFData).GetFields().Length
+ typeof(Unlit.BSDFData).GetFields().Length
+ 1; // None
debugViewEngineStrings = new GUIContent[num];
debugViewEngineValues = new int[num];
// Special case for None since it cannot be inferred from SurfaceDAta/BuiltinData
debugViewMaterialStrings[0] = new GUIContent("None");
debugViewMaterialValues[0] = 0;
var index = 1;
// 0 is a reserved number and should not be used (allow to track error)
FillWithProperties(typeof(Builtin.BuiltinData), debugViewMaterialStrings, debugViewMaterialValues, GetSubNameSpaceName(typeof(Lit.SurfaceData)), ref index);
FillWithProperties(typeof(Lit.SurfaceData), debugViewMaterialStrings, debugViewMaterialValues, GetSubNameSpaceName(typeof(Lit.SurfaceData)), ref index);
FillWithProperties(typeof(Builtin.BuiltinData), debugViewMaterialStrings, debugViewMaterialValues, GetSubNameSpaceName(typeof(Unlit.SurfaceData)), ref index);
FillWithProperties(typeof(Unlit.SurfaceData), debugViewMaterialStrings, debugViewMaterialValues, GetSubNameSpaceName(typeof(Unlit.SurfaceData)), ref index);
// Engine
debugViewEngineStrings[0] = new GUIContent("None");
debugViewEngineValues[0] = 0;
index = 1;
FillWithProperties(typeof(Lit.BSDFData), debugViewEngineStrings, debugViewEngineValues, GetSubNameSpaceName(typeof(Lit.BSDFData)), ref index);
FillWithProperties(typeof(Unlit.BSDFData), debugViewEngineStrings, debugViewEngineValues, GetSubNameSpaceName(typeof(Unlit.BSDFData)), ref index);
index = 0;
FillWithPropertiesEnum(typeof(Attributes.DebugViewVarying), debugViewMaterialVaryingStrings, debugViewMaterialVaryingValues, "", ref index);
index = 0;
FillWithPropertiesEnum(typeof(Attributes.DebugViewGbuffer), debugViewMaterialGBufferStrings, debugViewMaterialGBufferValues, "", ref index);
FillWithProperties(typeof(Lit.BSDFData), debugViewMaterialGBufferStrings, debugViewMaterialGBufferValues, "", ref index);
isDebugViewMaterialInit = true;
}
}
}
namespace Attributes
{
// 0 is reserved!
[GenerateHLSL]
public enum DebugViewVarying
{
None = 0,
Texcoord0 = 1,
Texcoord1,
Texcoord2,
Texcoord3,
VertexTangentWS,
VertexBitangentWS,
VertexNormalWS,
VertexColor,
VertexColorAlpha,
// caution if you add something here, it must start below
};
// Number must be contiguous
[GenerateHLSL]
public enum DebugViewGbuffer
{
None = 0,
Depth = DebugViewVarying.VertexColorAlpha + 1,
BakeDiffuseLightingWithAlbedoPlusEmissive,
}
}
[Serializable]
public class MaterialDebugSettings
{
public int debugViewMaterial { get { return m_DebugViewMaterial; } }
public int debugViewEngine { get { return m_DebugViewEngine; } }
public Attributes.DebugViewVarying debugViewVarying { get { return m_DebugViewVarying; } }
public int debugViewGBuffer { get { return m_DebugViewGBuffer; } }
int m_DebugViewMaterial = 0; // No enum there because everything is generated from materials.
int m_DebugViewEngine = 0; // No enum there because everything is generated from BSDFData
Attributes.DebugViewVarying m_DebugViewVarying = Attributes.DebugViewVarying.None;
int m_DebugViewGBuffer = 0; // Can't use GBuffer enum here because the values are actually split between this enum and values from Lit.BSDFData
public int GetDebugMaterialIndex()
{
// This value is used in the shader for the actual debug display.
// There is only one uniform parameter for that so we just add all of them
// They are all mutually exclusive so return the sum will return the right index.
return m_DebugViewGBuffer + m_DebugViewMaterial + m_DebugViewEngine + (int)m_DebugViewVarying;
}
public void DisableMaterialDebug()
{
m_DebugViewMaterial = 0;
m_DebugViewEngine = 0;
m_DebugViewVarying = Attributes.DebugViewVarying.None;
m_DebugViewGBuffer = 0;
}
public void SetDebugViewMaterial(int value)
{
if (value != 0)
DisableMaterialDebug();
m_DebugViewMaterial = value;
}
public void SetDebugViewEngine(int value)
{
if (value != 0)
DisableMaterialDebug();
m_DebugViewEngine = value;
}
public void SetDebugViewVarying(Attributes.DebugViewVarying value)
{
if (value != 0)
DisableMaterialDebug();
m_DebugViewVarying = value;
}
public void SetDebugViewGBuffer(int value)
{
if (value != 0)
DisableMaterialDebug();
m_DebugViewGBuffer = value;
}
public bool IsDebugDisplayEnabled()
{
return (m_DebugViewEngine != 0 || m_DebugViewMaterial != 0 || m_DebugViewVarying != Attributes.DebugViewVarying.None || m_DebugViewGBuffer != 0);
}
}
[Serializable]
public class RenderingDebugSettings
{
public bool displayOpaqueObjects = true;
public bool displayTransparentObjects = true;
public bool enableDistortion = true;
public bool enableSSS = true;
}
public enum ShadowMapDebugMode
{
None,
VisualizeAtlas,
VisualizeShadowMap
}
[Serializable]
public class LightingDebugSettings
{
public bool IsDebugDisplayEnabled()
{
return debugLightingMode != DebugLightingMode.None;
}
public DebugLightingMode debugLightingMode = DebugLightingMode.None;
public bool enableShadows = true;
public ShadowMapDebugMode shadowDebugMode = ShadowMapDebugMode.None;
public uint shadowMapIndex = 0;
public bool overrideSmoothness = false;
public float overrideSmoothnessValue = 0.5f;
public Color debugLightingAlbedo = new Color(0.5f, 0.5f, 0.5f);
public bool displaySkyReflection = false;
public float skyReflectionMipmap = 0.0f;
public void OnValidate()
{
overrideSmoothnessValue = Mathf.Clamp(overrideSmoothnessValue, 0.0f, 1.0f);
skyReflectionMipmap = Mathf.Clamp(skyReflectionMipmap, 0.0f, 1.0f);
}
}
}

37
Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.cs.hlsl


//
// This file was automatically generated from Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.cs. Please don't edit by hand.
//
#ifndef DEBUGDISPLAY_CS_HLSL
#define DEBUGDISPLAY_CS_HLSL
//
// UnityEngine.Experimental.Rendering.HDPipeline.DebugLightingMode: static fields
//
#define DEBUGLIGHTINGMODE_NONE (0)
#define DEBUGLIGHTINGMODE_DIFFUSE_LIGHTING (1)
#define DEBUGLIGHTINGMODE_SPECULAR_LIGHTING (2)
#define DEBUGLIGHTINGMODE_VISUALIZE_CASCADE (3)
//
// UnityEngine.Experimental.Rendering.HDPipeline.Attributes.DebugViewVarying: static fields
//
#define DEBUGVIEWVARYING_NONE (0)
#define DEBUGVIEWVARYING_TEXCOORD0 (1)
#define DEBUGVIEWVARYING_TEXCOORD1 (2)
#define DEBUGVIEWVARYING_TEXCOORD2 (3)
#define DEBUGVIEWVARYING_TEXCOORD3 (4)
#define DEBUGVIEWVARYING_VERTEX_TANGENT_WS (5)
#define DEBUGVIEWVARYING_VERTEX_BITANGENT_WS (6)
#define DEBUGVIEWVARYING_VERTEX_NORMAL_WS (7)
#define DEBUGVIEWVARYING_VERTEX_COLOR (8)
#define DEBUGVIEWVARYING_VERTEX_COLOR_ALPHA (9)
//
// UnityEngine.Experimental.Rendering.HDPipeline.Attributes.DebugViewGbuffer: static fields
//
#define DEBUGVIEWGBUFFER_NONE (0)
#define DEBUGVIEWGBUFFER_DEPTH (10)
#define DEBUGVIEWGBUFFER_BAKE_DIFFUSE_LIGHTING_WITH_ALBEDO_PLUS_EMISSIVE (11)
#endif

9
Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.cs.hlsl.meta


fileFormatVersion: 2
guid: 8f206be5d6c03164da4ba185ebead15a
timeCreated: 1492764489
licenseType: Pro
ShaderImporter:
defaultTextures: []
userData:
assetBundleName:
assetBundleVariant:

12
Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.cs.meta


fileFormatVersion: 2
guid: af3e841f9b2f10049b025e31928eef49
timeCreated: 1492764488
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

12
Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.hlsl


#ifndef UNITY_DEBUG_DISPLAY_INCLUDED
#define UNITY_DEBUG_DISPLAY_INCLUDED
#include "DebugDisplay.cs.hlsl"
// Set of parameters available when switching to debug shader mode
int _DebugLightingMode; // Match enum DebugLightingMode
int _DebugViewMaterial; // Contain the id (define in various materialXXX.cs.hlsl) of the property to display
float4 _DebugLightingAlbedo; // xyz = albedo for diffuse, w unused
float4 _DebugLightingSmoothness; // x == bool override, y == override value
#endif

9
Assets/ScriptableRenderPipeline/HDRenderPipeline/Debug/DebugDisplay.hlsl.meta


fileFormatVersion: 2
guid: d6dd73727229cdd41ab7f4b61be39b73
timeCreated: 1492764490
licenseType: Pro
ShaderImporter:
defaultTextures: []
userData:
assetBundleName:
assetBundleVariant:

9
Assets/ScriptableRenderPipeline/HDRenderPipeline/SSSProfile.meta


fileFormatVersion: 2
guid: a0ba759eadcfdcc44bc08adad4960ed0
folderAsset: yes
timeCreated: 1493162006
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/ScriptableRenderPipeline/PostProcessing.meta


fileFormatVersion: 2
guid: f9e0215129f26be429b86e3119cc9a5c
folderAsset: yes
timeCreated: 1493295523
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/ScriptableRenderPipeline/common/Debugging.meta


fileFormatVersion: 2
guid: 58a02e8711d94134393b2a8ac22b96ca
folderAsset: yes
timeCreated: 1491989728
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/Common.meta


fileFormatVersion: 2
guid: e42cfeaf226ad624786ad5b39095906c
folderAsset: yes
timeCreated: 1493044341
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

221
Assets/TestScenes/HDTest/GraphicTest/Common/Dragon/DragonStatueSpecular.mat


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: DragonStatueSpecular
m_Shader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
m_ShaderKeywords: _ALPHACUTOFFENABLE_OFF _DEPTHOFFSETENABLE_OFF _DETAIL_MAP_WITH_NORMAL
_DISTORTIONDEPTHTEST_OFF _DISTORTIONENABLE_OFF _DISTORTIONONLY_OFF _EMISSION _ENABLEPERPIXELDISPLACEMENT_OFF
_HEIGHTMAP _MASKMAP _NORMALMAP _NORMALMAP_TANGENT_SPACE _SPECULARCOLORMAP _TESSELLATION_DISPLACEMENT
_TESSELLATION_OBJECT_SCALE
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses:
- DistortionVectors
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AnisotropyMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BaseColorMap:
m_Texture: {fileID: 2800000, guid: d2472fab9be6dd4479dd5895a5055413, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMap:
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: 2800000, guid: 57044228904fe56449ead7efc223e4ad, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DistortionVectorMap:
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}
- _EmissiveColorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _HeightMap:
m_Texture: {fileID: 2800000, guid: 57044228904fe56449ead7efc223e4ad, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MSK:
m_Texture: {fileID: 2800000, guid: e31d177bc8c9381439c9b327a2636d3e, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: d2472fab9be6dd4479dd5895a5055413, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MaskMap:
m_Texture: {fileID: 2800000, guid: e31d177bc8c9381439c9b327a2636d3e, 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}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: 75bfcd5e2d2d5954ca601a85db5d1a73, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMapDetail:
m_Texture: {fileID: 2800000, guid: ad9cb02bddceb1340bc1fcb19d5f35bd, type: 3}
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}
- _SpecularColorMap:
m_Texture: {fileID: 2800000, guid: 53cf1b46cfd6ff347aad6fd4c6e1ea1e, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecularOcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SubSurfaceRadiusMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SubsurfaceRadiusMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _TangentMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ThicknessMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _AlphaCutoff: 0.5
- _AlphaCutoffEnable: 0
- _Anisotropy: 0
- _BlendMode: 0
- _BumpScale: 1
- _CullMode: 2
- _Cutoff: 0.5
- _DepthOffsetEnable: 0
- _DetailAOScale: 1
- _DetailAlbedoScale: 1
- _DetailHeightScale: 1
- _DetailMapMode: 0
- _DetailNormalMapScale: 1
- _DetailNormalScale: 1
- _DetailSmoothnessScale: 1
- _Displacement: 0.008
- _DisplacementCenter: 0.36
- _DisplacementfalloffFar: 150
- _DisplacementfalloffNear: 30
- _DistortionDepthTest: 0
- _DistortionEnable: 0
- _DistortionOnly: 0
- _DoubleSidedEnable: 0
- _DoubleSidedMirrorEnable: 1
- _DoubleSidedMode: 0
- _Drag: 1
- _DstBlend: 0
- _EmissiveColorMode: 1
- _EmissiveIntensity: 0
- _EnablePerPixelDisplacement: 0
- _EnableWind: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _HeightAmplitude: 0
- _HeightCenter: 0
- _HorizonFade: 1
- _InitialBend: 1
- _MaterialID: 2
- _Metallic: 0
- _Mode: 0
- _NormalDetailMul: 0.347
- _NormalMapSpace: 0
- _NormalScale: 1
- _OcclusionStrength: 1
- _PPDLodThreshold: 5
- _PPDMaxSamples: 15
- _PPDMinSamples: 5
- _Parallax: 0.02
- _ShiverDirectionality: 0.5
- _ShiverDrag: 0.2
- _Smoothness: 1
- _SmoothnessAO: 0
- _SmoothnessAv: 0.499
- _SmoothnessTextureChannel: 0
- _SmoothnessVar: 0.491
- _SpecularHighlights: 1
- _SrcBlend: 1
- _StencilRef: 3
- _Stiffness: 1
- _SubsurfaceProfile: 0
- _SubsurfaceRadius: 1
- _SurfaceType: 0
- _Tess: 8
- _TessFar: 1
- _TessNear: 0.2
- _TessellationBackFaceCullEpsilon: -0.25
- _TessellationFactor: 4
- _TessellationFactorMaxDistance: 50
- _TessellationFactorMinDistance: 20
- _TessellationFactorTriangleSize: 100
- _TessellationMode: 1
- _TessellationObjectScale: 1
- _TessellationShapeFactor: 0.75
- _TexWorldScale: 1
- _Thickness: 1
- _Tiling: 1
- _TilingDetail: 6
- _UVBase: 0
- _UVDetail: 0
- _UVMappingPlanar: 0
- _UVSec: 0
- _ZTestMode: 8
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 0.9862069, g: 0.9862069, b: 0.9862069, a: 1}
- _DoubleSidedConstants: {r: 1, g: 1, b: -1, a: 0}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _EmissiveColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecularColor: {r: 1, g: 1, b: 1, a: 1}
- _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0}
- _UVMappingMask: {r: 1, g: 0, b: 0, a: 0}

8
Assets/TestScenes/HDTest/GraphicTest/Common/Dragon/DragonStatueSpecular.mat.meta


fileFormatVersion: 2
guid: fe109261e26646f4b88bc8153a24ecc3
timeCreated: 1480931890
licenseType: Pro
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

610
Assets/TestScenes/HDTest/GraphicTest/Common/Dragon/Dragon_specular.psd


8BPSM8BIM%8BIM$7�<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c138 79.159824, 2016/09/14-01:09:01 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
<xmp:CreatorTool>Adobe Photoshop CC 2017 (Windows)</xmp:CreatorTool>
<xmp:CreateDate>2017-03-29T10:26:04+02:00</xmp:CreateDate>
<xmp:MetadataDate>2017-03-29T10:45:22+02:00</xmp:MetadataDate>
<xmp:ModifyDate>2017-03-29T10:45:22+02:00</xmp:ModifyDate>
<dc:format>application/vnd.adobe.photoshop</dc:format>
<xmpMM:InstanceID>xmp.iid:62fdb28d-db2d-a842-974d-32399f2be92d</xmpMM:InstanceID>
<xmpMM:DocumentID>xmp.did:84481483-4ba5-8b4d-8ed3-aa1f69d35c61</xmpMM:DocumentID>
<xmpMM:OriginalDocumentID>xmp.did:84481483-4ba5-8b4d-8ed3-aa1f69d35c61</xmpMM:OriginalDocumentID>
<xmpMM:History>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<stEvt:action>created</stEvt:action>
<stEvt:instanceID>xmp.iid:84481483-4ba5-8b4d-8ed3-aa1f69d35c61</stEvt:instanceID>
<stEvt:when>2017-03-29T10:26:04+02:00</stEvt:when>
<stEvt:softwareAgent>Adobe Photoshop CC 2017 (Windows)</stEvt:softwareAgent>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<stEvt:action>saved</stEvt:action>
<stEvt:instanceID>xmp.iid:62fdb28d-db2d-a842-974d-32399f2be92d</stEvt:instanceID>
<stEvt:when>2017-03-29T10:45:22+02:00</stEvt:when>
<stEvt:softwareAgent>Adobe Photoshop CC 2017 (Windows)</stEvt:softwareAgent>
<stEvt:changed>/</stEvt:changed>
</rdf:li>
</rdf:Seq>
</xmpMM:History>
<photoshop:ColorMode>3</photoshop:ColorMode>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>8BIM: printOutputPstSboolInteenumInteClrmprintSixteenBitbool printerNameTEXTCanon iR-ADV C2220/2230 PCL6printProofSetupObjc Proof Setup
proofSetupBltnenum builtinProof proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@o�Grn doub@o�Bl doub@o�BrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R
vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlong cropRectLeftlong cropRectRightlong cropRectToplong8BIM�HH8BIM&?�8BIM Z8BIM8BIM� 8BIM'
8BIM�H/fflff/ff���2Z5-8BIM�p��������������������������������������������������������������������������������������������8BIM@@8BIM8BIM5nullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum
ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong
leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?�8BIM8BIM8BIM
����,
����� Adobe_CM��Adobed����   
        ����"��
��?

 3!1AQa"q�2���B#$R�b34r��C%�S���cs5���&D�TdE£t6�U�e�����u��F'���������������Vfv��������7GWgw��������5!1AQaq"2����B#�R��3$b�r��CScs4�%���&5��D�T�dEU6te������u��F���������������Vfv��������'7GWgw������� ?��Bv2
�*.�Z�2Vܵ&1�K� ��K�#�f5�n��⠖��c��b���I�F�H��m.��!�6񎪹��T�ou`:fPm��V�6�&�U�>\{D*v�ϒ� ,�6<��(��4�V���Qk{�։�K��� ֓��E��fxN� (�aᕐ֜��Y���9�k���Ȧ�O��v�� TIv�!��o�3
nf����b�ڜ�����&��U�ۅj0K�?�����0���U�P��Q{$B���U��K �V��n�D7��7���q7l6��Nnwn@KT�a)��m h��tPs��w����
9kJ��v�������S��nӎvQ�{#��(u���mU�D��|�� t�qw�BqvMR�H�HW�)my�=��:b8������j�tR �*����p����PӢ�XR5�(�\ Vd���ѪӕN9V� �iD(2swg��5��tW�YE^߂X��tk��h>���Yp�Fv5ݔf�j)@��� ��㪚̍��&����H4�S���� µ���V-���4D���3*X�gF�2^�x�Aӕ��MBv��S�`An�vV�|Uj50U����'�Q<,}> �>�q.���y*9r�˻\�wC��\5���i�Ί��#��Ҽ�†�V�gEI�U�$%�e��5,�EF�r�_�R���g�"�Y�����+��u;G�U�J��Dݵ>�I��x ��K���<&m:-\" 6qd�i��:!
�y(���"�8�u`�[5�M8����|9�(K}" ������E�bB�wdu�
�]��'Dj�^�?,�7w�E�"�i��V��V�g1��KE�Z���AP�N���Z��\�nÐ��������"H��&�}�[W&C�Z�L��[I�����j���:�1�Íu@�7���׵�Y�i��e� Z���oل�_g+��\d��[)!��Hj9���B
��i��YJ��տ�5`
[���b4�� ��@�%����5H�<(���]r)��VK�� h �3*��#X��\©�9�X��#�+�^Я�P 6��J0����ϖ�Xr7��c@��'�*�3�5`�ʄ欳������t�!4AS.܄���rx�&�� J�9�5�Rȵ��S]��+:닉*�\�X�.N�N�C�Bq�[ւ�e񪿆&$˛ѝ�!|P�}�x!ib���$w �! �Dr��<�k���b����}@2Z�0��@��z<:3�Z#l�[��|�P���*y��[��H�� db���Dj���� �6��$�<r��J5m ���j���= � ������hL!8 U �E~\�]�����怩�h�� ����I�����SW@�"�J���eمNٙZ�Di���T�;][�;��IUn=���2���=VB�������2�׈�V����1�m��-P�Dk�)c:�IDU���d�v���N�N��bZ����Ij-D4����Q'Eyƨ�sT���(�i1(uq
�H!dg�5�H��c@�DӁ�Gu1� +<l��1��[�+O�t�I��(%��ͼx��O��;�B�v�P}m�J�x���8x:::2��U|�Wۧ���|
Q4(/�t��*��駊%���C�O�gvዪ G���)�����O &Ya�f�uE�#��F��ܤ������l������Z�fl25�V4�A�Fh�C�v��/��=�[�N�� �Wan�7<l�r֭��~JC@�--r���W%dA��tT,�ouẐ�hr�[K���פ-�� �D�m��J~lѻ �Z7^���l����*/ʩ�Aѵ�u-Gn�P �U��S:�:)c��r� @�:r��dh�]PxVY�/w�d�V�m{9E��Q^���������Ye���v��� ���Q����kFx̤���qh: ��. 5+%�Dj�(��5LY�ξ90u�����}W����!x�!�_FV�s��T��#f���^8�����v �9i������(�@�G
U丘[9�D�a��]�ih �5�T��дi��<�1��tqe�tm��?CMU���I�t �j���ʹ�6�\�l ;���c����aw<k�����E�2�� �|"V�:��`�=��i2��O�t�+F ���'r`�����3A�8�7�[��)�&>_5w5�/,E��C��V�Wy J��ԔI6� �U�v���'D�v�l8�u�����8BIM!]Adobe PhotoshopAdobe Photoshop CC 20178BIM"2MM*bj(1"r2��i��
��'
��'Adobe Photoshop CC 2017 (Windows)2017:03:29 10:45:22�����"*(2HH 8BIMFMsk ��2������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/00//02�42�0�2$47<?BDDEIJLORTWZ^afkotw{~�������������������������������������������������������������������������������������������������������������������~|�{wtqonl�k igffggfdb_\YWV�TV�WVTROLIEB=840-,*('%$"" � $$%'*--/�0�2�4�0�2.458<?BDDEIJMORRVY\^bglqty|������������������������������������������
���������������� ���������������������������������������������������~|{yywtsonn�lkigf�g�fda\YWVV�T�VTVW�YWVTROLGB?840-,*(('%$" � $%'(*,,-/0�2�4202�4+57:=ABDEGILOQRRTVY\adinsw{~����������������������������������������������������������������������������������������������������|{yywvsqo�nlk�igfda\Y�WV�TVWVVWY�Z YWVTQMID?:52/,�*('%$""� "$%'(***,-0200�245778:<=ABEIIJLOQ�RTWZ_bfkqvy~������������������������������������������������������� ��������������������������������������������������������~|{ywwvsq�on�l�kifda^ZY�W�V�WYZ�\ ZYVTROJEA<740-�,*(''%%$�"�$%''((*,-/�024578:<==?ADGJLMMOQ�RTWZ^adioty~������������������������������������������� �������������������������������������������������������������~|{ywwvs�qo�n lkkifba_\Z�Y�Z\�^\ZWVTQMIB=8520/--,,�*('�%�'�(�,-/�02458::<==ABEGJM�OQRRTWZ\_bgnsw|��������������������������������� ��������������������������������������������������������������������������������~|{�ywts�q�sq�nlkigd�a_^ZZ\\�Z�\^__�^ \YWVROJD?:7420�/�-�,*((�'�(�*�-�/0�20458::<=?BEGIJMQQOOQRTVYZ\_bglqv{~������������������������������������������������������������������������������������������������������~|�{ yvtssqqssq�nligfb�a_�^�\^�_�a�_ ^\ZWTQLGB=:754�20/�-,*((*�,�/�0�2458::<?BEIIJLMQR�QRTWYZ^adglqv{|~������������������������������������������������������������� ����������������������� �����������������������������������|{�|yvttsqssqonlkgfd�a�_�^_abab�a _\YVQMIDA=:875�4�2�0/-,**,�-�/�0�2�4578:<=ADGJLMMOQ�R,TVWYZ^adglqvy{|������������������������������������������������������������������������������������ �������������������������������~�|�~|ywvt�sqonlkgdb�a�_�ab�d�b�db_\WROLGDA?=<8755�420/�-/00�2�4�5078:==BDGLMOOQRTTRRTWWYY\_bfkosvwy~���������������������������
�����������������
������������������������������ ������������������������������������������������~�|�~|{ywvtqqoonlkgdbaabbaa_�abddfg�f gfb^YTQMJGDDA?:87755420//0/--//00�5�7 8:<=?BDGLOQQR�T�RT�WY\_dilosvw{~�������������������������������������������������������������������� ����������������������������������������~~�|{wvtqo�nlkgfdbbdda__aabdfg�igfaZVRQMJIGDA=<:8754200220//�02�7�5�7�8 :<<=?DDGLOQR�T(RTTWVVWYZ^bfknqtvy|������������������������������������� ����������������������������������������������������������������������������~��|~|wvtqon�lkgfdbbdda__aabfgi�k�l�kigb^YVTQMMJGDA?=<85220244200�24�8�78�:<�=ADEILOQR�T�V"WYZ^adinqstw{~�������������������������������������������������������������������������������������� ���������������~�|�~|yvtqon�lkgff�dba�_abfikkl�nlkifb^ZWTRQMJGDA?=85�24�5422457�:�<=?�ABDGJLOQR�TVWW�V WY\_dglostwy|�����������������������������������
�����������������������������������������������������������������������������~~�|�~|yvtqon�lkiggfdba_^^__adilloqq�onlkifb_\YWTQMJEB?=87�5�7542478<�=�?AB�DGJMOQR�TVWW�V WYZ_dgkosvwy|�����������������������������������������������������������������������������������������������������������~�|�~|{wtqo�nlkiigfba_^^__adilnq�sqonlkgda^ZVROLGDA=:�875457:<?�ABE�G EDDGJMOQQR�TVW�V�W�Y*Z_bgkostvy~���������������������������������������
�������������������������������������������������������������������������~�|ytsq�onllkigdb_^^__adilns�ts�qolifa^YTQMJGDA=<<�:�<:87578:=ABDDEEDDEIJJIGEEGJM�QR�TVWVVWY�Z\_bgloqsty~������������������������������������������������������������������������������������������������������~~�|yvtsqqoo�nlkigda__aabfilostv�wv�tsqnkfa\WTQMJGDBA?�=�?=:�8:<?BDEGIIGGIJLJIIGGILOQRQR�TVWVVWY�Z^_bgknosty|������������������������������������ ���������������������������������������� �������������������������������������~~||{{yvttsqoo�nlkifd�bdfgknqsvy�{yw�vtqokfa\YVRMJGEDB�A?=�<=BDEGI�J�LJ�IJMOQ�R�TV�W�Y\_adgklosvw{~����������������������������������������������������������������������������������������������������� ��~|{{ywvtsqoo�nlkiggffgiknostw{|�~|{y�wvtsokfb_\WROLJIGE�DB�A�?A�DEIL�M�LJ�I JLMOOQRRTV�W�Y^abfiknostvy|~������������������
���������������������������� ������������������������������������������������������������� ���~|{{ywtsqoo�n�l�k ikknnqqvvy|~��~|{�ywvsokgda\WTROMMLIIGGEDEDBAB�E
GJMOOQQOMLL�JL�MOQRTVWWVV�WYZ^adgkloqstvy{|~����������������������������������������������� �������������������������������������������������������
���~||{yvsq�o�n�o�qstwy{|~����~�|{wvsokgda^ZYVTRQOMLJ�IGEDD�GIJMOQ�RQMLJLLMOMLLMORTTVVTTW�YZ^afiklostvvwy{|������������������+���������������������������������������������������������������������������������������� ���~||{ywtsqq�o�q�s�t*vy{||~���������~|ywtqnkgfb_^ZYVTRQOMLMLJGEEIJLLMOQRTTROLLM�OMLJLMQ�RTVYZZ\^afiklost�vwy|��������
�������������
�������������������� ������������������������������������������������������������������������~||{ywvts�qs�qst�v
wy{|~���������~~|yvsqnlkgda^\YWVVTRQQOMJII�LMOOQQRVTROMMOQOOML�JMOO�QRTYZ\^_bfgkloqsttvwy|��������� ������������ ��������������������������������������� ���������������������������������������������
������������� ��~~|{ywvt�st�stvwyy�w vwy{|������������~|yvtsonlifba^\ZZYWVTQOMLL�OQ�RTVTR�Q�ODMLJIIJLMOOQRTWZ\^_bdfilnoqstvwy|������������������������������������������������������������~������������������������������������������������������������ ����~|{ywv�tvwy{{y�wy{|~�������������|{ywtqolkgfdbaa_^ZWTRQOO�R�T�VT�RFQOMLLJIJJLOOQQRVYZ\_bbdgklnostvwy|�����������������������������������������!��������������������|�������������������������
����������������������������������� �����~|{yw�v�wy{|ywwy{|~����������������~||yvsonlkigffdb^\YWTRR�VW�V�WVTT�RQO�ML�JLO�QRTWYZ^aabfiklosvwy{~���������������������������������������������������������~|~��������~ ~������������������� �������������������������������������~|{y�wy{|{yy{|~�������������� ������~{wtsqol�kifba^\YWVYZZYYW�YWVVRQQ�OMLJJLO�Q�R#VWY^__adgiknqvw{~��������������������������������������� �������������� ����~|{|~�������|�| ~������������� �������������������������������������������~|{�y�{�y�w y{||{{|~���������������������|ywvtqoonligfb_^^Z�^\Z�Y�WVRQ�O�QOMMLLMO�Q�RTVY\^^_bfgknqtw{��������������������������������������� ������������������~|�{|�����~|�{
|~����������������������������������� �������~~|{{�|�~|{ywy{|~~||~��������������������~|ywvtsqonlkgdbb_�a_^\ZWW�VTRQOOQQ�OMLLM�O�Q�TWY\\^adgknqtw{������������������������������������� ������������������~{�y{~����~~||{�y
{|�������������������� ��������������������� ��������~~�|~��~||{||�~�������������������������~|{ywvtssqnigfbdbba_^ZWV�T�VTR�Q�OMLLM�OQTTVWZ\^_bgloqtw{~�����������������������������������������������������|ywwyy{|�����~|{y�y{~����������������������������������������������������~�����������������������������������~|�{ywvsnkifgdbaa^ZWV�TVTRQQ�OMLLM�O*QRRTVYZ^_bgloqtwy|�������������������������������������������������������~{wvvwy{|~��~||~{ywwyy|������������������� �������������� �������������������������������������� �������������~|{wsoli
kgdba^ZYWVV�T�VTRQ�O�M�OQRRTVWZ^_bgloqtwy{~�������������������������������� ������������������|y�vwy{|�~�|ywwwy{~����������� ���������������������������������������������������������������������� ���������������~{vsolnkfda^\YW�VWVTR�QO�M�OQRTTVWWZ^adglosvwy{|���������������������������������������~||��������~{wvtvvy{|�~�|{ywwwy|~����������������������������������������������������������������������������������������� ����������������|yvsqqnifb_^Z�W�Y�WV�TRQ�O�QRTVW�Y\_dgilotwy{||~�������������������������������������~|{{|~�����|{wvtstvw{|�~|{�yy{~~�������������������������������������������������������������������������������������� ���������������~{wvt tqkgfb_\YYZ\ZZ�WVWWTRQ�OQRTTVYZZ\^afiknqtwy{�|~�����������������������������������|{�y{|���~ywtsqqsvvy|��~{�wy{{|~~�������������������
������������������������������������������������������������������������������������|ywv vsnkifb_\\^^\Z�Y�ZWTR�QRTVVWY\^_abfilostwy{�|�{|�������������������������������|y�wy{|~~{wtqonoqtvy|���|yvvwy{�|~�������������������������� ���������������������������������������������������������������������������~{ywwtqlkgfb�_^\�Z�\ZWV�T�V�WYZ^_abbgknoqsvw�y {yy{~|~�������������������������~|yw�vwy{{wtqo�nosty|~�~|ywvwy{�|~���������������������������
���������������
����������������������������������������������������������������~{{ywvsoligdbaa__^^�\�^\ZY�W�Y Z\_aabdilnnost�v�wy{{|~����������������������~ |{yvttvwwvtqo�noqty{�|{ywwyy�{|~������������������������������������������ ������������������������������������������������������������~||{
yvtqolifdba�_^\\�_^\ZYZZ�\Z\^�abfkllnos�tstvv�wy{{|~����������������� �����������~|{|~~{yvtsttssqonl�noqtw{{�|{yywwy�{|~������������������������������������������������������������������������� ����������������������������������~|{
{wvtsokgfdb�a_^^�_^\Z\^�_�^
_aabdgkllnq�s�qs�tv�wy|��������������������~|{�y {|~{wvtssq�onll�nostvy{||{�y�wy�{|~��������������������������������������������������������������������������������������� ���������������~||ywwvsligffdbbdb�a�_�^_abba__�abdiklno�q�onooqqst�vy|~����������������~|{yw�v�wy|yvtsqon�l klloosstwy{{y�wy�{�|~��������������������������������������������� ���������������������������������������������������������������~ ~{yywtolkiig�f�dba�_abdd�bdfiln�o�n�l�n�o
qstvwy|~���������� �~{ywvvtss�t vwvsqqonll�k lkkloqsstv�wy{�| ~�������������������������������������������� ������������������������������������������ �������������������|{{ywsonllkiggffdbaa�_a_bd�f dbbdfginoqonl�k�l�noqsvy{|~������������|{wvts�qs�qsqo�n�l�klnq�st�vw�y|�~ |~���������������������������������������������������������������������������������������������� �������������~||{yvso�nligffddbb�abdf�gfddfgiknqqnlkigi�kl�n
osvy{|~��~~��~�|~�� �|ywvsqonn�o�n�l�nl�k�lnq�st�vw�{|�~������������������������������������������������������� ������������������������� �������������~|{{ywtq�onkig�f�d�bfg�i gfggiklnooli�gikk�n
oqtw{|~�~||�~|{�y{�~ |ywvsonlkk�l�kl�kl�nlkklnno�s�t�vy�|�~|~�����������������������������������������������������������������������������������������������~|{{ywtsqqonlki�gf�dfg�i�k�lkgffggikl�n�oqsvy{|~~||~~|{ywwvvwy�{ywvtqnlk�i�k�ik�ik�l�klnoqss�t�vw{�|�|
~���������������������������������������������� ��������������������������������������������� �����������~�| {yvtssqonlkgg�ikig�fgiikk�l�ki�fgik�l�o�qtwy{~~||~|{wvttsstv�wvsqnki�g�f�gfggiggikl�klnoqqst�vtvwy|~~||�|����������������������������������������������������� ��������������������������������������������������������~
|ywvttsqnlk�i�kig�fgikl�n�lkig�fgi�k�lnoqqsvy{||{||{yvts�qs�tsonlig�f�d�fg�k�iknoqqst�vwy{|~~||�|~���
��������������������� ������������������������������������������������������������������ ��������������~{ywvttsqnl�k�i
kiigfddfikl�n
lkiikgfddff�i�k�nlnnoqvy�{�ywtsq�o�qonlkigf�dbabbdfd�bfgikkiiginoqqst�vwy{|~~|~~����� ���������������������������������������
��������������������������������������������� ��������������~{ywvttsqon�lkigg�igfddfik�l
kiggigfddfg�iklnn�lnotw�yw�vtsq�o�n�onlkkigff�dba_abddb�abdgii�giloqss�tvwy{|�~������������������������������� �������������������������������������
������������������������
����������� ����~|{ywvtsqo�nkiggf�gfdffgi�ki�g�f�dfggikk�l�k�lnqv�w tssqonnoon�lki�g fgfddba__aba�_ab�fdffglnoss�tvwy{~������� ��������������������������������������������������������������������
���������������������������������������~|{ywvtsqoonkigg�f�g�f gikkigffgg�f�gi�k�lnost�vtqon�l�nl�kigff�gfdba�_�^�_a�bdfgklnqs�tvwy|����������������������������������������������������������������������������� ����������������������������������~{ywwvsqoonlkii�gf�dgikkig�f�g�ikllnnoqsttsonnllklkk�igffd�f gffdba__^^\^�\^_�abfgiklnoq�tvw{~���������������������������������������������������������������������������������������������������������|{yywtsqoonnll�k igfdbdgikkigg�fgffg�i�g�ikl�no�qonnllkk�igff�d�fdba__^^\\�Z\^__abdfg�i knstvvw|��������������� ����������������������������������������������������������������������� ���������������� ��~|{{wvtsqo�n�lkigf�dfg�ig�figgi�ki�gikln�l�nlk�i�gigf�d�fdba__^\Z�YZ\^^_abd�f
ilqsvwy~������������������������������������������������������������������������������ ������������������������������������� ����~|ywvvsq�onlkkig�fg�igffgi�k�lki�gikll�kl�nlk�i�g�ig�d�fdba_^^\ZYWWYYZZ\\^_ab�d
filosvy|����������������������������������������������������������������������������������������������������������� �����~{ywwts�q�nlkii�g�i�g�fgikk�lkif�gikll�k�iklnnlliig�f giigdfddbdfba^�\ZY�W�Y�Z�\^_aabbdfknqtvy|�������������������������������������������������������������������������������������������������������������������������~|{ywvttsqoonlkk�ig�fgikk�lkgfg�ik�lkigg�ik�lkig�f�g�fdbabda^Z�Y�W�YZ\�^_aabdgilosvwy|��������������������������������������������������������������������������������������������������������� �������~|{ywwt�qonll�k�ig�fgik�l kgffgiikllnlkg�fgik�l�kgffd�f gffda_ab^ZWVT�V�W�Y\^�_abdfilnstvwy|���������������������������������������������������������������������������
�����������������������������
�������~|yv�sqonn�lkii�gik�l�kigffgikl�nlkgf�dfgi�kigf�d�f�dba�_\YVRQRTV�WY\_�abdfiloqtvvwy|��������������������������������������������������������������������������������������������������������������{v�ts�qonnllk�i�giklkki�g�ilnonnlkgfdbbdfgi�kigfdbbfdb�a&_^^ZWTQOQRTVWWVY\^_aabbfilnqsvwwyy|~��������������������������������������������������������������������������������������
����������������������������������|wvvwv�tsqonll�k�i�kig�f gikklnonllkifd�bdfgikkigffdbbdba�_ ^\ZYVRQOOQRT�VWZ\^_abdgknostvw�y{|~��������
����������������������������� ��������������� ����������������������� �����������������������������������{�yw�vtsqonn�l�kigf�dfikkl�n�lkifb�abdfgiigfddbaaba_�^\YWVTRQOMOQQTTVWZZ\^_bfiloqsttv�wy{|����� �������������������������������������������������������������������������������������������������������������������������|
{ywvttsqoon�l�nl�kigf�dfgik�lkigda�_abbdfgf�db�a_^\ZYVT�RQOMMOOQRTVYZ\^_bgkloq�s tvwwy{|~���� ������������������������������������������������������ �������������������������������������������������������������������~||{wttsqoonlnn�onlkigf�dfgkkl�kigfba_^^�_adf�d�a�_
^\ZYWTQOOMM�L�MOQRTWY\^_bgiloqststvwy{||~��~ ~�������������������������������������������������������������������������������� ������������������������������������������������~|yvtsqonlln�onligf�dfgi�kigfdba_�^_b�d ba_^\ZYWTQMLJ�I�J�LMOQRVWZ\_bfgknqsttvwy{|~~���~ ~�����������������������������������������������������������������������������
�������������������������������������������|{wvsqonllnn�onlkif�dfg�i�kigf�ba_^^�\^aa�b
a^ZYYVTOLJG�E!GIJJLLMORVYZ^abfiloqstvwy{|~~�~~|~ ~���������������������������������������������������� �������������������������� ��������������������������������������
����~|{wtqo�no�q onlkgfdbdf�gikkigd�a _^\\ZZ\^__�a
_\YWVROLIGD�BDEI�JLMORWYZ^adgknoqstwy{{|�~�|~����������������������������������� ����������������������������������������� �����������������������������������������~|yvsqoonnoq�sqnnkgfdbbdfggikigfda__^\Z�Y�\�^_�^*\YWVTOLIEDBA??BDGIJIJJLLORVW\_bfilnostwwyy{�~�|�������������������������������������������� �������������������������������������������������������������������������������������~{wvtsqooqs�tsonkgdbaabdfgiiggfda^\ZZWVWYZZ�\ZYYZZYWVTQLIGDBA?==ADEGII�J LORVZ_bfiklost�vwy|�~������������������� ��������������������������������������������������������������������������������� ����������������������|ywvtsqqst�vtqnifba�_abf�gfda\YWWTTVYYWYYWVTT�VTQMJGDBA?�=?ADEGGIGIIJMQTY^bfiknoqs�tvw{|�~��������������������������������������������������������������������������������������� �����������������������
��������������� �����|{ywtsstv�wvsnifb_�^_ad�f db_ZWVTRRTWW�VTR�Q RTTQMJIEBAA?�=?B�E GIJLORW\adgkn�oqsstvw{|�~������������������������������������������������������������������������������������������������������� �������������� ������|{yw�v
wyywvsnifb_�^_a�ba_\WVT�R�V�TRQ�OQRQMJIGDA??=<<=<=A�D EGILORWZ^afil�noqstvw{�|�~����������������������������������������������������������������������������������� �������������������������������������
�������~|{{�ywvsokfba_�^�_^\YVT�R�TRQ�OMLIGEBA??<::<<=?B�D EGILORWZ\_dgik�l noqstvwyy{�{ |~��~~�����~�����������������������
�����������������
����������������������������������������������������
����������������������������~�|
{ywvvsolfba�_�^�\�ZYVTT�QRQRQ�R�Q OMLLJIIGEB?==<�:"<=?ABBDDEGJMQTWZ\_bffgikklnoqstvvtv�vwy{�|�~�|~������������������������������������������� �������������������������������������������������
������������������������������� �~|yvttsolgda�_^\ZY�WVTRRQOOQ�O�QOLJII�GEB?==<�:<=?AABDEGILORVYZ\_b�d fgikklnqss�q�stvwyy�{ ~��������������������������������������������� ������������������������������������������������������������������������������~|yvssqolifb�_^\YWVVTR�QOML�M�OM�OMJIGE�DB??=<:88<==??BDGJJMQTWYZ\^a�bdfggilno�noqst�v�y�w
y{{|��������������������������������������� ������������������������������������������������������������ ��������������������~{yvsqonkifb_�^\ZWVTTRO�ML�JLMM�LJIGEDB�A�?=<:88:<<=?BEILMORTWZ\^^_�a�b�dfi�k�lnoqs�t�v�tvy{{|~��������������������������������������������������������������������������������������+��������������������|ywtqonligfb_^\\ZWTRRQOL�J�I�G IJLJJIIGEDDBA?�=�<:88::=?DEILOQRVY\^�_a__�abdff�giklo�q�sty{{|~~��������������������������������������������������������������������������������������������������������!���������|yvsonligfda_^\ZWTRQQOMJI�GEDDEG�IGEDB�A?=<�:�<:�8 :=ADEILOQRVY\^�_�a�_a�bdffgikn�o�noqstwy{|�~�����������������������������������������������������������������������������������������������"����������|wtqolkgfdba_^\WTRQOOMLIG�ED�BD�EBA?�=<:�8�:�878:<ADDGLOQRVYZ\�^\^^a_^^_�abddffgk�n�l
noqsvwyy{{|�~���������������������������������������������������������������������������� ��������������������������������|wtqolifdbaa_^ZVRQOMMLJIGEE�DB�A�BA?=<::8�7�8�78:<?BDGJMQRVWYY�Z\^__�^�_ab�dfgkll�k�l�noqstvvwy|~~������������� ��������������������������������������������������������� ��������������;������������������������������������~yvqolifdbaa^\YTQOMLLJII�GD�BA?�=�?=<:7755�78�7�58:<?BEGILORTVWVWYYZ\\�^_ab�d�dgii�giknnoqoqstvy|~~���������������������������������������������������������������������������������������������!�����������~{vqnkifdba_\ZWTQMLJJII�GEBA?==<<�:�<:85445�75�4 58:=?BEGIJMQR�TVWYZ\\�^�_abdd�bd�fgilnoonnosvy{|~���������������������������������������������������������������� ����������������������������������������������~ytqligddb_^ZYVROLJ�IG�EDBA=<<:875578754�24554200�2 47:=?ADEGJLO�Q�RTVYZ\�^_abb�a�b�dfgklnllnoqtvy{~�������������������������������� ���������������������������������������������������������������� ��������������|wsolgdbba^ZYWTQMJI�GED�B A?<:875422442�0�20//00247:=??ADGJLM�O�QRTWYZ\^�_�^_aa�_abddfgi�k
lnqqstwy|�������������������������� ����������������������������������������� ��������������������������������������~{wsnkfbaa_\YVTROLIG�EDB?�A ?=:8520/--�/-/00�/�0�/�0 2478<=?ADGJL�M�OQTVWYZ^_�a�_�^
^\\^_abbdfg�i lnqqstvw{��������� �������������������������������������������������������������������������������������������� ��������~{wsnkfba_^ZWTQOLJGEDDBA?�=<:852/-,�*�,-�/�0 24578<=?ADGJL�MOQTVVWY\_abba_^\�Z\ZZ\^_aabdffgilnoqstvw{����������������������������������������������������������
�����������������������������������������~{vsnkfa_\ZYVROLIGD�B?=<�:8750/,,*�(*,,-//0�2 4578:=?AADEIJ�MLMORTTVWZ^_bb_^\ZWWYZYWYZ\^_aabbfgklnoqsvwy����������������������������������������������� ����������������������������������(�����������������������{vsolfa^ZYWVROJGDB�A=:88�7540-,**(�'�(/*,/0244554458:<=?ABBDEGJMOOMLMOQRTVWZ\^aa^ZYWVVWYWVWYYZ^�_ adfgilnosvwy~���������� ������������������ ������������������������������������������������������������������7�����������������������|wtqnga^ZWVVROIEAA??=:8754220/-**�('�%�'(*/025578�7:<=?BBDDEEGJLOO�M�OQTVWZ\\^_\YWVTVVVTT�WZ\^^_bddfilostwy|~������ ���������������������������������������������������������������������������������������� ����������������������������~yvsoib^ZWVTQMID�? =<87540/--,*((�'%�$
%''(*-/2578�:<=?B�E�GIJLMM�OQTWYZ�\ZWV�TR�RT�VWZ\^_aabdgkostw{||~��������������������������������������������������������� ��������������������������������������������������%����������{wtqld_ZWTQMLGB?==<:7742/-,*�('%�$�"�$�%(*,/258:�<=?BE�G�IGIJLLMO�QTWY�ZYVVTRQO�Q�RTRTVYZ\�^ _bfinqtw{{||~���~ ��������������
���������������������������������������������������������� ���������������������� ������������������'������|yvsnga\WTOLIEB?=<:87542/,*(''(('$�"�$ %(*,/258:<�=?ADG�I�J�IJLLMOQ�RTWY�ZYWVVTQMM�O�QRTWZ�\ ^adgkotwy{�|�~�|~�������������������������������!������������������������������������ ������������������������ ����������������"��������~{vsoib\WRMJGDA?<:754220/*(�'�(%$�"�$%(**/257:<=??ABEI�JIJLLMORTTRTVWYY�ZWVVTROLJ�LMOQRVYZ�\ ^_adinsvwy�{�|~��������������������������� ����������������%�����������������������������������������������������������������������(������{vsokd^WRMJEBA?<854200/-*(''(('%%$$�"�$�%'(*-2458<=?ABDEI�L�J�LMOR�TVW�Y�ZYVTTRQMJI�I�JLMQRVYZ�\�^
_bglqtwyy{{�y{|~~������������������������������������� ������������������������������ ���������������������������������������� ��������{wsokd_YTMJEBA?:74200/-,(�'�(�%$""$$�%'(-0457:=?ABDGILLM�J�L MOQRTVWYZZ�YVTRQOMLJIIGGIJLOQTYYZZ\^__bgkosvw�y�{�~������������������������������������� ������������������������������������� �������������������������2��������������������~{wsnid_ZVOJGDB?:74200/-*(''(('�%�'%�$%(,/2458<=?ADGIJLML�JLMOOQRVWWYZZYWVRQOMLL�JIGEGIJMQTWYYZ\_abdgknsvw�y�{|~���������������������������������������������*�����������������¾�������������������������������3��������������������������|{vqlid_\WOJGDA?:75420-,**�(%$%%'('�%$""$%'*-0247:<=?BEIILML�JLMOORT�WYZZYVROML�J�IIGEGIJMORTWWZ^abdfgklqtwy�{|~����������~~����������������������������������������������������������������������������������)�������������������|ytolid_\WQLGDA?<87540-�,�*(%$%'(*(�'$""$%'(,-/258:<=ADGIJ�L�JLMOQTW�YWTQMLJ�I�G�GIJMORTWY\_bfgiiklotwy�{�|�~��� �~|{{|����������������������������������������������������������������������������������)������������������|wsokgb_\YTOJEB?<:7542/-�,('%'(*,*�'$""$$%'(*-/257:=ABEGIJJ�LMOQRTY�ZYWVTQMLJI�G�E�E�GILORVWZ\^afgikklnqtvw�y�{�|~��~�|{�y
{|~~||~��������������������������������������������������
¾�������������������������+��������������|wsokgb_\YVRMIDA=<87540/-,,-,*�(*,,*�'%�$�%(,-/25:=ABEGIIJL�MOQTTVYZ\ZYVRQMLJJGEEGGEE�EGIJMQVY\^_adgiklnoqst�v�w�y{|�~{yy{{y�w�y{|�����������������������������������������������������
��������������������������������&��������������{wsokgb_\YVTOLGB??:87520/�-,**�,*(''�%�$''*,-048<?ADEGIJLOOQRRVVWYZZYWTQOMLJJGEEG�E�EIJLORWZ^_bdfikkloqtt�v�t�vwy�| wvvwwvvwvv�t�vwy|��������������������������������������������������� ¾�������������������������'�����������~{wtokgb_\YVTQMIDBA=<:85420/-�,�-,*(('%%�'%$$%(*,/47:=ADEGIJMOQRTTVW�YWVRO�MLJI�G�EEGJLOQTW\_adfgiklnos�vt�s�tvw�yv�tvwvtsqqsstw{�������������������������������������������������������������������7�������������������������{wtqlgb_\YWTQMIEDBA?<:754200/-,�-*(('%%�'�%$%'(*,/458<?DEGIJMQRTTV�W�VTQOMLLJII�G�EGGIJLQRVY^abdfgiknoqt�vtsqq�s�t�vwt�stvsq�oqstvy|���������~|~�������������������������������������������������������������� ����������������|yvsnida^ZWTQMIED�B?<875�42/�-,*(�'�%'(*,-0458<?DGIJLMQ�TVWWV�TRQOMLJ�I�GI�JLMQTWZ^abbdfiloqs�ts�q�s tvvttvvtssts�q�s qonnoqstvw{~�������~|{|~��������������������������������������
�¾������������������&�����������������������~{wsnkdb_ZWROLIE�DB?<:8�740/�-�,*�(�'�*-/2458<AEIJJLMORTT�VT�RQOMLJI�J�IJ�LMOQVY\^_aadfins�t�s�qstt�v�ts�q�o�qo�noqtvvwy{|~~���~{�|�{|~��������������������������������������¾���������������� �����������������������|wsnkfb_ZVQMLIGEE�DBA=<::8520/--,,�*�,*�( *,/24578=BGJ�LMORT�VTR�Q�R�QOM�L�J�L�MOQRVY\^^_adgkotvvtsq�oqst�vt�sqonn�o�qo�noqtv�wy{|~~|{yy�{|~������������������������������������¾���������������������������������������|wsnkgb_YTQMLIIGG�E�DA?==<840/�-�,�-,�*,/4457:?BGLMMLMQT�WTRQOO�Q�O�M�OQ�RTVYZ\\^_bglqvwvtsoonnoss�t�vtssqonllnoonooqoonnoqsvww�v�y�vw�y{|~�����������������������������������¾���������������������������������������|wsnkgb^YTQMLJI�G�E DBA?=:520//00/�-�/-�,
-04578<?BGL�MORW�YVRQOO�Q�RT�VWYZ\^_bgnsvwvtsqqono�qstvvtsqon�l�n�ln�q�oqstvv�t�v�t�stvwwy{~����������������������������������������������������������������� ����������������|wsnkgb^YTQMLJIGG�E�GEDDB?:742�0/�20/�-/25778<?BGLMMOQT�YWTRQOOQRR�V�T�VV�W!VWWYZ^_dinsvwwvvttqooqqoqstvvtqnnl�k�l�k loqqoqqsttvtts�q�o�q�stvwy|~�����������������������������������¾�������������������������������������������~ytolgb^YVROLJIGG�E�G�EDA<8754�2455420/025788:<?DGJLMORV�W�Y WVTRQOQTVW�YWVVWW�W�Y�W YZ^afknqtv�wvts�qstvvtso�lkii�kln�o�qs�t�sqo�n�lno�qstwy{|�������������������������� �������������������������������������������������������{volgd_ZVROMLLJI�G�E DB=::7545542�457754224588::<=?DGJLMOR�TVWW�VTRQRVWWY�Z�Y�W�YZ�Y
Z\adgklostv�wvtt�s�tsqn�k�iklnn�o�qsqqnn�lkl�noqsvwy|������������������������� �������������������������������������������������������|wqlifa\WTQ�OML�JIGE�D BA=<:87887�457887�578:�<=?ADGJLMO�QRT�V�TV�WY�Z�Y�Z�\ ^_adgiklostt�v�t�v�tsqnk�i�g�i�kl�n�on�l�n�lnoqtvy|�����������������������������������������������������������������������������~ysnkgb^YVR�QOM�LIGE�DB?==::<:8�578�:�8 :<==?AABDGIJLM�OQR�VW�Y�Z�YZ\\�\^_abdfgikklostt�vtvvw�y�vtsqnlkk�i�g�i�k�l�k%lnnlnnllnoqtvy|������������������������������
����������������������������������������������������~ytqlgb_ZWTRQQO�MLJG�EDBA??�=
<:8778:<<==�<�=?AB�DEGIJLMM�ORV�WY�Z�YZ^_�_adgi�k�lnostvww�vwy�{ ywtsqonllk�i�g�i�kigg�ilnnll�noqtvy|������������������������������������������������������������������#���������������~yvsngb_\YVRQQOMOOMLI�GEDBB�A�?=�:<==AA�?ABBDD�EGILM�ORVWW�YZ\\�YZ^a�abfik�lnooqstvw�ywy{�| {ywtsqonllkk�i�g�igff�gk�l"kllnnqstw{~���������������������������������� ���������������� ���������������������������������|yvsnid_\ZVRQQ�OMLJIGE�D�BA?�=?A�BD�E�GIJMOQQ�OQRVWWY�Z�\ZYYZ�YZ\^a�bdgiklnoq�stwy{||{{|~~|{ywvsqon�l�ki�g�fgi�k�lnostvy~������������������������������������������������������������������������"���������~{wtsnkfa^ZVRQOOQQOOMLJIGG�E�D�B�AB�D�E�G�E�G�IJMOQQ�OQRVWWY�Z�\�Z\ZYYZ\^abdd�fiklnos�tvyy|~�~|�~|{ywvtsqq�on�lki�g�fg�f�d�fgiiklnoqstw{~���������������������������������� ���������������������������������������� ���������|yvsqnkgb^YVTQOOQQOOMLJI�G�E�DE�G�E�G�I�JLMO�QRVWWYZ\\�^\ZZ\^_adfg�iklnost�vwy{~����� ~|{{ywvvtt�sq�onki�gf�d�fd�b�dfgiknoqstvy|�����������������������������������������������������������������������������~{wtqnlifb^YWVR�Q�OMLJIGGEE�G�EGEGIIJ�I�GI�JLMLMMOOQ�RQRVYZ\�^�_�^�\^_abfgikklnoqsttvvwvvwy|�����~�|{y�wv�t sqqoligfgd�b�dba�b dfiknoqsvw{��� �����������������������������������������������������������������������~|yvsoligda^ZYWTR�Q
OMLJJIGEDDE�G�I�GIGGIJ�LJ�IJLMM�OQ�RTWZ^_a__a�ba�_abdfgikklnqt�v�tv�wy|��������~|�{yww�v
tsqoligffdb�ab�a�b dfiklnoswy|��� ����������������������������������������������������������� �����������~|yvsnkgdba_\ZYVRQOMMJ�IGE�DE�G�I�JL�M�L�J�LM�O�QOQQ�R TW\abdbbdd�fbaabbddfgiklklotwywvttvw�y {|~��������~�|~�| {wwvtqoligfdba�_a_aa�b�dgiklosw{~�����������������������������������
�����������������������������������������~|{wsnkfbaa_\ZYVROMLLI�GE�D�E�GIJJIIJ�LMOO�M�LM�OQ�R�Q�RTVY^b�fgiigdbbd�fg ikllnqvyyw�vwy{�|~����������~����~{wvtsqnkgfdba�_�a�bdgklosw{~��������������������������������������������������� ��������������������������~|yvslifba__\ZWTQOMLLI�GE�B�D�GI�JLMOO�QOMM�L�M�OQ�T�QRTVWZ_d�g ikkifddffgfggiklnqtwyywvvwy{|~��~������������������|ywtsqnlifda_�^_aa�_!abbfinqtvy|��������������������������������������������������������������������������������~|{wtqlifba_^\YVRQOMMLI�G EBAABBDDEG�IJLMORTTRRQMLJJL�MOQR�T�RTVWZ^adgiiggiklkig�f�g�iklnqtv�w�vwy|~������������������~{wvtsonkgda_�^�_�^_abfinqtvw{~������������������������������������������������������������������������%����~|{wvsolifdb_\ZWVRQMLLJIGIIGEBAABB�DEIGIJMORTWWTTQMLJJL�MOQR�TR�TWY\_bfgikiiklnlki�g�i�lnoqtvww�vwy|~������~~������������|{wwvtqnlida_^^�\^_dilotvw{|�����������������������������������������������������������������������������~{yvtsolifdb_\YWVTQMLJJ�IGDBAAB�DEGGIJMQTVWWVTQOMLLM�OQR�T�VWZ\_bfgi�klnnlk�iklnoqstv�w�vwy|~������~~������� �������~{y�w tqnlifb_^^�\�Z ^bgknsvy{|��������������������������������������������������������������������&����������~ywtssolifba^\YWVRQMMLLJIIGEB�A�DEDEEGJJLORVWVTR�O�LOQOOQT�V
WVVW\\adfgi�kloonlkk�l�noqstw�y�w�vwy|~�����~||~�������������~yy�w tqnlifb_^^\\ZZ�Y\adinqty{{~���������������������������������������������������������������������~yvtssqnkfb_^\ZYVRQ�OMLIGEDB�ABD�EG�JMQTVTRQ�O�MO�QRV�WY\^adfggi�kl�o�n�oqstwy�{y�wy|�~�|�~������������|yw�vtqnkgfb_^^\\ZZYY�WY\_bgnqtwy{|���������������������������������������������������������������������������~yvtsqqnkgd__^\YWTRQQOMLIGD�BABD�E GIJJILORTRRQ�OQRRTW�Y�W�YZ\_adfgfgiiklnnooqq�sqqsvwy�|�ywy�{�|�{�|~����������~|{w�vtsolkgfb_^\^^\ZWV�TVWZ^afnqtwyy{~��������������������������������������������������������������������~{wtsqqolifba_^ZYWVTROMLJGD�B�DEG�ILOQ�RQ�OQRTVWY�Z�YZ\\^_ad�f
giklnnoqstt�vtsstwwy|�~|{�y�{�y{�|~��������~{ywv�tsqnkifda_^\^^\YVT�R"TVY\aflqtvwy{|��������������������������������������������������������������������~|{wtsqqonkgfdb_\ZZYVTQOLJGD�A�B�DEGEGILMOQ�R�Q�O�MQRTWWY�Z\�^_abd�fgil�noq�t�vts stywy|~~��~|{�y{�|~����������|ywt�s1qooligdb_^^\^\ZWTRQQRTVY\afkoqtvyy{~������������������������������������������
����������������������~||{yvtssqolkigfb_^\ZWTRQMJGDA�?A�B�DEIJLOQ�R�QOMLMQRTWY�Z�\^_aa__aabdffgilnooqs�ttv�y{|~��~||�{�y{�|����������~|yvsqoonllkgdba^�\0ZYVTRQQRVWY\afilnqtwy{~���������������������������������������������������������������������!~|{{||{wvttssonlkgfba^\YTRQMJGDA??�AB�DGIJMO�QMLJLQRTWYZ\\^_bbdd�abddfilnoostvttssttvvw�y�{~���~{�|�{�|���������~|{wsqollk�i fa_^\ZYYZYWTT�R(VWY\afgiknsvy{|��������������������������������������������������������������� ~{yy{||{yw�vtsqoligfb_\YVRQMJGEBAABBA�?AB�DEGJLM�O MLLMQRVYZ\^_ad�fdb�a�bdgklnosvwvtsstvw�y�{|�~�|�~|�{�|~���� ���~|ytqonki�g fb_^\ZYWWYYW�TVWY\adfgilqtwy{|���������� ������������������������������������������������� ��������~|{yy�{�y�wtsqolkigb_\ZWROLJGGDBBDDBAA??AA�BDGJLL�M�O
QTVWYZ^_abf�gfba�_adilloswyvtsstwy�{y{{yy{|�~|{�|{yy|~~�������~|yvsoliggffdb_^\ZYY�WVTTV�TVWY\_bdfgkostvwy{~���������������������������������������������������������~|{�y�w�ywtsqnlkifb_\ZWRMLJIIG�EDBB�ABDGIJJL�MOQRTVWYZZ\_bddg�igfba__�^_bgkloswywvttvy{�{�y{|�~|�{ywy|~~��
����~{wtqni�fdba^\ZZYY�WVTTV�TVWZ\_bdfgiloqstvw{~������� ����������������� �������������������������������������||{yw�v�ywvsqlligda_\ZWQML�J�I�EDB�A�BDEGIJLLMORVWYYZ\\_adfg�kiggdba_^\\^afikosw{ywvvwy{�{�y�{�|�~|{{�ywy{~~��~
����~{vsnkf�d ba_\ZYYWYW�V�TVTTVWYZ\_bdfggklnoqstw{~������ �����������������������������������������������������~|{yv�tv�wvsolkgfba_\YVQM�L�MLIGEDB�A�BDEIJJLMQTWYZ\\^_bdfik�lkigfdba^\\^adgknsw{{�y{|�|{�y�{�|{�y{|�~ ����{vqlgd�ba_^ZY�WVTTV�T�VWYZ\^abd�fgilnoqsvy|������� ���������������������������������������"��������~|{wvttstvvwvtqnkigfda_\YTQ�M�QOMJIEDB�A�B�DEGIJLMQTWZ\_abdfgi�ligfdba�^ _adgklqv{|�{|~�~{�y�{�y�|{�y�{�|�~����{tokfba�_�^\ZY�WV�TVT�VYZ\^_a�b�d fiklnosv{~������������������������������������������������������|{ywvvtst�vtqonkiggfba^YTQ�OQ�RQOLIGED�BD�EGIJLMQTW\_bfgiikl�nkgfdba�_abdgkloty�|~��~|�{�y�{�y{�|~�� ~ytokfb_^^�\ZYWV�T�V WYZ\^_aa__�a bfikklotw{~�����������������������������������������������������������|{ywvvts�tsonnkiggfba_YTQOQQRT�VTQMJIGE�DE�GEGIJLORVY^bfilnn�oligfdb�a bdfgklotw{|~���~�|{||{�y{�|�~�|~��~|wsokfb_^^\ZZ\\ZYWTRR�TVWYZ\^�_�^"_bggiknsvy{~��������������������������� �������������������������������������|{ywvv�tsqonnlkgfdba_ZVRQQRTV�WVROLJIG�EG�I�GIJMQTY\_diloqssqq�sqolkifdbbdffgiknqtwy|�������~�|{ywwy{|�~�|~��~|yvsokfba_^\ZZ\\ZYVRQR�TVYZZ\^__^�\ ^adfgilosvw{~���������������������� �����������������������:������������~~|{yywvvttsqonnlkgfdda_ZWTRQRTVWYWVRQOMJIGEEGG�J�IJMORVZ^_fknqsttssttvvssonkigffg�iklosvy{~�������~�|{�y{�|�~�|~��~|ywtqnigba_^\ZZ\\ZWTRQQRR�T VWZ\\__a_^�\�Z!\^adffilostw{~~����������������������� �������������������������������>�~||{ywvtsqqonkigffda^ZYVRQQRTVWVTRRQOLJIGGIIJLLJJMQRTWZ^afknqt�v�w�vtqnl�k�l noqty|~����������~||{{�y�{�|�~�|{wvtqligda__^\\^\ZWTRRQQR�VWY\^_�a_^�\�Z^abdfilosvy{|~���������������������� ��������������������������
�������������~{ywvtqqonkigffb_^ZYVR�Q�R VTTRRQOLLJII�J�MLORTVY\_bfknsvwwyy{�ywvsqo�n�oqstvy|����������~||�y{�|�{�|�~�~|{�y
wvsolifda__�^\ZYVT�R�VWZ\^__aa�_�^\�Z2\^_bdfikoswwy{|~��������������������������������������������������������������|{ywvsqonkigfda^\ZYV�R�QRTTRQOOMM�LM�OQTVYZ^adgknsvy{{|~|{{|{yvtss�qsvwy{~������
�����~|ywy|�~|�{�|~��~{y�wvsolifdba�_^\ZYV�T�VWY\^�_�^�_^�\�Z^abdfglqtvwyy{~���������������������������������������������������������������~|ywvsqolkigfda\ZYWV�R�QRTQQOQOO�M�LMOQQRVY\^_bfilosv{||~��~~��~{ywv�tsvwy{|����������
�����~~{y{|�~�{|{||~��~{�y
wvqolifdba_�a�^\YW�V�WYZ\�^�_^\^^�\�Y\^abdgkoqstwwy|������������������� ���������������������������������������|ywvtsolkigfda\YWWVTRR�Q�R�Q�R�QO�MOQRTWZ^_adgloqsw|~~������~|{yywvwy{|~���������������~�|�~�|~�|�~|�{yvqonkgdb�a�ba�_^\ZYWWYYZ�\�^\�Z#YWWYZ\_bdgknnosvwy{~��������������������������������������� �������������������~|yywvtolkkifd_\YVWVVTRQOO�Q�R�TR�OQRTVWZ^adfinqtty|~�����������~|{yy{|~��������������~~|{|~~���~|�~�| yvsonkgddbaabb�a_^\ZZY�Z�\�Z�\ZYYWW�Y�W!YZZ^adgillnqtvy{|������������������� ����������������������������������������������~|{{ywtqnllkgd_\Y�WVRQOO�QR�T�VTR�QRTWWYZ^afgknsvw{~��������� ���~||~������������������|{|~������~�|�~ |ywtqnkgffdb�a�ba_^^\\�ZYWVVW�Y�Z"^adgikklosvy{|������������������������������������������������������������������~|{ywtqonnlgda^�Z�YWTQOO�QTVV�WVT�RTVYYZ\_bgiknsvw|���������������������������� ���������~{|~������~�|
{wsqnkiggfd�aba__^^�\ZYYZZ�Y�Z�YW�VWY�Z^adgikklosvw{|���������������������������������������� �����������������������~|{wtssqnlifb_�^\ZYVR�QRVWW�YWVTT�VWZZ\^adgiknqtw|�������������������������|~������~�|�{
wsqolkiggfb�a_�^�\Z�Y�Z�YWVVWZ\\ZZ\_bfgikklosvw{|�~����������������������������������������������������������������~|yvttqnlkgfbaa_^\ZWT�Q�RTWYWYYWW�V�WYZ\\^_bfgiknqtw~���������������������������������~~�����~~�|{�ywtqonliggfbbaa__�^\Z\\ZYY�W�Y�\ZY�W�VWZ\^\\^abfgikklosvwy�| �������������������������������������������������������������~{wvvsonlkigfdba_\YVRQRTVW�Y�WYZ\�^_adfgiknsvy~��������������������������������������������~�|{�ywvsqonkigfddba__�^\�Z
YWVVWYZ\\ZY�WYZ\^__abdgikklnosvwy�{|~�������������������������������� ������������+���������������|ywwtsqonlkigfdb^ZYVTVVYWYYZZ�Y�Z\^_aabbdffgiknsv{~�����������
���������������������������������~�|�y wvsqqolkigffda�_�^\ZZ�YW�VYZ\\YY�W�Z\^aabdfikllnoqtvw�y{|���������������������������������
��������������������������~|{ywvtsqonlkigda^\Z�YZYYZ\\ZZ\\^^_abdf�g�i knqv{~���������� ���������������������������������~|{�y�{ yvtssqolkigfdb�a _^\ZZYWVTT�VW�Z�Y Z\^_bdfgil�noqsvw�ywvw{~�����������������������������������������������������������~|{ywvtqolkkgfba_^\\Z\ZZ�\�_�abdfgikkiggiklnqty|~���������� �������������������� ������������������~{�y{|{yvtstsqnlkgfdd�ba_^ZYWVTRRTTVVYYZ�Y Z\_adgikln�o�qtwy�{�y�w�v y{|��������������������������������������������������������~|{ywvsolkkgfddba_�^_�bdffgikllkiiklnoqtw{|�~��������� ����������������������������������~{�y{||{ywvttsqnlkgfdd�ba_^ZYWVT�RTVVWYZZ�Y�Z ^adfiklnoo�qtwy{||{y�w
y{~��������������������� ��������������������������������~|{ywtsolkli�fb�a�_ab�dgiikl�n�lnoqsvw{{�|~���������������������������������������~~�{�|�y
wttsqolkgfd�ba^\YYWVT�RTVVWYYZ�Y�Z\_bfgiklo�qtwy{||{yw�y wy{~��������������������� ��������������� ����������������� �����~|{yvsqn�lkgffbaa�b�a bdffgikklnoonn�oqsvwy{{�|~������� ������������������������������������~~�|{y{{yvtsqolkigdb�a_\ZYYWVTTRRTVWW�Y�Z�\
^adgiikloqq�o qsvy{||{yy�{ |~���������������������� ����������������������������� �����|{ywtqon�l kgffbabdff�b dfgikkllnn�o�q�sqstwy�{|{|~������������������������������������~������~��~||{{y{{yvtsonlkkgdba�_\ZYWVV�T�V�W�Y-\Z\^adfgigiknoonooqqtw{||{yy{|~|~������������������������� �������������������������������� ����|ywvtqon�l
kigfdbdfggf�dfik�l�noqss�tvy�{|~�������������������������������~�|~�������~|�{ ywvsonllkgfda�^\YW�V�W�YZ\\^ad�f�gikl�n�o�qsvy�{|~���������������������������������������������������������������|ywvvsqonl�kigfdfgiig�fgiklnnllnnoqstvvwvwy�{�y{|�������������������������������~|�{|�~��������~|{|{{yyvsonllkgfb_�\ZYY�WY�W�YZ\\_bd�f�gikl�n�o�qtwwyy{~���������������������������������������������������������3���������~{ywwvsqolkkllkiggikkiggiggikklnonlnooqsvww�y�{ ywy{|����������������������������~|�{|~�������~||{�y vsqonlkifb_\�Z�Y�Z\^abd�fgikln�o�qsvvwy|�������������������������������������������������������������������~||{ywtsqnlln�l�k�iklklno�n�q�svwy�{�y�{ ywy{|~����������������������������|{{y{y�w�y|~~������~~||ywwyvtsqonkifb_\�Z\�^\�Z�\^_bdd�fgikln�o�n�o$qttw{~���������������������������������������������������������������������~|yvtsq�o�n�on�l�n�lnlln�o qsttvw{||{�y {|~������������������������������~{�yw�vwy|~~��~�|{y�w�vtsolifda^�\^�_^\�Z\�^_abd�fgiklnoo�n�oqstw|����������������������������������������������������� ���������������~�~{yvtss�q�sq�oqon�o�n
oqqooqsttvw�{�y�w�y�{ ~���������������������������~{�w�vwy|~��~��~�{y�wvtqlifda_�\�^_aa�_^\�Z\_^^_abbdffggiiklnoo�n�qstvy|�~������������������������������������������������������������������~~��~|ywvv�t�v�t�s�q�oqss�qsttvw�y�w�v�wy{~����������������������������~{w�vwy{|~��~��~|{yy{{y�w�ywtqnkgfba^\\^^_aa_�^ \ZZ\^_^^_b�dfgi�k�lnoonnos�tvw{�|�~�������������������������������������������������� ������������������~{�ywvv�w�v�t�s�qstt�stvwv�w�v�wvttvvw{~���������������������� ��������~{yvv�tvwy{|~~��~|{yywyy�w�ywvsokgfdb_^\^^_aa_^�\Z\^�_ bdffgilnnl�noq�ostvwyy{{�|~�������������������������������������������������� �������������������~ |{yy{||{ywwvt�stvv�tvww�vwvvwwvttvvw{~������������������� ��������~|{wv�t�vw{�|�~|{y�w�v�w vsoligfda_�^�_^�\^_�abdggikn�oqssqqstvy�{�|~����������������������������������� �����������������������������������~�|~�~||{ywv�tvww�vt�vtvttww�t�vy{~����������������� ���������|{wwv�tvw�y{||ywvv�t�v
sonkiigdb__�^_^�\^_abaa�bdiiklo�q oqqsttsstvwy�{|{{|~���������������������������������������������������������������������������~|{y�w�yw�v�t�v�tvw{|~������������������������~{yywvttvwwvvwyywvtt�s�tson�l kifba_^^_^�\^_bddbb�dfiiklo�qst�vw�y{||�{|~������������������������ ������������ ����������������������������������������������~|{{�y{|{ywvwvv�ts�t vtvy{|~�����������������������~|ywv�tvtsst�vtss�qs�q�sqsqo�nlkgdba_^_�^_bdffdd�fgiikloq�svw�y{�y{�|{|~����������������������������������������������������������������������������������~~|{{|~~|{yyw�vtssttvvwy{|~���������������������~{ywvvtt�s�ts�q�o�q�o�nlifdba�_adfggffggiikklnqsttvy�{�|�{�y{|�~�|~�������������������������������������������������������������������������������������~�� ~||ywvvtss�tv�y{~�������������������������~|{yvv�t�s�q�o�n�o�n�l�nlkgdbaa�_abd�g�i�k�lnostvvw{�|�{y{{|~���~���������������������������� ��������������������������������������������������|ywv�tv�y{~�������
��������������������������~|yvtt�vts�q�o�n�onll�k�lkgdb�a�_abffgk�lnooqsv�wy{�|�{�|~������������������������������������������������������������������������������������������~|y�w�v�wy{~���������������������������������~|yvttv�wvts�q�o�n�l�nlk�ik�lkgdb�a�_�^_abdfgknooqstvw�y�{|{|�{~���������������������������������� ����������������������
����������������������������������������|�{y�w y{~�������������������������~|{yvttv�wvt�sqonn�l�n!liggikllkifdbaaba_^^_abdfiloqstvwy�{�y�{|�������������������������������������������������������������������������������������������������������~|{yww�y
{~����������������������������~|{yw�v�wvtt�s�q�o�nlkk�lkgffi�k igdbaabdba�_ abfgknqstvwy{~�|�{�y�{�y{~��������������������������������������������������������������������������������������������������������~|{yy�{
|������������������������� �����~~||{{yy�wvt�s�qolkkllkg�fg�igfbaab�dbaabdgknqstvvwy|�~|�{ywwy{~������������������������������������������������������������������������������������������������������~|{{~�| ���������������� ��������������
����~||{|{{�yw�v�t�sqnl�kif�dfgiigdbaabddffdbbdfilostvvwy{|�~|�{ywwy|~~���������������������������������������������� ���������������������� ��������������������������������� �������~~��~���������������������������~�{�|{�ywv�t�sqonlkkif�dfggfd�bdffddfgiklostvvwy{�|{�y�{�y{|�~��������������������������������������������������������������������������������������������������������~������� ����������������������~�|{ywwvv�t�st�s�tsqonlkigd�b�d�bdffddgikknqttvwwyy{�|y�w{�|�{ |~~������������������������������������������������������������ ����������������������������� �������������������������������������~�|{yw�vtsqqs�q sttsqonlkigd�b�a�b�dgkklosttv�w y{|{wvvwy|~~|�{|�������������������������������������� �����������������������������������������������������������������������������������������������~�| {ywvvtvvtq�o�qsttsqonlkigfdba_^^__a�ba�b�dgklnqs�t�vwy{yw�vw|~||�{|������������
�������������������������������������������������������������������������������������������������������������
���������~~�|{ywvv�tsqonnoqs�t sqonlkigfba_�^_a�b�abdfgknoqs�t�v�w�vw{�|�{�|~���������������������������������������������������������������������������������������������������������������������������������������������
�������~~|~�{ywvvttsqoonooqs�vtsqonkiifdba__^__�ab�abdgikoqqs�t�v wvwvtsttvw{|~~�|�~���~������������������������������������������������ �������������������������������������������� ������������������������������������������~~�|
{yy{{ywvvtq�o�qt�w vtsolkigffdba�_�a
bdfikloqsst�v�w�v
tsqstvw{~���~���~�|~������������������������������������������������������������������������������������������������������������������������� �������������������~�|{ywy�{ywvtq�oqsstvw�y wvtolkiigifdba�_�a
bfgklnosttv�w vtsqqoqttvy~�������| {|~��������������� ������������������������������������������������������������������
�����������������������������������
������������������~|{yy{�| {yvtsqooqstvww�ywtqnl�kigfda�_abdgklnoqstvwwyywvtsq�oqttvy|����|�{|~��������������
����������������������������������
����������������������������������������� ����������������������������������������~�|�~|yvtss�qstvw�y�wtso�n�lkigfbb�a_bdgikloqqstvwwyywvtsq�oqstvy|�����~|�{
|~��������������� ��������������������������������������������������������������������������������������������������������������������~|ywvttss�qstv�w�vs�qonnligffddbbdgkllnq�st�v�w�v tqooqqstw{|~~��~||�{|~����������������������������������������������������������������������������������������������������������������������������������������������~|{wv�t�s�qs�t�v�w vttsqqonki�g�fgilnnoqss�t�v wvvtqooqqstw{�|~�~|�{|~����������������������������������������������������������
���������������������������������������������������������������������������������������������~||yw�v tsqooqsstv�wv�tsqnl�klno�qstvvtsstv�wvsqq�stwy�{|~~|�{|����������������������
�����������������������������������������������������������������������������������������������������������������~||yy�w tsqonoqqsv�w�y wvvwvtqqoo�n�oq�stvwvv�tvwyywsqs�tv�wy{{�|�{|����������������������������������������������������
������������������������������������������������������������������������������ ������~|{{�y wvtsqooqqstvww�ywvvtt�s�t�v�w�vw�ywtst�v�w�vw�{|~~�|~��������������� ����������������������������������������� ��������������������������������������������������������������������������������~�|�{ywvtss�q�stwy�{�|�{y�w�y�wy�wy{ywwvtvw�yvttvy{{|�~��������������������������������������������������� ����������������������������������������������������������������������������� ��������~~||�{ywvtt�stw{||�~|�{|�~�|{�y�{y�w
y{{yvttvw{|�~���������������������������������������� ����������������� ���������������������������������������������������������������������������������������~~|�{ywvttqqsstvw{~~�����~
�����~~{{y{�|{�y
{||{vttvwy|�~�����������������������������������������������������������������������������������������������������������������������������������~{�y�w vtsqqstvwy|����������������~|{|�~|�{�|{w�vwy{�|~������������������������� ���������������������������������������������������������������������� �������������� ��������������������������� ������������~{�ywvvttssttw{|�������������� ������~|~��~�|�{�|�{|y�wy�{�|~���������������������������������������������������������������������������������������������������������������������������������� ������������~{�yw�vy|������������������� �~�����~|{{|�~|{{�y�{ywwywwy�{|~���������������������������������������������������������$�������������������������������������������������������������������������������������������~|{yywyw�v�wy{|���������������������������~|{{|~~�~|{y{{yywyyvtt�v�w
y{|����������
����������������������������������� ������������������������������������������������������������������������������ �����������������~|{yww�v wvvwy{||~�������������������������������~�|~��~�{yw�vt�s�t vwy{~������������� ����������������������������������������������������������������������������������������������� ���������������������� �����������������~|yw�vw�y {|~���������������������������������~�|�~�|{ywv�tsqq�o�q
stvw{~��������� ����������������������������������������������������������������������������������������������������������������
��������������� ��~{wvvwy{�|~������������������������������~�|{wvtt�sqon�l�n
oqtvy|~����������������������������������������������������������������������� ��������������������������� ���������������������������� �����������������~{wvvwy{|~��������������������������������������|{||{yvvttssqonl�k�l
nostw{|~~�������������������������������������������������� ���������������� ������������������������� �������������������������� ���������������~|ywwy{|~����������������������������������~~|�{yw�vtsonlkiik�lostvy{�|�~��������������������������������������������������������������������������������������������������������������������� ������������������~|�{|~��������������������������������������~~|{yywvt�vtsonlk�i�klnqtvyy�{|~���������������������������������������������������� ����������������������������������������������������������� �������������������~�������������������������������������������~|{yw�v�tsonllkkiiklnqtvww�y{|~����������� ����������������������������������������������������������������������������������������������������������� �������������������������� ���������������������������������~|yw�t�sqo�n�l�klnos�t�v�wy{|������� ~��������������������������������������������� ����������������������������������������������������� ������������������������������������������������~�|~��~|{wt�sqo�n�l�no�qstvvwy|������������~ y{|~��������������������������������������������������������������������������������������������������������������������������� ���������������������������������~|{yy{|~~|{yvs�q�o�ln�l�n�oqsvvww{~����~||{vwy{|~��������������������������������������������������� �������������������������������������������������������������������� ��������������������������������~�|{y�wy{{ywvs�qon�l�kl�kl�n�oqtvwwy|��~�|�~�|{w�t vww{{~����������������������������������������������� ������������%�������������������������������������������� ����������������
�������������������������������|~||{{yww�vwvsqnn�olkk�i�k�ik�ln�oqtvvw{�|�{�|�{yv�s�tvw{|~~�������������������������������������������
������������� ���������������������������������������������������������������������������������������~{�y�{yw�vt�s
qnlkklnnlki�g�igffgi�kln�oqstv�wy�{�ywvt�qs�q
tvvwwy|~��������������������������������������������
������������� ��������������������������������������������� ��������������������������������
��������������~{�wv�tsqoonkiggiklkkigg�f dbbdgigiigikn�o�noq�st�wvtvssq�no�n�oqstw{|~���������������������������������������� ������������������������������������������������������ �����������������������������������������|y�vts�qonlkg�fg�i�gfdbbaabd�fgilnn�on�ln�oqs�tsqqoon�klnqtwy{�|~���������������������� ����������������������������������� ������������������ �������������������������������������������������������������������������|{w�t�v tsqoonligg�d�f�d�b a_aabdbbdfgill�nl�ik�lno�sqoollkg�fgknqstvwy{|��������������������
������������������������������������������������������������������������������ ����������������������������������������~{yvt�s tvvtsonlkgfdd�b�dba�_abaabddfi�ki�gi�kln�o�nlkigdbaa�_�a"dgklnoqsty{~�������������������������������������� ���������������������������������������������������������������������������������������������������������|ywvt�s�t vttsokifdb�a�b�a�_abddfba�_a__a�bf�g�f�gi�gik�lkiggffa_^\�Z$\^adfgiklnqvy|~������������������������������������ ������������������������������ ����������������������������������������������������������~|ywvvtss�t�s qnifbaa_^_�a�_�^_abddba_�^�_abd�f�df�gfd�b^\ZY�W$Y\_abdgiknqty{~��������������������������������������������������������������������������������������������������������������������������������������~||ywvvt�s�onlgb_^^\\�^�\^_�a_^\�Z�\^_adb�d�bd�b�a_^�_YWWV�T*VWZ\_adgiklotw{~��������������������������������� ��������������� ����������������� ���������������������������������������#�������������������������~||{ywvtsqq�onlkifa^�Z�\�Z\�^\ZYW�VW�YZ\_�a_^_�a_\�Z\ZZ\\ZT�R'TVWY\^adfiklosw{��������������������������������������
�������������
�����������������������������������������������������������$��������������������������~|{yywvtqon�ligfb_\�Y�Z�\�Z\ZZYWVTR�Q�R�TVWY\^�_^\Z\�^
\YVTVWVVYYVQ�O�QRTVWZ\_adgikloty~������������������������������������������������������������������������������������������������
���������������������������������������|{yywvtqnl�kgdba^Z�Y�Z�\�ZY�WVTRO�M�O�QRTWYZ�\Z�Y�ZYWVROQ�R�TRO�MOQRTWZ^_bfgiknsw|���������������������������������������������������������� �������������� �����������������������������������������+���������������������~|{yywvsonkkiigdb_\ZYWY�Z\ZZ�Y�ZYVTTRQQOM�LM�OQTVWYWYY�WVTRQMLL�M�O�M�LMOQRVY\^adgiknsvy~�������������������������������������������������������������������������������������������������������������)��������������������~|{{ywtqolkiigfb_\ZYWY�ZY�W�YWTRQO�ML�JL�MOQR�T VWWVVTRQMLJJ�I�JLMJLJLL�JLMOQTWZ\adgiklqsv{������������������������������������������������������������������������������������������������������������������������� ��������������������~||{yvsqnlkigfb_\Z�Y�Z�YW�V�WYVROM�LMLJ�IJ�L�MOQRTVVTTQOMLJIG�EGIJIJJLL�J�LMORVY\adgikloqsw~����������������������������������������������������������������������������������������������������������������� ����������������������~|{wtqonlifdba^\�ZYWW�V�WTQML�J�LJI�G IJJIIJJLMQ�RQOMLJIGEDDBBDEG�G'IJLJJIJJLORVY\adfgiknosw|��������������������������������������������������������������������������������������������� �����������������������������������������������~|yvtqolkidbaa^\Z\Z�Y�W�V�WTQOLLJIIJJIEEDDEGG�EGILOQ�OMLJIGGEDAA?ABDE�EGI�J�IJLORVY^adfgiklosw|���������������������������������������������������� ����������������������������������� �������������������������&�����������������������~|{wtsqnkigdba_^�\Z�Y�WVROMLLJ�IGEDD�BDGJL�MLJIGEEDB?==?ABD$BDEIIJJIIJLQTWZ_bdfgiiknqw{��������������������������������������� ���������������������������������������������� �������������������������������������������~{yvtsqligfdba_�^\Z�YW�YWVTQO�MJ�GEDBBAA?==�?ADIIJ�L
JIGEDBAA=<<�?AADEGG�IJMQTW\_bdfgiiknqv{������������������������������������������������������¾��������������������������� �������������������������������������������������~{wvtsoligfdba�_^\ZZ�Y�ZYWVRQ�OMJGEED�BA?<::<<=?BEGIJLLJIGEBA??=<<�=?ADDEE�GJMORW\_bdgikiknqt{����������������������������������������������������������������������������������������������������������������%����������������{wvsqnligfdba_a_^\ZZYY�ZYWVRQO�M JGEEBABBA=:88::<=ABDGIJJIGEEB?==<�:<=?A�BD�E
ILMQVZ^adgi�k nqty~���������������� ����������������������������������������������������������������������������������������������������������������|yvsonlkgfdb�a_^\�Z YWVRQOMLLJIGEB�A?<:�8 :<?ABEGIIG�D
B?=<::88:=?�A�B�D
GJLOTY^adgi�k%nqtw~�����������������������������������������������������������������������������������������������������������������������������������������~{vsqonkgfddbaa_^�\�ZYWVTRQOLLJIGEDA??=<<�8:<=?BDEED�B
A=<<::778<?�?�A3BDGJORW\_bfgiiklosv|��������������������������������������������������������������� ������������������������� ���������������������������������������������~{wtsqoli�fdba_�^\�ZYWVTTRQMLJIGEDA=�<:�8:<=?ABBA�?
=<::88778:=-:<<=<<==?BEIMQVZ^_bdfgiknqty~��������������������������
������������������������������������� �����������������������������������������������������'������������������������~ywttsqnkigffdba�^_^\ZZYWWVTTRQOLJIGEB?<�:�7878:<<=?=�<:8�78:578�:�<(=ADGLORWZ\^_bdfgknqv{|~����������������������� ���������������� ������������������������ �������������������������������������������������������������2����������|ywvvtsonligffdb_^^_^\ZZYWVTRRQOOMLIGDA=:�8755�78�:8�75�4�5245�7�:,<?BEILOTVYYZ^_bdgkotwy{|~����������������������������������������������������������������������������������� �����������������������������������������������~|{ywyvtqqokiffdb�_
a_^\ZYWVRQQ�OLIEBA=:88�754�578875544�2�0�2�4�22/0245578:<?BEILOQTVWYZ^adglqtvwy|���������������������� �������������������������������������������������������������������������������������������������~||�{
ywtsqnkgfdb�a _^\ZYWTRQQ�OLIEBA?<:8�75�4�54�20/�-/�0�20//1,-/0224458=?ADILMORTVWZ\_bgnqstvy|��������������������
�����������������������������������������������������������������������������������������������~|~�|{yvttqnkgfdbbaa_^\YVTR�Q�O�M
LJGDBA=<:87�52�0�20�/-�,-/-�/�,(*-/�0)25:<=AEIJLORTVWYZ^binoqsv{������������������ ��������������������������� ����������������������������������������������������������������������������~�~�|{wvvtqnkgfdba_^\ZWTR�QOM�L JGDB?==<85440/�-�/-�,�*�,*('(*,-�/ 0278:=ADGILOQRTVWZ_dilnqty|������������������������������������������������� �������������������������������������������������������0���������������������~����~~|{wvvtqolgfdba^\ZYVTR�Q�ROM�L JGDBA?=:7420/�,-�,*(�*�(�'�'(*,-�/)0458:=ADEILOQRRTY^adgknsvy|�����������������
������������������������������������������������������������������������������������������������������������~~|{wvtsqolifdba^ZYWVTRQQRTROM�L IEDBA=<8520/,�*�,*�(�*(''%%$$%�%'(,--�/(0257:=ADEILMOQRVY\_bgkosvy|����������������
�������������������� ������������������������� ������������������ ��������������E�����������������������������������~����~|{ywtssqqnkgdb_^ZYWVTRQQRTROM�LMJGDBA?=:520/,**((�* ,*'%'(('%$�"$�%'(,--�/'0457:?BDGJLMORTVY\_bfknsv{����������������
�����������������������������������������������������������������������������%���������������������������~~��~|{ywvs�q olifb_^\ZWVT�RQOMLL�MJGDBAA?<7420-,*((�*(%$$�%$"  "$$%(*,--�/ 02447<=ADGJLO�RVWZ^afkosw~��������������
��������������������� ���������������������������������������������������������������������������������������~|�{yvtq�o nlkgd_^\ZYWV�R�Q�OMLL�MJGEDAA?<8720/-,((�*'$�"�  ""$'*,-//�0�258:=AEILO�QRTWZ^bgnqv{��������������������������������
������������������������������������ ���������������������������������������~|{�ywtqon�lkifa^\ZYWVTRRQQOO�M�OMLIGEBA?=<840/-,�*(%$" �� �"%(,--//�0/�0!478<?DGJLMMOQTVY\_dkoty�������������������������������������������������������������������������������������������������������������������~|{ywvtqnl�k�l kifa^\ZWVTTR�Q�O�MOQQOMLJGDBA?<840/,�*('(%$"  ""$$(,�-/0�20�/"0258<?BEGIJLOQTVYZ^bioty~���������������������������������������������������������������������������������������������������������������������~~�| {yvsqnlkii�k igfb_\ZWVTTR�Q�OQ�R"QOMJGEDA=852/,**('%%$"  "$%'',//--/2�42�//0247<?BDEGIJMORTYZ^agnsw{~������������������������������������������������������������������������������������������������������������������������~|{|{ytqonlk�i�gfba^ZWVTT�R�QRTTVTRQOJIEB?:72/,**('%$"" ���"%'(*�57�87420/-,*('(*,-/002478:<?ABDGJMQR�TVWYZ^adgknqssqqssqoonnll�k�ig�f db_\YTOLJIGEDA�? =<87540/--�,*('%�$"� �"$�%'(�*,�-/24578<?B�D�BD�E�GIJJ�I
JLMQRTTVVTR�Q�RTV�WYZZY�WVTQMLJIJLLJIEDA=:�8�:�8:�<
=?AA?=<:887457�85400/-,(('((*-/0024578:<?BBEIMQR�TVWYZ\_dilosttssts�q�o�n�lkiikk�igfddb_^ZYTOMLJIGEB�A?=875420--,*,*(%$"� � �"$%%'�(,--,,-02457:=ABBDDBB�AB�DGI�G IJLOQRTVVT�Q�RTV�WYZZY�WVTQOL�J�MLIEB?<:�7�8�78::<<=??=<:8875457�8742�0/,�(*-//0224578:=ABDGLOR�TVWYZ\_dinqtvvtvvtssts�q0onlkkllkiigfba_\ZYWTQOMLJIGEDBBA?:75542/-,**('$" ��� ""$%'(*�,-/02458<=?ABDDBA�?A�BA?AD�E�G�IJLOQRTVT�QRTV�W�Y�WVTRQOM�L�M
LIDA=<:7557�57�578�:<=<:�87525�75200220-*�(*,�-/0024578<?ADEJMQRRTVWWYZ\_dinqt�vtssqqonlk�l�kifa_^ZWVVTROMLLJIGEDDB?<7�540/-*('%" ��� "$'(�*,-/02578:=?ABDB?�=�?=<=BDD�E�GIJLOQRTT�QRTVW�V�W�VTRQQO�MLGDA?<:�75445�45�78:�8:87424�54200�2/,�*,�-/0024578:=ADEILOQRVW�YZ\_bglost�v�w vtsqqonlkk�lkifa^\YV�T'ROMLLJIGEEDB?<8775420/,(%$" �� "%'�(*,--/25778<=?ABA?�=<::<?AB�D�EGIJMOQQRR�QRTVV�T�V�TRQQOO�M�OMLJGDBA=:�875445�4�5�78::874�2�4�2�0�20-�,�-/�02457:<=ADGILOQRVY�Z�\_afinqst�vwyywvvtqqonlkilkkiifa^ZWT�RQOMLJ�IGEDB?<:887542/,*'%$" ��� $$%%''(*--/24577:<??AA=�<:878:=A�B�DEGILMMOQ�R�T�R�T�QO�MLMOOLJIGEDB?<::8754242�45�7�8752�2�420020�/-,,-/0�2�458<=?BEIJMOQRVYZ�\^_bfknost�vwyyw�vsonlkiiki�gfb_ZWTR�QOLJ�IGEDB?<:887542/-,*'%$" ���� "$''(*-/0245778<�?=<<�:87557:=?AABDEGIJLLMORTTVVT�R�QOM�L�JLMMLLMMLJ�I GDA?<:8754�2�45�75442�2�4�0�20-,-/2�4�578=??BEILOORTVYZ�\�Z\_bgknoqstvwyyw�vsolkiggig�fdb_ZVRR�Q"OMLIIGGEBA?<:8874420/-,('%$"" ��� $''(*,/0457�8<�=<�:�8754457:<==ABDEGIJJLORTTVTR�QO�MLJ�IGILMM�L JIJJIEDA=:7544�2�4�2 4557554220�0�2�42002�42/--/2445778:=?ABEILOQTVWY�Z�YZ^adgklnostvwwv�tsolki�gfdbba^ZV�RQOOMJIGGEBA?<:885�420/,('%%$" ��� $'((*,/2578�:<==�<�:�<:8754224588:<?ABDEIJJLOR�TRQ�OM�LJI�GILMM�L�J�LJGEB=:75�4202�4�54220�/�0�20/2�420--/0445778:=ABBEIJMQT�W�YWYY\^adgklnqstvwvsstsqlki�gfb�a_\WT�R�Q OLJIGEDBA<:875�4 2/,('%%$" � � �� $'((*,/4578:�<�=�<�:87544�24788:=?ABEIJLLOQ�ROM�L�JI�GILMMLLMM�L�MLIGB=<875544554420�2544�20/�-/00//0�20�/024578:<?ABDGIJMQTWW�V�W�Y!Z\^adilnoqstvtsstsqnlkiigda__^\YVT�R�T�R QOMJIGEDB=:87�540-*('%$"  � ����$'(*,-04578:<�=<:�875�4�24788:<=ABEIJLLMO�QOL�J�I�GI�JMOOMMOO�MLJGB?=<:87557754�2�4�20/-�,�-/-/0�2�02457:<?�A DGIJMRTVVT�RTVWYZZ\^afilnoqst�sqnlkiifb_^^ZYWVT�R�T�R QOMJGGEB=:8755�752/,*('$  � ����$'*,-/24578:<�=<:�875445�4788:=?ADEIIJLMM�OMLJJ�IJ�MOQQOMOQOO�M LJGB?==<:8�74�2�0�2�42/-,�*�,�-/02�4�2458<?�ADGILOR�TR�QRTVWYYZ\_bfiklno�qolkiigda_^\YWVV�T�VT�R QOLIGEB?<8�7�8740-,*(% ����� $'*,-/24457:<�=<:�87�57�578:<?ABEG�IJ�LJ�I�JLO�Q�O�QOMLLJIEBA?=<::88�754�20/0�2�42/-,�*�(�*,-/02554�2478:=�ABDGILOQ�RQ�OQRTVVWYZ^abfgikl�nonlkiggfba_^ZYWVVT�VWVVTTRRQOMJGGDA<:�8:852/-,(% ���  "%'*,/�2 458:==??==<<�:�8�75744578:<ABDGIJJIIJJ�I�JI�G�IJLMOQRR�QROOQRQMLLJIEBAA=<:<::87754�2�02442/-�, *((**,-024554�247:<=?�ABEEGILM�O�Q�OQR�TVWY\_abdfgikiiklkigfddba_^\ZYW�VW�Y�W VTRQOOMJGGEB=<�:�<
8520-*%"�����""$%(,/0224578<=??�=<�:8754458:<=ADGIJLLJ�I�G�I�G�IJLOQQRR�QRQQRRQMLLJIEDBB?=�<:8755�42�0�20/�- ,*((**,-04�54�247:=??�A
DIGIIJLMLLM�OQ�RTVVWY\^_abdffddfigffdba_^\�ZYWVWWYZZYWVTRQOMMLJGGEB?==�< =?<852/,'"������ "$"$%(,/0224578:<=�?=�<:8�57:<=?ADIJ�LJ�IG�EGII�G�IJMQRRTTQQRTRRTRQMLJIGEEDDB?=<:87�54�5�20�/�-,�*,-04�5�47:=?�ABE�I�JLMO�QRT�V WYZ\^_abbaabdd�ba^\Z�Y�W�YZ\\ZYVTRQOMLJIGEDB�A�?�A?<852/($ �� "�$'*-/0245578::<=�?=�<:8�78:<=?ADIJ�LJ�IG�EGIIGG�I JMQRRTTRQR�TRQMLJGEE�GEB?=:87�5�7540�-�-,�*�,-/04�5�458<?�ABDGGII�G�IJLOQQ�OQRT�V
WYZ\^__^^_a�_�\ZYWWVVWWYYZ\^\ZYVTQOLJJGGDD�BABBA=<850*%"�� "�$'*//02�5�7�8:<==�?=<�:8�7 8::<=ADIJJLLJ�IE�DE�GIJ�I JMQRRTTRQQ�R�Q�MLIGG�IGDA?<:87�5�7540�-,�,�*,-/0024�5 7:=?AA??AABBDE�G�EGIIJMOOMMOQRTVVTTVWYZ�\�^�\�^�\ZYWVTTVWYYZ\^^\ZWVROLJJGE�D�E�DB?=:72-($�� "�$%(,/024�5�7�8�:�<=�?=:�8755778:<=ADGIIJLJ�IE�D�EGI�JLMOQQ�R�Q�OML�JIGDA?=:87�5�7540�-,�*,-/0224�578:=??A�?�ABAAB�EDEGGIL�M OQRTVVTRTVWYZZ�YZ\\�ZYVTTRTVWYZZ\\ZYWVROLIIE�D�GEDBA?<850,% �� ""$$"$%%(*-/024�5�7:�8�:=�?<87�5 78:=?ADEGI�JIGE�DEGJ�L�M�O�QRQQOO�M�O�M�L�JGBA?<:87�5420//-*�(*,,-/24�5�7�57:<=�?�A�?AB�D
EGIJLLMOQRT�VTRRTVWYYW�VWY�ZYVTTRRTVY�Z YWVTROLIGE�DEG�I GEDBA=:72-($���� "$$""$'(*,-/024�578::�8:=??=:75�4�578<?ABDEG�I�JIGEE�DEGJLL�M�OQRRQOO�M�OMLIEBA=<:8775544�20-*�*(,-/02457�8�78:=?A�?A??==??�ABDEGGIJMORTTVTRR�QRVWWVTR�TVWYY�ZYWTTRTTVWYZZYWVVRQOMJIG�E�DEG�IJIGEDA=:82/,'"�" "$$""$'(*,--/024457�8:<==:85424244578<?B�E�G�IGE�DEG�JLMLMM�OQRR�OMOO�Q�O�QOMJGDA?=<:88775422442/,�,-/25778:�<�:<?AA�?�=?AD�EGILOR�TRQQ�OQTVVTRQR�TVWYZZ�YVTTVVWWYZZYVTTQO�MLI�G�EGI�JIGEB?<840/,'" � �"$%'(*�,-/0245�78�:�<:87422422457:=AD�G�EGEEGGE�D�EGI�J�LMO�QRTR�OQ�RQ�O QRRQMLIEBA?=�<
:875445540-�- /0278::<=??=�<=?ABA�?=�<�:<=ADEDEGIJMQRTTRQO�MOQRRQ�O�QRTVW�YW�V�W�ZYWTRRO�MLJII�GIJ�LJIGDA=:542/*'$ ��� �"$%'(*�,-/024�578�<875420202457:?BE�G�E�D�E�I�JLM�Q�TR�OQ�RQO�Q�TROLIGDBA?=??=:87�5754/�0247:<�=?AA?�=?A�B�A?<�:�8 :=ABDDEGIJLOQ�RQM�LM�O�M�OQRT�VWYYW�V
WYZYWVTRQOM�LJ�I�JLMMLLJIGEB?<8740-*%" � � �"$%'(*�,-/04�57:�=<87542�02478<ADE�G�E�DE�GI�J�L�JLO�QRTTRQOOQ�R�Q�R�TRQMJIGDB�A
?<::8778752�4578<=�?�A?�=?AA�B�A?<:88:8�7 8<=ABBEGJJLOO�QOL�J�M�L�MQRR�TV�W�V�T
WYYWVTRROML�J�L�J�LJ�M�LJIGEB?<:852/,'$ � "� "�$�"$%'*,�-,--04�7�8 :==??=<87442�02478=ABE�G�EG�I�J�LM�L MOQQRTTRQQ�OQRR�Q�R�T ROMLJEEDBBA?�=<�8754�7�8:<?�A�?�AB�DBA?=:88:8�7
8:<?ABDGJLM�OML�J�L�M�L�MO�QRT�V�T
VWWVTTRQMLJ�I�J�L�M�LJIGEB?<:852/,'$� �"� "�$�%�$%'(,-�/�-058::�<=??=<:7�4�2 47:=?ADEGG�I�GI�JL�M�O�QRTTRQ�OQ�R�T RQOLIGEDBB�A?<::877�:<=?�B�A�B�EDA??<:88�7
8:<??ABGJLM�O�MLJ�I�J�M�L�MOQ�R�TRTTROLJJIGGIIJJ�MLJ�I EDB?<8852/,($�"$�"�$�%(*,/�0�/278::<==<<=?==<8�5422458<=??ABEGII�J�IGI�JLJLL�MOQ�RTRQQ�O�Q�R�T�V�TRQMJIG�D�B�DB=<<:88�=?AD�ED�B�D EGGEDBA?=<:8�7 8:<=??ABEIJL�MJ�I�GIJ�LJ�IJLM�OQR�T RQQRRQMLJJIGG�IJ�MLJI�G EDB?<8752/,(%�$$�"$%�'(*,/�02478::<==�<�= <:87754457:<=�?ADGII�J�IJ�L�MOQR�TRQQ�OQ�RTV�WV�TROLIGEEGEEGGDA?=�<�A�BABDE�G�E�D�E�GEDBA??=<:�8 :<=??AADGI�J�LJ�IGEG�I�JG�E�GILMOQR�TQOOQQOLJIJIGGIGGJMM�L�J�I�G�E
DBA=:752/,(�%$$ ""� "$�'(*,/�0�2�478::�< =<::8875578:<<�?BGII�J�I
JLLMMOQQRRT�VTRR�Q�R�QRTV�WVTTVVTROLJIGIJIIJIGBB�?�D�EG�I�J�I�G�EDBA�?=�<�:<?�ABDE�GI�J�IGEEG�E�GEDD�B�DEILOQ�RQO�MLJIIJIGGIGGILLJ�I�JIGEEDBA=:742/,('%%$"� � "%'((*,-//02�4578�:�<�:�8�:<=�?BEGI�JLMOQ�RTV�WV�TR�QRT�VTQMLLJIJ�LJIEDBBDD�G�I�JL�M�L�J�IJIG�E�DBA�?�=�< =?BAA?AABD�E�G�IG�D�EDBBA??AABEIMOQRQQOML�J�I�JI�G�I�GIJLJIEEBA?<8522/,*('%$"� � "%'�*,-/045544557788:�<�:�8�:�< =??ADEGIJL�JLOQ�RT�W�V�WVRQQOQR�T�VTROMLL�JL�MLJIEDEGG�I�J�LM�OM�LJIG�EDBAABBA?�=?ABA�?AB�D�EGIIGD�BDEEDBA?==??ADGJLOQOMLLJ�I�JI�G�EGIJLJIEDBA=:7520-,*('%$"� � $%'*,,**,/2455�4�5�78:�<�=<�:�<=?AABDGIJ�L�JLO�Q�RTVWW�VW�YWTRQOOQ�RTVVTRQOM�LM�OMLJGEGII�JL�MO�Q�RQOOMLIIGGEEDDBB�D B??AABB?==�?�ABDEEGGE�B�A�BDBA?=<=�? BEIJMOMLJJII�G�I�J�GIG�E�DEIJLJGDBBA=:750/,**('%$�" � "%''*,,**,/2�4�24557�8:<<�=�<�=�?�ABEGIJL�M�JLOO�Q�RTVWY�WY�ZYVRQ�O�QRTTRQOMMLLMOOQQOOMLJ�I�J�L�JL�MO�RTVVTRQML�JIG�ED�B?==??�=?ABDDEED�B�A?=<<=�?ADGIJLLJ�I�GIJJIGGIG�E�DEIJJIEDBBA=:850-,*('%%$�" � $'((*�,/�2 4578::88:<�=�<�=?�ABDG�IJM�OMLLJJL�MOQQRTVWWYYWWY\\ZYWTRQ�O�QO�MOQRRQOML�J�L�M�J�LMO�TWYYWVRO�LJIGGIIGGE�DBAA?=<==�<?AAB�D�BA?AA�?�=�<=�?ADEGIJ�I�GIJ�I�G�EDEEGIIGEDBBA=<850-,*('%$"�"� � "'(**,�-�,/2�0�2�4578:88:<<�=�<�=�?�ABDG�IJM�O�MLJLMLLMQQRTVWWYYWWY\^\YWTRQ�O�QM�OQRRQOML�JLM�MLJJLLMQTVVYZZYWTQ�ML�J IGEDDEEDBAA?=�<�:<==?A�BA??AA?�=?==?AA�?ABEG�I�G
IGGIJJIJJIG�E�GEDBA?=<852/,*'%$" � � "%(*,-�/�-/�0�2457�8�:<�=�<=�?�A�BDE�GIL�M�OM�L�JLOQRRTV�W Y\^\ZWVTRQ�O�MO�Q�O�QOML�JLM�O�M�LMLMQTWWZ�\YVTQO�M�LJGG�ED�B?=<<::�8�:<=?�A�?�=�?�A�?ABE�G�E IGIJLLJLJI�G�I�G�EDB?==<840-*(%$" ��� "$'*,-�/�0�/�0/25�7�8:<�=�<=??�A�B�DG�J MOOMLLJIJLMQ�RT�V WY\^\\YWVTRQOO�M�OQOOQOOMLJ�LMO�O�MQVWYZ\^^\YWVROMM�LJ�IGE�DA=<<:�8�78:<�=�?�=?�A�?ADEE�D�E�GIJ�LJ�I�JIGEDBA=<<:740-*'$"   "$%%'*-�/�0�/�- 0455445778:<�=�<=?ABBAA�BD�GIL�MLJIIJLMO�QR�TVWZ�\�ZYWVRQO�M�O�QOMLM�O�O�Q�ORVWY\^�_\ZYVROM�LJIIJGE�DB?=<�:�8�78:�<=??�=�<=�A�?ABDD�BD�E�IJLMLL�JILLJIEBA?<::8540-*(%$ � "$''(*-�0200�/�-�,-0220224577:<==<<=?ABDBA?�ABDEIJ�LJIGIIJM�ORQRRVWYYZ�\ZYWTRQOO�M�L�MOQRRQOO�QO�O�QTWYZ^_�a _^ZYVROMLLMML�JIG�E�DB?=�<:8�78�:<�=<�:<?�A�?�A�B�ABD�E�GIJ�L�J�LJIEB?=<:87542/,*(%"�  $'(*,-0�20//--,,�*,-�/�024557:<<:<=?ABDBA�?�A�?ADG�I�GIL�M�OQRTVWWYZ�\ZYVTRQO�M LJJLMMOQRRQQRR�QO�Q�RVYZ\_a�b a_\ZWTQOMMOOM�LJGEEGGEDBA?=<<::8�7�8:�<:8::<=?AA�=�?�ABDD�EGIJJL�J�LJIGDA?=<:75440-*(%" �  $'*,-/022�0�-�,*,�*�(*,�-/0244578�:=?ABDBA?�A�?=??BDE�G�EGJ�LMOQRT�WYZ\\ZYVTRQMMLLMMLJIIJMMOQR�Q�R�Q�R�T�VWZ\^a�ba_^ZWVTR�QO�M LIGGIIGEDBA?=<�:�8�:�8�:�<=??�=?�ABD�E�DEG�IJ�LJIGGEBAA?<875540,(%$" "$'*-//�0�/-,�*�,*�(*�,-/2�4 578::<=?ABBAA�B?==??AAB�DEGIJLL�JLOOQRV�WYZ\ZWVTQOMMLLMMLJIIJMOQRR�Q�R�T�V�WY\__b�dba__\YWVT�R�Q�OMJ�I�GEDB?=�<�:�8�7�8�:�<�= ?ABAA??ABE�G�ED�BD�EGI�JIGEEDBA?<:88752-*'%$"" �"$'*-�/�-�,�*�(*((*,/0�2 4578:<==??ABB�DB??=�?�ADEG�I�J�IJMMOQR�VWYZYWTRQ�O�ML�JMORTR�Q�R�TV�V�W�YZ\_aab�d baa_^ZYWVV�TRQOL�JIGEB?�=�<:�87�5�7�8�:<=?A�BA??ABE�G�EDB�A�BDEGII�JIG�EDBA=<::8740-*'%% %$  "$'*,--�/�-,�*(�' (*-/0024578:<�=?BD�EDBAA�?�=?BEG�I�J�I JLMOOQRTVW�YWTR�QOMM�LMQTT�R�TV�W�W�Y�Z\^�ab�d baba_\ZYWW�VWVROM�LMLJIGEA�?�<�=:�8�7�5�7 8::<=?AABB�A�BDEGGEDBA�?ABDEGII�LJIGGIGEDA=::8852/*(''�' $" ""$'(*,-//�-�,*,*('�$�% '*-/02247:�=?BD�E�DBA�?=�<=?DEGGIIJ�IJLLMOQQRV�W
YWVTTRRQQOM�L�MOQ�T�V�W�Y�Z \^^_aba_ab�d�ba_^\\ZZ�YWTQO�M�OMLJIGDBAA=<<==<:�8�78:<=�?A�B�D�EDBA?==?ABDEGIJMOOML�JIEB?<:8874/,**(�('%�$ %''(*-//-,-//�-�,*'$�"�$ %(,/02247<�?�=?AB�DB�A?<�:�<=ADEGIJJIIJJLLMOQQRV�W�Y�WVTRQOMLLMMOOQRTTVWY�Z�Y\^^\\^_abdda__ab�dba__�^�\�ZYVRQOO�Q OMLJIGEBA?�=�<�:875�78:<=�?�A�BDEEDD�EDBA�? ABDDEILOQQOL�JIEB?=<::840--,*�(�%�' (*,--,,-/0�/�0/,*(%�"�$ %(,-02248<�?=??A�BDB�A?=<�:�<=?BEGIJJIJLJLLMOOQRVWVWY�ZYVTRQO�M QOQRVWYZ\^^\\�Z^__^^_adffda__ab�db�a�_^\ZWVTRRTTRRQOMLJJIEBAA?�=<:87�5�78:<=?�ABDEGG�EDB�A�B�DEILOQQOL�JIEBA?=<:8520/-*�(�*�(�'(*,--,,-/�0�2/,(%$�"�$ %(,-/0248<==�?�=?�A�B�A?=<�:�<=?BEG�IJLMLLM�OQRTVVWZ�\ZYWVTRQ�O�Q RTWZ\^^__^�\^�_�afggdbaabb�d�b dfdbdbb_^\ZYW�V�T
RQOMLLJGDBA�?�=<87�5�78:=??B�ABDEGII�GED�B�D�EILOQQOM�JIEDDA=<:87520-*(*�,�( '(*,--,-//�02-*'$�"�$�%(*,-/048<=<??=<<=?�A�B�A =<::<==??BDE�GJLM�L�M�OQRTVWZ\\^^\ZYWVT�R�QRTVY\^�_�^�^�_abfggf�dfgig�fdba__^Z�Y�W VTROMLJIGD�A?=:87�5�78<?AA�BDEG�IG�E�DE�GIJMQQOMLJ�I�G EB?<:88740-**,�-,*((*�-/�0�/,(%$�"�$%''(*,,-/27:<<==<:<=?ABBAAB�DBA=�<=?�A�BDEGGILMMLLMMOOQQRVYZZ\^^\\ZYW�VTRTVWZ\^�_�^�^�_adfgg�f�d�b�d�fgi�k�igfdbba_^�\�Z YWVRQMLJIE�BA?=:88554558:<=�A�B�D�EGIGGII�JIG�EG�I�JLOOMMLJ�GEDA=�:850-,�,-�/-�,-//02200//--,('$$�"�%�(�*,-058:<=<::<=?BDDAABDEEDA?�=?AABB�DEGGIJMOMM�O�QRV�YZ�\�ZW�VWY\\�^�\�^�^�_abf�g fddbbdfgik�lkig�fdb�a_^\ZYWTQMLJGEDDBA=<::75457:=?A�BD�E�G�IJLLJI�GI�J�LI�G EDB?<::872/-�-/�0�/0245420//-,('%$$""$�'(�* ,-/258<<::<<=A�D�BD�EDB�A�BD�EG�IJMOO�QRTW�YZ�\�^�_^Z�YZ\�^�\�^�^�abdg�i�gf�dfgil�o�nli�gf�d�a
_^ZZWTQMLIE�DB?=<:87578:?BDEDDE�GE�G IJIJLMLLJIJL�M�J�IGE�G EDB?<:87740/�/�0 24578542//-*'%�$%�(�*(�*�,-047�:<=A�DBEGE�DE�DE�G�IJLMOO�R�TV�YZ\�^�_�a_�\^_�a�_^\\^^ ^_bbdfiklkig�f�gilossq�onki�g�f�g fddba^\ZWTQMJG�EDBA=<:�8:<?DE�G�I�GI�JL�OMLMO�QOLJIIGG�E�G�E DBA?<8755420�0�24578::8740/-*'%$$%%'(**((*((*�,-/2578�:<?AB�DEGEDDEGII�GI�J�IJLMOOQRT�V�WY�Z\^�_a�ba__ab�db�a_^^_^_abdfgk�lki�gikkoqssqqooqolki�g�i�gfda^\ZYTQMJIGGEDD?=<<::<?AEG�I�G�I�JM�QOMQ�RQMLIIGE�DEGGEDBA?=<:7745422�2�024578:<<::874/-*('%%''(*,,((*((*�,�/ 245788:=AB�D�EDEIJJLJJIIJLMLLJJLMOQQRRTW�Y�Z�\^_�ab�dfggf�dba�_�abdfi�lk�iklnq�s�q�onk�ik�lkgfda__^YTQOLJIIGEBA??==?BDEG�I�GIJJIIJLO�R�Q RTTRRQOMJIGED�BDEGGEDA?=<:87755�4�54�2458::<==<<:850-,*(''((*�,*�(*�, -/0224578<?AB�D�EGJLLMM�LMOQO�MOQR�TVY�Z�\^_a�bd�f�g�ig�fdba�__abdfik�l�knossttq�sq�on�ln�onkgf�ba^WTROMLLIGDDBBAABDEGIJ�IJI�G�JLMQR�TVTRRQOMLIGEDABBDE�GDA?=<::�8�7�8�7�578<==�?=:850-,,�*,�-,�(,--,--/002478<??ABBDD�EGJLLM�OQRTR�QRT�VW�Z\ZZ\\^_abddbbdf�g�i�k iggffdb_^_^_abfgik�lnqssttssttsqqss�q�sqolig�f da\YWTRQOLIGG�E�GIJJ�I�JI�GIL�MOQRTT�V
TRQQOMLJIGD�BDE�GEB?=�<�:�<�=<�:<=??�A=:752/--�,�-,*�(,--�,-/0247:<�=?ABDE�GIJLMOQRTV�WV�TVWYWWY�Z�\^_ab�d�f�gi�kigffdb_^^�^
_bfgiikklln�ono�q�s�t�st�v�tsqonk�i
fb_^\YWTROL�J�I�G�JI�GILOOQQRRTVWWVVRRQOMLLJJIGE�D�EBA?<�=�?==?ABBAA?==?AABBAA=<7540//--�,�-,�*,--,**,-/245:<==<=?ADEG�IJLMORTWY�ZYW�Y Z\ZYZ\Z\\^\\�^�_abddff�g�k�igfda_^^�^_bfg�iklnoqss�q�s�t�vw�ywvtsqon�lkgdba_^ZWVRQOMM�OMLJII�G�I�GIJMOQ�R
TVWWVTRRQOM�L�JIGE�DBA?==�?ABBAABD�EBAA�B A?=<875420/-�,�-,�*�,*((*,/2458<==<<=ADEGI�J LMORVYZ\^^\\�^�_^�\^__^^_�a�bdfg�i�gi�k�lk�igda__^�^ _adfgiklnqqs�t�s�tvwy�|{ywts�qonnkgfba_\YWVTR�Q�ROMLJ�I�GILOQQR�QRT�V�TRQO�M�LJGGEEDDBA�?�=?AAB�DDE�G�IEDDED�B A?<::887520/�,*�,*�(�*�(*,-0457:<=<<=?BDGI�J LMOTWYZ^aa__a�b a^^\^_aa__ab�d�fgi�k�ik�lk�igfba_^
^_aabdgiloq�stv�wvtt�stvw{|�~|{wv�tsoonkgdb_^ZYWVT�R�TROMMLJJLJ�I�GIJMO�Q�OQR�TRQ�O�QOMLJ�IGEDA?�=?ABD�EG�I�JI�GEDBBA?<�: 87420-,*((**('�%'�(*,-04578:�<=?ADG�I�JLMQTWYZ_�bd�fdb_^\^_a�bdfg�iklnn�l�nlk�igdba_�a dfgknqssttvw�{
yvtsstvw{~�����#~|ywwvvtsqolifb_^ZYYVVTVTVTROMOMLLML�I LMOOQQOOMMOQ�R�Q�RQOM�LJIGEA=<�=?BDEGEGG�J�IGEBA?=<�:8740-,(�'�%�$�%'�(*,-04578::<<=?ADEG�IJLMOQTVYZ_bdfggiigfda^\^_adffi�klnoonnoo�q�onlk�igfdbdbabfgiloqsstvw{�| {wvttvy{~���������|{yywvvtsolifb_^\ZY�W�VTRQOO�MLJIIJLM�O�MO�QR�TRQ�OMLJIGB?�=?ABDEGGIJ�LJ�IGDA=�<�:850-,(�%�$�%'�(*,/24578�:=ABDEGIJJLMOQRTVY\_bfi�kigfb_^^_bfgilnn�l�no�q�sqonl�kigffdbdgiklqqsstwy|�~�|{ywwy{|��������+�||{{wvvtsolifda_^\ZYYZYWVVTRQOMOOMLJJIJLMOO�MOMM�O�QRT�R�QOMLJIGDB�?ABDEGILMOMLLMJ�IGDA=�<�:
8750-*'%$$"�$%''�(*,/24557�8 <ABDEGILLM�QRTWZ^adgillkkigfb�adfil�n�o�q�s�t�s qonllklkiggffgiklnqsttvy|~���~�|�~��������~~|{wvttsolkgfba_^�\ZYWWVTRQ�OML�JLMOO�M�OQRR�Q�R�QOLJI�GEB�ABEGIJMOQO�MLJII�GEDB?=<<�:87540-*'%$""$$%%'�(*,-024457�8 <?BEGIJMOQ�RTVY\_bfgi�kigf�dfgk�n�o�qs�tvwvt�s�tsqon�lki�ikllnnoqstvw{�������������������~|{wvtssqnlgfba__�^\ZYYWVTQOOMLJIIJJLMOO�MO�Q�O�R�Q�O�QOLJIG�IGED�BDEIJJMO�Q�OLJII�EDB?=<=::875540/,'%�"$%�'(*�(*,-/0245�7
8<?BEILMQQR�TVWZ^adfg�i�g�fgil�n�qs�tvwywvv�t�w vttsqonnlklno�q stvw{~���������������������~|{wvtssqolifdbaa�_ ^\ZYYWVRQOLJ�IJLM�O�MO�Q�OQ�RQOMO�QOMLJII�JIG�EGIJJLO�QOLIGG�EDB?�= <:8755420-(%�"$%�'(**((*,�-/245�78<?BEJMQ�R
TVVWY\_bddf�gikl�no�qs�tvw�ywvvwyyw�vtqonloq�s tstvwy|��������������������"���~|yvvtsqonligfdbbaabb_\ZYYWVTQMJ�IJM�O�M�OQ�RQOMM�OML�J�L�J�I�G�IJM�OMJG�EDBA?==<<:855422/(%"" "$�'(�*!,-//-/0457557<ADGLMQRTTVWYZ\^abdbd�f�g�i�knln�o�qs�tvwy�{�|yww�y�w�ywtsqo�t�v wy|�������������������~{wvvtsonllkigfd�b�da^\ZYYWVRMJIIJJLM�OM�L�M�OQ�RQOO�MLJJL�ML�J�IJL�M�LJG�EDBA?=<<=<:75442/*'$" "%�'(*,--�/04�57<AEILMQRTVWYZ\^_a�bd�f�g�i klnoqooqss�qst�vwy{|�~|{{�y {yy{{ywvvtyw�v�w y{~��������������������~|ywvvtqonlnnlkgf�b�d b_^\ZZYWTOLJJ�LM�OM�LJL�J�MO�QRQQOMLLJ�LJLMOOML�J�L�MJIIJL�J�IE�D�EDBA??=<=?=<87552/*(%" "$%''(*,-�/�0�4�57:AEILMQRTWYZZ\^_abab�dfgiikloq�svwwvvwy{|��~|{{y{y{�|�{y|{y�w�y{|~���������������~{ywwvtqonnoonlifbb�d b_^\\ZYVRO�M�OL�J�I�JLM�O�QOMLJIJ�LMOQQOM�LMOQQOL�JI�GE�D�EDA?==<<=?=<:8752/,*'$�"$%'(**,-//--/02�4�57:?DILOQRTWYZZ\^_�ab�dfikklnqs�t�s�t wyywwyy{|����~||�{|�~�~|�{�|����������������������~|y�wtq�onligdd�f dba_^^\ZWTQOM�O�ML�I�G�IJ�L�MOMLLJI�J�LO�QO�M ORTRQMLJIGG�E�DEDA?<<::<=<<:8540/-,(%�$%''((*,�-�,-024�5 7:?BGLQQRTWZ�\�_abd�fiklnoqs�t�st�vw�y�{|~������~~|�~�����~~�� ������������������������~{�yvs�qonlkigff�g fdbba_^\YVRQ�OM�LJG�EG�IJ�L�J�LMOQRR�Q RTVTQOMJGEE�D�E�DB?<�: 87420//-,('%%'�(*�,�*,/25�78<?BGLQRTVWZ\^^�_abf�gikno�qsttsstv�wy|�~������������������ ��������������������������|{y{wvsqqolki�g�i gfddba^ZYVTQ�OMJJIGE�D EIIGGEEDDEEGIJ�L�MOR�TVWTRQOJGEE�D�E�D�BA?<�:�8 75420//--,*((�*�(,/257�8<=ABGJQRVWYZZ^^�_ abfgikkloqqooq�svw�y�wy~�������������������������������������������������~|{{ywtsqolki�gi�kiggfda^\ZWTQOOMJIGED�BDEGGEEDBAABDEGILM�OQTVV�WVTROLIG�EDBAA?<�:877�5420�/�-,**((''(,/257:<<=?BDGJORVY�Z\�^
_aabdfgklno�q�o�qstw�y{~����������������������������������������������������|{ywvtsolkigg�i�k�l�kigb__\YVROOMJIGEDB�D�E�D
BA??ABDEGLO�QRVVWYYZZYYWVTOMJI�EG�E�G�E�DBA?<�:�87442�0�/-,**(('((,/257<�=ADDGJORVYZZ\\^^\_abf�gklo�q�o�qsvy{{�y�{�~ �������~~�����������������������������������������~{ywwvtqnkigg�i�kl�nlifba^ZWTQOMLJIEDD�EDBA�?�ABDGLOQ�R�T�V WYZ\^\ZZYVQOMJ�GI�G�IG�EDBA=<�:�<8�5�42�0/-�,
*((**,/258<�=
ADEILORTWYZ�\^_dg�iklo�qsvy�{�|�~�������~���������������������������������������������~|y�wtqnkiggi�g+iknqqonlgfd_\YVRQMLJJGEDEEGGEEBA?=??A?ADGLOR�T�V WY\^_^\\ZWRQOL�IJ�G�I�GIGEB?�<�=�?
<8875577542�0/--,�*�,/047:<=??BDGJMORTWY�Z\_dik�iko�qstvyy{|~~��~~�������~�����������������������������������������~{yywtqnlk�i�gilossqonkifa^ZYVROMLLIG�E�GEDA?�=�?ADGLORTVV�WYZ^�_^\YVRQM�J�I�JIGDA�=�?�A
?<:8778:854�20/-�,-/2457:<=?ABDGJMORTVW�YZ\_dg�ikno�qstvvwy{~���������~����������������������������������������������������||{wvsonl�knossqqonkgb^\ZVRQOMMJIG�EBA?=�< =ABEJMRRVW�Y�W�YZ^_a_�a^ZWTQML�J�LJIGDB�?�A�BA=�:<875�420/�-/04�5 8:=?ABBGJMORTT�V WYZ\_bfggiikno�q oqstvvwy|�����������~������������������������������ �����������������������|ywvsonll�noq�sqolid_^\WTRRQOLJIGEDBA??=<�:=ABEIMQRV�Y�Z\_�a�b_\WTQOM�L�MLJIGEDB�A�BA=�<8�752�024�5 78<?AABEILMQ�RTWYZ\^_bdfgiknoqssqoqsstvw{~���������~~�������������������������������������������������������~{ywso�n�q�s�tsqnkfa_\YWVTROLJIGDBAA==<<�:<?BEIMQRV�YZ\^\^_a�b_\YTRQOMMLLM�OMJIIGGEDD�BD�BA?�=<:8�7�854�245�7 578:=AABDGJMO�QRVYZ�\_abdgiloqssqoqsstvw{�~���������~~��������������������������������������������������������~|ytqooqs�t�vtsolgda^\ZYVRQMLIGDBAA=�<�: <?BGJMQTVWWYZ^�_a�ba^ZYVTRQOOMMO�QOL�JIGE�DBA?==<:�8:<<:7�57�8�7
8:<?ABBDGLM�OQRTW�Z\^abfgknqssqqsttvwy|�~����������������������������
��������������������������������~{vsqqstv�w�v�wtsqnkgba_^ZWTROMJIEDBB?�<�:<=ABGJMQTVWWY\_�a_\ZYWVTRQQOOQ�TRQMM�LMLIGEE�DBA?==<<�:<=�?<:88:<::8778:<==?ABDIJMM�OQRTWWYYZ^abdfiloqsqqsttvy{�~�������������������������������������������������������������������|yv�tvy�{y�wvtsqnifdba^YVTRQMJGEEDA=�<=?BDGJORTVWWY\_aa�ba�_^\ZYWVTT�RTWYWVRQQ�OMLJIG�EDBAA??==�<=?A�B A?==??=<:878:�<=?ABEILM�OQRTVWYZ^abdfiklo�q stvw{|~~��������
��������������������������������������������������������������~{y�wy|�~|y�w*vsokigfda\YVTROLIIGED?=<<==?ADEILORTVWWY\^a�ba_^�_^\YWVVT
VTTVWYZZYWT�R QOMLJIGGEDBBA�?�=?AD�EDBABDDB?<:788::<==?ADGIL�O�QRTVWZ\_abdgikloqstvwy{|~���� ����������������������������������������������������������~�|~��~{�y0wtolkigfda\YVTQOLJIGEB?==?ABDEGILORTVVWYZ\_bba_^^�_^\YW�V�WYZ�\ZYWVTT�V TRQOMLJIGEDDB�ABE�GEDEGGEB?<�8
:<==?ADEGJM�O�QRTVWZ\^_abfgiknqstvwy{|~�����������������������������������������������������������������������~|�{ywtonlkgffb_ZWVRQMLIGEDA?ABDE�GIJMQ�RVWWZ^ab_^\\^__^\ZY�W�YZ\\�^\ZYW�V WVTRQOMLJJIGEE�DBDG�IG�I0D?=::88::<<=?BDGIJLMMOOQRVWZ\^^_bfgiknoqstvy{||�������������������������������������������������������������������������������~||�{ywtqonligfda^ZYVROLIGEEDBDEG�I�GILO�QRTVY\_a_^\\^_a_^\\�Z�\^__^\ZYWVVWWVTRQO�MLJ�IGEGI�JIEA?=<�:<=ADG�IJLMOQRVY\�^(_bfgiknoqqstwy{|~������������������������������������������������������������������������������~||�{ywtqqonkigfba^ZWTQMJI�G EGGIJJIGGILOQQOQRTWZ^__^\\^_a__^^�\�_�^_aa_^ZYWVVWWVTRQQOQQOO�M�LJIIJ�LJIEBAA=<�:<=AD�GIJLOQTVZ\\^^adfgiloqqsstvwy|~���������������������������������������������#�����������������������������������������~|�{ywvsqoonligfda\YVROLJ�IJLLJIGILOQQOQRTWZ^�_�^_�a�_abba__�a_^ZY�WVTR�Q�RQ�OM�L�MJGEEDB?=�<?BE�GIJLORVWZ\\^_bfgiknqss�tvy|�~�������������������������������������������������������������������������������|{{y�wtq�o nkiggd^ZVROML�J�LJIILM�OQRTWZ�^_�bbddb_�a^\ZY�WVTTR�QRTT�VTRRQQOM�L�OMJ�GEDAA?�=�<?BE�GILORTWZ\^_adggiloq�s�tvw{�|~���������������������������������������������������������������������� ���������~||y�wvsq�o nlkifa\WTQOM�L�M LJJLLMMOQRVY\�^�_a�d�f�db�a�_^ZYWWT�R�QRTVWW�YWVTTRQMLM�OMJ�I#GEDDBA??==?BEGIIGGILORTWZ^_adgiiknoq�s�t�vw{�|~���������������������������������������������������������������������������������~|{ywwvts�q
onlid_ZWTRO�M�OM�LMOQRVY�\^_abbd�f�g�db�a_\ZYWTR�QRTWZZ�\ZYWTROMM�OMLJJIGGEGEDAA??ABEG�I�JMORVY\_abfillnooqs�t�vw{�|�������������������������������������������������������������������������������������~|{ywvvt�s
qonkgb^ZYVR�Q�O�QOMMLLMOQTWYZZ\^abdd�f�g�fdb�a_^\ZYVR�Q�RTVY\^�_\YVTRQ�O�QOMLJJ�IGEDBAABDEGIJLMMOQTW\_abfgkno�qst�v wy{||~����������������������������������$���������������������������������������������������������~|{{ywv�t
sqolida^ZWT�R�T�R QOMLLMORVW�Y\^ab�d�f�gi�gfd�b�a�_�^\ZWT�RTVWZ^_b�d�b_ZWVTR�QOMLJ�LJIGED�BDEGIJM�Q RVW\_bdgkloq�stvv�w y{{||���������������������������������������������������������������������������������~~|{yw�v
tsonkgda^ZW�V�WVTRQOMMOQTWYZYY\_a�b�dfgi�igfddfdba_�^\ZWV�TVWYZ^adgigfda\YWVT�RQMLL�MLJIGE�D�EGILORTTVWY\_bfilnoqstv�wy�{
|~||~�������������������������������������������������������������������������������|{�y wvsoonlida^\�Y�Z
WVTRRQQRTWY�Z\_a�ba�b�dfi�igfddffdb_�^\^^\YW�VWYZ^bfgkigda^ZYWVVTT�RMLL�M#LJIGEDDEGGIJMQTVVWYZ^_bgklnostvwyy{|�~��~�������������������������������������������������������������������������������~�|{wt�qolifba^\\^\\^^\ZYWVVTTVYZZ�\^_bddb�a�b�dfg�ig�f da__^\\^\ZYY�W Y\_bfgiigda^\Z�YWVTTRO�M�L"JIGEEGIJLMQTVWWYZ\_adgklnqtvwy{|~���������������������������������������������������������������������������������������������� ~|yvtsqqonkgfb�a�_ ^\\ZWWVWYZ�^�\^_bdd�abd�f�i�g�fda�_�^�\�Z�YZ^adg�igfa^^�\YWVTROO�MLMLJ�IJMOQTVWYYZ\^abfgkloqtw{|~�����������������������������������������������������������������������������������������������|ywts�qonligfd�ba__^ZYYZZ\_aa_^^_abdb�abdfggff�gfddbb�a_^�\�^�\
^abdgiiggfb�_^\ZYVRQQO�M�OM�LMQTVWYZ�\^_bfiiknqsty~���������� ��������������������������� �����������������������������������������������������������������|ywvs�tqolkg�f
baa_^\\^^_a�b�_abbdbaabddfggfd�f�g fddbdbba_\ZZ�\ ^_^^_bddfg�fdbaaba__^\ZWTRRQ�O�QO�MORVYZ�\�^$_abdgklnoqtw{�����������������������������������������������������������������������������������������������������|{y�w�ywvsol�kifdbba�_ab�d�b�d�fd�dfggf�da^ZYYZZ\^�_ab�d�b�db�a_^ZWVVR�Q�R�QTWZ\^�_abffgiloqqsv{~������������������������������������������������������������������������������������������������������~�|�~|ytqnnlligffddbaabb�db�ab�d�fb�b dfggfddfddba^Z�YZ\^�_�b�d�fd�f�d�b
a^ZYWVTRRTV�T�VY\^_�a�b,dgkklnqsttwy~���������������������������������������������������������������
��������������������������������������������������~yvsqoonlkiggfd�b�db�ab�db�bd�f
dba_^\ZYYZ\�^_�abdff�g�fdb_\ZYY�WY�WYZ\^_ab�d*fgiloqstvvwy|~��������������������������������������������������������������¾����������������� ��������������
������������������~{wvttsqonlkigf�dfdb�a�d�b�aba�b�f�dfggfda^\\�Z�YZ�\�^_adfgiigg�ikiigfa_�^�\�Z\^_aabdfggikloqtvwy{{|~���������������������������������������������������������������¾�������������������������������������������������������~|�{yvtsolkkg�f�d�f dbbaabddba__aa bdffddfggfb_\�ZYWWY�Z�\ ^_bfgiiggi�k�lkgd�b�dba__ab�dfgiklnoqtvw{|~~�������������������������������������������������������������������������������������������������������������������������~{wtqnllg�f�d�fdb�a�dba__aabdffdd�fb_^�Z�WY�Z \^adfgiggi�k�l<nlkgffggiigfdbdfgiikklnoqstwy|~�����������������������������������������������������������������������
����������������������������������������������������~{vsonli�g�fdb�a�b�ab�da^\ZZ\\ZY�WYZ\\�Z\^abdf�gi�kl�nlkiklnnlkigikln�oqstvwy|������������������������������������������ ���������������������������������%�����������������������������������������������������|wtqonkiigffgfgdb�abaa�b�b�da^ZYZ\\ZY�WYZ�\�Z\aabf�g�i�k
lnoqonlnoqq�o�n�qs�tvwy{|���������������� ���������������������������������
������������������������������������������������� ���������������������������~yvsqonlki�gfd�b�a�b�d�b�a�ba^ZYYZZY�WYZ�\�Z\_abf�gikklnqss�q�s�t�vw�y�{ |~�������������� ���������������������������������������������������������������������������������������������������������������������|yvs�olki�gfdbdd�a�b�ddb�a�_\Y�W�VWYZ\\�Z^_adfgffggiklns�tv�w�y{|�~���� ��������������������������� ��������������������������������������������������������������������������� ��������������������������~{wt�qolkiggff�d�b�d dbaaba_^^\ZYW�V�TVWYZZ�Y�Z\^_bd�f�g iklostvvwy�{�|~������� ���������������������������������������������������������������������������������������������������������������������������������������������|yt�sonkggff�db�dfddbd�b_^\ZZYWV�TVWYY�WZYZ\^abdfgiiklnosvwyy{�|�~�������������������������������������������������������������������������������������������������������������������������������������������������|yv�tsokig�f�df�gfdb�b�d�ba^\ZZYWV�T VWWVVWYYZ\^_adgikklnoqtwy{{|~||~��������������������� ������������������� ���������������������������� ������������������������������:�������������������������������������������������������~ywv�tokigff�g�i�gdb�b�d�ba\�Z�YWVTTRRTRRTVVTVVWWYZ\_adgk�lnqtvy{�|~|~��������������������������������������� ����������������������������
�������������������������������������������������������������!�������������������~{yyvttsnkiiggi�ki�gfd�ba_\�ZYVT�R�T�VWYZ\_bfik�losvwy{|�~�������������������������� ���������������������������������������������������������������������������������������¾������&�����������������������������~||{wtsqnk�ik�l�i�gfd�ba_^\�Z�\ZWVRRQQR�T�VWZ\^adgkkllnqsvyy{~���������������������������������������������������������� �������������������������������������������������������������������������������������~|yvsonl�k�l�kigfdd�ba_^\�Z�\ZYWVTRQQR�TVWY\^_bfikklnqstvy{|�����������������������������������������������������������������������������������������������������������������������¾��������������������������������� ~{wtqonllkklnn�lkligfddbdda_^\�Z5YWVTTRQQRTTVVTVWY^_abfgklloqtvwy|����������������������������������������������� ������������������������������������������������������������������������������������������������������� ~|yvsqonlkklnn�lkigf�d
ba_^\ZYWWVT�R�QRTVWWVVWZ^abbdfilnoqtwy{~�������������������� ������������������������ �����������������������������������������������������������������������������þ���� ���������������� ��������������~~{yttqolkklln�l�nlkigf�d ba__^ZWVTRQO�QRTWY�WYZ_bdbdfglnoqty{|����������������������������������������������������������������������������������������
�������������������������������� ��������½�� ����������������
������������� ��~~|{wvso�l�nlkigd�ba__^ZWTROMMOOQQRTVWYWWYZ\_b�d fgknosvy|�������������������������������������������� ���������������� ��������������������� ���������������������������������� ��������½����������������������������������~~||ywtolln�l�nligfb�a_\YWTQ�M&OQQRTVWYWWY\^_bfddfgknosvy|�������������������������������������������������
������������� ��������������������������������������������� �������������� ��������¾��)�����������������������������������~||{wtq�n�lkgfdba__aa^ZYWTQOOMMO�R
TVWYWWY\^_b�fgiknqtw{~�����������������������������������������������������������������"����������������������������������������������������������������������������������������~|{{wtqo�no�nlkkifd dba__aa^ZYWVRQ�OQ�RTW�YZ^_bfggiklnsw{~����������������������������������������������������������������������������������������������������������������������������������������������������������������������~|{{yvsqonoqqoqqonkigfd�dba�_^\YWVTRQQ�RTVY�Z\_bfgiklnoty~��������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������
��~||ywttqo�q�soligffd�da__�^\YVTTRRQ�RTVVYZZ\\ZZ\^bfgiklnoty~�������'������������������������������������������������������������������������������������������������������������������������������������������������������������������������~{ywvs�q�solig�ffda__�^\YVTTRRQQRTVWWYZ�\^adfgikloty~���������������������������������������������������������������������������������������������������������������������������)��������������������������������������������������~|ywtsqoq�sqligfgggda__�^\ZWTTR�QRTVWWYZ\\�^\^_bdfgiloty~������������
������������� ����������������������������������������������������������������
�����������������������������������%���������������������������������������������~{wvtqoq�sqnk�ggfbaa�_^\YVTRQQRTVVWYZ\�^�_abfgiloty������������������������������������������������������������� ����������������������������������������������������������������������¾���������������������������������� ��~|yvtqoq�sqnk�ggfdba__a_^ZWVTTRTTVWYZ\^_�^�_abdfilqw|������������������������������������������������������������� �������������������������������������������������������������������������¾�������������������������������������~|yvtsqqssqolig�f�fdb�a_^\Y�W�VWY\^^_a_�^�_abdfint{������������������������������ ���������������������������� ����������������������������� �������������������������������������������¾��������������������������������������~{wvt�sqnkigffdd�babba_^^\ZZYYWWYZ^_abba_�^�_abdfkov|������������*����������������������������������������������������������������������������������������������������������������������������������������������������������~����~{wvt�sqolkigffdb�a�ba_�^\�Z\^abddba�_�a�bdglqw~����������������������� ������������ ����������������������� ����������������������������������������������������������������!���������������������������������~�|~��~��~{ywvssqonlkkigffdb�a�b�a�_�^�\Z\^ad�f"da_aabbdfinsw~������������������������������������&����������������������������������������������������������������������������������������������������� ��������������������������������~�|�~�|�~|{ywtqnlk�ig�fdbaaba�_^\\�^�\^_adfggfb�abdfilqtw|������������������������������������������������������������������������������������������������������������������������������������ �������������������������������~|�{|~~|{{�|{ywtqlig�f�gfdb�a_�^�_\ZZ�^_abfgiigd�abdfknsvw|��������������������� ������������������������������������������������������������ ����������������������������������¾������������ ������������ ��������������������~|�{�|�{ywtokgf�dfggfdbba_�^\ZZ\^�_abdfgiigdbaabfgkotwy|������������������
����������������� ���������������������������������������������������������������������������������������
������������� ���������������������~~|{y�{yw�ywvsnigd�b�d�f�db_�^"\ZZ\^aabbddfgiigfdbabfilqvy{|���������������������������������������������������������������������������������������������������������������������������������������������
���������������������~{yyww�v�w
vtsoligdaab�d�db_�^�\^_bd�fgig�fdbdgknswy{|�������� �����������������������������������������������������������������������������������������������»���������������������������������������������~{wwv�t sqolifb__a�b�b_�^�_�^�\^_adg�i�g�f)dfgkosvy{~��������������������������������������������� ��������������������������������������������������� ������½���������������������������������������������~|{wvt�s�qonkgda�_a�ba�a_�^�_�^_abfi�kigg�f�giloqtw{~�����������������������������������������������������������������������������������������������������������������������������������������������������~~|{ywtsoqqsqqoonnlkifb_�^_�ba�_a_^\\^^__^^_adg�k�l�i�g�i�knoqtwy~������������������������������������������ ������������������������������������� ���������������������¾������������������������������������������������ �~|{{ywvsonno�qonkiggfda^\\^_abba�_^�\^_a__abfi�klnnl�k�lnoqsvwy|������������������������
����������������������������������������������������������
��������������������þ������������������������������ ������������������~#�����~|ywwvttolkklnoonlifddba_\ZZ\^_�a_�^�\�_a�bdfgikllnn�l�klnnoqstvwy|���������������������������������������������� ���������������������������������������������$����������������������������������������������������������~||~|�{|~~||{ywvvtsqnk�ik�lkgdba_^^\�Z\�^__^�\^__ad�fgik�l�klnnoqstvw{|~�������������������������������������������������������������������������������������#�������¾�������������������������������������������~|{yywywwvvwy�{ywvvtsqolifggik�ifba_^\\Z�YZ�\^^�\�^_bdf�gikk�l�k�iknnooqstw{|~��������������������������������������������������������������������������
���������������������������������������������������� ���������~|{w�v�t�stvwwv�tsqonkgdfgiigffda_^^\Z�YZ�\�\�^�\_bdfgikll�k�lkiiggil�noqsvy|~��������������������������������� ������������
��������������������������������
�����������������¾���������������������������������� ��������|{wvs�qo�q�oqssqoqqonlkgfdd�fdba_�^ZY�WY�Z�\�^_�\
_abfiklnlkk�igffdfgk�l�oqtvy|~���������������������������������������������������������������������������������
������������������������������������������������ ������|{ywtqon�l�n�lkgf�d�ba^�\Y�W�YZ�\^_^�\^_bgklnnlkigffdd�bdfikklnnoqsvy|�������������������������������������������������������������������������
���������������������������������� ��������������������������~{w�tolk�ig�i�g�igdb�a�_�^Z�YZWVVWW�Y�WY�Z\^_^\ZZ\_bgklnnlkgfddbbaabdfgi�k+lnosvy|��������������������������������������������������������������
���������������������������������þ������������������������������������� ������|yvs�olig�f�d�bd�f�gfdba_�^\ZYWW�VW�VWYZZY�W YZ\^_^\ZZ\_bgk�lkifdbb�abdfgikk�iknosvy~������������������������� �����������������������������������������������!������������������������������������%�����������������������|{wtqnlkkgfdbaa�_^__aab�dba_^^�Z�\YWVT�R�TWYZ\\ZYWW YZ\^^\\Z\\_afi�k�gfd�a:bdffikkggfgklosv{���������������������������������������������������������� ���������������������������������½�������������������'�����������������������|yvsolkigfdba_^^\�Z�\�Z
\^_aa_^\\ZZ�YWVRQ�OQRTWY�ZYWWYZ\^^�\�^_adgiig�fda�_abdfikigfddgknosw|���������������������������������������������������������� ����������������������������þ������������������(����������������������~{wtqnkgffdba_^^\ZY�WV�WZ\^\ZYWW�VTRQML�MOQRV�WWYZ\�^_abdfggf�db_^�\^_bfgifd�b dilnqw|������������������������������������������������������ ���������������������������������������������������~����������������~���~{vsolkgd�ba^�\ZWV�T�R�TWYYWVVTT�R�T�R QOLJLMMOQR�TVWW�WYZ^�_a�d�f�dba_^\�Z\^adffdbaabdgknsw~������������������������������������������ ������������������ �������������H������������������������������������~||{{|~�������������~||{||~~{wsokigda�_^\�ZYWTRQQ�OQR�T�R�QOQQR�Q OLJIJLMOQQ�RTVW�W
YZ\__abbdff�d�ba_^\�Z�YZ\_b�dbabdfiloty~��������������������������������������� �������������������� �������������&������������������������������������|{{�y
{|~����������~|{�y�{
yvqlgfda_^\�ZYWVVTROM�LMO�QOMM�O�QMJ�IJM�QRVW�WYZ\^_b�d�fd�ba_^^\�Z�YZ\^abddbbdfgknqvy~������������������������������������������������������� �������������&�����������������������������������~{yy�wy{|�������~~||{yw�y vsnida_\\Z�W YWVTRRQQML�JIJL�M�L MOOLIGGIJM�QRVW�W YZ\\_bddbdfd�ba_^\�ZYWWYZ\_b�dfgikoqtw|������������������������������������������������ ��������������������������������»������������������|yww�vwy|~��~|{yy�w�ywtokfa^ZYWVTTVVTRQO�ML�JIGGIJ�L�MLJIIJLMMLIGGILO�Q�RTVW�W YZ\\^abbab�d�ba^\ZZY�WYZ\_bd�fgikloqsv{~��������������������������������������������������������������������������½��������������������|ywv�t�stvwy{{�|{wvvtvw�y+wtnid_\YVTRQQRRQOMLJJLLJJIIGEEGIJJLLMMLIGGIJ�L�IJMOQRQQR�T�VVWYZ�\_aa_ab�dbaa^\YY�WYZ\_bfg�iknooqstw{|���������������������������������������������������� ����������������������������¾����������������������|ywvtts�qsttvw�ywt�stv�w vsngb_ZWTQ�O�MLJII�JI�G�EGIJLLMMLI�G
IJLLJJLLMOQ�RT�VVWYZ�\^�_a�ba_^\Y�WYZ\_dgi�k#loqqsttvw{~��������������������������� ���������������������������������������������*�������¾��������������������������|{wvttsq�o�q�st�vsqooqtvvtsokfa^YTQM�L�MLJJI�G�EGJLLMML�G�I�J�LMLLOQRRTV�W�VVWYZ�\�^_aabda_\Z�W�YZ\^adgk�ln�q,sttvwy|��������������������������������������������������������¾��������������� ����������������������������������~|yvttsqonn�oq�sqo�n qssonkgda\WROL�J�LJ�IGE�D�E�DEGEEG�J�LJ�G�I�J LMMLLMOQRV�W�V�WYZ\�^ _abdb_\YWWYZ�\ ^_bfikllnoqqst�vwy|������������������������������������������������������������ ������������� ���¾���������� ������������������~|{wttsqnllnlkl�n�lnonligdb_ZVQMLJIILLJIIGE�BDBDE�GIJ�I�G�I�JL�M�LMORTV�W�Y�Z\�^_abdb^\�YZ\�^_adgk�lnqstvvwwyy{~����������������������������������������������������������¾��������������� �������������� ������������������~|{yvtsqnlkkigi�k�lkifdba^YTQMLJIIJJ�IEB�ABDEGI�JI�G�I�JL�M�LMQRTVV�W�Y�Z\�^�_abba^\ZZ\\^^__abfi�lnqtvww�y{~����������������������� ���������������������������¾����������� ����������������!�������������������|{ywvsqlkggfdfg�i�g�igfdba^ZWRQLIIGGIGEGGDA�?BDEGJ�LI�G�EGIIGGJJLM�LOQR�VTVVWYWYZ�^_^^_abba^�\�^_abdgikl�noqtvw�y{~����������������������������������������������������������������������������������������������������������|ywwvsolifdbbdfg�igff�g fdba_\WTQOJG�EDBDDB?�=ADEGJ�LJIGGEEGIIGGIJLLJJ�LMORTT�RTV�WY\�^�_^\^_�a_�^�_!abdfggiknooqstvwyywwy{~���������������������������������������������������������������������������������������������~|wvvtsnlidbaabdg�i�fdba_^ZVQMLIGDBBA??AA?�<=?ADEIJLLJIEEDE�G�IJLMMLMM�Q�RTVWY\\�^_^�\^__�a_�abf�g ikloqsttvwyy�wy|������������������������������������������������������������������������������������������~|{wvtsqnlida_abdf�g�fdba_^\YTOLJIGDA?=<<==<�:<==?ADGIJJIGEDD�E�GIJMOO�M�OQ�RTVYZ\\^�_^�\�^_abb�d fgiiggiklost�vwyy�wy|�������������������������������������������������������������������
�������������������������~{yvtsqonkgda_aabbf�dfddba_^\ZWVROLJGEB?=�:�8�: <==??BDGIJIGG�D�E�GIGGIJMOO�MOQTRRTVYZ\^_�a^�\Z\abd�f�g�iklnqstv�w y|������������� ����������������
����������������������������������������
��������������������������~{wvtsqonkgdb�a�bdfdba_\ZYWTRQOMJEBA?<�8�78�:<=�? ABEGIIGGEDBD�EG�IJ�MOR�TVWZ\^_�a_�^\ZYZ_bf�gikk�i�klnqsttvwyywwywwy~���������������������� ������������������������������� ������������������� ����������������/�����~{wtsqonnkigfbaa__aabdfdba^ZYWVRQOOMJDA?=:8�7�578::<=�?�A�DEGEEDD�BEG�IJL�MOQRTTVV�WYZ\_�a�_^\ZWY^adggikllkiiklnost�vwy{yw�y{������������������� ����������������������� ������������ �������������������������������������~{wtsqonnlkigdba�_ab�dba^ZYVTQOMMLIDA=<:8�7�578:<�=�?�AB�D�B�ABDGIIJL�MOQQRTVW�WYZ^�_
^\ZYY\_bfgk�l�kloqsv�wy{{yy{|~����������������������������������������������� ������������������������������������� ������|ywtsq�olkigfba�_a�ba_^ZYVRQOLLJGDA<:87�5�4578:�<=�?�AB�ABEGIJLM�LMOOQRTV�W�VW\�^�_�^\�Z^_bfgikll�k�loqstvw�y�{|������������������������� ������������������������ ����������������������������������
������|ywts�qoliggfba�_^\YVRQOLJIGDA<8775544�2 4578::88:<�=�?�=?�ABDEIJ�L�JLMMOQRT�V�TVY�Z\^^�\�^_abdfgi�k lnnoqsstvy�{|~���������������������������������������������������������������������������������������������|ywt�s qoliggfdba__�^�_^\YVTROJIGEDB=:77554200//0245�78:<�:<::=�?=?BDGIJ�L�J�LMOQQ�TRTVWWYZ\\ZZ\^__�a,bddfikllnonooqsttwy{||~���������������������������
������������������������������������ �������������������������� �����������~|yvt�sqnlkgfddba__^^\\^�_^ZWVTQLIGEDB?<8755420/�-/02�4578877�8:�<=ADEEGJ�L�JLM�OQ�RTVW�Y�Z\^_aa__abbdfiln�oqsttvw{~���������������������������������������������������������������� ���������������������� ����������������~|{{wttsqqonlifdbba�_^�\^�_ \ZYWTOLIEBB?<8�7540/-,,--�/ 0255445778�:<?BDDEI�LMOOMOO�QR�VWYZ\^�_ ^__aabdgkl�o�q�s�tvw{~������������������������������������ ������������������������������������������������������~������������~|ywvttso�n
lifdba__aa_�\^�_�^\ZWTOJEBA=<:8::8520-�,�*,-0�2457�8:<=ABBDG�JLMM�L�M�LM�OQ�TVYZ\�^�_abfgknoqs�t�vwy|~��������������������������������������������������� ����������������������������������~���������~{wv�t qnlkllkgdba__�a�^_^�_ ^\ZWRLEB?=�<:852/-,**('%%''(*-�/0245�78:<=AABEIIJJLMOMLJLJ�I�J�LMO�RVYY�Z�\�^�_�adfglost�v�wy|~������������������������������������������������������� ������������������������������~���������~{wvttsolkiikkifb�a_�^�_�^\YTMGB?�=�<:740-*('%$""$$%'*�,�-/0455788:<?ABDEGIJLMOMLJIG�G�I�JLMQQRV�WYZ�\^_�abdfkot�v�w
y|�����������
���������������������������������������������������������������������������~~�|��������~{wtssqnlkigiigd�b�a�_^\\^\^�_�^\YTMGB?==?==<<:74/,'%$" � "%�(*,-0�4578:<=?�B
DGJLLMLJIGE�EGIIJLMOQT�VWYZ�\^_�abdfinst�v�w y|�����������������������������������������������������������������������������������~~||�{|������ ��~{wtsqonlki�gf�d
ba_^^\ZZ\\^�_^\ZWRLGBA�?=<:8740,(%$  $�'(*-0�4578:<=?�ABEI�JIGED�DE�I
JLMORTVVWYZ�\^_�abdfinqs�t
vwy|����������������������������������������������������������������
���������||�{|����� �~{wtsqnlkig�f�d�f
da^\\ZYYZZ\�^\ZWTOJIDA?A?=<752/-*'$"�"�%'(,/44�58:<=�?ABE�GEDA�ABDGIGIJLMOQTVWYZ\\^^_�abdgknoq�s tvwy|����������������������������������������������������������������������������|�{�|~������� �~{wvsqnligff�d fggfda^\\ZYY�Z(WTQMJIEBAA?=:52/,*('$ "%%$%'(*-24�5
8<=??==??AB�DBA?�?ABEGGIJLMMORVYZ\\^�_abbdfilno�qstvwy|��������������������������������������������������������������������������
������~��|{�y{�|~�����~ywvsqnli�f dfgigda^\Z�Y�Z�Y!ZYYVRQMJIEDBA?<840-*('%$ "�$%'(*/24558<=??=<==?�A?==�=/ADEEGJLMMORVYZ\\^__abddffillnoqqsvwy{����������������������������������
�����������������������������������������������~|{ywwy�{|~�����~|ywvtqoli�f�g�fgigda_\Z�Y�Z�YWVTRQMJGEDB?=:74/,*('%$ �"�$�%'(,/2458<=??=<<=??�=�?=<<�<?BDEGJLMOQRVYZ\^^_abdf�giklnoqstwy{~���������������� ���������������� ����������������������������������������������~�|{yyww�y�{|���~||{ywvtqoligff�g*fggfba_^ZYYWYYWWVTRQQOLIEEDB?:740-,(''%"�"$�% $%'*-0458<=??=�<=<<:::<<?BEGIJLMORRTWZ\^_bdfgg�i�klnoqtvy{~������������������ ������������������
����������������������������������������������~|{yy�w�y�w�y{~��� �|{yywvtqnkig�f�g�fda__^\ZY�WVTRQOMMLJGEEDA=852/-,('%$ �"$�%�$%(,/258<�=�<�:�<�::<?ADGIJLLMORRTWZ\^adfg�i�k�lnoqsvw{|�������������������� �����������������������������������������������������������~�{yvvttvwyy�wy{|��� �~{{ywwtsolkg�f�d%b__^\\ZYWWVTRQMLJLJGEEDB=<852/-,(%$"��"�$%(*-047:�<�:�<<=ABEGIL�M ORTVY\^_adfg�k�loqqsvy|~���������������������� ��������������� ������������������������������������������������{ ywvttsstvwwyy�wy{|~��~|{{ywvsonkifddffd�b&a_^\ZZYWWVRQQOLIIJIEDDB?<:852/-,(%" � �" $%'(*-/2578::�8:<<�:<==?ADEGIJM�OQRVY\^a�bdgk�lnqsstvy|~��������������������� ����������������������¾��������������������������������~|wv�wvs�q stvwy{yywyy{|�~�| {ywtqnkgfdbbdb�a�_&^\ZYYVTTRQOMJIGEGGEDBA<::8540/,(%" � $%'(*--/24�578:�<�:=?ABDGGIJMO�QRTWZ^_b�dfgklnllnosttvwy{|��������������������������������������������&������������������������������������~{ytssttsq�o�qstvy{{y�w�y{�| {ywtolifdbbaa�_�^\ZYWVTRQOMLIGEE�DBA=�:8542/,('$"��  "$%(*,,-/0�2458::<==�<?BDEGIIJLOQ�RTWY\_bd�fgikl�noqtvw�y{|����������������������������������������������������������������������������~|yvtonnoqoo�n�oqstwyy�wv�wy�{�y!wvtokgdbaba_^^\\^\\ZWVTTRQOLJGEEBB�A?=<�8 7540-*('$ �� "%'((*,-/0024588:<??�=ADGI�J LORTVTVYZ_bdff�g�i lnnoqsvvy{�|�~
�������������������������������������������������#������������������������������|ywtqol�k�lnoqqst�vwyyw�vtsokgdb�a_^\�ZYVT�RQMJG�DA�?=<:87�5 42/,('%" ��� "$%%'(*,-/025788:=�?BEIJ�L MORVWWY\^adfgg�i kloqsvwwy{~���~������������������������������������������������������������������������������~yvtqnli�g�ikllnnooq�s�t�vwvvttsqnigdaa__^\ZYY�W"VTQOQOLGDBAB?=<<=:875424420/,'%$" ��� "$$%'(*,-024788<=�?ABEGJL�M OQRWYY\_abdfik�l kiilqsvy{yy{~���~�����������������������������������������������������������������������~|wsqnkif�d�fgkl�no�q�s�t�vtsqnkigda_^\\ZYWW�V TROMMLIEBA??=<�:87420020//-*'%$""  �� �� "$%%'(*-024578<=�?ADGIJLM�O QRTWYZ^abbdfil�n liilqtw{||{|~���~�������������������������������������������������������������������~~|{yvqnkigbaab�dgilnn�o�q�s�t
sonkiifda^\�Y�W VTTRQOMLLIEDA?�<:8775420/-/-,,*('%$""� " � " �� �"�$%'(,/24557:<==?BEGIL�MOQQRTTWZ\_abddfil�nliiloty|~~||~����~������������������������������������������!���������������������~|{{ywvqnkgfda__a�bfil�no�q�oqssqqolkiigdb_\YW�V TRQMLJJIEBA=<�: 854200/-,,*(''�%$"� � ""  �"�$%'(,/2�5
78<==?BEGILMOOQRRTVY\^_abdfgkl�nlkkloty|�~�����~���������������������������������������������"���������������������~|{yywvsnkgdba_^^�_bfk�l�n�o�n�o nlkigfdba^YVTT�RTQQOMJIGEB?=:87�8 7420/-,,*('%�$%$$"  � "$"� "�$�%'(*-02�5
78<==?BEGIJMQQ�R TWYZ\^aabfiln�o
nkkloty{|~~���~��������� ���������������������������������������������������|{ywwvtqlifba_�^adgik�ln�o�n lkkigdba_\WTRR�Q�O MLIEDA?<:755�7 520/-,**('%$�"�$" � "$%$�"
$%%'(*,-/24�5
7:<==?BEGIJMQ�R TVYZZ\^aabfiln�o nllnqtwy{|~���~������������� ����������������������������������������������~|ywvvtqnkgdba_\Z\Z�\_adgikkilooqonnll�n lkigfba_\YVRQQ�O�MJIEB?<:8854455420/-,*('%%$" � �"� �"$%'%�$�"
$%'(,--/045�7
8:<==?BDEIJMQ�RTWZ\\^_�bdgklnoollnoqtvwy{~��||~���������� �������������������������������������������������|{wvtsqligda__^Z�Y�Z"\^_bfgiggknoqqonllnoonkgfdba^ZWTRQQ�OMJGDB?<8�74245420//-,('%$$" �� � "�$%'('�%�$ %'*-/02457�8
:<<=?ABDEIL MOQRTVY\^^_b�dfgilnnlnooqstvw{�~�|~��������� �������������������������� �����������������������|yvtsolifda�^\Y�W�YZ\^adfgffglnoqonll�n ligfba^\YVTRQ�O�MLGDB?<854454244200/-,*'%%$"" �  "$$%'(*(('�%
$%'*-045778�:�<=??ABDEIJ
MOQRTVZ^_ab�dfdffgk�l�o�qstv{�|�{|�~���~����~�����������������������������$����������������������|yvsolifba_^\\ZYWVV�WYZ^_ab�dfikl�n�l kigfb_\ZWVTTQ�O MLJIEBA=85�2�42�0/-,('%%$�" � �"�$%'(�*(�'�%(,/25�8:�<=?�ABEGIJ MOQRTWZ^_b�d�fgikln�o�qstvy�{�y�{|�~�|~���~ �����������������������������������������������|yvsnifda_^^\ZY�W�V W\^^_aabdfgi�k*igdb_\ZWVVTROOMLIGEB?=<85200224420//-,*'%$%�"  �"�$�%�'�( *,,*(('%'*-057�:�<=A�DGIJL OQRTWZ\^_b�d�f�gik�nossttvw�yw�y�{|�{|~~���~�� ������������������������������������������������|ytqlgdba_^^\ZY�WV�T VYZ\^__abdff�g�i�g�igdba^ZYWWVTQMLIGEDA=<<852�02�4 2/-,,*'%$$�" � �"$%'�(*�, *('(,0478:�<�=?BE�GIJMOQRTWZ�\^a�bdf�gikllnost�vw�yw�vw�y�{|�~���������������������������������������������|ytokgdba_^^\ZYWYWWT�R
TVWY\^^_bbd�bd�fd�gdb_^ZYYWVTQLJGEDB?=<<852�02�42/-,*('%$�"���� �"$%(*,�*�,�*,/258::�<=?ABDG�IJLQQRVWZ�\^_aadfg�igiillnost�v�w
vtssqssvvww�y�{�|���������������������������������������������~{wtokgdba_^^\ZY�YWVT�RTWZ\^_�a�_a�bdffdb_^\ZZYWTOLIEDBA?==<852002�4�20/-*(''$�" �� �"$%(,�-�,�-/02478�:�< =?ABDEGIJLMORTVYZ�\^_adgi�k�iklnoqstvv�w�v
tqonnooqstv�wy{|����������������������������������������~|{wtqlifba_^\ZYY�YWTR�QRTVYZ�^\^^�_adfdb_^^\\ZYTOLIEBA?=<=<87442�4�2�0 /,*('%$""� "$%'(-//-,--//�045588�:�< =?ABDEIJLOQRTWYZ\�^�\^_bfgi�k�i giknoqstvv�wvttqnlkkllnoqsttvwy{|������������������������������������������~|{wtqlifba_\ZYWWYWVTRQQOOQTTVWZ\\�Z�\�Z�\^_bddba�_ ^\YTOLIEBA?=�<:8775544�2
/,*('%$"� �" $%((*-//--//02�4578�:�< =?ABDEIJMQRTVYZ\\^__^�\^adgi�ki�gilnoqst�vtsqnkiggiiklnoqsvwy{|~���������������������������������~{wtqlifda_\ZYWW WVVTRQQOOQTVWW�Y�Z
YWWYZZ\^abb�a _\YTOJGDBA?=�<�:8755�4
2/-,('$"� "$$%',*,-/0//0247�8788:<<::<�= ?ABDEGIMQRTVY�\^__^�\_bdgkllkigffggiknoqs�tsoligfddffgiklnqtwy{|~����������������������������������������|ytoligfa_\ZYWWVTTR�Q�OQRV�W�YW�VWYYZ^�_�a_\YTOJGDBA?==<<::<<:8�7 5420-*(%$ � "$%%'*�-/0�2458:<==�<�=�<=�? ABDEEGILORTVY�\�^�\ ^abdgkllkigff�gilnoq�sqolifd�bdfgilosvy{{|����������������������������������������|ytolkigb_^\ZYWTRQOO�MQRT�VW�V�TVWYZ�\^_a_^\ZWTOLIEBA?==<<::�<�8�:�8 7520-,*'%" �"$%''*--//0224458:<=?A�?�=�?ABDE�GILOQTWY�\Z�\ ^aabfkllkiifd�fgkkln�onlifb�a�b�d filotwyy{~�����������������������������������~{wtonkiida^\ZYVTQOMM�LMOQ�RT�VT�RTVWY�Z\^^\ZYWVTQOLGDA?�=<::<<�:�<�: 850/-,*('%$$�%�'(*-//02�457:<<=A�B�ABDG�IJMOQTWY�Z�Y�Z\^__adi�kif�df�gi�kigfda�_a�bdgilqtvwy{|~��������������������������������~~|ytsqnkiifb_^ZYVRQOM�L�M�O�QRTTR�QRTW�Y�W
VTRRQOLIEB?�=<::�<�:�=&<=:50/-,*(''%%''((**,/00224575578:<=?BD�EDBBDEEIJJLJJMOQTVW�Y WVVWYZ\\^^_bgi�kg�d�f�d�gfdbaa_^\\^abbdbdfgknqqstwy{~�����������������������������������~��~|{yvsqqnkiifba_\YVRQOM�L�MO�Q�O�QRTW�YWVV�TR�Q OLJGDA??==�<�=�<=�?<720/-,*�(�*,-0�2�4 578778::<?BDEG�IGEEGIIJLMMLLMOQRTV�V�TVWYZZ\^_adgkkifbbdd�b�a�b a_^^\\ZZ\_ab�d fgilnnoqtvy|�~�����������������������������~|�{�|{yvtsqolkigdba_\YVQOMM�L�MLM�O�M�OQRTVW�V�T�R�Q�OQOLJIEB�A?==�?�=?�A=8520/-,,�*�,-024424457:8:<==?BDEGI�L�JIGGIJLM�O�MQRRQRRTTRRTVWYZ\^^_bdggfbaaba�_�^\�^\Z�YZ\^^abddfggiklnosvw{{||�{�|�~���������� ����������~��~�����|{�y�{ywtsqqoliigdb_^\YVQO�M�LM�O�MOQR�T RQOOMMOOMLJIGE�DBA�?A�BA?<8540�/�-�,-/2455�4 57:<=?AABDEEGJ�MLJ�IJM�Q�OQRQOOQRRQQRTVWZ\^^_abddba�_^�\Z�Y�ZYWVVWYZ�\^_bdf�g
iknosvwyy{{�y�{|~��~~�� �����������~~�|~��~~|{y�w�ywvtqoonk�gda^\ZWT�OMOOMLL�JM�O�M�L�MOQ�R�T�R QOMLLMMLJI�GEBA�?A�BA?<872�0�/�-/24577�578:=AB�D�EGJM�OMLJIIJMO�Q�O�QOMM�O�QRVWZ^^__�a�_�^Z�YWV�W�V�TVWZ�\^adfg�i klnstvwwyy�wy{~~�|�{|~�������~|�{�y|~~||{yww�vtsonkg�fb_\ZYVR�OMLJIIJMOO�M�L�MOQ�R�T�RQOM�LJI�G�IGEDA?�=?A�BA=:854�20/045�78:<?BD�E�G IJMOQQOMLJJLO�QO�M�O�M�M�OQTVY\�_^\Y�WVTTVVT�RTWZ�\^_bfgi�klnqstv�w�v�tvwy{{�y�wy{~�����~|{�y�wy�{y�wvtst�vtqlifddb_\ZYVRQQ�OMJIGIJ�M�LJLLMLLMM�O�QOMLJ�I�G�JIEDBA?�=?A�BA?<:7544�5�24788�78:<=ADEG�IJLMOQQ�OMLMO�QOMLMOOM�L�L�M�OQRVVYZ�_\ZYWWVT�R�QRTWZ\\^\^^adfgikklnooqsvvts�t�v�t vw{|{||~||{{�w�v�w�vwttsttvvtqlgdba_^ZYVRQOQO�MLIGGIJ�LJIIJLMM�LM�O�QOMJIGGIJJIIJJIGDBA??�=?A�BA?<:88�7�5 788778:<=ADEGI�JLM�O�Q�O�Q OMLMOOMLLJ JLMMOQRVWWYZ^_�a�_ ^\ZYYWVTRQOOQQ�ORVYZ\\�^_bdfgikl�noqssqqs�ts�qstvwwvvw�ywvvtt�st�v�t qlgda_^\YVRQOOOM�LJI�G�I�J IGGILMMLLJLLM�O�M OQQOMLIGEGGI�JIEDB?�=?BDD�BA?=<�:87788:877�8:<?ADEGI�J�LM�O�Q�O�MLMOOMLLJ�J LMORTWYYZ\^_�a_^^�ZYWRQOMM�ORVY�\ ^\\^_abdgikkl�n�oqstt�so�noq�sqstvv�wvtsqq�oq�ts�t�s
okgda^\YWRQ�OMLLJJII�G�I�GIJLMML�JLO�Q�OQRQOMJGEE�GIJJIGDBA=�<=??ADEED�BA?�=<:88:<=<:�8:<=?BDEGI�J�LM�O�QOMM�L�M�LJ�JLMQRVY�Z\^�_
^\\ZZ\\ZWRO�M�ORVY�\ ^_abdgikkl�noqss�qonl�kln�o�noqss�tsqo�nos�t�s�t sqolifb_\YVTQ�O�MLJ�I�G�ILMLJJ�L OQRRQQRRQOMJG�E�I�EDBA=�<=??AEGGE�DB�A�?=�<=??=�<�=�A�DEGIJL�J�L�MOMOQQOML�J�L�J�JLMQRVY\�Z\�^
\ZYYZ\\YVRO�MO�QTWY�Z�\ ^_bdfgikll�n�l�noqqonnkk�i�k�l�kln�o�n�l�k�lnqstvssttqonkgb_\YVRQ�MO�MLJ�I�G�ILMLJL�MOR�TRQOMJG�E�GE�DBA?�=?AABE�GE�DBA�?�A�?�A�B�D�EGJLLJJ�L�JL�M�OMLJ�I�JI�GI�J LMQRVY\ZYY�Z�\ZYWYZ\ZWTRQOMOQ�RTVW�Y Z\^^_adfggil�n�l noonnoonki�g�i�g�iklnl�k�iklnostvt�s olkgd_\YVROM�LM�L�JI�G�E�G�ILMLJLMOOQTVWWVTRQOMJIGEE�D�BDBA??�ABDGG�IGEGGEDD�B�A�B�DEDEEGILL�J�IJ�L�MLJ�IJGG�EG
IJLMQRWZ\ZY�W YZZ\YWVYZZYVRQ�OQ�RTVW�Y�Z�^abdfiikn�o nllnnonnlnlif�d�figg�fgiki�g�i�giknos�t sqqnkgd_\YVRQM�L�JL�IG�E�G�IJLMMLLMOQRVWYYWVTRQMLJIGED�B�D�B�DBAA�BDEGG�I�GED�B�DE�G�E�GIJ�L�J�IJ�LJ�IE�DEGIJLMORW�ZYWVVWYZZYWVWYYWVRQ�O�Q�R�TVWY�Z \^abdfikln�on�l�n lkkigdbabdfggf�df�g�f�dfggffgilo�s qonkgda\YVRQOM�LJII�E�D�E�G�IJLMMLMQRTVWYZYWVTROMLJIGD�B�D�B�A�BD�GI�JGEDDBBDEEGGIIGGEE�GIJ�L�JIGIIJ�L JIGGIIGDBABBEG�IJMOQV�YWVTVWWY�W�VTQQ�OQRRT�V WYYZ\^aabfikl�n�l�k�igfdb�abdffd�b�dfdd�bd�fgikn�qonlkgd_^YWTQOML�JIGD�BD�GIJJIIJLMMOQRTVWYZZYWWVROMMLIE�D�BDGII�GIJ�L�MLIGEEDDE�G�IGEG�IJ�L�JIGIJ�LJI�GEBA?ABEG�I JLMORVWWVTTV�W�V�TR�QO�MOQRT�V WYZ\^__adgikll�k�l�kigffgfdbb�ab�d�b�d!ba__abbaabddfgilnonligfb_\ZWVRQMLJ�IGEB�ABDGII�JIJJLJIJLMOOQRTVWYZZYWYWVRQQMJGE�DEG�IJLL�M�QOMJIGGEDEIIGIJJIIGIJ�IJ�LJIJIGJ�L�MLJJIGGEDBA??ABDGIJJLLMOR�T�RT�V�T�R�QMLJJLOQRTTVVWYZ\�^_afggik�igf�bdbbaa__aa�d�a�b�a�_^�_�abdgilnlidba^ZYWVTROLI�GED�?ABDGIJ�L�J�L�JLM�OQRTVWYYWWYYWVTROLIGEDD�E�GI�JLMOQQRRQOLJIIGEG�I�J�I�J�LJ�IJ�L�ML�JIGDBA�?ABDGI�JLMO�QRTVVT�R�QOLJIIJMOQQRTVWYZ�\^_bddf�g�fda�_�a�_ab�db�a�_�^�_abfgikifa_^ZWVTTRQMJG�EDBA�<�=?ABEGJ�L�J�L�JLMMOQRT�V�W�Y�W
VTRMJIGEEGG�E�GIJL�MOQ�T�RMLJJIGII�J�IJLLJIJJLJ�I�JLMML�JIDBA�?ABDE�GIGIJLLMLMMOORTVVTRQRQ�M LIIGIJLMOQ�RVWY�Z\^_�abddbaab_�^\^^_�^�_a�ba�_�^\^_^�\^�_ab�fgfd_\YVTRQROMJGEDBBDA=< 8:<<=?ABDEIJ�L�J�L�JLMOQR�TV�W VTQMJIGGII�GIJLMO�QRT�V�TQMLL�J�IJLLJ�I�JI�G�IJLL�J
IEDBA??ABDD�D�EG�I�JLMQR�TRQQOL�JI�GIJLMOQRQQRTWYZZ\^__�^_aa_�^�\�Z\�^�_�^\Z\^^�\^_�abdd�ba^YVRQ�OMJGEDB�A=:8 58:<?AABBDIJ�L�J�L MJJIIJMOQR�T�W�V�WVROLJJIJ�ILOQQRR�T�V�W�VTROMML�J�I�J�LJI�G�EG�IGEDA�?ABBBD�E�DEGGIJMQRRQQOOLJI�G�E�GJLLMOOQOQQRVWYYZ\^^�\�^\�Z�Y�Z�\^a_�^�_�^�\�ZYZ\\ZZ\^�_�a�ba_^\ZVROM�LIEDA�?=:7557:=A�BDGI�JLMLJIGILMOQRTTVV�T
VWWVTQOMMLL�JLOR�T�VW�Y�WVTRQOM�L�JLJJLMML�JIG�E�DE�GEDA?�=?AB�DB�ABDDEGJMOO�M LJIGEEDBDGIJ�L�M�O�QRTW�YZ�\�ZY�W�VW�YZ\_a_�^�\^__^^\Z�YZ^__^^�_^\ZYWTQML�JIEB?�=<875 78:=ABBABDEG�IJ�LJ�G�J�MORRTRQRRV�WVRRQQMMLMLLMRTVWVW�Y�Z�\�Z�WTRQO�M�LMLL�MLJ�IGDDEDD�BDE�G�EBA?=�<=??�A?�=�?ABDGI�J
IGGEDBBDGII�JLMQOQRV�Y�Z�Y�WYW�VT�V�WYZ_a^\\^�\�^\^\YWWYY�WYZ\^�\ZYYWWVRMJ�I�GDA?�=:878:<?�A�BDE�GI�JI�G�I�JLOQQOOQRV�WV�T RQOOQOOQTVWYY�Z�\�^�\ZYVTR�Q�O�M
LJIGGEDDEED�BD�E�DB?=<<�:<=�= <::<=<<=?ABD�E�GEDBBDEGG�IJLOOQRVY�ZYWW�V�WV�T�V�WYZ^_^\\^^�\ZYWWYW�VWY�Z�YW�VTQLI�G EDBA?==??=<::<=�A?AB�D�E�G IJMOOMMOQTVWW�VT�R�TVWYZ�\�Z�\^�_�^�\YWVVTTRT�RQ�O LJIEEDBBEE�B�A�B�D�B
A?<:8878:<==<<:877:<�:<=?�ABDEEGED�BDEEI�GIJJMMQRVY�ZYWVV�T�V�T�VWZ�^\^^�\ZYWWVWV�TRTVWW�VT�RMJG�EDBAA�?�A?<�=?�A?�=�?AB�D�E�G�E
GJLMMLLMOQT�V�W�VW�YZ\^^�\^_abba_^^\\ZZYYWWVV�TRQ�OMLIED�B�D�BA??==?AA�?=<87�578:<<:87�57�8�78:<�=?ABD�ED�BDE�GIJJLMQTVW�YWVV�T�V�T�VWZ\\^^�\�^�\ZYWVVTTRR�QR�T�RQ�OLIE�DB�A�BA?A?A??A??�<:�<?�A?ADDEGGDDEJJLLJLMOOQTTVW�Y�W�YZ�\�^_abddba_�^\^�ZYWVTTRQQ�OMLIGD�BA?<<:8:�<�=:855�4�578875�2�54578::<=??ABDEED�B�D�EG�I
LOQTTVWYYWV�TV�RTVVWWY�Z�\Z\^^\ZYWWVTRQOO�MOQQ�R�QO�LJGDBB�A�BDBBBAA�?=<�:�8:�< =ABDEEDDEI�JLM�O QRTWYZZYYZ\^^�_�^_�abdffdba�_�^\YVTR�QO�MLIGEDDBAABBA?<:8755778::8544�245540�/�0244224�7:�=?ADEED�BDE�GILOQRRTV�WV�T�RTVWYYZZ�Y�Z\^^\Y�WVRQOMLJJL�OQ�RQOML�JIGDBA??�ABDD�B�D�BA?=<:�8�7�5�78:=?ABDBBEGIIJL�M OQRVWZ\\Z\^_�a�_abddf�gfdba__�a^ZWTRQOO�MLIE�DB?�A=<:85420224575400/00�/00/-,�-,--/022024458::<<=?BDEEDDBBDD�EGLMOOQRTT�V�T�R�T�RTVWY�Z�W�YZ�\ZY�W TQOMLJIIJMMO�QOLJIGII�G
DB??=?AADEE�B�D�BA?<:8�7�542024457:<=?AABDEGIJL�MORTWZ\�^_a�b�abdfg�igfdbb�a
bddb_\YVRQO�MJGD�BA�?=<:8740/�-/0�2/�-�,--,**�,�*,-/�025788:<=?ABDEEDBB�DEGJJLMQ�RT�VT�R�T�RTVWYZZY�W�YZ�\ ZYWWVROMMJ�IJLM�OMLIGEEGG�E DA??==?ADEED�B�BA?=:87�5420�/02478<==?BBDEGIJ�M QTVWZ\__abbdbb�d�bdffg�i�g�dbd�bdffda_\WTROMMOMMIEB�A?=�<:8740/-,**,-//0/,,�**(''�(�*�,�-/045778:<?ABDEDBAB�D�G�IJLO�R�VTRR�T�QRVW�Y�W�YZ�\ ZYWVTQMLLJ�I JLMMLLJIEDDB�D BA?=?<<=ABDEE�DBA?=<:875�42/�-�,-/047:<<=AABDGGIL�M ORVWYZ^_ab�dfggffg�igff�d�f�d�fdba^ZWTQ�OMLIEB�?=<�:852/-,�*,�-,*�(('�%�'(�*,/025�7
8:=ABDDBAAB�DE�IJLMQ�R�T�R�TRQ�O�QRV�W�YZ\^\ZYWVTQMLLJJ�I JLJIGGEDBB�A?�=�<=?ABD�E�D?=<<:8754�2/�,�*,-/04788:=?BEGGIJ�MORVYZ^_ab�d�fgiklkk�lkigffd�fgfdd�fda^\YVQOOMMJIEB?==<:88::840-,�*�(�*�(�' %$""$$%'(*�(*-0245778:<?ABB�A�BDG�I�JLM�Q�RQ�RQ�OQRRTV�TV�WZYZ\^\ZYWVTQOMMJJIJ�IGDDB�A�?�=�< =?ABEEDDBA<�:8544�2/,�*,-/04578<?BEGGIJM�OQRVY\_ab�dfgikln�o�nlig�f�g�f"da^\ZWROMLLJIEB?=<::88::72/-,**,,*(�'�('�% $" ""$'((''�( *-/024578::<?�A�BDG�I�JLMOO�Q�OQR�T�RTVWY�Z�\ ZYWVTRQQOL�JI�GEBA�?=<::�<�=?BDDBBA=:88::85442200-*�(%*,-/04458<?BDDGJLOQOOQRWYZ^_adffgilnno�q�onlii�g�i�g�fb_\\YTQMLJIIDA?=<::�850-,�*�,*'�%�'%�"� "%�'�(*�-/045788:<�?A�BDE�GI�JLMLMMO�Q�OM�OQR�TR�QRTWY�Z�\ YWWVTRQQOM�J�I�GDBA==�<�:�<�=?ABBAA=<:88::85�420/,(�'(*,-/24458<?AABEJMO�Q RTWWYZ^_bfgikn�o�q�onlkk�i�k�ig�fda^\YTQMLJIGDA?=�<:87540-�*('�%�$�%$" � $%'(''(*,-,,-/025778:==?B�D�EGI�JLM�O�M�O�QR�TR�QRTWYY�ZY�WVTRQOMLJ�IGDBA=<�:�<�=?�A?=<:�7�875440/-,(�'&(,,-022478<=AABDILOQRRTTVVWY\^afgiloqqo�q�onlkk�i�k�ig�f!db_\YTOLJIGEDA?==<<87542/-,*,,*(('�%�"�$"  $%�'(*,,*,--//24578:<?B�D�B�DEGIIGGIIJLMLLJLMOQRRTVTTR�Q�RVWW�Y�WVTROMLJIIJJIGDDA=:�8�:�<
=??AA?=<::8 �������������������������������������������(�����������������~|{yvttvtsqnkifdba^\ZYWW�VWYZY�W�VW�YZ\^_�a�b�abddb_\YW�VTOJGEDB�A?=<=ADEIMTY\_bfinsv{������������������������������������������������������������������� ����������������������������������������������������������������|{yv�t solkifdba_^Z�YWVWYZ\ZYWWVVWYYZ\^�_a�b�aba bababbddb_\Y�WVROJGDBB�A?�=?BEJOTW\_bfkosw~������������������������������������������������������������������������ ����������������������������������������������������������������~|{wvttsqn�kgdbaa_\�ZYWYZ�\ZY�WYZZ\^_�abddbaabbb�a�ba_\ZYYWTQOLGDBB�A�?BGLORVZ^afkot{�������������������������������������������� �����������������������������������
������������������� ���������������������,���������������������������|{ywvtqnlikkgdbaa_�\ZYZ�\�YZ\\^_�abdffbaabbb�a�_ ^\ZYVRQMLIEDD�BA??�ADGLQRVY\_dkov~���������������)������������������������������������������������������������������������������������������������������� ���������������������~|{ywtolk�igdbba_�^\ZZ�\�Z\�^_aabd�fd�b�ba__aa__^\ZYVRQMLJIG�EDBAABDDEILQTWY\_dkqy��������������������������������������������������������������������������������������������������������������������������������������~|{wtoli�g�da�_^\ZZ\�Z�\�Z\^^__abd�f�db�ba�_^\ZYYWTROMLJIIGGEED�EGIJLORVY\_dls{��������������������������������������������������������������������������������� �����������������
����������������������� �����������������������~{wtolig�fbaaba_\�Z�YZ\\�Z\^_abd�fd�dba�_^\Z�Y WTRQOMLLJJ�IJIIJLLMORVY\_fnt{������������������������� ����������������������������������������������������������������� ������������������������"�������������������������|wtoligfdd�fdbbdba^�Z�YZ�\�Z\^_bdfg�f�g�fdba�_^\Z�YWVTRQO�M�LMO�MOQTWZ^agot{~��������������������������������������������������������������������������������������������������������������������������������������|ytqnkgfdd�fdb_\�Z\^^�\^_bf�gi�kigfdb�a_\�ZYWVTR�Q�OQRRQOOQRTWY\_bioty~���������������������������������������������������������������� �����������������������
����������������������%�����������������|ytqnkifddfddfgiifb_\�Z�\^_�^�_bf�g�ik�lkigf�d�ba^�\0ZYWWVTRRQRTTRRQQRVWYZ^afkoty~�����������������������������������������������������������������
������������� ������������������������������������������������������|yvsolkg�f�dfikkgda^�\�^�_�abdfgikl�nlki�g�fdba�_ ^\ZZYWVTTVVT�RTWZ\^_diloty~������������������������������������������������������������� ������������������������� �������������������+�����������������������{wvtqnkigffdfgkllkfb_�^�_^�_
abbabdfgkln�o�nlkkikk�igfd�ba_^^\ZY�WV�T�VY\_bbgknqvy~������������������������������������������������������������� ���������������������������������������������������������������~{wvtsolkigffgik�lida�_�a bddbbdfilnoqq�on�l�n�l�kig�fdbaa_^\\Z�Y�W�YZ^bfgilotw{~����������������������������������������������������������� �������������������������������������"������������������������|{wvttqnlki�gik�lkfbaa�_abb�f�d fgknoqssooqqq�o�q�o�nlk�igffdbaa^�\ZYYZZ\_dgiknqwy|��������������������������������������������������������������������������������������������
�������������������������������������� ~|{wvttsonlk�ik�l kgdbbaa__abdf�g
ilnoqssqqst�t�stvvttsqo�n�l kigfdba__^\\�^adgkloty|����������������������������������������������������
�������������������������������������������������������������������������~ |{{ywvvtsonl�k�l�kigfdb�a
bfggiikiikn�oq�stv�v�ywvtsttssqqonligfdbba__�adfilosw{������������������� ������������������������������� ���������������������������������������������������������������������~|�{ywvvtqo�nl�kigd�b
dfggiklkkln�oqstvww�w�y{�|{�y�w
vtsqolkigff�dfgilosvy|����������������������� �������������������������������������������������������������������������������������������������~|�{ywvvtsqooqqonnl�klkkg�d�fgikllkkln�oqtvy{{�{|~~���~�|{yvtqonlk�g ilnoqtw{~������������������������������������������������������������������������������������������������������������� ����������~|�{ywvttssqqssqonn�lkg�f�gikll�k lnqqsvy|~~�~��������~|yvsqonl�k lnqsstvy|������������������������ ���������������������������������������������� ������������"������������������������������������������������������~||{ywvttssqqttqo�nlkgig�i�k lnqqtw|�������������������~{wvsqo�n�o qstwvwy|~��������������������������������������������������������������������������������������
������������� ����������������������������������~|{wvtt�s�tsq�onlkk�i�gik�lnqsv{����������������|{yvts�qs�t
vwy{{|~��������������������������������������������������� ����������������������������������������������������������������������������������������|{yyw�v�t�s�qoqqonlki�gf�g illnoqtw|�������������������~{ywv�tvwwy{|~�����������������������������������������������������������������������������������������������������������������������������������������������~�|{yy{yw�vts�qonkig�f�g ilnoqsv{�����������������������~|{�y�{|~�������������������������� �����������������������������������������������������������������������������������������������������������~�|{ywv�wvts�qonki�g iklnosv{~���������������������������~����������������������������������������������������������������������������������������������������������������������������������� ������������������~|{yww�ywvt�sqolk�i klnoqty~�����������������������������������������������������������������������������������������������������������������������
����������������������������� ���������������~|ywwyy{ywvv�tqnlkik�l nqqsv{~���������������������������������������������������������������������������������������������������������������������������������������������������������������������~{ywwy{yw�v�wtqnlkloqooqttvy|~�����������������������������������������������
���������������������������������������������������������������������������������������������������������������������������������~|{�wywvtvw�yvsqooqtvttvwy{{~��������������� �����������������������������������������������������������������������������~�������������������������������������� ������������������������������������������������������������~|y�wvttvwy{{yvtstvw�y {|~~�������������������������������������������������������������������������������~~�|
~�������������������� ���������������������������������������� ��������������������������������������|~~|y�w vttwwy|~|y�wy�{�~���������� ����������������������������������������������������������������������������~~||{|~����������������������� ������������������������������������������� ����������������������������������~�|{y�w vtvyy{~�~|�{�|�{|����������� ����������������������������������������������������������������� ������~~||{{|�~�����������������������������������������������������������~���������������������������������
����|{{||{w�v�y|����~�|~||~���������� ������������������������������������������������� �����������������������������~~||{{�| ~���������������������������������������������������~|{{||~���������������� ������������
���~|{{||{w�v�wy{~������~�~~�����������
����������������������������������������������
������������������������������~~�|~������������������������������������������������~|{yy{|~~������������������������������~|�{|{ywv�wy{|~~������������������������������� �������������������������������������������������������� ��������������~ |{{|~������������������������������������������~{�y{|�~�����������������������������~|�{y�w�y{|�~�������� ������������������������������������������� ������������������������������� ��������������~ |{{|~��������������������������������������� �����~{ywy{|�~ �������������������������������~|{yywvww{{||~~������������ �������������������������������������� ���������������������������������������
��������~~|�{|~��������������������������� ���������������~��~�|{ywy{|�~�������������������������������~{ywvvwy{|�~����������������������������������������������������������������������������������������~|{{|~~������������������������ ������������������~�|�~|{y{yywy{|~~�~|~����������������������
���~{ywvvy{�|�~�����������������������������������������������������������������������������������������������������~||~������������������������������� �������������|�{�|{y�wy{~�� ~||~�������������������������~|{{ywwy{|{{|~~||~�����������������������������������������������������������������
��������������������������������~����������������������������� ���������~��|{�y�{ wvvttvww{~��~�|~����������������������~|�{�y�{y{||{|~~����������������������������������������������������������������
��������������� �������������������������������������������������������~|{y�w vttsstvw{~��~�|~��������������������~{�y�{yww�y�{|�~��������������������������������
������������������������� �������������������������������������������������������������������������~�~||{yyw�v�t�s�tw{�~|�{|�������������� ��������|{�y�wy�{�|~����������������������������������������������������������������������������������� ����������������������������������������������~|{y�wv�tsqqs�tw{�|{�y{|�����������������������~|{ywwvtt�v�wy�{|���������������������������������� �����������������������������������������������������
������������������������������������������������~
|{yvtvvtssq�oq�tvwyy{{yww�y{|����������������������~|ywvtsqq�tvwy�{|���������������������������������������������������������������
��������������� ������������ �����������������������������������������������~|{ywt�sqo�noq�st�vwyy�w�y{|~���~����������������~{wvsq�o�qstvy�{ |~������������������������������ ����������������������������������������������������������� ����������������������������������������������~~�|{ywvqoo�n lkklnoqsstvvw�v�w�y�wy{{||{y{|�~�|~�����������|ytsqo�n�oqsv�y{~����������������������� ����������������������� ���������������������������������������������������������������������������������������~|{{�ywvsolk�iklnoqstvv�w�vwyy�w�ywvwy{||�{|����������~{vsqo�noqsvwyy{~�������������������
�����������������������������������������������������������������������������������������������������~�|�� ~|ywvwwvtoligf�dfgikkloqsttvwwvtv�w�y�wv�tvw{ywyy{~��������~|wtqqn�l�noqtvyy|����������������������������������������������������������������������������������������������������������������������������������������|{yy�{|�~ |{wttvtsqnkgdb�abf�g
ilnoqstvvtt�vw�y�wvt�stvwvvwy{|�������~|yvsqqnl�klnnoqtvy{~��������������������
����������������������������� ��������������
��������������� ����������������������������������������������� �~{yywywwy�{ywtqqsqonlifb__�a�d fgilnoosttss�tvwyw�vs�qststvwy{~����~||yvt�qnl�k�lnqtvy|����������������������� ����������������������������� ���������������� ���������������������������������������������������������������������~|{yyww�v�wvtq�onlkgda__�abdfgklnno�q�svwwv�tsq�o�qstvw{|~���|{yvts�qn�l�klnqtw{����������������������� ����������������������������������������������������������������������������������������������������������
���~|{ywywv�s�q onllnkigfbba�_�^_bffiikll�n�qt�v�tsqo�no�q stv{{||~~{wvts�qonll�klnqvy|������������������������ ������������������������������������������������������������������ ������������ ���������������������������~|y�wvsqqoo�nl�kigfd�b a_^^\\^adfggi�klooqt�vtqo�no�qsvy�{yvtssqq�onl�klnosw{~��������������������� ������������ �������������������������������������������������������������������������������������������� ���|{wvwvt�onl�kikk�gfdb�a_^\�Z^adff�g�iklooqt�vtso�n�l�noqqsstw�y�w tsqqoonnon�klnoqtw{~����������������������� ���������������� ������������ ���������������������������������������������������������������������������� ��~|{wvvtq�nlkiigffgf�dba_^^__^Z�YZ^abd�fgikloqst�v tqoonllnnoqs�tv�wvtsqoo�nl�k
lnqqsvy|������������������������������� ������������ ���������������������������������������������������������������������������~||{yvtsollkigffddbdbbaa__^�\�^\Y�WY\^_adfdfgkloqstvv�wvsonlkklnoqsttsttvvtsqoonnllnnl�k
lnqstw{~�������������������������������� ��������������������������������������������������������������������������������������������~|�{ yvsqnlkigfddbb�a_^\\�Z�\�Z YWVWYZ\\^a�dfilnoqstv�w vsonlkklnoqstt�s�tsqo�n�l�k
lostvy|������
������������������������������������������������������������������������� ������������������������������������������|{�y
wtqolkigfdb�a�_^\�ZYZZYYW�VWYZZ\^aabfiklnoqst�v
sonlkklnoqq�s�q�o�nl�k�i�klnqtwy{~����������������������������������������������
���������������������������������� ����������������������������������������������~yw�v
tsqolkigdba�_^\�Z�YW�VWY�Z \^_bfgiklnnoqs�tsqon�ln�q�sq�o�nlk�iklnqtw{|~�������������������������
���������������������������������������������������� ������������������
����������������������������~{vt�s qolkifbba_^^�\�^�\�Z�Y�WV�W�Y�Z \^_adfggiiklno�qo�no�q�s�q�o�n�l�k�ikloqtvy|��������������� �������������������������������������������������������������������������������������������������������������~{ws�q
onlifba_^\\�Z\�^\ZYWW�VW�YZ\\^_abd�fgklln�o�q�o�q�sqonn�l�klosvwy|�������������� ������������������������������������������������������������������������������������������ �������������~||{wtq�o noonnlida^\Z�Y�Z�^\ZYWVV�R�TVW�YZ\\^^_aab�dfikllnoq�s�t�s�q�stssttqonn�lnqtw{|��������������������������������������������������������������������������������������������� �������������������
�������������~{ywvtsqo�n�lkgd_\Y�WY�Z�\ZYWVTRQOQRRTVYZZ\�^�_a�bdgkllnq�tvwwvtt�s�tsqoonnllnooqsvy~���������������������������������������������������������������������������� ��������������������������~~�������� �����~||{yvs�qon�l�kigd_ZW�VY�Z�YWTRQOMOQQRVYZZ^__�^_aabdfilnosvvwwyywwvts�qst�vtsqqoo�noqtvy~������� ���������������������������������������������������������������������������� ������������������������~|{~������ ���~|{ywvs�onl�k�i gfb_ZVTTVYZZY�WVRQO�MOQRVYZZ^�_�^ _aabdfgknqtvw�ywvsqooqt�vtssqq�oqtw{~���������������������������������������������������������������� ��������������� ������������������������~||{{|�������� ��~|{ywtsq�onlkii�gfb_^YVRRT�W�V�TRQM�LMOQTWZZ^__a_^^__aabdffilqtvw�ywvtqooqt�vts�q
oqsw{|������������������������������������������������������������������������������������������������������������||{||~������� ���~{ywvssqq�oonli�g fdb_\ZYVRR�TR�QOL�J LMQRVYZ\^_aa__�abd�fgkostv�w�vtsqqsst�vts�q svy|~������������������������������������������ ������������������������������������������������������������������~||~||~��������~{wvt�sqooonli�gda_\ZYWW�T�Q�OML�J LMQQTWZ\\^�_�a bdffgfgknqst�v�t�s�q�ts�q stw{~����������������������������������������������������������������������������������������������������������������~~�~||�~�����~�|{wvtss�t�qonli�gfb_^ZY�WVTROMMOO�ML�JLMOQRWZ�\�^�_abd�f�giklnostt�s�q�oq�s�t�s tvy|����������������������������������������������������������������������������������������������������������������������~�|~��~||~|{{yv�t�vtsonlkgffda^\YYWVVTRQ�M�LML�J LMORWYZ\Z\^__abffddgfgiklnoqqoqqo�nonn�oqssttvvw{|~������������������������������������������������������������¾�������������������������������������������������������~|�{�~�|�{vtvvwwvtsonlkgdba_\ZYYWVTRQO�MLJJLMML�JLORVWYZZ\^_abdffddffggikl�nl�k�l noonnosstvy{|������������������������ ������������������� ����������������� �������������������������������������������������������������|{yy{�|�{�y�{wvv�wvtqqnkigda_\ZZYYWVRQ�O�MJIIL�ML�J�LMQRTVWY\^_adfgffdffggik�l�k�i�k lnnllnqstw{~����������������������� ����������������������������������������� ��½��������������������������������������������������������~{�y�{|{�ywyy�{ywv�wvtqqnkgfda^�ZYWVTQ�O�MLIGIJL�M�L�M
OQRTVY\^_bf�g�fg�ikllkii�gi�g�i klnllnqsvy|������������������������ ������������������������ ������������������������������������������������������������������������~~{�y{|{y�w�yw�vtssqnkgdb_\�YWVRO�M�LJ�GIJ�M�L�O�M
OQRTVY\^_bf�gfg�i�gi�g�i/klnllnqsv{|������������������������������������������������ ������������������������������������������� ��������������������������������������~~{�y{|{yw�vwvv�wv�t�sonkgda^ZY�WVTQOML�JI�GIL�M�O�QRTVY\_adf�g�i�g�i�kl�noqtw{|~���� ���������������������� ������������������&�������������������������¾������������������������������������������������������~|�{�|{wv�t�vts�q�olida^ZYWWVTRQOML�IG�IGIJLLM�O
RQRTWY\_adf�iki�gfggii�k�i�kl�noqsvy{|~�����������������������������
�����������/������������������������������������������������������������������������������������������������~�|�~|ywvtt�s�tvtq�oq�o
lida^\ZYWTR�QOLI�G
JLJIIJJLORR�Q�R
TVYZ^_bfgik�lkig�f�gik�lk�ikln�o#qsvwy{|~������������������������������ �����������������������������������������¾�����������������������
��������������������������~~���~|ywvtt�s�tso�nonlkgda^\ZWVTRQRQOLI�G
JMLIIJLMQTT�R*QRRTVZ\_adggiklnnkkigffggiknnlkiikkllnoqqtv�wy{~����������������������������������������������������������������������������������������������������������������������������~~�����~|{ywvt�q�sqolklln kigfb_^\ZWVT�RQOLJ�ILMLJJLMQT�V
TRRTVWZ^adf�g ilnnllkigg�ilnnl�k�l�noqstv�wy{~������������������������������������������������������������������������������������� ��������������������� ��������������~����~�| {ywtqooqssolk�ikgfdba�^\YWTR�QOL�JMOMLMOQR�V�W
VTTVWYZ_bdf�giknonnlkiikkinoonklknn�qstvv�w&y{~���������������������������������������������������������������������������¾����������������������������������������������~~�|����~�|{wtq�o�snkigffgfdba_�^\ZYVR�QM�LMOOMMOQRT�V WYYWVWYZ\_bdf�gikn�onl�knoon�lnos�tv�wy{|~�����������������������
�����������������������������������������������¾�������������������������������������������~|�{�|~��~�|{wtsqooqqnigfddf dba_^\^^\ZWVT�ROM�L�O�MOQRT�VW�ZWYZ\^abbdfgiklnoonnll�knoo�lnqt�vwyy{{y{|~������������������������������������������������� �������������������������¾�����������������������������������������|{wwy||~��~~|�{ywtsq�onkgfdbbdba_^^�\ZY�WV�TRO�M�O�MOQRTVWWYZ\\ZZ\^_abbdfikl�n�l�klnn�l&nostvvwy{|~~||~������������������������������������������������� �������������������������¾����������������������������������������
�����~{yvvy�|�~|{yy�wvsq�onligfd�ba_^\\�Z�YWVWVTQ�O�M OQRTVWWYZ\�^ _abbfgilno�n�lkl�klnn�l nqstvvwy{~��������������������������������������������������������������������������������¾�����������������������������������������
�����|ywttw�{�|�ywyvvttsqo�nlkifdb�aa_�\Z�Y�Z�YWVTRRQO�MORTTVWYZ\^_aa__aabdgiknoo�nl�kl�n ostvvwy{|������������������������������
�����������������������������������������������������������������������������������������
�����|yvttv�y�wvtsqoonn�lkifdba_a_^�\�Z�\Y�Z�W�VTRQ�OQTVVWWY\^_abbaabbdfgik�n�l�k�i�kln�o3qtvvwy{|~���������������������������������������������������������������������������������þ������������������������� ���������������� ����~{wttstvv�w�vtsqqoon�lkifdaa__^�\�^ \ZZ\ZYYZZYWVT�RTVW�YZ^_ab�d�f�gik�l�k�iklno�q svwwy{|~�����������������������������������������������������������������������������þ�������������������������������������� ����~{yvts�qst�vtss�q onllnlkigda__^�\�^�_ ^\\Z^\ZZ\^\ZWV�TWYY�Z\_abd�f�gikk�l�k�ikloq�s tvwy{|~������������������������������������������������������ ����������������������¾��������������������� ��������������������~{wwtsqonnoq�ts�o�q onllnlkigd_^^\�Z�\^_a_^�\�^�_\YWVVWZ�\�^_abdf�gikl�n�l�nlkiiknqs�tvwy{|������������ ��������������������������������������������������������������¾�������������������� ������������������|wvvtqonlkloqsqo�no�qon�lkigfb_\ZZ�YZ\^�_^\\^�_�a_\ZYYZ^__^^__aabdggiilnoqqoo�nonllklloqsttvvwy{|~���������������������������������������������������������������(��������������������������������������������������������������������{v�t onkkiknnon�lnoqoonlkkigfdba_\YY�VWYZ\�^�\^_aa�b�a_^\\^_aa�_�abdggiknoq�s�q�o�qo�n�oqst�vwy{|~��������������������� ���������������������������������������������������������������¾�����������������������������������������~|yvttsol�i�k lnoonlkiigfdba�_\YW�RTWYZ\�^�\�_a�babba__�a�_�a bdggiknqsstv�tsqqs�oqsstv�w vww{||����������������������������������������� ���������� ����������������������������������������������������������������������������~{yywvtsqnligi�g�iklnnlkigfdba_^\^^ZWV�QRTVWZ\^^�\�^_a�b�d�ba�_�a
bdfgiknqstv�wvtss�qst�vw�y�wy{|��������������������
������������� ������������������������������������ ����������������������������������������������������~{w�vtsqnlkiggfddffggikllkigfda_^\�ZYVR�O�QRTWZ\^^\\^^__abd�f�dba�_�abdffgknst�w�ywvt�st�v�w�y{�y{~��������������������������������������������������������� ���������������������������������������������������������������������|y�t�sonkiggffddbddfgi�kigffda_\ZYYWVVRO�M�OQRTWZ\�^�_abd�fdba__^^_aabdffgknsvyywwy{{ywv�t�v�wy�{#|�����������������������������������������������������������������������������%����������������������������������������������~|w�sqolkigff�d�bdfg�ig�f db_\ZYWTRQOM�L!OMMOQRTWZ\^^\\^^abdffggfdaa^^\\^_b�dfgilsv�wy{{ywv�t�v�w�{�|${|��������������������������������������������������������������������������������������� ����������������������������� ������~{vq�onkigf�d�babdffggf�d ba^ZYWVRQMLLJL�MOQRTWZ^^�\ ^abdffggfbaa^�\^_b�dfgilqt�vw�ywv�t�v�wy{�| ~���������������������������������������������������������������������������������������������������������������������� ������~yto�nligff�dbaab�abd�fdba_^\YWVTROLJJ�J�LMOOQRVW�\^ab�d�fdbaa_�^_b�dfgilq�tv�w�yw�v�w�v�w$y{||~���������������������������������������� ������������������������ �����������������������������������������������������������������{vsn�lkggfd�ba__a�_ab�d ba_^\ZYVTROL�J�J LMOOQRTVYZ�\^_a�ba�_�abdfgiknq�t�v�w�vwyy�w�y{|~���������������� �������������������������������������������������������� ��������������������������������������������������~ytqnllkiggfdb�a_^^_�^_b�d
ba^\ZYWTQOL�J�J�L�MOQRVY�Z\^_�a�_a�b�a baabfgklnq�s�t�v�tw�y�{ywwy{|���������������� ��������������������
��������������������� ������������������������������������������������������������~ytolklkkigdbaa_^�\^�\^abddb_\YWVTQML�J�LMORVW�YZ\^�_�^_a�b�abfilnno�q�s�tvw�y�{y�wy{|���������������� ����������������� ������������������������������������������������������������������� ��������~ytol�kigdbaa^\�Z\ZZ\^_a�b_ZWVTQML�J�L�M�LOQ�T�VWZ\�^�\^_abbdd�bdgklnnl�n lnooqstvvwwvvw�y�wy{���������������������������������������������������������������������������������� ����������������%��������������������~{wtnkiigiggdba_\Z�YZ\^_�a ^ZWTROLJII�J�L�M�LMO�QRTVWY\^^�\ ^_abddbbdfgik�l�k�iklnost�vtsst�wy{~���������������������������������������������������������%���������¾�������������������������������� �����~~����� �~{wvsnkig�fdba_\ZYY�WYZ\^�_
^ZWTROLJIIJ�L�MOMM�L�J LMOQQRTVWZ�\�Z \^^_bbabfggii�k
iggffgilnqs�tsqoqtt�v*wy||����������������������������������������������������������������������������������������� �����������������������~�|~���.~|yvtqnligffddfda_\ZYWWVWZ\\^__^^\ZYVQMJJIIJLMM�OM�L JIIJLOQQRTTVY�Z�Y�Z�\^_aabf�g�igf�dfgilo�qonnoqs�t vwy{~���������������������������������������������������������������������������� ������������ ���������������
����������|�{|�~|{wtsqonkgffddffb_\ZY�WY\^^�_�^\ZYVQM�JLMO�M�LJGIJLMOQRTRTVWWYWWYZYZZ^_aadffgg�f�d�b�dfil�n�l�noqq�stwy|�������������������������������������
������������� ��������������������������������������������������������������~�{y�{�|{ywtsqonkgffddffda^\ZYYZZ\�_^�\ZYTOM�J�LM�JIGIJLMOQ�R�T�V WYZYYZ^_ab�d�fd�b�a�bdg�k�l�no�qsvy|����������������������������������������������������������������������� ������������������� ���������������~~||�{�y�{
ywtsqnlkigf�db_^�\�^�_^\�ZYWROMLJII�J�IGEGILMO�Q OQQTTVYZWWY\_a�b�da__a�_�a�_abfgg�i'klkklkklonoqvy|���������������������������������������������������������������¾���������������������� �����������������~|{{�y�w�ywvtsqnlkiigfdbddba�_a__a__\Z�Y WVQMMLIGGIIGI�G�E�G�EGILM�O�MORTVWYWWYZ^_aa__aa_^^�_�^_adf�gi�k�i kllnqtw{������������������������������������������������������������������������������������������ ����������������~|{{yy�w�y�wvtsqnlk�igd�b�a�b�a_^\ZYWVVTQMLJIG�EGD�B�EGIJLMMLLMMLMOQRTVWVWYZ^^_^\\�^�\�^\�Z\_ab�dfg�i�giklnqty|�����������������������������������������������������������������¾�����������������������������������~~|{yy�wy{{�ywy�wvtqollk�igd�a bdb_aa_^^\ZWT�ROLJJIGE�DA�?AD�EG�I�J�IJLLMOQRT�VWYZ�\�Z�\�ZY�W�YZ^_�abdf�g�f giklosw{����������������������������������������������������������������������������������������������������~|{�y�wy�{y�w�y�w vsonllkiggfda�_abba�^�\ZYVRQOOMLJJIGEDBBA?<==?BDEE�G�EGJLMOQQRVVWWYYZ�Y�WYZZ�YW�V�WYZ\^_�abdfgg�fgklnqvy~������������������ ����������������������������������������������½�����������������������������������~|{y�w�y {yywwvwwywwvtsonlkiiggfda_^^_aa_^�ZYZYWTQOMLLJLLJGGEBA? =<<=?ABEGGEGGE�D EIJLMOQRTV�W�VW�YWV�TVWYZ\^_�abdfgig�fgklnqvy|�����������������������������������������������������������������������������������������������������|{y�w�yw�v�wvtsqonlkiigfdba_^^__^\ZY�WVTROML�J�LJGGEB?==<<=?ABEIIEGEBAABDEIJLMQRRT�V�TV�WVT�R�T�V WYZ\^__abbdgig�fgikloty|������������������������� ����������������������������������������������������������������������������|{yvv�w�t�vtsqonnlkiifdba__\\^^\ZYW�VRQQML�JIGGDA?=?==?ABDGIIGEDA??ABDEIJLO�QR�TV�WVT�R�T�V(WYZ\^^_abbdgiigffgiiknsy~��������������������������������������������������������������������������������������������~{yw�v�t�vtss�tsqon�lkigdba_^^�\ ZWVTTVVTQOMLL�JI�GEBA??A?AABDEGIIGDB??=?ABBEIJM�OQ�RT�V WTRQQRRTVWVWYZ�^_abdfikki�g�iknsy~�������������������������������������������������������������������������������������������������~|w�v�t�sqstssqonlkikllkigba__^^�\ZWT�R�TRML�JIGE�D�B�A�B�DE�G EBA??==?AABEIL�MO�Q�RT�VTRQQRTV�W�YZ^�_adgikll�k�iknsw|������������������������������������������������������������������������������������������������~|yv�ts�q�sqonlkkigi�kifba__^�\ZWTQOO�QOLJ�I�JIGED�B�DB�E�GEDAA??�=�?ABEIJ�L�MORRT�V�T�R�TV�WYWY\^_abfiklnnlln�klosv{~��������������������������������������������������������������������������������������|{wt�sq�s�qsqonk�igff�igda_^^\�ZYWTQMLLM�LJ�GED�BDEE�G�EDBAA??�=�?ABEIJJLMLJJLMQRT�VT�R�T�V�WYZ^_bdgklnoonno�noqsv{~��������������������������������������������������������������������������������������� �|yvtsqooqss�q�sqonli�gfdd�fdb_^\\ZYYWVROMLJII�G�E�D�BDEG
IGEDDEEDDBA�? =AA?ABDGII�J�IJLMQ�T�R�T�V�T VWYZ^adgilno�q�o*qssv{~������������������������¾�������������������������������������������������������������������|yvsq�nqssq�sqnlkg�d�bdbba_^\\ZZYWTQOLJIGE�D�E�BAB�AB�DEG IGEDDEEDBAA?==�?�ABDEG�I�JLORRQQ�R�T�RTVVTTVWZ\_bfiknoqq�s�q)stw|��������������������������������������������������������������������������������~���� �|yvsollnq�sqonlif�ba_�^ \ZYYWTQMLIGEEB�ADEEDBA�?ABD�EGI�G�E�DBAA?=<==�?ABDEG�IJLMQQM�OQRTRQR�T WY\^_bfiilnqq�stw|������������������������������������������������������������������������������~~|�{�|~���~��~|yvqnllnooqssqqonlkgd�a�ba__�^\ZYWWVRMJIEEDDA?�= ?ABDAA?=<=?ABD�EG�IGE�DBA?=�<�=�?�ABDGIJJ�IJL�M�LMQRRQQRRTVYZ\^_adfgilo�qs�tvy|���������������������������������������������������������������������~|{y�wy{|~���~
���|{wtqnll�noqqoonlkifba__aa_�^
\ZYVTTROJGE�DBA=<:<=?AA??=<:<?AABDEGIJIIGEE�DB?=�<�=�?�ABDG�J�IJLMLJ�ILOQRQQRRTVYZ\^_abbdgknq�oqs�tvwy|~���������������������������������������������� �������������������������~|{{ywv�tvy|~���~��
~��|ywvsqnn�l�n lkigdba_^^_^�\
YWVRQQOLGED�B?=<:8:=?A?==<::<�?ADEGIJIG�EDBA?=�<=?�A�BDEI�J�LJIGEEGJMO�Q�R TVYZ\\^_aabfil�oqsttvwy{|~����������������������������������������������������������������������~|{ywvtt�stw|~���~ |ywvvsqoonllnn�lkigfddb_^�\'ZYVTRQOMLIEDBAA?=<<:8:=?A?=<::<<==?ADEGI�I�GED�A?=�< =?AABDEEIJJIIJ�LIGEEDEEIJMMOOQQTVYZ�\�^_adgk�ostvwy{�|~�������������������������������������������������������������������������~|{yvt�s�qsv{~������~~|{yw�vtsqqon�ligff�db_^�Z\ZWVTQOMMLJGDA?==<<::878<=?==<::�<=?DEGI�G�IGEB�A?=<<==??ABDGIJJIGIJLMLJGE�D�E GIJJLMQQRTWYZ�\(^_bfknooqtwy{|~�~~������������������������������������������� �������������������������~|{wts�q�oqsvy|~����~|{yww�vt�sqn�lkgf�d ba_^ZYYZYVTRO�LJIEB?=<�:8778:<�=�<�:<=?BEGG�G�IGDA�?�=�?ABDG�J IGIJLMLIGE�D�E�GIJM�Q0RVWYZ\ZZ\^afilnosvy{|~�������������������������������������������������
����������������������������|{vtq�oqstw{|���~|{ywvtt�vwvvttso�lkiffddbbaa_^ZYWWVTQOM�JIGDA=<:�8�78:<�=�<�8:=?BDEG�E�GEBA?�=�?�=�?ABDGJJ�IJLLJIG�EGJM�QRTVWY�Z \_dgklosvy|~�������������������������������� �����������������������������������������|yvtq�o�qstwy{~��~{ywwtssttv�wvtsolkkg�fdba__^\ZYWVTROMLJIIGEB?<:�8�78:<�=
<:88:=?ABDE�B�D�A?=<<?�=?=?BDGIJ�I�JLJIIG�E�DEIM�Q�RTVW�YZ\^adiknqvy|~������� ��������������
���������������� �������������������������������������~~{wtsqq�osqstwwy|~�~{ywvsqqss�vwttsoligf�d�ba^\\ZZYWTRQOMLJIGEDA?<<:887�5788::�<:�8:<=?ABB�?�A?=<<=�<�=ADEG�I�J�IG�ED�BDEIL�OQRRTVWWYZ\^_bfilotw{~�������~ ��������������� ��������������� ��������������������������������|{wvt�sqoqsstvwwy{|~~|{yvs�qs�t�sqnkgfdb�a_\�YWVTRQOMMLJGEDA?==<:875445�78�:8�78:<=�?�<�=�?=<<�: <==<==ABDG�IJII�G EDDBBDEEIL�MOQQRTVWY\^__abfilqvy|����~�||��������������� ��������������������������������������������������������{wvvtsstsqqsstvwy�{�|{yvs�o�s�qolifdba�_a_\YWVWVVTTROOMMLJGEDA�?=:75�4�5787�578::==<�8�:<�=<:88:<=<<=??ABEGG�I�G�I GEEDDEGGIJ�L MOQRTVWY\^�_ adgknsw{|~���~�|~����������������������������������������������������������������{wvv�t�vtsstvvwy�{yvs�o�q�onlifda_^^__\YWVTT�RQ�O MLJIEDBAA?=:75�4200�2 4554224788::8�57�8:8�: 878:<<::<==?A�D�GIG�EGIJI�G�E�GI�JLMOTVWYYZ\\^^_bfilqvy{|�~�|{|~�������������������������������������������������������������������|yw�vwv�twvvwy�{�ywvqonnoo�n�o�l ifb_^\\^^ZWVTR�Q OMMOOMJIEB�A?<7545420�/�0�2�025�7�5�45�7�5�78�:�<=?AABDEGG�EGIJJ�I�G�IJLOTW�YZ\_bfgkotwy{|~~|{{|~��������������� �������������� ����������������������������� �������~|ywwyy�w�vw�vw�yw�vtqo�n�l�nlkifa^\�ZYVTRQ�O�M�OLIEB�A ?<8755420/--/�0�/0245422024�5�4�57�8:�<�=ABD�E�G�IJ�LJGGE�GIJMRVYY�WY\_adgknqtw{|~~|{y{|��������������� �������������� �����������������������������������|{y{yywy�w�v�wvt�sq�onllkklkigfb_\YYWWVTRQQOO�M�OMLJGDBA??=<:87542/-,,-/0//�-�/02200/0�4�2�4�5�78:<�=�<=ABDDEGI�JLMOO�MLIG�EGIJMQT�W�VWY\_adgklosw{|~~|{yy|���������������� �������������� ���������������������������������������~||{{�yw�v�wvts�q�s�qonlk�i gfdb_\YWVVTR�QOM�L�M�LJIEDB?=<::87420-,**,-�/�-/00//�/�0�2�0�2�4578::<<�=<=B�DEGIJLLMOQ�O LIGEEDEGJMOR�W�VWY\_adfiknswy{|~||yy|�������������� ������������������������������������������������~~||{yy{{�wvs�qs�qonlli�g fdba^ZWVTRRQ�OMJ�I�J�L�JIGEDB?=<::8720/,*((*,,-/�-�,-00//�/�024457�8:=�?AD�E�G+IJMOOQQOOQQOLJIGEDDGJLORVWWVVWYZ^abdfinsvwy{�|�{~�������������� ����������������������������������� ���������������~|{{|{�y�wvs�q�sqnlkkig�fda^ZYWVR�QOMMLI�G�IGEDBBA?<:8752/-,*�(�*,�-�,-00//0/--�/�0�/022457788:=?ABDEGG�IJLOQQRQOORROMJIE�DEIJMQTVVTTVWYZ^abdglqtvy�{|�����&����������������������������������������������������������������������~�|{y{{y�vs�qsttqnlkiggffdb_\ZYVTRQOOMLLJGGEE�D�E�GEDDBBA?<87540/-*�(�*�,-00/00/--�/02245778:<=?BEGGIJ�LMO�Q�R�Q�RQOLIE�DEGILOQRTRRTVWY\_abfknqtw�y{~������������������������ ���������������������������������������������������~|�{w�vt�stvvsolki�gfda^\ZYVTRQOMLLJIGGED�BDEED�B A?=<85420/-*((�*�,-/00/0�/�-�/�-�/ 0224577:<<=?DG�IL�MOQRQQRTQQ�RQMJG�D�EGILO�QRTVWY\^_bfilnqv�w{|~��������������������������������������������������������������������������������~{{ywwvv�t�s(vwvsonligffdba^\ZYVTRRQMLLJIGGEEDBBABDDBA�? =<8520/-,**(�*�,-/0/-/�-�/-,,-/0224578:<=?ADGIJJLM�OQ�R�T�R�TROLI�EGJMOOQRTWYZ\^_bfiklostvvwy{|~����������������������������������������������������������������������������|{�yw�vtsstvwvsonlkgfddba^\ZZWVTTROMLJI�GEDB�A ?=<<==<:8520/-�,�*�,-//--�,-�/,**,/02244578<?ABEIJLLMM�OR�TVT�RTVVROJGG�EILMOQRVWYZZ\^adgkknoqstvwy{|~~��&�����������������������������������������������������������������2�����������|{{yywwvvtsstvwvsonlkigfdba_^ZZYWVVTQMLJ�IGEB??==<�:�<�:852//�-�*�,�-�,*,,-/--�,
-//-*((*-02�4 578<?ABEIJLM�OQRT�V�TVWWVRMJI�GILMOQRVWYYZ\^abfiklnoqsvwy{{�|~������ ����������������������������������������������������� ����������~||{�ywv�t�vtsol�kigdbaa_\ZYYWVTQML�JIGEB?=<::�8�:�8740�/-�,�-,�*�,-//-�,�-,*�(*,/0445778<?ABEIIJM�QRT�V WVVYYWROML�JIJMMOQRTVWYZ\_aadgikloqsvvw�{|������� ������������������������������������������
������������� �����������~|�{w�v�wvsqnl�kigdbaa_^ZYWVVTQOM�JIGEB=<:�8�752/�-�/�,�-
,*((*,,-/--�-,*�(*,-045788:<?ABEIIJMQ�R�T�V WYZYWYYWTRRQ�O�M�OQRRTVYZ\_aabdgiloqstvw�y{|~����������������������������������������� �������������� ������������~�|{y�wvsonlkkigfdbba_^ZWVTTRQQOL�JIGEB=:�87540�-�/�-�/ -,*((*,-//--�-*(�'!(*,-0258::<<?ABEIJLMORRTTRTTVVYZ\Z�YW�V�TRQ�R�Q�RVYZZ^__abfgknoqsv�wy{{|~~�������������������������������������������������������������~||{�y�w$vtsonlkkigffdda_\YWVTRRQQOLLJJIGEDB=:�878740-,�-�/�-�/
-*((**,-/--/-*(�'!(*-/0258:<==?ADEILMOOQRTVTTVWWYZ\\�Z�YWVVWWVT�RV�YZ\^_adfgknoqtvv�tvwyy�{|����������������������������������������������������������������~||�{ ywvttsqonllki�gfb_\YWVT�R QOMMLJIGDBA?<�8�752/,,-�/�0/,�*,-�/0-*(�'(*-/0258:==??ADGJMOQOQRVW�VYWY�\�Z�\�^�\ ZYYZZYWVTRRTV�WYZ\^_bbdgknoqssqqsstvwy�wy~���� �������������������������������������������������������������~|{|{ywvttsqon�lk�igda^ZYWV�TRQMMLLJGDA??<88�: 8754/-,,-/�0�/�020-�,�-/000-*(�'(*,-047:<==?ABEILMO�QRV�W�YZ�\�^_aa_^�\ZYVTTV�W
YZZ\^aabfil�n�oqst�vwy|���������������������������������������������������������������~||{yw�vtsqo�n
lkigfb_^\ZW�VTROMLLJGDA??<::<<:8520-�,-/0022�0�20/--�/�0/-*(�'�(*-048<�=?ADGJMM�OQRVW�YZ�\�^�_�ba_^\�^\YWVV�WYZZ\^_adg�k�l noqstvwy|~������������������������������������������������������������~|{y�wvtsqoo�qolkgfdaa_^ZYWVTTQOLLIEDA??�<:8740-�, -//0/0202244�20/�0/00/-*(�'�(*-258<�=?BEIL�OQTVW�YZ�\^__ab�dba_^^�_^\ZYWWY�WY�Z^adfgg�i klnosvy{|~�� ���������������������������� �����������������������������������~{�y+wvtsqsttsqoligfdba_^\YWVTRQMJGEDBA?==<:8752/�,-�/�02�4�20�//-*(�'(*,/258<<=?ADGJMOQOOQQTV�Y�Z\^_aabdf�dba_�a_^\ZYYZYYWWYZYY\_bbdf�g
iknqvy{|~���~�����������������������������������������������������������������������|�{*ywvttvvtsqnkiifda_^\ZYWVTQMJGEDDB??=<:8752/�,�-�/�0242�42�4�20--/0/,(�'(*,/0478:<=ABEILMO�Q�RTWYYWY�Z\_abdd�fd�ba_^�\ ZYWWYWWZ^__ad�f�g�f ilqtw{|~���~ ������������ ��������������������������������������������������������������~|{y�w#vtsonlkgda_^\\ZYVTQMJGEDDBA?=<:8752/�-�,-/�0�2 455455420/--/#0/-*(''(*,02578:<?DEGILMOQQRTVVWYYWY�Z\_b�fgf�g�f�d�b�a_�^ZY�WVWY\\^_a�d�fgkosvy{~�� ���������������������������������������������������������������������+�~|{{wvttqonkifb_^\\ZYVROLJGEDDBA?=::875200/�-/�0�2457�540/�-/�/-,*((*,-04788:=BEGIJLMOQRTV�WYZ\^ad�g�ig�fdb�a�_�a^ZYYWVVWYZZ\^_b�d�fgknqtw{~�������������������������������������������������������������������������'��~~|yvttsqnkigda_^\ZYVQMJIGEDBAA?=:8754�20�/0�2�45775420/�-/�/-,�*,-/2488:<?DEIJLMMORTVV�W�VWZ\_bfg�i�ki�gda__aa�bdb_ZYYWVVWWYYZ\^adf�d�f gknqtw{~~���������������������������������������� ������������������������������������������~{wvvtsoligfdba_\YVQMIGEDBA�?<:754�20/�0/2�457754200/�-/-�,-/02458:<?BDEILMOOQT�V�W�VWZ^adfg�i�kigda^^_abdffda\ZY�W
YZ\^adffddf�g knqtw{|~������������������������������������ �������������������������������������������'�����~|{wvtsqnkiggfdb_ZVQMIEDBAA?==<:754�2�02455�7�5�754�2/---�,-//02457:<?BDEGILMOQRVWWVWWVT�VWZ^bdgg�ikllifba^^_abfggfa^ZY�WYZZ\_bd�f�gknqsvy{~����������������������������������������������������������3�������������������������~{wvtsqnkkiiggfaZVQMIEDBA?=�<:742�0245�7�5�7�5�40--�,-/�02478:=ADEGIIJLMQTVWW�V�TVWWY\_bdg�ikllifba�_ abdffda^ZY�W YZZ\^abdff�g knqstw{~��������������������������������������������������������������������������!�������~{wvsqonllkiigfa\VQMJGDBA?=�<:742�0�2�0�247�8�7�52/-�- /020245778=ADG�IJLMQRVWWVTTRTVWY\^_bdg�i�kiklkgfda�_�a�ba_^Y�W�Y�Z\^abbdffgginqsvw{~������~�����������������������
������������������������������� ������������������������~|{wvsqon�lkifda\WRQMIEBA??=<:8742�024�2458�:8�787�540/�/0�245�78<ADG�IJLMOQTVVT�R TVY\_aabdgikk�l�kiggfb�_�^\Y�WY�Z\^__abdfgilosvy{|�~
|{yy{|����������������������������������������������?�������������������������|{yywtsqoonllkgdba^YVTQLGDBAA?=:8742002�457:<�=<:�8755�420�02�4�7878:<?DEGGIJLMMO�RTVY^a�bdfikk�l�kiggfda_�^�\Z�Y�\�Z�Y�Z�\^_adfilnqtwy{||yywwvvwy|~������
����������������������������������������������������������������~ywvwvtsq�onlifdba_ZYVROJGDBBA?<874�0244�5�7:=?AA=<�:8755�4�2�4�57�8 :<=?BDEEGIJLMO�QR�TWZ_�bdfi�k�igfddb_^\\�Z�Y�Z�\Z�Y�Z \^_bfiklnqvw�yv�t�stwy{|���������������� �����������������������������������������������������~|{wv�tsq�o nkgfdba_\ZWTQMJGDBA?=:74002244557�8 <?ABBA=<::8755�4�5�7877�8:<=?ABBDDEGIJMO�QR�TY\_�bdffg�k�igff�d ba_^\ZYYWVVWWY�Z�\Z�YZ\^_bf�ikosvwvt�s�qsvwy{~���� ������������ ������������7��������������������������������������������|{ywttsqqonn�lkgfda__^ZWTROLIEBA?=:75�2�45788:<?BBDDB?<::87�4�5�78:<:�8:<=?�ABDEGILO�QRT�VY\_aabf�gikkiggff�db�a_\ZYWV�TVWYZ\�^\�Z�YZ\^adf�gilosts�qstvwy|��������������������� ���������������/�����������������������������������|{yvtssqonnlk�igfda__^ZWTRQMJGDA?=:875422�45778<?B�E DA<:875445�7�8:<?=<�:<=?A?�=?ADEGJMQ�RV�W Y\^_abfgii�gf�da�_^\ZYWT�RTVY\^�_^�\�Z\^ad�fiknq�o�qstw{~����������������������������������������)���������������������������|ywvsqqsonnllig�f+dba_\YWVRQMJGEB?=::87542244578:?BEGIGGDA<875�457�88:<=??=�<=??=�< =?BDEILORTTV�W Y\^_abfgiigfd�b�d
ba_^^\ZZYVT�RVY\_�a_^�\^_adff�dfgk�n�ln�oqsvy|~��~~����������������������������������������������������������|yvtsqooqonnlkgfd�b�d)ba^ZYYWTQMJIGDA=<<:875424557:=ADGIJIGDA=85�457�8:<<�=�<=<�=<::<=?BDEGJMRTT�VWY\^_bbf�gfdb�a�bdaa_^\ZYYVTRRQQRTY\_�a_�\�_bdf�dfgi�k�l�i�lnoqtw{|~~|{|���������� �����������������������������������������
�����~yvsqo�nonnlkgdbb�a_aba_\ZYZYTQOMJGDA?=<�:7545778:=ADGIJJIDA=854�5�7�8:�<�=�<�:
<=ADEEGJMQR�TVY\_abbdffdffdba�_�a�_^\ZWVTR�Q RTWZ^__aa_�\�Z\�_ab�d"fgiiggiigffgknoqsvy{||{y{~����������������������������������� ������������������~{wson�lkgd�a_^^__^\�Z YVRQOLGDBA?=�<:87788:<=ADGIJJIEA=:8�7�8�:�<�=<�:<?AD�GJLOQ�TY\_a�b�dbddba_�^�\ZYVRQOMMOOQQRTVYZ^_aa^�\�Z\^�_�abddfgigg�f�diloqsvy�{ ywy||~��������������������������������������������������������{wtonl�kgda__^�_�\�^�\�Z YWTQOLIEDDB?==�<�:<=??ADGIJJIEB?<<::�8788:88:<�=<�: <?ADGIIJLOQR�TWZ^�a�b�a_^�\ZY�WTQML�J LMORTVVWY\�_�^�\^�_abdff�gfdbb�dgloqsvy{{ywvwyy{|~���������������������������������������������������~|ytqnlk�i gda__^\\^^�\Z�Y WTQMJIGEEDBA?�=?==?A�BDGJLJIGDA??==<<::�8<:8:<�=�<�: <=ADGIGIJMOQ�TRWZ\__a�_�a�_^Z�Y�V�TQMLJIGGIJMRTVWWYZ^^�_�a�_abdbdffd�b�dfgknstvy{ywvttvvwwy{~~����������������������������������������������|ywtqnlki�gfdb_^^\�ZY�Z YWWVROLJIG�EDAA�?A??B�DBDGJLLJIEBAABBA=<<�:=<:<�=�<�=<::<=ADEGGIJMOQ�RVYZ\^__^^�_^\YWVTRR�QOLJJGEEGILQTVWWYZ\^_�ab�d�ba�_�abdd�b dfgiknsvwy{ywt�s�tvw{{|��������������������������������������������|yvsqnlkig�fdba_^\ZZY�WYZZYZZYWVTOLJIG�ED�B�ABDEE�DGJLMMLIEDDEEDA?�=
=<<=?=<<=<<�=�< =ABDGGIJMO�Q RTVWY\^^\\�^\YWVTQO�MJII�EGILQRTWVWYZ^_abdfggf�dba__^__a�b�f gilnsvwyywvts�q�stvwy{| �������������������������������������������~{wtqnlkigfdd�fba__^ZYYWVVWWYZYZZYVTQMJIGEE�GE�D�BDEEG�EGJLOOMJIGGIGEDA�??==??=<<�=�?�= ?ABDGIJLMO�Q�RTVWZ�\ZWWVROL�JIGG�EGILOQRTTVWY\_abfgiig�fdba_^^_a�bdggiknoqt�wvts�qsttvwy{~��������������������������� ������������ ��|yvtqnlkgf�d�f da_^^\ZYWVTV�WY�Z YVROLJGEEG�I�G�EG�I�GILMOOML�JIGEB�A�A�?=<<�=�A�?ABDEGIJLO�QOQRTVWZ�\ZYVVTQMJI�G�E�DEGJMMOQQRTWZ^abf�ig�fdbaa�_a�b dfgikknoqtvw�vts�q�stvww{|������������������������� �������������� ��|yvsqnlkfd�b dba_^Z\ZYWVTRT�V WYZZYVROLJIGGI�J�IJLL�JLMOOMMLJJ�LJGEDBAA�BA??�=?A�B�DEGIIJLO�Q�ORVWY\^^\^^\ZWVTROLIGEDDEDBBDD�BEI�J LMOQTW\_ad�g�fdbaab�a�bdfgik�lnqst�vt�s�q�s�t�v wy~��������������������������������� ��~yvsqonkfb�a_^\Z�YWVT�R�T�V WYZYVRQMLJIJL�M�LM�O�M�OMLL�J LMMLIGEDBBDBA??==<<=?ABDD�E�GJIJLOQ�OQVWZ\�^\ZWVTQOJGDBAABBA?�ABDE�G
ILMMQVY\_bd�f�dbaababbd�b dfiklnllnoqs�tv�t�s�t vw|���������������������������������� ��~yvtssokfb�a_^ZY�WVTT�R�TV�W�YVTQMLLJMO�Q OMMOOQRTRR�QRQOMLLJJLMMOMIIG�DDB�A ?=<<=ABBDE�G�I�J�LM�OQTWZ\�^
\ZYWVROMJEB�?�A?�=?AABDEEGIJLORVY\_abddbbdd�b�dfil�noqss�t tv{�����������������������������������|ywwvtqlgb�a_\YW�VT�R�TV�WVTQO�MOQRTTRQQRTVWWVT�R�TROM�LM�OMJIG�E�BA=<<=ABDDEGIIJJL�J�LM�OQTVZ\�^ \ZWTROMLIDB??�=<�:<�=?�B
DEIMORVZ^_a�b�d�f�dfgil�noq�st�v�t tvy|�����������������������������������|yywvtqlgdba_^ZWV�T�R QOQQRTVWVVTRQQ�ORT�V
TVWWYYWTRTT�VTQO�M�O�QOLJIGGE�B�DB?==?BD�EGIJLMMLJJLLMOQQ�OQTVY\^^�\YTQOLJIGDBA?=<:�8�:<�? ABEJLORWZ^_abd�f�gf�d fgiklnoonnoq�st�v�w�vt tvy{~����������������������������������|{ywvtqlifdb_\YWV�T�RQO�MOQTVVT�R�QRTVWW�YV�T�VTR�Q�RQOLJJIE�D�E DBA?ABDEEGIJJL�MLJJLMOQ�O�QTVWZZ\Z\ZWROMJGEDBBA?=:87�5�78:<==?BGILOTWZ\_bdff�g�if�d fgkllnoqqooqs�t�stvv�w�vt�vwy|~������������� ����������������������~|yvtsqlkgfba^ZWV�TRTQQOOMMLOOQRTTRR�TVWYZ�\Z�YW�V�T�R�T RTTVVTRQOMLIE�E�G EDBBDEGGIJ�L�MLJLMOQOOQRRTVWYY�ZYVQMLIEDBAA?=<:75�4�2"45578<<=ADGJMQTWZ^abdfgiigiifddfgkn�oqssqqstv�wv�tv�w�v�w y{|�����������������������������������|yvtsqnkifdb_\YWV�TQ�O�M�OQR�TVWW�VWZ\�^\�ZYWWVV�TVWW�V�W�VTRQMJG�IJG�E�GIJL�M�O MLJLMORQQR�TVW�YZYWTOLJGEDB??=<:855442200�24588:=ADGJMQTY\_abdfgigii�fglo�s�t�vw�ywvtv�w�vw�y�w
y{~�������������������������������|yvvtqnkigfb_\YWWTTRRQ�O�M�OQ�R�TVYY�WYZ\�_ ^Z\\^ZYYWW�VW�Y�WY�WVTQMJ�LJ�I�J
LMOQQOOQQOM�LMQTTRT�VW�YWVROLIGEDB?=<:87�542�024578<?BEGJMRWZ^_abdf�gilqtvv�w�ywvwyyw�vw�y�wy|��������������������� �����������|ywwvsnkigfb_\ZYYVTRRQ�O�Q�OQRQQR�TVW�Y�Z\^�_^\^__^\�ZYWWY�Z�YWVTQMQOO�M�L�MOQ�RQRQOM�LOR�VYZYYWWTROMLIGGDA=<:877�52�0/-/0458:=?BEILRVY\^_abd�f�g�iknsvwy�{�y�{yw�v�tvw�y�w {|~������������������������������|yywvsoligfb_^\ZZWVTRQOO�Q�R�QRQQR�TVWYY\^__aa_^\^_aa_^\\ZYYZZ�\�YZYYWTQVTRQOOQQ�OQRTTRRQOMLLMQTVWW�V WYZYWVTQOMLJ�IEA=:8�7-54200220-,-/2478<=ADGLQTVY\^_abbdfgikklnosvy{|�~�|{ywwvttvw�y�w y{|~������������������������������~{ywvsoligfba_^^\ZWVTRQQ�RTVT�R�TVWY\_�a
_^^_abdba_^�\�^ZYY�ZYWVYWVTTRTR�QOQRTTVTTQOOMMORTVVWVWW�YWVTROMLJ�IGB=:8�7"5420022/-,,-0045:<=AEIMORVY\^_aabfi�knossvy|~~���~���~|{wwvtvwy{yywvvwy{|~~����������������������~$����~{ywvsoligfbba__^\YWVTTRTTVWWVVTT�R�TVW\_�a_^_ad�fda__a�_a__^�Z\ZZ\Z�YWVT�R�QR�T�VTR�Q�R�T�VW�YWVTRQMLJIGGIIGD?<:8�754�2+0/-,,-//048:<?DEILQTVYZ\^_afikklnqttvy|~~���������~|{yywvwy{|{ywvvwwy{||~������������������~�|~���~{ywvsnkigfdbaa_^\ZYYWWVVWYY�WV�TVWZ^�a�_bf�gfdbb�d�ba_^�\�^_�^ZWVTT�R�T�VTR�QRQRRT�V�WVTROMJIG�E�IGDA=:8755�420/-�,�-!/278<?BDEIMQRVWYZ^_dgklnoqttvw{|~���������|�{�wy{|~|{w�vwy{|~����������������������|�{|~���|{wtqnkgffdbaa^�\�Z�Y�ZY�WYWWV�TVWZ\__�a�_bfggigg�f�gfdda_�^�_�a_\YWWVTTV�T�VTR�QRQQRT�VTROLJIGEDDEGIGDA?<:75�4�5420/-�,#-/0258<?ABEILOQTVWY\_bfknoqstvwwy{~��������|�{�y{|~�~|yw�vw{|~����������������~|�{|���~{wtqnkgffdbba^\\�^�\ZY�W�YWVV�TVWZ\^_�a�_bfgg�i�g�igfdba�_�a�_�ba_^�ZWVVY�W�V TRQQOQOQQRTT�V�T ROLJIGEDBB�EBA?=<7�5�20//-�/#0245:=?ABEILMORTWY\^afinqstvvwwy{~����������||�{|~��~ |ywwvvwy{|�~������������~�|�{~��|ywtqnkigfddba_^\�^�\�YW�Y�W�VWY\^^�_df�g�ikllkgfdbb�a�dbaa�dba_�^\ZYY�ZYWVTRQO�M�O�Q RTVVTRQMJIGED�B�D�BA?==<8�754�2�0�24578<?ABDGJLLMQTWZ\^afilqtv�wy{|�������~||�{�|~���~{yywvwyy{|~||~���������~�|�{|�{ |~~{wvtqnlli�fdba_^^\\�ZY�W�Y�W�Y�WYZ\^�_ad�fgiklnnlig�fdbbd�f�d�fda�_^\\Z�\ZYWTQOM�LMORTVVTROMIGDDBBDBAA??=�<:�85442�4�578:<=ABDEGIJLMORVZZ^afikosvw�y�{~�����~�|�{|~����~|{{�wy{�|~���������~|�{�|~|{wtsqonnkgfgfdba^\YYWYYW�VWYYWWY�Z�YZ\^aa�_�a�dfgklnnlk�g�f�gigg�gfb�a_�^�\ZYWTQM�L�J LMQRTTRQMLIE�B�DB?=�<�:�<�:85�45�7�8:<=?ABDEGIIJLMORVYZ^afiknqtwy�{�y{�~�|�~�|�{|~�����~|{{yy�wy{||~���������~|�{�|�{|�~|{wts�qoli�gfda^ZW�V�TV�WY�Z\_bb�a�b�dfgk�lk�i�k�i�ki�igd�b_�^\�^\WVRQOLL�JIJLO�QOLIGED�B?<�:�8:�<87�5�8�:�<=?B�DEIIJJLMORVYZ^adgklosvw�y{�|�{�|�{�y�{�~�����~|�{�y{|~~�����������~�|�{�|�{�|yvt�s qliggfdba^YWV�T�R�TVW�Y�Z
^addaababbd�b�dfg�k�l�kln�lk lkigfdba_^\\�^\WTRRQML�J�IJLMMLJGE�DB�A?<:�8:<=<:8�7�8:<<=?ABD�EGIJ�LMORVY\^_bfiklqtvv�wy�{�|�{�|{�y{|�~����~|�{|�~���������~||~�|�~|�{�|{wvttsqnkigdba_\YWVTRRTT�RVYYWWY�Z\_bddbbd�bd�b�dfg�i�kln�o�noqqonl onlkifbaa^�\^\WTRQQOMLLJIGGIJJIEDDBB�DBA??=<:�8�:=<<:78:8�:<==?BDEE�G�IJ�LMORVY\^^_bgiiosts�v�w{||�y�|�{�y{|~||~�~��~�{�|�~�������~~�|��~��~�|~|�{ywvttsolkgda_^ZYWVT�R�QRVYY�W YZZ\^abddb�d�bd�b�d fgiggiklnoqqs�q�tqon
qonlkgdbb_^�\ZYVR�Q OMJIGEEGGE�B�DBA?�=<:88�:�<:8:�<=?ABE�I�J�L�MOQRVYZ\\^adfgloqq�stvy{{�y�{�y{�|�|~��~|�{�|�~ ����������~|�{|~��~~���~|{�ywvttsqnkgda^\ZYWVT�RQOOQRVYY�WY\\^_bdff�d�b�df�giknoqqs�t�vtsq
sqnnlkfdda_�^\ZYWVRR�QOLIGEEGGE�ABDBA?�=:�8�:�<�:�=�?ABDEI�L�J�L�M�OQTVYYZ\^_abfklnnoonnoqtwywyywyy�wy{{||{�{|��~||{{�|�{|~~|~�������~|�{|~���~���~�|{y�wvttqonkfda^\ZYWVV�T�R�ORTW�Y Z^^_adfggfdb�d�ba�b dffgiknqsq�tvwyyvtttqonnligfdbaa_^ZYWVTTR�QOMJ�GEBA�?ABBA?==<:�8:<�=�<=?B�DEGIL�M�L�MO�QRVWYYZ\^^_adgik�l�klostvv�w�vwy{||{�{|�~|�{�y{�|~������~|{{�|
~��~||~��~|�{yw�v tsonlifdb_\ZZY�WVTTRRTVY�Z\^__abf�gfdbbdd�b�a
bdffgiknqss�tvy{{ywvtsqonlk�igfda_\ZYWVVTRQQOOL�I�GEBA==�?�A=�<�:<=?=�<=?ADE�GILM�O�M�OQ�TV�WYZ\�^_adfg�i�gknqsttvv�w vttsstwy{|{y�{�|�~�� ~{{yywwy{{|��������~"|{|~~���~||~��~|{yywvttvtqnlkifba^\�ZYW�V WZ\^\\^_aabdf�gfd�ba__abffgilnqttvttvvy{||{wvttqonn�lkifb_^\ZYWWVTRQOOMLJJIGEDA==�?=�<
=?=<<=?ABDG�IJMOQQOO�QRTV�WYZ\�^_adf�g�filoqs�t�v tssqqsvy{{yy�{�|~��~|{yy�wy{~������~||~����~||~��~~|ywvv�t solkkifba^�\^__^^\Z�YZ\^�_abd�f�gfdd�b�dba__abfgiknoqtvvtvwwy{|~|yywvtsqqonlkigb_^\ZZYYWTRQ�OMLLJGEDA�?�=�<=�<�=�? ABEIJJLMOQRRQQ�T VWWYYWWVVWYZ\\�^_abf�dfknoqsqqstssqqooqswyywy�{�|~��~|{�y w{{|�����������~�� ��~||~��~~|y�w vtsqnlkkifba_�^_aa�_�^�\�^ _abbdfggffggf�d�b�db�a�b�giloqqs�vwy{|~�~||{ywwvtsolkigb_^\�ZYVTRQQOMMLJGEDBB�A?�=�<�=�<�=�?�ABDGIJLMOQ�RTVWW�YW�VWYZ\\�^_�bdgknoonno�q�oqt�wy�{|~��~|�{�|~���������~���~���~|{�y wtsqnlkkigdb�a�b�a_�^_bdfg�i�gfddf�d�fd�bdfiiknq�stv�w{~���~�~|{{ywtqlkigb_^ZYYZZYWVRQQOMOLJGG�EDBBA=<<=�<�=�?=�<�=?ABDEGGIJLMOQQRRTVWYYZY�W VWWYY\^\^^�\�_�abdgk�ln�o�nqs�vw�{|~��~|{{�|~�~~|~~��������~���~�|�{ ytsqonlkiiff�bd�fd�ba__^^_bfgklkkiigg�fg�f�dgi�lnq�s tvwyy|~����~�� ~|{yvsnkigda^Z�YWTRRQOOMJ�IGEDBA=<<�=?�A?�=�?ABEGIIJL�M�OQRVWWYZZY�W�Y�Z\�^\�Z\^�_abf�iklnnoon�lnqsttvw{||~��~�|�~�����~���������~����~�|{yvtsqonlkkigdbdf�gf�d baa__abfik�lki�g�i�g�fgkn�oqs�tvw{|~~��������~|{vsnlifdb_\ZZ�YWVTTQ�OL�JIGEDBA=�<=??A�B�?�ABEGIJLMOOMOOQRVWY�Z�YZ\\ZZ\^^�Z�\�^_bd�gikklnnlkllnqsttwy{�~��~�|�������~����������|�~������~�|ywvtqon�lkgddf�g�igffggfbb�abfiikklki�gikki�gikloq�s�t�vwy|�~���������~{vsonifdba_^\ZZYY�WVR�Q
OMMLIEDDBA=�<=?AA�B�A�BDEGILMOQQ�OQRTWY�Z�\�^\ZZ\\�Z\�^_bdf�g�i kllkklnoqstvy{|~���~�|~������~���~~���~�|~�������~�|{ywvso�nkg�f�gikigikigffdbbdf�gikki�g�i�k�iklnoqsv�w�y{|�~���������~|wtonifdbaa_^\\ZYWYYWT�R QOMIEDDBA=�<�=?ABDDB�A�BDEGJMMOOQQOOQRTWY�Z�\�^_^^\�Z\^__�^_abf�g�i�k�lnoqsvwy{|~���|�~���������~~��|�~�|����������~�|ywtq�o
nkigffggikl�klkiggf�d�f�gik�i�k�lnostvy{||�{|{||~����������~|yvqnkgdbaa_�^\Z�YWV�T RQOJGEEDA?�=?AB�D�B�DEGIL�O�QRTWY�Z\�^\�Z�\ ^__^^__abfggi�k�lnosvwy{|~��~�|~��������
����~|{{yy{�|�~���������~~||~~|{wtssqolkiggiik�lk�ig�f�gi�kl�n�oqsvy{|~���~�����������~{yvsolgdb__^�_\Z�YWVVTTVTRQLIEEDBA�?A�B�D�EGJMO�QRVWYYZ�\ZYZZ\\^^\\^_^^_abd�fi�k�i kllnnqtwy{|~��~�|~�������������|ywwvwwy{{|�~ ���������~|~||�~ yvttsqonlk�il�nlikki�gi�klkkl�oq�stvw{~~����������������������|ywvtqnifb_^^�_\�ZYWW�V TRQMJGEDDB�ABDDBBD�E�GILOQ�R�QRTVWY�Z�YZ�YZ\�^�\^__abd�fg�ik�losvy{|�~�|~�����������~{wvttvvwy{|�~��������~�|�~�� |ywwvtsqonlkkl�nl�kigikk�ik�lnoqqsv�wy{|��������������������{wvtsqnkgb_^^_aa^�\�ZYZWWVTRQOMJGEED�BDEDBBDDE�GI�JMQR�TR�QRTTW�YWVVWWYYZ\�^�\^_a�dfd�f�g�igi�knosw{|~||�{�|�����������~|{vtssvvwy{|�~ �����������|�~�� �~|{{wvtssqn�l�n�l�k igkllkklln�l�noqstvy�{|~�����������������������{wtsqonlgb�_�a_�^�\ZYWVTRRQMJIGEDDEDDEGE�DEI�JLMMOR�TR�QR�Q�RTV�WVTTVWYYZ\�^�\^_bff�d�f�d fgiiggiiklnqvy
{||{yy{|~����������~||{wvttvwy{|�~�����������~||~�����~{w�vtqonn�l�n�lk�ik�l�n�oqstw{|~������������������������~yvsqonnlgba�_�a�_^_^\�ZYWVTRQMLI�G�IGEEGGIJ�LMOQR�TR�QR�Q�R�Q�RTVV�TVWWZZ�\^\\^ad�f�dfd�b dgigfgiiklnqty{||�{�|~�����������~|yy�wy{|�~
�������������������~{�ywtqon�lnl�kigi�kl�n�o qstvw{���������������������������~yvsqnllkgdba�_�a^\\�^\YWVTROL�J�LJ�I�JL�MOR�TRQQ�R�Q�RQ�OQR�TVW�Y�Z�\^_bd�fd�b dgigfgikllnqtwy�{|�~����������~�|{yy{{|~���������������������~�|{wsqonllnlkiiggi�kl�n oqsstvwy|������������������������������~{vsqnkkigfdbaa_aabdbba_^^�a_^ZYWTRO�M�OM�L�MOQOOQRTVV�TRQ�R�QRTRO�MOQTTVTVV�W�VWYZ\^abd�fdbabdgigffgklnosstvwy{|�~|~�����������~|�{ |~�������������������� ������|yvsoon�l kggfggikkl�noqstvwy|~�����������������������������~ {wtqnkiiggffdd�bdffdb�a bddba_^ZWVTRQQ�R�QRQQRTRRTV�W�V�T�R�TROM�LMORTVV�W
VTTVWZ^_aab�dbabdf�g�filoq�stvw{�|�~�|~�������������~||~��������������������������~{wtqoonllkgffggikln�oqstvy|~�����������������������������~||{{yvsqnlikii�g�fdffggddbbdfgfdba_ZYWWVV�W�T
VTTVWVVWYZZ�YWVV�TQML�JLMORT�VTVWY\^_�a�b�d�b�a�bdfgffilo�qstvw�{�| {|{|~����������������� ����������������������������|wtqoonlki�f�gklnoq�stvy|�����������������������������������
~|{yywvsqon�l�ki�g�igf�dgigffdb_^�\ZW�VW�Y�Z\^^�\�^\YW�V TRQMJIIJJLMQR�T�VWYZ^_�a�ba�_ abdffgiknooqsvww�y�{�|~������������������������������� �����~yvso�nkg�fgiloqst�vwy|������������������������������� ~|{ywwvtsq�o�l�nl�k�i�fiki�gfb�a�_^Z�YZ\�^�_�a _^ZYWWVTRQOLJI�JLOR�TVWYZ\_ab�a_�a_^^\^^_abdfggiknnqstvvww�v�w y{||~����������������������������������������{wtqnnlki�giknqstvwwyy{����������������������������������~|{y�wvt�sq�on�lkii�gikk�igf�d ba_^^\\^_abd�f�d�f�d ba^\ZYWTRQOML�JLOR�TVYZ\^_a�ba�_ ^\Z\^_aabf�gilnoqsttvv�t�vwy{{|~�������������������������������'���~yvsonlkkiiklnqstvwwy{|~������������������������������ ��~|{yywwv�t�s�qo�n�l�kigg�i�ki�gfb�a�_abdfi�k�g�f�g�f db_^\ZYVTQMLJJ�IJMQR�TVYZ\^_a�ba__�^�\�^�_ bfggfgklnq�s�t�s tvvwwyy{{||����������������������������������{wtqonllkklnostvwyy{|������������������������������������ ���~~|{yywwvv�tsqonn�lk�ikllk�if�d�bdfgilnonk�i�g
fda_^\ZYVQL�IJMQR�TVWYZ\^a�b�a_^\\�^
_bfggfgiklo�q�st�v�wy{~�����������������������������|yvtq�o�noqstvwy{{|~�����������������������������������������~~|{yywv�wvtson�l�k�l�k�ikg�f�gkno�qn�lkiiggfdba_^ZYVQLIG�IJMQR�T�VWYZ\^_�b�a_^�\^�_�^
_bdfgfgiikl�o�n�qstt�s�twy|~����������������~ ��������������~|{ywts�q
sttvwy{|~��������������������������������������������~|{�ywvtqon�lkiiklk�i�knq�sq�onlkigfddba_\YVQMJ�IJLMQRTTVWWYZ\\^_a�ba_^�\^�_�^_abdff�gi�l�noqsqoo�qsvy{|�~�|~���~����~||�{|~����������~�|{ywv�tv�wy{~��������������������������������������������������|�{ywvtson�l�n�lkiklonn�l�nqt�vtssqonlki�g fba^YVROML�J LMORTTVWWY\^^�_
bddba_^ZZ\^�_\^^_a�bdfddf�i�k�n�o�n�oqtwwy�{�|�ywyy{|�{|~�~|y{�wy{|~������~�|�{|~|{ywwyy�{�|�������� ��������������������������������� ���|{{wvttsqon�ln�onll�klo�q�o�qstvw�ywvtqonnl�k
ifb_ZWTRQQM�LMORT�VWZ^_aa__addba_\YZ\�^�\^�_a�bdfg�i�kl�noqstv�wy�{ywv�tv�wy{|{yww�vwy|~~��~�|{�y{|~|{yy{�~������������������������������������������������������~|{wvttsqoo�no�q�o�lklnoqq�sqstvwy{{�|{ywt�qo�nlid_\YWWVTQOMMLMOT�VW\_abba_abba_^ZYZ\^�\�Z�\�^_aabbdf�gik�lnoqst�v�wvtss�qs�tvwwv�t vtvw{|{|{{�y�{ywwy{�|{|~����������������������������������������������������� ����~{ywvvtsqq�oq�sq�onllnoqss�tvwy{�|~��~|{w�tsqqonkfa^\ZZYWVTQOMOQT�VY^_abba__aa_^\ZYZ�\Z�Y�Z�\^_aaabd�fgi�klnoqstt�vts�q�o�qstts�qs�tv�yw�vw�y�wy{�|�~������������� ������������������������������������� �����~||{yvtst�q�s�q�onllnostt�v�wy{||�~���~|{�w�vtonlgba_�\ZYWTR�QRTTVVY\_�a_^^�_\ZZY�Z�\�ZY�W�Y�Z�^�_abddbddf�gi�kloqqss�tsqooq�o�q�oqsst�vwv�t�v�w vwwy{|~���������������������������������
���������������������������������|ywvvttssqq�o�nosv�wy{|�~�������~|�{ yvqnlifdb_�^\YWWVT�R TVWYZ^__^\Z\�^Z�YZ\\ZYY�W�YZ�^_bddbabd�fg�klo�q�sq�o�q�o�nonnoq�st�v�t�v�w
y{~����������������������������������������������������
��������������~{w�vtqqoonnoqoonnosv�y{|����������������
~{wsoligffb�a ^\Z\YWTRRTVWYZ�\ ZYYZ\\ZYWW�Y�Z�Y
WYYZYYZ\^_a�dbabb�d�fikllno�qo�q�oq�o noonnllklnnlln�oqsst�v�t�v wy|��������������������������������� �������������������������������������~{�wvsqoonno�q�oqtwy�{|~������������~{vql�igfdba�_\YV�TVWY�ZY�W�YWVVW�YZ\\�Z\^ab�d�b�d�fgk�ln�o�n�o�n�onlkiik�l�noqqsvww�v w{~�������������������������������� ���������������������� ������������|y�wvsqoonnooqqoqsvy{�|~����������������~wso�lkif�d�b^ZWV�TVWYY�ZY�V�T VWYYWWYYZZ^^�\^bd�d�b�dfgi�klnn�l�n�o nllnnoonkiggii�kl�n�oqsvww�vw|�������������������������������������������������������������������������|ywvtssqo�noqqstw{|�~������������������ytsq�onli�gfd_\ZYV�TVWY�ZYVTT�R�TVWYWWYZ\\�^_bd�d�bdffgikk�i�k�i�klnonlkkl�nli�g�ikln�oqsvww�v y|���������� ������������
���������������
������������������/����������������������|yvtssqonnlloqtvwy{|~~��������������������|wvsqqsqnl�kifb_\ZWVTTVWYZZYYWTR�Q�RTVWVWYZ^^�_�a�_�b�bdbbdd�fgikki�g�f giknlkigikllk�f�gilo�qstvww�v
wy|����������������������������������������������� �������������� �����������{wt�sqonllosvy�{|~��������%��������������{wtsstsqonnlkgda^\YWVVWY�Z�YWTR�Q�R�T�VWYZ^�_abb�a�a�bd�fg�igff�d�bdfg�igffgiig�dfggiloq�stvwyyw�v wy{|������������������������������������������������������������������������|ywt�so�nosv{�|~����������������������~{w�v tsqqnkgdb__Z�YWVTR�Q�RTVWYZ\�^_bdbba_�_�a�b�d�fgiigfdb�ab�a�b�d�f�d�fd�bdfggikoq�tw�y�w y|~������������������������������~~��
�����������������������������������������|{w�tq�o qsv{|~������������� �����������|{y�w
vtsokgdbaa^�\Z�YV�TRQQ�R�QRTVWY�Z\^a�ba_�_�abdffggfba�_�a�_ab�db�a�b dfggiknqtvvy�{�y |��������������������������������~ ���������������!����������������������������|yvvts�q stw|~��������������� �������~|{yy�wvtqkgfdba_^__^\ZYYWV�T�RQ�OQRVWW�YZ\^_�a^�^_^^_abbddb_^\\^�\^__^�Z\^abb_^\\^^abddfgiknqtvwy{�|�{ |~���������������������� ���������������||{||������������������������������������������~{ywv�t vy~������������
�������|{yy�wvtqligfdb�a_^\ZYWV�TRQO�MOQTVVW�YZ\^�_^�\�^�\�^_aa_^\�Z�Y#Z\\ZWVVWY\^^\ZYYZ\_bddfgklnqtwy{|~���~ ������������������������������|{y{|����������������������������������������|{{y�v w{�������������� ��������|{yy�wvtsnkg�f�d
ba_^\YYWVTR�TQO�M�ORTVWWYYZ\�^_^�\�Z\Z�\�Z�YW�V WYYWTRRTVW�Y�W#Y\_abdfgknosvy{|~�������������������������� �����������������~{{y{|��������������������������$�������������������~~|ywwyy{~����������������
��������|{y�wvtsoli�g�f dba^\ZZYWT�RQOMM�OQRVWWYZ\\�^�^\�Z�YWT�RTVVTQOOQ�R�TVWY\_abdfilosvy|~������������������������������������������������|�{ |~��������������������������������������������~|{{||~������������������������������|{w�vwvtsqoki�g�fba^\�ZYWTR�Q�OM�O�QTVVYZ\Z�\�^\�ZYW�V�WTQ�OQRQOO�MOQTTWZ_abdgilotw{~����������������������������������������������| ~���������������������� ��������������
�������������������������������������������~{wvttvvtssqnkig�fb_^\�ZYVR�Q�O�QRTVY�Z\^^\�ZYV�T�VTQOMM�L�MLJIIJJLMQRVY^abfiknqvy|���������������������������������������������~ ������������������������������������������������������������������������� ����������{wv�t�sonli�fb_^\�ZYWVR�QRVY�Z�Y�Z�\�ZYTRTRR�TRQOMLJJ�I�JIEEDGGJLMQVY\_bfiloty|��������������������������������������������������������������������������������������������������������������������� ����������|y�vt�s qonkgfddb_\Z�YWVTRR�Q�R�QRVY�Z�YZ\\�\�ZYVTT�R�QOMLJIG�ED�BDEIJLQVY\_bfknsw|������������������������������� ������������������ ���������������
������������������������ �����������������������������������������|ywvvt�sqnkigba_^ZYWYWWVT�R�TR�QRVY�Z�YZ\^�^\�ZYWVTRR�Q�OMJGED�B�ABDEGILOTY\adgloty~�����������������������������������������������������������������������������������������������������������������������������������������|{ywvtt�s qnkigb_^\Y�WV�T�VT�R
TVYZ\\ZZ\^_�_^\�ZYVTTQ�OMLIEDA�?�=?ABDEGILOTY^bfinqv{�������������������������������������������������������������������������������������� ��������������������������������������������~{{wvtsst�s
qnkifa_^\YW�V�WVWVWW�V�TVWZ�\^a�a�_�^-\WVTRQQOOLLGDB??==<==?ABDEIMQVZadginqv{����������������������������� ����������������������������������������
����������������������������������������/�����������������������|{ywtstvtssqnkgda_^\YWVTV�W�YW�VWY\�^_a�a�_�a_^ZWVTTRQOLJGDA??�= ?ABDEJORW^bfgkosw|������������������������������������������������������������������� �����������������������������������������������&�����������������|{ywtstvtssolifda_^\YW�VWYZYW�V�WYZ^�_a�b�a�ba_\YVTVTROJIEDA�?�=!<=ABDGLRVZ_bfglqty~��������������������������������������������������������� ��������������

88
Assets/TestScenes/HDTest/GraphicTest/Common/Dragon/Dragon_specular.psd.meta


fileFormatVersion: 2
guid: 53cf1b46cfd6ff347aad6fd4c6e1ea1e
timeCreated: 1490775966
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: -1
mipBias: -1
wrapU: -1
wrapV: -1
wrapW: -1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: PS4
maxTextureSize: 2048
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest/SSS.meta


fileFormatVersion: 2
guid: 5b138ce4bb2634640802ec8b652c4d13
folderAsset: yes
timeCreated: 1493290941
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

197
Assets/TestScenes/HDTest/GraphicTest/Two Sided/Material/GroundLeaf_DoubleSidedFlipSSS.mat


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: GroundLeaf_DoubleSidedFlipSSS
m_Shader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
m_ShaderKeywords: _ALPHATEST_ON _DOUBLESIDED_ON _MASKMAP _NORMALMAP _NORMALMAP_TANGENT_SPACE
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
m_CustomRenderQueue: 2450
stringTagMap:
RenderType: TransparentCutout
disabledShaderPasses:
- DistortionVectors
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AnisotropyMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BaseColorMap:
m_Texture: {fileID: 2800000, guid: 00447c5eeb984f54d92c80818840a36b, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 2800000, guid: 0c3144d154991884c8aa53e7dc7893ff, 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}
- _DetailMap:
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}
- _DiffuseLightingMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DistortionVectorMap:
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}
- _EmissiveColorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _HeightMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: 00447c5eeb984f54d92c80818840a36b, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MaskMap:
m_Texture: {fileID: 2800000, guid: b24f69ff4ace9194fb0d9eee4f5cf1a4, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 2800000, guid: b24f69ff4ace9194fb0d9eee4f5cf1a4, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: 0c3144d154991884c8aa53e7dc7893ff, type: 3}
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}
- _SpecularOcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SubSurfaceRadiusMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SubsurfaceRadiusMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _TangentMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ThicknessMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _AlphaCutoff: 0.5
- _AlphaCutoffEnable: 1
- _Anisotropy: 0
- _BlendMode: 0
- _BumpScale: 1
- _CullMode: 0
- _Cutoff: 0.5
- _DepthOffsetEnable: 0
- _DetailAOScale: 1
- _DetailAlbedoScale: 1
- _DetailHeightScale: 1
- _DetailMapMode: 0
- _DetailNormalMapScale: 1
- _DetailNormalScale: 1
- _DetailSmoothnessScale: 1
- _DistortionDepthTest: 0
- _DistortionEnable: 0
- _DistortionOnly: 0
- _DoubleSidedEnable: 1
- _DoubleSidedMirrorEnable: 1
- _DoubleSidedMode: 2
- _Drag: 1
- _DstBlend: 0
- _EmissiveColorMode: 1
- _EmissiveIntensity: 0
- _EnablePerPixelDisplacement: 0
- _EnableWind: 0
- _GlossMapScale: 0.892
- _Glossiness: 0.507
- _GlossyReflections: 1
- _HeightAmplitude: 0.32
- _HeightBias: 0
- _HeightCenter: 0.68
- _HeightMapMode: 0
- _HeightScale: 1
- _HorizonFade: 1
- _InitialBend: 1
- _MaterialID: 1
- _Metalic: 0
- _Metallic: 0
- _Mode: 1
- _NormalMapSpace: 0
- _NormalScale: 1
- _OcclusionStrength: 1
- _PPDLodThreshold: 5
- _PPDMaxSamples: 15
- _PPDMinSamples: 5
- _Parallax: 0.02
- _ShiverDirectionality: 0.5
- _ShiverDrag: 0.2
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _StencilRef: 1
- _Stiffness: 1
- _SubsurfaceProfile: 0
- _SubsurfaceRadius: 1
- _SurfaceType: 0
- _TessellationBackFaceCullEpsilon: -0.375
- _TessellationFactor: 4
- _TessellationFactorMaxDistance: 50
- _TessellationFactorMinDistance: 20
- _TessellationFactorTriangleSize: 100
- _TessellationMode: 1
- _TessellationObjectScale: 0
- _TessellationShapeFactor: 0.75
- _TexWorldScale: 1
- _Thickness: 0.5
- _UVBase: 0
- _UVDetail: 0
- _UVMappingPlanar: 0
- _UVSec: 0
- _ZTestMode: 8
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 0.5882353, g: 0.5882353, b: 0.5882353, a: 1}
- _DoubleSidedConstants: {r: 1, g: 1, b: -1, a: 0}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _EmissiveColor: {r: 0, g: 0, b: 0, a: 1}
- _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0}
- _UVMappingMask: {r: 1, g: 0, b: 0, a: 0}

8
Assets/TestScenes/HDTest/GraphicTest/Two Sided/Material/GroundLeaf_DoubleSidedFlipSSS.mat.meta


fileFormatVersion: 2
guid: 943c7c930eb495d4486788572dc49a12
timeCreated: 1460562588
licenseType: Pro
NativeFormatImporter:
userData:
assetBundleName:
assetBundleVariant:

8
Assets/TestScenes/HDTest/NewBatcherBench1.unity.meta


fileFormatVersion: 2
guid: efeef759b5144ef4fa1cfc182ddbaea5
timeCreated: 1493136714
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/NewBatcherTest.meta


fileFormatVersion: 2
guid: 01a0eae0646089f489a0047dc8afb564
folderAsset: yes
timeCreated: 1493224766
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

37
Assets/ScriptableRenderPipeline/HDRenderPipeline/SSSProfile/FoliageSSSProfile.asset


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a6e7465350bf0d248b4799d98e18cd24, type: 3}
m_Name: FoliageSSSProfile
m_EditorClassIdentifier:
stdDev1: {r: 0.27931032, g: 1, b: 0.050000012, a: 0}
stdDev2: {r: 0.3010142, g: 0.8235294, b: 0.05, a: 0}
lerpWeight: 0.5
texturingMode: 0
enableTransmission: 1
tintColor: {r: 1, g: 1, b: 1, a: 1}
thicknessRemap: {x: 0, y: 0.2873168}
settingsIndex: 0
m_FilterKernel:
- {x: 0.28517896, y: 0.09090909, z: 0.9996764, w: -0.00000009903661}
- {x: 0.22566724, y: 0.09090909, z: 0.00016186091, w: -0.209237}
- {x: 0.10604589, y: 0.09090909, z: 8.6876086e-17, w: -0.43068767}
- {x: 0.024215871, y: 0.09090909, z: 5.8571e-41, w: -0.6816498}
- {x: 0.0014802383, y: 0.09090909, z: 0, w: -1.0000685}
- {x: 0.0000013396462, y: 0.09090909, z: 0, w: -1.5417894}
- {x: 0.22566712, y: 0.09090909, z: 0.00016185877, w: 0.20923716}
- {x: 0.10604589, y: 0.09090909, z: 8.6876086e-17, w: 0.43068767}
- {x: 0.02421585, y: 0.09090909, z: 5.857e-41, w: 0.6816499}
- {x: 0.0014802383, y: 0.09090909, z: 0, w: 1.0000685}
- {x: 0.0000013396391, y: 0.09090909, z: 0, w: 1.5417898}
m_HalfRcpVariances:
- {x: 6.4090853, y: 0.5, z: 199.99991}
- {x: 5.518182, y: 0.7372449, z: 200}
m_HalfRcpWeightedVariances: {x: 5.9386554, y: 0.60145676, z: 199.99997, w: 0.60145676}

9
Assets/ScriptableRenderPipeline/HDRenderPipeline/SSSProfile/FoliageSSSProfile.asset.meta


fileFormatVersion: 2
guid: d6ee4403015766f4093158d69216c0bf
timeCreated: 1493161911
licenseType: Pro
NativeFormatImporter:
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

37
Assets/ScriptableRenderPipeline/HDRenderPipeline/SSSProfile/SkinSSSProfile.asset


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a6e7465350bf0d248b4799d98e18cd24, type: 3}
m_Name: SkinSSSProfile
m_EditorClassIdentifier:
stdDev1: {r: 0.22794116, g: 0.17430794, b: 0.17430794, a: 0}
stdDev2: {r: 1, g: 0.05, b: 0.05, a: 0}
lerpWeight: 0.5
texturingMode: 1
enableTransmission: 0
tintColor: {r: 1, g: 1, b: 1, a: 1}
thicknessRemap: {x: 0, y: 2.04}
settingsIndex: 1
m_FilterKernel:
- {x: 0.09090909, y: 0.5992897, z: 0.5992897, w: -0.00000006668997}
- {x: 0.09090909, y: 0.12275139, z: 0.12275139, w: -0.14089748}
- {x: 0.09090909, y: 0.061923057, z: 0.061923057, w: -0.2900195}
- {x: 0.09090909, y: 0.015196559, z: 0.015196559, w: -0.45901415}
- {x: 0.09090909, y: 0.0004841472, z: 0.0004841472, w: -0.6734332}
- {x: 0.09090909, y: 0.000000024399057, z: 0.000000024399057, w: -1.0382211}
- {x: 0.09090909, y: 0.122751325, z: 0.122751325, w: 0.1408976}
- {x: 0.09090909, y: 0.061923057, z: 0.061923057, w: 0.2900195}
- {x: 0.09090909, y: 0.015196541, z: 0.015196541, w: 0.45901427}
- {x: 0.09090909, y: 0.0004841472, z: 0.0004841472, w: 0.6734332}
- {x: 0.09090909, y: 0.000000024398872, z: 0.000000024398872, w: 1.0382214}
m_HalfRcpVariances:
- {x: 9.623311, y: 16.45643, z: 16.45643}
- {x: 0.5, y: 200, z: 200}
m_HalfRcpWeightedVariances: {x: 1.3264011, y: 39.750328, z: 39.750328, w: 1.3264011}

9
Assets/ScriptableRenderPipeline/HDRenderPipeline/SSSProfile/SkinSSSProfile.asset.meta


fileFormatVersion: 2
guid: 906339bac2066fc4aa22a3652e1283ef
timeCreated: 1493291209
licenseType: Pro
NativeFormatImporter:
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

288
Assets/ScriptableRenderPipeline/common/Debugging/DebugActionManager.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEngine.Experimental.Rendering
{
public class DebugActionManager
{
static private DebugActionManager s_Instance = null;
static public DebugActionManager instance
{
get
{
if (s_Instance == null)
s_Instance = new DebugActionManager();
return s_Instance;
}
}
private static string kEnableDebugBtn1 = "Enable Debug Button 1";
private static string kEnableDebugBtn2 = "Enable Debug Button 2";
private static string kDebugPreviousBtn = "Debug Previous";
private static string kDebugNextBtn = "Debug Next";
private static string kValidateBtn = "Debug Validate";
private static string kPersistentBtn = "Debug Persistent";
private static string kDPadVertical = "Debug Vertical";
private static string kDPadHorizontal = "Debug Horizontal";
private string[] m_RequiredInputButtons = { kEnableDebugBtn1, kEnableDebugBtn2, kDebugPreviousBtn, kDebugNextBtn, kValidateBtn, kPersistentBtn, kDPadVertical, kDPadHorizontal };
public enum DebugAction
{
EnableDebugMenu,
PreviousDebugMenu,
NextDebugMenu,
Validate,
Persistent,
MoveVertical,
MoveHorizontal,
DebugActionCount
}
enum DebugActionRepeatMode
{
Never,
Delay
}
class DebugActionDesc
{
public List<string[]> buttonTriggerList = new List<string[]>();
public string axisTrigger = "";
public List<KeyCode[]> keyTriggerList = new List<KeyCode[]>();
public DebugActionRepeatMode repeatMode = DebugActionRepeatMode.Never;
public float repeatDelay = 0.0f;
}
class DebugActionState
{
enum DebugActionKeyType
{
Button,
Axis,
Key
}
DebugActionKeyType m_Type;
string[] m_PressedButtons;
string m_PressedAxis = "";
KeyCode[] m_PressedKeys;
bool[] m_TriggerPressedUp = null;
float m_Timer;
bool m_RunningAction = false;
float m_ActionState = 0.0f;
public bool runningAction { get { return m_RunningAction; } }
public float actionState { get { return m_ActionState; } }
public float timer{ get { return m_Timer; } }
private void Trigger(int triggerCount, float state)
{
m_ActionState = state;
m_RunningAction = true;
m_Timer = 0.0f;
m_TriggerPressedUp = new bool[triggerCount];
for (int i = 0; i < m_TriggerPressedUp.Length; ++i)
m_TriggerPressedUp[i] = false;
}
public void TriggerWithButton(string[] buttons, float state)
{
m_Type = DebugActionKeyType.Button;
m_PressedButtons = buttons;
m_PressedAxis = "";
Trigger(buttons.Length, state);
}
public void TriggerWithAxis(string axis, float state)
{
m_Type = DebugActionKeyType.Axis;
m_PressedAxis = axis;
Trigger(1, state);
}
public void TriggerWithKey(KeyCode[] keys, float state)
{
m_Type = DebugActionKeyType.Key;
m_PressedKeys = keys;
m_PressedAxis = "";
Trigger(keys.Length, state);
}
private void Reset()
{
m_RunningAction = false;
m_Timer = 0.0f;
m_TriggerPressedUp = null;
}
public void Update(DebugActionDesc desc)
{
// Always reset this so that the action can only be caught once until repeat/reset
m_ActionState = 0.0f;
if (m_TriggerPressedUp != null)
{
m_Timer += Time.deltaTime;
for(int i = 0 ; i < m_TriggerPressedUp.Length ; ++i)
{
if (m_Type == DebugActionKeyType.Button)
m_TriggerPressedUp[i] |= Input.GetButtonUp(m_PressedButtons[i]);
else if(m_Type == DebugActionKeyType.Axis)
m_TriggerPressedUp[i] |= (Input.GetAxis(m_PressedAxis) == 0.0f);
else
m_TriggerPressedUp[i] |= Input.GetKeyUp(m_PressedKeys[i]);
}
bool allTriggerUp = true;
foreach (bool value in m_TriggerPressedUp)
allTriggerUp &= value;
if(allTriggerUp || (m_Timer > desc.repeatDelay && desc.repeatMode == DebugActionRepeatMode.Delay))
{
Reset();
}
}
}
}
bool m_Valid = false;
DebugActionDesc[] m_DebugActions = null;
DebugActionState[] m_DebugActionStates = null;
DebugActionManager()
{
m_Valid = Debugging.CheckRequiredInputButtonMapping(m_RequiredInputButtons);
m_DebugActions = new DebugActionDesc[(int)DebugAction.DebugActionCount];
m_DebugActionStates = new DebugActionState[(int)DebugAction.DebugActionCount];
DebugActionDesc enableDebugMenu = new DebugActionDesc();
enableDebugMenu.buttonTriggerList.Add(new[] { kEnableDebugBtn1, kEnableDebugBtn2 });
enableDebugMenu.keyTriggerList.Add(new[] { KeyCode.LeftControl, KeyCode.Backspace });
enableDebugMenu.repeatMode = DebugActionRepeatMode.Never;
AddAction(DebugAction.EnableDebugMenu, enableDebugMenu);
DebugActionDesc nextDebugMenu = new DebugActionDesc();
nextDebugMenu.buttonTriggerList.Add(new[] { kDebugNextBtn });
nextDebugMenu.repeatMode = DebugActionRepeatMode.Never;
AddAction(DebugAction.NextDebugMenu, nextDebugMenu);
DebugActionDesc previousDebugMenu = new DebugActionDesc();
previousDebugMenu.buttonTriggerList.Add(new[] { kDebugPreviousBtn });
previousDebugMenu.repeatMode = DebugActionRepeatMode.Never;
AddAction(DebugAction.PreviousDebugMenu, previousDebugMenu);
DebugActionDesc validate = new DebugActionDesc();
validate.buttonTriggerList.Add(new[] { kValidateBtn });
validate.repeatMode = DebugActionRepeatMode.Delay;
validate.repeatDelay = 0.25f;
AddAction(DebugAction.Validate, validate);
DebugActionDesc persistent = new DebugActionDesc();
persistent.buttonTriggerList.Add(new[] { kPersistentBtn });
persistent.repeatMode = DebugActionRepeatMode.Never;
AddAction(DebugAction.Persistent, persistent);
AddAction(DebugAction.MoveVertical, new DebugActionDesc { axisTrigger = kDPadVertical, repeatMode = DebugActionRepeatMode.Delay, repeatDelay = 0.2f } );
AddAction(DebugAction.MoveHorizontal, new DebugActionDesc { axisTrigger = kDPadHorizontal, repeatMode = DebugActionRepeatMode.Delay, repeatDelay = 0.2f } );
}
void AddAction(DebugAction action, DebugActionDesc desc)
{
int index = (int)action;
m_DebugActions[index] = desc;
m_DebugActionStates[index] = new DebugActionState();
}
void SampleAction(int actionIndex)
{
DebugActionDesc desc = m_DebugActions[actionIndex];
DebugActionState state = m_DebugActionStates[actionIndex];
//bool canSampleAction = (state.actionTriggered == false) || (desc.repeatMode == DebugActionRepeatMode.Delay && state.timer > desc.repeatDelay);
if(state.runningAction == false)
{
// Check button triggers
for (int buttonListIndex = 0; buttonListIndex < desc.buttonTriggerList.Count; ++buttonListIndex)
{
string[] buttons = desc.buttonTriggerList[buttonListIndex];
bool allButtonPressed = true;
foreach (string button in buttons)
{
allButtonPressed = allButtonPressed && Input.GetButton(button);
if (!allButtonPressed)
break;
}
if (allButtonPressed)
{
state.TriggerWithButton(buttons, 1.0f);
break;
}
}
// Check axis triggers
if(desc.axisTrigger != "")
{
float axisValue = Input.GetAxis(desc.axisTrigger);
if(axisValue != 0.0f)
{
state.TriggerWithAxis(desc.axisTrigger, axisValue);
}
}
// Check key triggers
for (int keyListIndex = 0; keyListIndex < desc.keyTriggerList.Count; ++keyListIndex)
{
KeyCode[] keys = desc.keyTriggerList[keyListIndex];
bool allKeyPressed = true;
foreach (KeyCode key in keys)
{
allKeyPressed = allKeyPressed && Input.GetKey(key);
if (!allKeyPressed)
break;
}
if (allKeyPressed)
{
state.TriggerWithKey(keys, 1.0f);
break;
}
}
}
}
void UpdateAction(int actionIndex)
{
DebugActionDesc desc = m_DebugActions[actionIndex];
DebugActionState state = m_DebugActionStates[actionIndex];
if(state.runningAction)
{
state.Update(desc);
}
}
public void Update()
{
if (!m_Valid)
return;
for(int actionIndex = 0 ; actionIndex < m_DebugActions.Length ; ++actionIndex)
{
UpdateAction(actionIndex);
SampleAction(actionIndex);
}
}
public float GetAction(DebugAction action)
{
return m_DebugActionStates[(int)action].actionState;
}
}
}

12
Assets/ScriptableRenderPipeline/common/Debugging/DebugActionManager.cs.meta


fileFormatVersion: 2
guid: 7e580489e9758c4429e4048beba3792e
timeCreated: 1492088391
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

292
Assets/ScriptableRenderPipeline/common/Debugging/DebugItemDrawer.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace UnityEngine.Experimental.Rendering
{
public class DebugItemDrawer
{
protected DebugMenuItem m_MenuItem = null;
// Label for simple GUI items
protected GUIContent m_Label;
protected List<GUIContent> m_EnumStrings = null;
protected List<int> m_EnumValues = null;
public DebugItemDrawer()
{
}
public void SetDebugItem(DebugMenuItem item)
{
m_MenuItem = item;
m_Label = new GUIContent(m_MenuItem.name);
Type itemType = m_MenuItem.GetItemType();
if(itemType.BaseType == typeof(System.Enum))
{
Array arr = Enum.GetValues(itemType);
m_EnumStrings = new List<GUIContent>(arr.Length);
m_EnumValues = new List<int>(arr.Length);
foreach(var value in arr)
{
m_EnumStrings.Add(new GUIContent(value.ToString()));
m_EnumValues.Add((int)value);
}
}
}
public virtual void ClampValues(Func<object> getter, Action<object> setter) {}
public virtual DebugMenuItemUI BuildGUI(GameObject parent, DebugMenuItem menuItem)
{
DebugMenuItemUI newItemUI = null;
if (menuItem.GetItemType() == typeof(bool))
{
newItemUI = new DebugMenuBoolItemUI(parent, menuItem, m_Label.text);
}
else if (menuItem.GetItemType() == typeof(int))
{
newItemUI = new DebugMenuIntItemUI(parent, menuItem, m_Label.text);
}
else if (menuItem.GetItemType() == typeof(uint))
{
newItemUI = new DebugMenuUIntItemUI(parent, menuItem, m_Label.text);
}
else if (menuItem.GetItemType() == typeof(float))
{
newItemUI = new DebugMenuFloatItemUI(parent, menuItem, m_Label.text);
}
else if (menuItem.GetItemType() == typeof(Color))
{
newItemUI = new DebugMenuColorItemUI(parent, menuItem, m_Label.text);
}
else if (m_MenuItem.GetItemType().BaseType == typeof(System.Enum))
{
newItemUI = new DebugMenuEnumItemUI(parent, menuItem, m_Label.text, m_EnumStrings.ToArray(), m_EnumValues.ToArray());
}
return newItemUI;
}
#if UNITY_EDITOR
bool DrawBoolItem()
{
bool value = (bool)m_MenuItem.GetValue();
if (m_MenuItem.readOnly)
{
EditorGUILayout.LabelField(m_Label, new GUIContent(value.ToString()));
}
else
{
EditorGUI.BeginChangeCheck();
value = EditorGUILayout.Toggle(m_Label, value);
if (EditorGUI.EndChangeCheck())
{
m_MenuItem.SetValue(value);
return true;
}
}
return false;
}
bool DrawIntItem()
{
int value = (int)m_MenuItem.GetValue();
if (m_MenuItem.readOnly)
{
EditorGUILayout.LabelField(m_Label, new GUIContent(value.ToString()));
}
else
{
EditorGUI.BeginChangeCheck();
value = EditorGUILayout.IntField(m_Label, value);
if (EditorGUI.EndChangeCheck())
{
m_MenuItem.SetValue(value);
return true;
}
}
return false;
}
bool DrawUIntItem()
{
int value = (int)(uint)m_MenuItem.GetValue();
if (m_MenuItem.readOnly)
{
EditorGUILayout.LabelField(m_Label, new GUIContent(value.ToString()));
}
else
{
EditorGUI.BeginChangeCheck();
value = EditorGUILayout.IntField(m_Label, value);
if (EditorGUI.EndChangeCheck())
{
value = System.Math.Max(0, value);
m_MenuItem.SetValue((uint)value);
return true;
}
}
return false;
}
bool DrawFloatItem()
{
float value = (float)m_MenuItem.GetValue();
if(m_MenuItem.readOnly)
{
EditorGUILayout.LabelField(m_Label, new GUIContent(value.ToString()));
}
else
{
EditorGUI.BeginChangeCheck();
value = EditorGUILayout.FloatField(m_Label, value);
if (EditorGUI.EndChangeCheck())
{
m_MenuItem.SetValue(value);
return true;
}
}
return false;
}
bool DrawColorItem()
{
EditorGUI.BeginChangeCheck();
Color value = EditorGUILayout.ColorField(m_Label, (Color)m_MenuItem.GetValue());
if (EditorGUI.EndChangeCheck())
{
m_MenuItem.SetValue(value);
return true;
}
return false;
}
bool DrawEnumItem()
{
EditorGUI.BeginChangeCheck();
int value = EditorGUILayout.IntPopup(m_Label, (int)m_MenuItem.GetValue(), m_EnumStrings.ToArray(), m_EnumValues.ToArray());
if (EditorGUI.EndChangeCheck())
{
m_MenuItem.SetValue(value);
return true;
}
return false;
}
public virtual bool OnEditorGUI()
{
if (m_MenuItem.GetItemType() == typeof(bool))
{
return DrawBoolItem();
}
else if (m_MenuItem.GetItemType() == typeof(int))
{
return DrawIntItem();
}
else if(m_MenuItem.GetItemType() == typeof(uint))
{
return DrawUIntItem();
}
else if (m_MenuItem.GetItemType() == typeof(float))
{
return DrawFloatItem();
}
else if (m_MenuItem.GetItemType() == typeof(Color))
{
return DrawColorItem();
}
else if (m_MenuItem.GetItemType().BaseType == typeof(System.Enum))
{
return DrawEnumItem();
}
return false;
}
#endif
}
public class DebugItemDrawFloatMinMax
: DebugItemDrawer
{
float m_Min = 0.0f;
float m_Max = 1.0f;
public DebugItemDrawFloatMinMax(float min, float max)
{
m_Min = min;
m_Max = max;
}
public override void ClampValues(Func<object> getter, Action<object> setter)
{
if (m_MenuItem == null)
return;
if(m_MenuItem.GetItemType() == typeof(float))
{
setter(Mathf.Clamp((float)getter(), m_Min, m_Max));
}
}
#if UNITY_EDITOR
public override bool OnEditorGUI()
{
EditorGUI.BeginChangeCheck();
float value = EditorGUILayout.Slider(m_MenuItem.name, (float)m_MenuItem.GetValue(), m_Min, m_Max);
if (EditorGUI.EndChangeCheck())
{
m_MenuItem.SetValue(value);
return true;
}
return false;
}
#endif
}
public class DebugItemDrawerIntEnum
: DebugItemDrawer
{
GUIContent[] m_EnumStrings = null;
int[] m_EnumValues = null;
public DebugItemDrawerIntEnum(GUIContent[] enumStrings, int[] enumValues)
{
m_EnumStrings = enumStrings;
m_EnumValues = enumValues;
}
public override DebugMenuItemUI BuildGUI(GameObject parent, DebugMenuItem menuItem)
{
return new DebugMenuEnumItemUI(parent, menuItem, m_Label.text, m_EnumStrings, m_EnumValues);
}
#if UNITY_EDITOR
public override bool OnEditorGUI()
{
UnityEditor.EditorGUI.BeginChangeCheck();
int value = UnityEditor.EditorGUILayout.IntPopup(m_Label, (int)m_MenuItem.GetValue(), m_EnumStrings, m_EnumValues);
if (UnityEditor.EditorGUI.EndChangeCheck())
{
m_MenuItem.SetValue(value);
return true;
}
return false;
}
#endif
}
}

12
Assets/ScriptableRenderPipeline/common/Debugging/DebugItemDrawer.cs.meta


fileFormatVersion: 2
guid: 7e413732cbed94f4688d5c59709a4556
timeCreated: 1492787007
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

267
Assets/ScriptableRenderPipeline/common/Debugging/DebugMenu.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
namespace UnityEngine.Experimental.Rendering
{
public class DebugMenuItem
{
public Type type { get { return m_Type; } }
public string name { get { return m_Name; } }
public DebugItemDrawer drawer { get { return m_Drawer; } }
public bool dynamicDisplay { get { return m_DynamicDisplay; } }
public bool readOnly { get { return m_Setter == null; } }
public DebugMenuItem(string name, Type type, Func<object> getter, Action<object> setter, bool dynamicDisplay = false, DebugItemDrawer drawer = null)
{
m_Type = type;
m_Setter = setter;
m_Getter = getter;
m_Name = name;
m_Drawer = drawer;
m_DynamicDisplay = dynamicDisplay;
}
public Type GetItemType()
{
return m_Type;
}
public void SetValue(object value)
{
// Setter can be null for readonly items
if(m_Setter != null)
{
m_Setter(value);
m_Drawer.ClampValues(m_Getter, m_Setter);
}
}
public object GetValue()
{
return m_Getter();
}
Func<object> m_Getter;
Action<object> m_Setter;
Type m_Type;
string m_Name;
DebugItemDrawer m_Drawer = null;
bool m_DynamicDisplay = false;
}
public class DebugMenu
{
public string name { get { return m_Name; } }
public int itemCount { get { return m_Items.Count; } }
protected string m_Name = "Unknown Debug Menu";
private GameObject m_Root = null;
private List<DebugMenuItem> m_Items = new List<DebugMenuItem>();
private List<DebugMenuItemUI> m_ItemsUI = new List<DebugMenuItemUI>();
private int m_SelectedItem = -1;
public DebugMenu(string name)
{
m_Name = name;
}
public DebugMenuItem GetDebugMenuItem(int index)
{
if (index >= m_Items.Count || index < 0)
return null;
return m_Items[index];
}
public DebugMenuItem GetSelectedDebugMenuItem()
{
if(m_SelectedItem != -1)
{
return m_Items[m_SelectedItem];
}
return null;
}
public bool HasItem(DebugMenuItem debugItem)
{
foreach(var item in m_Items)
{
if (debugItem == item)
return true;
}
return false;
}
public void RemoveDebugItem(DebugMenuItem debugItem)
{
m_Items.Remove(debugItem);
RebuildGUI();
}
public void AddDebugItem(DebugMenuItem debugItem)
{
m_Items.Add(debugItem);
RebuildGUI();
}
// TODO: Move this to UI classes
public GameObject BuildGUI(GameObject parent)
{
m_Root = new GameObject(string.Format("{0}", m_Name));
m_Root.transform.SetParent(parent.transform);
m_Root.transform.localPosition = Vector3.zero;
m_Root.transform.localScale = Vector3.one;
UI.VerticalLayoutGroup menuVL = m_Root.AddComponent<UI.VerticalLayoutGroup>();
menuVL.spacing = 5.0f;
menuVL.childControlWidth = true;
menuVL.childControlHeight = true;
menuVL.childForceExpandWidth = true;
menuVL.childForceExpandHeight = false;
RectTransform menuVLRectTransform = m_Root.GetComponent<RectTransform>();
menuVLRectTransform.pivot = new Vector2(0.0f, 0.0f);
menuVLRectTransform.localPosition = new Vector3(0.0f, 0.0f);
menuVLRectTransform.anchorMin = new Vector2(0.0f, 0.0f);
menuVLRectTransform.anchorMax = new Vector2(1.0f, 1.0f);
RebuildGUI();
m_Root.SetActive(false);
return m_Root;
}
private void RebuildGUI()
{
m_Root.transform.DetachChildren();
DebugMenuUI.CreateTextElement(string.Format("{0} Title", m_Name), m_Name, 14, TextAnchor.MiddleLeft, m_Root);
m_ItemsUI.Clear();
foreach (DebugMenuItem menuItem in m_Items)
{
DebugItemDrawer drawer = menuItem.drawer; // Should never be null, we have at least the default drawer
m_ItemsUI.Add(drawer.BuildGUI(m_Root, menuItem));
}
}
void SetSelectedItem(int index)
{
if(m_SelectedItem != -1)
{
m_ItemsUI[m_SelectedItem].SetSelected(false);
}
m_SelectedItem = index;
m_ItemsUI[m_SelectedItem].SetSelected(true);
}
public void SetSelected(bool value)
{
m_Root.SetActive(value);
if(value)
{
if (m_SelectedItem == -1)
{
NextItem();
}
else
SetSelectedItem(m_SelectedItem);
}
}
int NextItemIndex(int current)
{
return (current + 1) % m_Items.Count;
}
void NextItem()
{
if(m_Items.Count != 0)
{
int newSelected = (m_SelectedItem + 1) % m_Items.Count;
SetSelectedItem(newSelected);
}
}
int PreviousItemIndex(int current)
{
int newSelected = current - 1;
if (newSelected == -1)
newSelected = m_Items.Count - 1;
return newSelected;
}
void PreviousItem()
{
if(m_Items.Count != 0)
{
int newSelected = m_SelectedItem - 1;
if (newSelected == -1)
newSelected = m_Items.Count - 1;
SetSelectedItem(newSelected);
}
}
public void OnMoveHorizontal(float value)
{
if(m_SelectedItem != -1 && !m_Items[m_SelectedItem].readOnly)
{
if (value > 0.0f)
m_ItemsUI[m_SelectedItem].OnIncrement();
else
m_ItemsUI[m_SelectedItem].OnDecrement();
}
}
public void OnMoveVertical(float value)
{
if (value > 0.0f)
PreviousItem();
else
NextItem();
}
public void OnValidate()
{
if (m_SelectedItem != -1 && !m_Items[m_SelectedItem].readOnly)
m_ItemsUI[m_SelectedItem].OnValidate();
}
public void AddDebugMenuItem<ItemType>(string name, Func<object> getter, Action<object> setter, bool dynamicDisplay = false, DebugItemDrawer drawer = null)
{
if (drawer == null)
drawer = new DebugItemDrawer();
DebugMenuItem newItem = new DebugMenuItem(name, typeof(ItemType), getter, setter, dynamicDisplay, drawer);
drawer.SetDebugItem(newItem);
m_Items.Add(newItem);
}
public void Update()
{
// Can happen if the debug menu has been disabled (all UI is destroyed). We can't test DebugMenuManager directly though because of the persistant debug menu (which is always displayed no matter what)
if (m_Root == null)
return;
foreach(var itemUI in m_ItemsUI)
{
if(itemUI.dynamicDisplay)
itemUI.Update();
}
}
}
public class LightingDebugMenu
: DebugMenu
{
public LightingDebugMenu()
: base("Lighting")
{
}
}
}

12
Assets/ScriptableRenderPipeline/common/Debugging/DebugMenu.cs.meta


fileFormatVersion: 2
guid: 8275ad749cb4c4344ba07749bfc7d9d1
timeCreated: 1492075547
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

453
Assets/ScriptableRenderPipeline/common/Debugging/DebugMenuItemUI.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEngine.Experimental.Rendering
{
public abstract class DebugMenuItemUI
{
protected GameObject m_Root = null;
protected DebugMenuItem m_MenuItem = null;
public bool dynamicDisplay { get { return m_MenuItem.dynamicDisplay; } }
protected DebugMenuItemUI(DebugMenuItem menuItem)
{
m_MenuItem = menuItem;
}
public abstract void SetSelected(bool value);
public abstract void OnValidate();
public abstract void OnIncrement();
public abstract void OnDecrement();
public abstract void Update();
}
public class DebugMenuSimpleItemUI : DebugMenuItemUI
{
protected GameObject m_Name = null;
protected GameObject m_Value = null;
protected DebugMenuSimpleItemUI(GameObject parent, DebugMenuItem menuItem, string name)
: base(menuItem)
{
m_Root = DebugMenuUI.CreateHorizontalLayoutGroup("", true, true, false, false, parent);
m_Name = DebugMenuUI.CreateTextElement(m_MenuItem.name, name, 10, TextAnchor.MiddleLeft, m_Root);
var layoutElem = m_Name.AddComponent<UI.LayoutElement>();
layoutElem.minWidth = DebugMenuUI.kDebugItemNameWidth;
m_Value = DebugMenuUI.CreateTextElement(string.Format("{0} value", name), "", 10, TextAnchor.MiddleLeft, m_Root);
}
public override void SetSelected(bool value)
{
m_Name.GetComponent<UI.Text>().color = value ? DebugMenuUI.kColorSelected : DebugMenuUI.kColorUnSelected;
m_Value.GetComponent<UI.Text>().color = value ? DebugMenuUI.kColorSelected : DebugMenuUI.kColorUnSelected;
}
public override void OnValidate()
{
throw new System.NotImplementedException();
}
public override void OnIncrement()
{
throw new System.NotImplementedException();
}
public override void OnDecrement()
{
throw new System.NotImplementedException();
}
public override void Update()
{
throw new System.NotImplementedException();
}
}
public class DebugMenuBoolItemUI : DebugMenuSimpleItemUI
{
public DebugMenuBoolItemUI(GameObject parent, DebugMenuItem menuItem, string name)
: base(parent, menuItem, name)
{
Update();
}
public override void Update()
{
m_Value.GetComponent<UI.Text>().text = (bool)m_MenuItem.GetValue() ? "True" : "False";
}
public override void OnValidate()
{
m_MenuItem.SetValue(!(bool)m_MenuItem.GetValue());
Update();
}
public override void OnIncrement()
{
OnValidate();
}
public override void OnDecrement()
{
OnValidate();
}
}
public class DebugMenuFloatItemUI : DebugMenuSimpleItemUI
{
bool m_SelectIncrementMode = false;
int m_CurrentIncrementIndex = -1;
public DebugMenuFloatItemUI(GameObject parent, DebugMenuItem menuItem, string name)
: base(parent, menuItem, name)
{
Update();
}
public override void Update()
{
float currentValue = (float)m_MenuItem.GetValue();
bool isNegative = currentValue < 0.0f;
// Easier to format the string without caring about the '-' sign. We add it back at the end
currentValue = Mathf.Abs(currentValue);
char separator = System.Convert.ToChar(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
// Start with the maximum amount of trailing zeros
string valueWithMaxDecimals = string.Format("{0:0.00000}", currentValue);
// Remove trailing zeros until we reach the separator or we reach the decimal we are currently editing.
int separatorIndex = valueWithMaxDecimals.LastIndexOf(separator);
int index = valueWithMaxDecimals.Length - 1;
while (
valueWithMaxDecimals[index] == '0' // Remove trailing zeros
&& index > (separatorIndex + 1) // until we reach the separator
&& index > (System.Math.Abs(m_CurrentIncrementIndex) + separatorIndex)) // Or it's the index of the current decimal being edited (so as to display the last trailing zero in this case)
{
index--;
}
string finalValue = new string(valueWithMaxDecimals.ToCharArray(), 0, index + 1);
// Add leading zeros until we reach where the current order is being edited.
if(m_CurrentIncrementIndex > 0)
{
float incrementValue = Mathf.Pow(10.0f, (float)m_CurrentIncrementIndex);
if(incrementValue > currentValue)
{
float compareValue = currentValue + 1.0f; // Start at 1.0f because we know that we are going to increment by 10 or more
while (incrementValue > compareValue)
{
finalValue = finalValue.Insert(0, "0");
compareValue *= 10.0f;
}
}
}
// When selecting which decimal/order you want to edit, we show brackets around the figure to show the user.
if(m_SelectIncrementMode)
{
separatorIndex = finalValue.LastIndexOf(separator); // separator may have changed place if we added leading zeros
int bracketIndex = separatorIndex - m_CurrentIncrementIndex;
if(m_CurrentIncrementIndex >= 0) // Skip separator
bracketIndex -= 1;
finalValue = finalValue.Insert(bracketIndex, "[");
finalValue = finalValue.Insert(bracketIndex + 2, "]");
}
if(isNegative)
finalValue = finalValue.Insert(0, "-");
m_Value.GetComponent<UI.Text>().text = finalValue;
}
public override void OnValidate()
{
m_SelectIncrementMode = !m_SelectIncrementMode;
Update();
}
public override void OnIncrement()
{
if(!m_SelectIncrementMode)
{
m_MenuItem.SetValue((float)m_MenuItem.GetValue() + Mathf.Pow(10.0f, (float)m_CurrentIncrementIndex));
}
else
{
m_CurrentIncrementIndex -= 1; // * 0.1 (10^m_CurrentIncrementIndex)
m_CurrentIncrementIndex = System.Math.Max(-5, m_CurrentIncrementIndex);
}
Update();
}
public override void OnDecrement()
{
if (!m_SelectIncrementMode)
{
m_MenuItem.SetValue((float)m_MenuItem.GetValue() - Mathf.Pow(10.0f, (float)m_CurrentIncrementIndex));
}
else
{
m_CurrentIncrementIndex += 1; // * 10 (10^m_CurrentIncrementIndex)
}
Update();
}
}
// Everything is done with int. We don't really care about values > 2b for debugging.
public class DebugMenuIntegerItemUI : DebugMenuSimpleItemUI
{
bool m_SelectIncrementMode = false;
int m_CurrentIncrementIndex = 0;
public DebugMenuIntegerItemUI(GameObject parent, DebugMenuItem menuItem, string name)
: base(parent, menuItem, name)
{
}
protected void UpdateText(int value)
{
bool isNegative = value < 0f;
// Easier to format the string without caring about the '-' sign. We add it back at the end
value = System.Math.Abs(value);
string finalValue = string.Format("{0}", value);
// Add leading zeros until we reach where the current order is being edited.
if(m_CurrentIncrementIndex > 0)
{
int incrementValue = (int)System.Math.Pow(10, m_CurrentIncrementIndex);
if(incrementValue > value)
{
int compareValue = System.Math.Max(value, 1);
while (incrementValue > compareValue)
{
finalValue = finalValue.Insert(0, "0");
compareValue *= 10;
}
}
}
// When selecting which decimal/order you want to edit, we show brackets around the figure to show the user.
if(m_SelectIncrementMode)
{
int bracketIndex = finalValue.Length - 1 - m_CurrentIncrementIndex;
finalValue = finalValue.Insert(bracketIndex, "[");
finalValue = finalValue.Insert(bracketIndex + 2, "]");
}
if(isNegative)
finalValue = finalValue.Insert(0, "-");
m_Value.GetComponent<UI.Text>().text = finalValue;
}
protected virtual int GetIntegerValue()
{
throw new System.NotImplementedException();
}
protected virtual void SetIntegerValue(int value)
{
throw new System.NotImplementedException();
}
public override void Update()
{
UpdateText(GetIntegerValue());
}
public override void OnValidate()
{
m_SelectIncrementMode = !m_SelectIncrementMode;
Update();
}
public override void OnIncrement()
{
if (!m_SelectIncrementMode)
{
SetIntegerValue(GetIntegerValue() + (int)Mathf.Pow(10.0f, (float)m_CurrentIncrementIndex));
}
else
{
m_CurrentIncrementIndex -= 1; // *= 0.1 (10^m_CurrentIncrementIndex)
m_CurrentIncrementIndex = System.Math.Max(0, m_CurrentIncrementIndex);
}
Update();
}
public override void OnDecrement()
{
if (!m_SelectIncrementMode)
{
SetIntegerValue(GetIntegerValue() - (int)Mathf.Pow(10.0f, (float)m_CurrentIncrementIndex));
}
else
{
m_CurrentIncrementIndex += 1; // *= 10 (10^m_CurrentIncrementIndex)
m_CurrentIncrementIndex = System.Math.Max(0, m_CurrentIncrementIndex);
}
Update();
}
}
public class DebugMenuIntItemUI : DebugMenuIntegerItemUI
{
public DebugMenuIntItemUI(GameObject parent, DebugMenuItem menuItem, string name)
: base(parent, menuItem, name)
{
UpdateText((int)m_MenuItem.GetValue());
}
protected override int GetIntegerValue()
{
return (int)m_MenuItem.GetValue();
}
protected override void SetIntegerValue(int value)
{
m_MenuItem.SetValue(value);
}
}
public class DebugMenuUIntItemUI : DebugMenuIntegerItemUI
{
public DebugMenuUIntItemUI(GameObject parent, DebugMenuItem menuItem, string name)
: base(parent, menuItem, name)
{
UpdateText((int)(uint)m_MenuItem.GetValue());
}
protected override int GetIntegerValue()
{
return (int)(uint)m_MenuItem.GetValue();
}
protected override void SetIntegerValue(int value)
{
m_MenuItem.SetValue((uint)System.Math.Max(0, value));
}
}
public class DebugMenuEnumItemUI : DebugMenuSimpleItemUI
{
int m_CurrentValueIndex = 0;
GUIContent[] m_ValueNames;
int[] m_Values;
public DebugMenuEnumItemUI(GameObject parent, DebugMenuItem menuItem, string name, GUIContent[] valueNames, int[] values)
: base(parent, menuItem, name)
{
m_Values = values;
m_ValueNames = valueNames;
m_CurrentValueIndex = FindIndexForValue((int)m_MenuItem.GetValue());
Update();
}
private int FindIndexForValue(int value)
{
for(int i = 0 ; i < m_Values.Length ; ++i)
{
if (m_Values[i] == value)
return i;
}
return -1;
}
public override void Update()
{
if(m_CurrentValueIndex != -1)
{
m_Value.GetComponent<UI.Text>().text = m_ValueNames[m_CurrentValueIndex].text;
}
}
public override void OnValidate()
{
OnIncrement();
}
public override void OnIncrement()
{
m_CurrentValueIndex = (m_CurrentValueIndex + 1) % m_Values.Length;
m_MenuItem.SetValue(m_Values[m_CurrentValueIndex]);
Update();
}
public override void OnDecrement()
{
m_CurrentValueIndex -= 1;
if (m_CurrentValueIndex < 0)
m_CurrentValueIndex = m_Values.Length - 1;
m_MenuItem.SetValue(m_Values[m_CurrentValueIndex]);
Update();
}
}
public class DebugMenuColorItemUI : DebugMenuItemUI
{
protected GameObject m_Name = null;
protected GameObject m_ColorRect = null;
public DebugMenuColorItemUI(GameObject parent, DebugMenuItem menuItem, string name)
: base(menuItem)
{
m_MenuItem = menuItem;
m_Root = DebugMenuUI.CreateHorizontalLayoutGroup(name, true, true, false, false, parent);
m_Name = DebugMenuUI.CreateTextElement(m_MenuItem.name, name, 10, TextAnchor.MiddleLeft, m_Root);
var layoutElemName = m_Name.AddComponent<UI.LayoutElement>();
layoutElemName.minWidth = DebugMenuUI.kDebugItemNameWidth;
// Force layout because we need the right height for the color rect element afterward.
UI.LayoutRebuilder.ForceRebuildLayoutImmediate(m_Root.GetComponent<RectTransform>());
RectTransform nameRect = m_Name.GetComponent<RectTransform>();
m_ColorRect = new GameObject();
m_ColorRect.transform.SetParent(m_Root.transform, false);
m_ColorRect.AddComponent<UI.Image>();
UI.LayoutElement layoutElem = m_ColorRect.AddComponent<UI.LayoutElement>();
// We need to set min width/height because without an image, the size would be zero.
layoutElem.minHeight = nameRect.rect.height;
layoutElem.minWidth = 40.0f;
Update();
}
public override void Update()
{
Color currentValue = (Color)m_MenuItem.GetValue();
UI.Image image = m_ColorRect.GetComponent<UI.Image>();
image.color = currentValue;
}
public override void SetSelected(bool value)
{
m_Name.GetComponent<UI.Text>().color = value ? DebugMenuUI.kColorSelected : DebugMenuUI.kColorUnSelected;
}
// TODO: Edit mode!
public override void OnValidate()
{
}
public override void OnIncrement()
{
}
public override void OnDecrement()
{
}
}
}

12
Assets/ScriptableRenderPipeline/common/Debugging/DebugMenuItemUI.cs.meta


fileFormatVersion: 2
guid: 2af8a6ada82d1994d9cfd79a8b92eebc
timeCreated: 1492702176
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

194
Assets/ScriptableRenderPipeline/common/Debugging/DebugMenuManager.cs


using System;
using System.Linq;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEngine.Experimental.Rendering
{
public class DebugMenuManager
{
static private DebugMenuManager s_Instance = null;
static public DebugMenuManager instance
{
get
{
if (s_Instance == null)
{
s_Instance = new DebugMenuManager();
}
return s_Instance;
}
}
DebugMenuManager()
{
LookUpDebugMenuClasses();
m_PersistentDebugMenu = new DebugMenu("Persistent");
m_DebugMenuUI = new DebugMenuUI(this);
}
bool m_Enabled = false;
int m_ActiveMenuIndex = 0;
List<DebugMenu> m_DebugMenus = new List<DebugMenu>();
DebugMenu m_PersistentDebugMenu = null;
DebugMenuUI m_DebugMenuUI = null;
public bool isEnabled { get { return m_Enabled; } }
public int activeMenuIndex { get { return m_ActiveMenuIndex; } set { m_ActiveMenuIndex = value; } }
public int menuCount { get { return m_DebugMenus.Count; } }
public DebugMenu GetDebugMenu(int index)
{
if (index < m_DebugMenus.Count)
return m_DebugMenus[index];
else
return null;
}
public DebugMenu GetPersistentDebugMenu()
{
return m_PersistentDebugMenu;
}
void LookUpDebugMenuClasses()
{
// Prepare all debug menus
var types = Assembly.GetAssembly(typeof(DebugMenu)).GetTypes()
.Where(t => t.IsSubclassOf(typeof(DebugMenu)));
m_DebugMenus.Clear();
foreach (var type in types)
{
m_DebugMenus.Add((DebugMenu)Activator.CreateInstance(type));
}
}
public void PreviousDebugMenu()
{
m_DebugMenus[m_ActiveMenuIndex].SetSelected(false);
m_ActiveMenuIndex = m_ActiveMenuIndex - 1;
if (m_ActiveMenuIndex == -1)
m_ActiveMenuIndex = m_DebugMenus.Count - 1;
m_DebugMenus[m_ActiveMenuIndex].SetSelected(true);
}
public void NextDebugMenu()
{
m_DebugMenus[m_ActiveMenuIndex].SetSelected(false);
m_ActiveMenuIndex = (m_ActiveMenuIndex + 1) % m_DebugMenus.Count;
m_DebugMenus[m_ActiveMenuIndex].SetSelected(true);
}
public void ToggleMenu()
{
m_Enabled = !m_Enabled;
m_DebugMenuUI.BuildGUI();
m_DebugMenuUI.Toggle();
m_DebugMenus[m_ActiveMenuIndex].SetSelected(m_Enabled);
}
public void OnValidate()
{
m_DebugMenus[m_ActiveMenuIndex].OnValidate();
}
public void OnMakePersistent()
{
DebugMenuItem selectedItem = m_DebugMenus[m_ActiveMenuIndex].GetSelectedDebugMenuItem();
if(selectedItem != null && selectedItem.readOnly)
{
if(m_PersistentDebugMenu.HasItem(selectedItem))
{
m_PersistentDebugMenu.RemoveDebugItem(selectedItem);
}
else
{
m_PersistentDebugMenu.AddDebugItem(selectedItem);
}
}
if(m_PersistentDebugMenu.itemCount == 0)
{
m_PersistentDebugMenu.SetSelected(false);
m_DebugMenuUI.EnablePersistentView(false); // Temp, should just need the above. Wait for background UI to be moved to menu itself
}
else
{
m_PersistentDebugMenu.SetSelected(true);
m_DebugMenuUI.EnablePersistentView(true);
}
}
public void OnMoveHorizontal(float value)
{
m_DebugMenus[m_ActiveMenuIndex].OnMoveHorizontal(value);
}
public void OnMoveVertical(float value)
{
m_DebugMenus[m_ActiveMenuIndex].OnMoveVertical(value);
}
T GetDebugMenu<T>() where T:DebugMenu
{
foreach(DebugMenu menu in m_DebugMenus)
{
if (menu is T)
return menu as T;
}
return null;
}
DebugMenu GetDebugMenu(string name)
{
foreach(DebugMenu menu in m_DebugMenus)
{
if (menu.name == name)
return menu;
}
return null;
}
public void Update()
{
if (m_ActiveMenuIndex != -1)
m_DebugMenus[m_ActiveMenuIndex].Update();
m_PersistentDebugMenu.Update();
}
public void AddDebugItem<DebugMenuType, ItemType>(string name, Func<object> getter, Action<object> setter = null, bool dynamicDisplay = false, DebugItemDrawer drawer = null) where DebugMenuType : DebugMenu
{
DebugMenuType debugMenu = GetDebugMenu<DebugMenuType>();
if (debugMenu != null)
{
debugMenu.AddDebugMenuItem<ItemType>(name, getter, setter, dynamicDisplay, drawer);
}
}
public void AddDebugItem<ItemType>(string debugMenuName, string name, Func<object> getter, Action<object> setter = null, bool dynamicDisplay = false, DebugItemDrawer drawer = null)
{
DebugMenu debugMenu = GetDebugMenu(debugMenuName);
// If the menu does not exist, create a generic one. This way, users don't have to explicitely create a new DebugMenu class if they don't need any particular overriding of default behavior.
if(debugMenu == null)
{
debugMenu = new DebugMenu(debugMenuName);
m_DebugMenus.Add(debugMenu);
}
if (debugMenu != null)
{
debugMenu.AddDebugMenuItem<ItemType>(name, getter, setter, dynamicDisplay, drawer);
}
}
}
}

12
Assets/ScriptableRenderPipeline/common/Debugging/DebugMenuManager.cs.meta


fileFormatVersion: 2
guid: 0d82eeff53030774abf4d8d510717fad
timeCreated: 1491995655
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

178
Assets/ScriptableRenderPipeline/common/Debugging/DebugMenuUI.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEngine.Experimental.Rendering
{
public class DebugMenuUI
{
public static Color kColorSelected = new Color(1.0f, 1.0f, 1.0f, 1.0f);
public static Color kColorUnSelected = new Color(0.25f, 0.25f, 0.25f, 1.0f);
public static Color kBackgroundColor = new Color(0.5f, 0.5f, 0.5f, 0.4f);
public static float kDebugItemNameWidth = 150.0f;
GameObject m_Root = null;
GameObject[] m_MenuRoots = null;
GameObject m_MainMenuRoot = null;
GameObject m_PersistentMenuRoot = null;
bool m_Enabled = false;
DebugMenuManager m_DebugMenuManager = null;
public DebugMenuUI(DebugMenuManager manager)
{
m_DebugMenuManager = manager;
}
public void Toggle()
{
m_Enabled = !m_Enabled;
m_MainMenuRoot.SetActive(m_Enabled);
}
public void EnablePersistentView(bool value)
{
m_PersistentMenuRoot.SetActive(value);
}
void CleanUpGUI()
{
Object.Destroy(m_Root);
}
public void BuildGUI()
{
if (m_Root != null)
return;
float kBorderSize = 5.0f;
m_Root = new GameObject("DebugMenu Root");
Canvas canvas = m_Root.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
UI.CanvasScaler canvasScaler = m_Root.AddComponent<UI.CanvasScaler>();
canvasScaler.uiScaleMode = UI.CanvasScaler.ScaleMode.ScaleWithScreenSize;
canvasScaler.referenceResolution = new Vector2(800.0f, 600.0f);
// TODO: Move background an layout to the menu itself.
m_MainMenuRoot = new GameObject("Background");
m_MainMenuRoot.AddComponent<CanvasRenderer>();
var image = m_MainMenuRoot.AddComponent<UI.Image>();
m_MainMenuRoot.transform.SetParent(m_Root.transform, false);
image.rectTransform.pivot = new Vector2(0.0f, 0.0f);
image.rectTransform.localPosition = Vector3.zero;
image.rectTransform.localScale = Vector3.one;
image.rectTransform.anchorMin = new Vector2(0.0f, 0.0f);
image.rectTransform.anchorMax = new Vector2(0.5f, 1.0f);
image.rectTransform.anchoredPosition = new Vector2(kBorderSize, kBorderSize);
image.rectTransform.sizeDelta = new Vector2(-(kBorderSize * 2.0f), -(kBorderSize * 2.0f));
image.color = kBackgroundColor;
GameObject goVL = DebugMenuUI.CreateVerticalLayoutGroup("DebugMenu VLayout", true, true, true, false, 5.0f, m_MainMenuRoot);
RectTransform menuVLRectTransform = goVL.GetComponent<RectTransform>();
menuVLRectTransform.pivot = new Vector2(0.0f, 0.0f);
menuVLRectTransform.localPosition = Vector3.zero;
menuVLRectTransform.localScale = Vector3.one;
menuVLRectTransform.anchorMin = new Vector2(0.0f, 0.0f);
menuVLRectTransform.anchorMax = new Vector2(1.0f, 1.0f);
menuVLRectTransform.anchoredPosition = new Vector2(kBorderSize, kBorderSize);
menuVLRectTransform.sizeDelta = new Vector2(-(kBorderSize * 2.0f), -(kBorderSize * 2.0f));
// TODO: Move background an layout to the menu itself.
m_PersistentMenuRoot = new GameObject("Background_Persistent");
m_PersistentMenuRoot.AddComponent<CanvasRenderer>();
image = m_PersistentMenuRoot.AddComponent<UI.Image>();
m_PersistentMenuRoot.transform.SetParent(m_Root.transform, false);
image.rectTransform.pivot = new Vector2(0.0f, 0.0f);
image.rectTransform.localPosition = Vector3.zero;
image.rectTransform.localScale = Vector3.one;
image.rectTransform.anchorMin = new Vector2(0.7f, 0.8f);
image.rectTransform.anchorMax = new Vector2(1.0f, 1.0f);
image.rectTransform.anchoredPosition = new Vector2(kBorderSize, kBorderSize);
image.rectTransform.sizeDelta = new Vector2(-(kBorderSize * 2.0f), -(kBorderSize * 2.0f));
image.color = kBackgroundColor;
GameObject goVL2 = DebugMenuUI.CreateVerticalLayoutGroup("DebugMenu VLayout", true, true, true, false, 5.0f, m_PersistentMenuRoot);
menuVLRectTransform = goVL2.GetComponent<RectTransform>();
menuVLRectTransform.pivot = new Vector2(0.0f, 0.0f);
menuVLRectTransform.localPosition = Vector3.zero;
menuVLRectTransform.localScale = Vector3.one;
menuVLRectTransform.anchorMin = new Vector2(0.0f, 0.0f);
menuVLRectTransform.anchorMax = new Vector2(1.0f, 1.0f);
menuVLRectTransform.anchoredPosition = new Vector2(kBorderSize, kBorderSize);
menuVLRectTransform.sizeDelta = new Vector2(-(kBorderSize * 2.0f), -(kBorderSize * 2.0f));
m_PersistentMenuRoot.SetActive(false);
DebugMenuUI.CreateTextElement("DebugMenuTitle", "Debug Menu", 14, TextAnchor.MiddleCenter, goVL);
int menuCount = m_DebugMenuManager.menuCount;
m_MenuRoots = new GameObject[menuCount];
for (int i = 0; i < menuCount; ++i)
{
m_MenuRoots[i] = m_DebugMenuManager.GetDebugMenu(i).BuildGUI(goVL);
}
m_DebugMenuManager.GetPersistentDebugMenu().BuildGUI(goVL2);
}
public static GameObject CreateVerticalLayoutGroup(string name, bool controlWidth, bool controlHeight, bool forceExpandWidth, bool forceExpandHeight, GameObject parent = null )
{
return CreateVerticalLayoutGroup(name, controlWidth, controlHeight, forceExpandWidth, forceExpandHeight, 0.0f, parent);
}
public static GameObject CreateVerticalLayoutGroup(string name, bool controlWidth, bool controlHeight, bool forceExpandWidth, bool forceExpandHeight, float spacing, GameObject parent = null )
{
GameObject go = new GameObject(name);
go.transform.SetParent(parent.transform, false);
UI.VerticalLayoutGroup verticalLayout = go.AddComponent<UI.VerticalLayoutGroup>();
verticalLayout.childControlHeight = controlHeight;
verticalLayout.childControlWidth = controlWidth;
verticalLayout.childForceExpandHeight = forceExpandHeight;
verticalLayout.childForceExpandWidth = forceExpandWidth;
verticalLayout.spacing = spacing;
return go;
}
public static GameObject CreateHorizontalLayoutGroup(string name, bool controlWidth, bool controlHeight, bool forceExpandWidth, bool forceExpandHeight, GameObject parent = null)
{
return CreateHorizontalLayoutGroup(name, controlWidth, controlHeight, forceExpandWidth, forceExpandHeight, 0.0f, parent);
}
public static GameObject CreateHorizontalLayoutGroup(string name, bool controlWidth, bool controlHeight, bool forceExpandWidth, bool forceExpandHeight, float spacing = 1.0f, GameObject parent = null)
{
GameObject go = new GameObject(name);
go.transform.SetParent(parent.transform, false);
UI.HorizontalLayoutGroup horizontalLayout = go.AddComponent<UI.HorizontalLayoutGroup>();
horizontalLayout.childControlHeight = controlHeight;
horizontalLayout.childControlWidth = controlWidth;
horizontalLayout.childForceExpandHeight = forceExpandHeight;
horizontalLayout.childForceExpandWidth = forceExpandWidth;
horizontalLayout.spacing = spacing;
return go;
}
public static GameObject CreateTextElement(string elementName, string text, int size = 14, TextAnchor alignment = TextAnchor.MiddleLeft, GameObject parent = null)
{
GameObject goText = new GameObject(elementName);
goText.transform.SetParent(parent.transform, false);
goText.transform.transform.localPosition = Vector3.zero;
goText.transform.transform.localScale = Vector3.one;
UI.Text textComponent = goText.AddComponent<UI.Text>();
textComponent.font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font;
textComponent.text = text;
textComponent.alignment = alignment;
textComponent.fontSize = size;
textComponent.verticalOverflow = VerticalWrapMode.Overflow;
textComponent.color = DebugMenuUI.kColorUnSelected;
RectTransform rectTransform = goText.GetComponent<RectTransform>();
rectTransform.pivot = new Vector2(0.0f, 0.0f);
rectTransform.localPosition = new Vector3(0.0f, 0.0f);
rectTransform.anchorMin = new Vector2(0.0f, 0.0f);
rectTransform.anchorMax = new Vector2(1.0f, 1.0f);
return goText;
}
}
}

部分文件因为文件数量过多而无法显示

正在加载...
取消
保存