diff --git a/game/Assets/PathCreator.meta b/game/Assets/PathCreator.meta
new file mode 100644
index 0000000..e3aaeef
--- /dev/null
+++ b/game/Assets/PathCreator.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c78921add991a914aa4263c80d69a9d6
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core.meta b/game/Assets/PathCreator/Core.meta
new file mode 100644
index 0000000..af53750
--- /dev/null
+++ b/game/Assets/PathCreator/Core.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: fded9f896ea32473eb30ae61b640a176
+folderAsset: yes
+timeCreated: 1519645413
+licenseType: Store
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Editor.meta b/game/Assets/PathCreator/Core/Editor.meta
new file mode 100644
index 0000000..081c996
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 76c2f3171eae9954aa317277dbffd478
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Editor/Helper.meta b/game/Assets/PathCreator/Core/Editor/Helper.meta
new file mode 100644
index 0000000..c7dd6da
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/Helper.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 366e41d4e3408334aad31e48f28757e4
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Editor/Helper/MouseUtility.cs b/game/Assets/PathCreator/Core/Editor/Helper/MouseUtility.cs
new file mode 100644
index 0000000..0ae6b33
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/Helper/MouseUtility.cs
@@ -0,0 +1,43 @@
+using UnityEngine;
+using UnityEditor;
+using PathCreation;
+
+namespace PathCreationEditor
+{
+ public static class MouseUtility
+ {
+ ///
+ /// Determines mouse position in world. If PathSpace is xy/xz, the position will be locked to that plane.
+ /// If PathSpace is xyz, then depthFor3DSpace will be used as distance from scene camera.
+ ///
+ public static Vector3 GetMouseWorldPosition(PathSpace space, float depthFor3DSpace = 10)
+ {
+ Ray mouseRay = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
+ Vector3 worldMouse = mouseRay.GetPoint(depthFor3DSpace);
+
+ // Mouse can only move on XY plane
+ if (space == PathSpace.xy)
+ {
+ float zDir = mouseRay.direction.z;
+ if (zDir != 0)
+ {
+ float dstToXYPlane = Mathf.Abs(mouseRay.origin.z / zDir);
+ worldMouse = mouseRay.GetPoint(dstToXYPlane);
+ }
+ }
+ // Mouse can only move on XZ plane
+ else if (space == PathSpace.xz)
+ {
+ float yDir = mouseRay.direction.y;
+ if (yDir != 0)
+ {
+ float dstToXZPlane = Mathf.Abs(mouseRay.origin.y / yDir);
+ worldMouse = mouseRay.GetPoint(dstToXZPlane);
+ }
+ }
+
+ return worldMouse;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Editor/Helper/MouseUtility.cs.meta b/game/Assets/PathCreator/Core/Editor/Helper/MouseUtility.cs.meta
new file mode 100644
index 0000000..4b5ec6b
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/Helper/MouseUtility.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bd0de63ca5c52504a8d2063418a326c3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Editor/Helper/PathHandle.cs b/game/Assets/PathCreator/Core/Editor/Helper/PathHandle.cs
new file mode 100644
index 0000000..613fdb8
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/Helper/PathHandle.cs
@@ -0,0 +1,237 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+using PathCreation;
+
+namespace PathCreationEditor
+{
+ public static class PathHandle
+ {
+
+ public const float extraInputRadius = .005f;
+
+ static Vector2 handleDragMouseStart;
+ static Vector2 handleDragMouseEnd;
+ static Vector3 handleDragWorldStart;
+
+ static int selectedHandleID;
+ static bool mouseIsOverAHandle;
+
+ public enum HandleInputType
+ {
+ None,
+ LMBPress,
+ LMBClick,
+ LMBDrag,
+ LMBRelease,
+ };
+
+ static float dstMouseToDragPointStart;
+
+ static List ids;
+ static HashSet idHash;
+
+ static PathHandle()
+ {
+ ids = new List();
+ idHash = new HashSet();
+
+ dstMouseToDragPointStart = float.MaxValue;
+ }
+
+ public static Vector3 DrawHandle(Vector3 position, PathSpace space, bool isInteractive, float handleDiameter, Handles.CapFunction capFunc, HandleColours colours, out HandleInputType inputType, int handleIndex)
+ {
+ int id = GetID(handleIndex);
+ Vector3 screenPosition = Handles.matrix.MultiplyPoint(position);
+ Matrix4x4 cachedMatrix = Handles.matrix;
+
+ inputType = HandleInputType.None;
+
+ EventType eventType = Event.current.GetTypeForControl(id);
+ float handleRadius = handleDiameter / 2f;
+ float dstToHandle = HandleUtility.DistanceToCircle(position, handleRadius + extraInputRadius);
+ float dstToMouse = HandleUtility.DistanceToCircle(position, 0);
+
+ // Handle input events
+ if (isInteractive)
+ {
+ // Repaint if mouse is entering/exiting handle (for highlight colour)
+ if (dstToHandle == 0)
+ {
+ if (!mouseIsOverAHandle)
+ {
+ HandleUtility.Repaint();
+ mouseIsOverAHandle = true;
+ }
+ }
+ else
+ {
+ if (mouseIsOverAHandle)
+ {
+ HandleUtility.Repaint();
+ mouseIsOverAHandle = false;
+ }
+ }
+ switch (eventType)
+ {
+ case EventType.MouseDown:
+ if (Event.current.button == 0 && Event.current.modifiers != EventModifiers.Alt)
+ {
+ if (dstToHandle == 0 && dstToMouse < dstMouseToDragPointStart)
+ {
+ dstMouseToDragPointStart = dstToMouse;
+ GUIUtility.hotControl = id;
+ handleDragMouseEnd = handleDragMouseStart = Event.current.mousePosition;
+ handleDragWorldStart = position;
+ selectedHandleID = id;
+ inputType = HandleInputType.LMBPress;
+ }
+ }
+ break;
+
+ case EventType.MouseUp:
+ dstMouseToDragPointStart = float.MaxValue;
+ if (GUIUtility.hotControl == id && Event.current.button == 0)
+ {
+ GUIUtility.hotControl = 0;
+ selectedHandleID = -1;
+ Event.current.Use();
+
+ inputType = HandleInputType.LMBRelease;
+
+
+ if (Event.current.mousePosition == handleDragMouseStart)
+ {
+ inputType = HandleInputType.LMBClick;
+ }
+ }
+ break;
+
+ case EventType.MouseDrag:
+ if (GUIUtility.hotControl == id && Event.current.button == 0)
+ {
+ handleDragMouseEnd += new Vector2(Event.current.delta.x, -Event.current.delta.y);
+ Vector3 position2 = Camera.current.WorldToScreenPoint(Handles.matrix.MultiplyPoint(handleDragWorldStart))
+ + (Vector3)(handleDragMouseEnd - handleDragMouseStart);
+ inputType = HandleInputType.LMBDrag;
+ // Handle can move freely in 3d space
+ if (space == PathSpace.xyz)
+ {
+ position = Handles.matrix.inverse.MultiplyPoint(Camera.current.ScreenToWorldPoint(position2));
+ }
+ // Handle is clamped to xy or xz plane
+ else
+ {
+ position = MouseUtility.GetMouseWorldPosition(space);
+ }
+
+ GUI.changed = true;
+ Event.current.Use();
+ }
+ break;
+ }
+ }
+
+ switch (eventType)
+ {
+ case EventType.Repaint:
+ Color originalColour = Handles.color;
+ Handles.color = (isInteractive) ? colours.defaultColour : colours.disabledColour;
+
+ if (id == GUIUtility.hotControl)
+ {
+ Handles.color = colours.selectedColour;
+ }
+ else if (dstToHandle == 0 && selectedHandleID == -1 && isInteractive)
+ {
+ Handles.color = colours.highlightedColour;
+ }
+
+
+ Handles.matrix = Matrix4x4.identity;
+ Vector3 lookForward = Vector3.up;
+ Camera cam = Camera.current;
+ if (cam != null)
+ {
+ if (cam.orthographic)
+ {
+ lookForward= -cam.transform.forward;
+ }
+ else
+ {
+ lookForward = (cam.transform.position - position);
+ }
+ }
+
+ capFunc(id, screenPosition, Quaternion.LookRotation(lookForward), handleDiameter, EventType.Repaint);
+ Handles.matrix = cachedMatrix;
+
+ Handles.color = originalColour;
+ break;
+
+ case EventType.Layout:
+ Handles.matrix = Matrix4x4.identity;
+ HandleUtility.AddControl(id, HandleUtility.DistanceToCircle(screenPosition, handleDiameter / 2f));
+ Handles.matrix = cachedMatrix;
+ break;
+ }
+
+ return position;
+ }
+
+ public struct HandleColours
+ {
+ public Color defaultColour;
+ public Color highlightedColour;
+ public Color selectedColour;
+ public Color disabledColour;
+
+ public HandleColours(Color defaultColour, Color highlightedColour, Color selectedColour, Color disabledColour)
+ {
+ this.defaultColour = defaultColour;
+ this.highlightedColour = highlightedColour;
+ this.selectedColour = selectedColour;
+ this.disabledColour = disabledColour;
+ }
+ }
+
+ static void AddIDs(int upToIndex)
+ {
+ int numIDAtStart = ids.Count;
+ int numToAdd = (upToIndex - numIDAtStart) + 1;
+ for (int i = 0; i < numToAdd; i++)
+ {
+ string hashString = string.Format("pathhandle({0})", numIDAtStart + i);
+ int hash = hashString.GetHashCode();
+
+ int id = GUIUtility.GetControlID(hash, FocusType.Passive);
+ int numIts = 0;
+
+ // This is a bit of a shot in the dark at fixing a reported bug that I've been unable to reproduce.
+ // The problem is that multiple handles are being selected when just one is clicked on.
+ // I assume this is because they're somehow being assigned the same id.
+ while (idHash.Contains(id)) {
+ numIts ++;
+ id += numIts * numIts;
+ if (numIts > 100) {
+ Debug.LogError("Failed to generate unique handle id.");
+ break;
+ }
+ }
+
+ idHash.Add(id);
+ ids.Add(id);
+ }
+ }
+
+ static int GetID(int handleIndex)
+ {
+ if (handleIndex >= ids.Count)
+ {
+ AddIDs(handleIndex);
+ }
+
+ return ids[handleIndex];
+ }
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Editor/Helper/PathHandle.cs.meta b/game/Assets/PathCreator/Core/Editor/Helper/PathHandle.cs.meta
new file mode 100644
index 0000000..4dee2f9
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/Helper/PathHandle.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 804ddb43548540a4ca3b0a534a75c4b3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Editor/Helper/ScreenSpacePolyLine.cs b/game/Assets/PathCreator/Core/Editor/Helper/ScreenSpacePolyLine.cs
new file mode 100644
index 0000000..50b28a2
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/Helper/ScreenSpacePolyLine.cs
@@ -0,0 +1,215 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+using PathCreation;
+using PathCreation.Utility;
+
+namespace PathCreationEditor
+{
+ public class ScreenSpacePolyLine
+ {
+ const int accuracyMultiplier = 10;
+ // dont allow vertices to be spaced too far apart, as screenspace-worldspace conversion can then be noticeably off
+ const float intermediaryThreshold = .2f;
+
+ public readonly List verticesWorld;
+ // For each point in the polyline, says which bezier segment it belongs to
+ readonly List vertexToPathSegmentMap;
+ // Stores the index in the vertices list where the start point of each segment is
+ readonly int[] segmentStartIndices;
+
+ readonly float pathLengthWorld;
+ readonly float[] cumululativeLengthWorld;
+
+ Vector2[] points;
+
+ Vector3 prevCamPos;
+ Quaternion prevCamRot;
+ bool premCamIsOrtho;
+
+ readonly Transform transform;
+ readonly Vector3 transformPosition;
+ readonly Quaternion transformRotation;
+ readonly Vector3 transformScale;
+
+ public ScreenSpacePolyLine(BezierPath bezierPath, Transform transform, float maxAngleError, float minVertexDst, float accuracy = 1)
+ {
+ this.transform = transform;
+ transformPosition = transform.position;
+ transformRotation = transform.rotation;
+ transformScale = transform.localScale;
+
+ // Split path in vertices based on angle error
+ verticesWorld = new List();
+ vertexToPathSegmentMap = new List();
+ segmentStartIndices = new int[bezierPath.NumSegments+1];
+
+ verticesWorld.Add(bezierPath[0]);
+ vertexToPathSegmentMap.Add(0);
+ Vector3 prevPointOnPath = bezierPath[0];
+ float dstSinceLastVertex = 0;
+ Vector3 lastAddedPoint = prevPointOnPath;
+ float dstSinceLastIntermediary = 0;
+
+ for (int segmentIndex = 0; segmentIndex < bezierPath.NumSegments; segmentIndex++)
+ {
+ Vector3[] segmentPoints = bezierPath.GetPointsInSegment(segmentIndex);
+ verticesWorld.Add(segmentPoints[0]);
+ vertexToPathSegmentMap.Add(segmentIndex);
+ segmentStartIndices[segmentIndex] = verticesWorld.Count-1;
+
+ prevPointOnPath = segmentPoints[0];
+ lastAddedPoint = prevPointOnPath;
+ dstSinceLastVertex = 0;
+ dstSinceLastIntermediary = 0;
+
+ float estimatedSegmentLength = CubicBezierUtility.EstimateCurveLength(segmentPoints[0], segmentPoints[1], segmentPoints[2], segmentPoints[3]);
+ int divisions = Mathf.CeilToInt(estimatedSegmentLength * accuracy * accuracyMultiplier);
+ float increment = 1f / divisions;
+
+ for (float t = increment; t <= 1; t += increment)
+ {
+ Vector3 pointOnPath = CubicBezierUtility.EvaluateCurve(segmentPoints[0], segmentPoints[1], segmentPoints[2], segmentPoints[3], t);
+ Vector3 nextPointOnPath = CubicBezierUtility.EvaluateCurve(segmentPoints[0], segmentPoints[1], segmentPoints[2], segmentPoints[3], t + increment);
+
+ // angle at current point on path
+ float localAngle = 180 - MathUtility.MinAngle(prevPointOnPath, pointOnPath, nextPointOnPath);
+ // angle between the last added vertex, the current point on the path, and the next point on the path
+ float angleFromPrevVertex = 180 - MathUtility.MinAngle(lastAddedPoint, pointOnPath, nextPointOnPath);
+ float angleError = Mathf.Max(localAngle, angleFromPrevVertex);
+
+
+ if (angleError > maxAngleError && dstSinceLastVertex >= minVertexDst)
+ {
+ dstSinceLastVertex = 0;
+ dstSinceLastIntermediary = 0;
+ verticesWorld.Add(pointOnPath);
+ vertexToPathSegmentMap.Add(segmentIndex);
+ lastAddedPoint = pointOnPath;
+ }
+ else
+ {
+ if (dstSinceLastIntermediary > intermediaryThreshold)
+ {
+ verticesWorld.Add(pointOnPath);
+ vertexToPathSegmentMap.Add(segmentIndex);
+ dstSinceLastIntermediary = 0;
+ }
+ else
+ {
+ dstSinceLastIntermediary += (pointOnPath - prevPointOnPath).magnitude;
+ }
+ dstSinceLastVertex += (pointOnPath - prevPointOnPath).magnitude;
+ }
+ prevPointOnPath = pointOnPath;
+ }
+ }
+
+ segmentStartIndices[bezierPath.NumSegments] = verticesWorld.Count;
+
+ // ensure final point gets added (unless path is closed loop)
+ if (!bezierPath.IsClosed)
+ {
+ verticesWorld.Add(bezierPath[bezierPath.NumPoints - 1]);
+ }
+ else
+ {
+ verticesWorld.Add(bezierPath[0]);
+ }
+
+ // Calculate length
+ cumululativeLengthWorld = new float[verticesWorld.Count];
+ for (int i = 0; i < verticesWorld.Count; i++)
+ {
+ verticesWorld[i] = MathUtility.TransformPoint(verticesWorld[i], transform, bezierPath.Space);
+ if (i > 0) {
+ pathLengthWorld += (verticesWorld[i - 1] - verticesWorld[i]).magnitude;
+ cumululativeLengthWorld[i] = pathLengthWorld;
+ }
+ }
+
+ }
+
+ void ComputeScreenSpace()
+ {
+ if (Camera.current.transform.position != prevCamPos || Camera.current.transform.rotation != prevCamRot || Camera.current.orthographic != premCamIsOrtho)
+ {
+ points = new Vector2[verticesWorld.Count];
+ for (int i = 0; i < verticesWorld.Count; i++)
+ {
+ points[i] = HandleUtility.WorldToGUIPoint(verticesWorld[i]);
+ }
+
+ prevCamPos = Camera.current.transform.position;
+ prevCamRot = Camera.current.transform.rotation;
+ premCamIsOrtho = Camera.current.orthographic;
+ }
+ }
+
+ public MouseInfo CalculateMouseInfo()
+ {
+ ComputeScreenSpace();
+
+ Vector2 mousePos = Event.current.mousePosition;
+ float minDst = float.MaxValue;
+ int closestPolyLineSegmentIndex = 0;
+ int closestBezierSegmentIndex = 0;
+
+ for (int i = 0; i < points.Length - 1; i++)
+ {
+ float dst = HandleUtility.DistancePointToLineSegment(mousePos, points[i], points[i + 1]);
+
+ if (dst < minDst)
+ {
+ minDst = dst;
+ closestPolyLineSegmentIndex = i;
+ closestBezierSegmentIndex = vertexToPathSegmentMap[i];
+ }
+ }
+
+ Vector2 closestPointOnLine = MathUtility.ClosestPointOnLineSegment(mousePos, points[closestPolyLineSegmentIndex], points[closestPolyLineSegmentIndex + 1]);
+ float dstToPointOnLine = (points[closestPolyLineSegmentIndex] - closestPointOnLine).magnitude;
+ float percentBetweenVertices = dstToPointOnLine / (points[closestPolyLineSegmentIndex] - points[closestPolyLineSegmentIndex + 1]).magnitude;
+ Vector3 closestPoint3D = Vector3.Lerp(verticesWorld[closestPolyLineSegmentIndex], verticesWorld[closestPolyLineSegmentIndex + 1], percentBetweenVertices);
+
+ float distanceAlongPathWorld = cumululativeLengthWorld[closestPolyLineSegmentIndex] + Vector3.Distance(verticesWorld[closestPolyLineSegmentIndex], closestPoint3D);
+ float timeAlongPath = distanceAlongPathWorld / pathLengthWorld;
+
+ // Calculate how far between the current bezier segment the closest point on the line is
+
+ int bezierSegmentStartIndex = segmentStartIndices[closestBezierSegmentIndex];
+ int bezierSegmentEndIndex = segmentStartIndices[closestBezierSegmentIndex+1];
+ float bezierSegmentLength = cumululativeLengthWorld[bezierSegmentEndIndex] - cumululativeLengthWorld[bezierSegmentStartIndex];
+ float distanceAlongBezierSegment = distanceAlongPathWorld - cumululativeLengthWorld[bezierSegmentStartIndex];
+ float timeAlongBezierSegment = distanceAlongBezierSegment/bezierSegmentLength;
+
+ return new MouseInfo(minDst, closestPoint3D, distanceAlongPathWorld, timeAlongPath, timeAlongBezierSegment, closestBezierSegmentIndex);
+ }
+
+ public bool TransformIsOutOfDate() {
+ return transform.position != transformPosition || transform.rotation != transformRotation || transform.localScale != transformScale;
+ }
+
+
+ public struct MouseInfo
+ {
+ public readonly float mouseDstToLine;
+ public readonly Vector3 closestWorldPointToMouse;
+ public readonly float distanceAlongPathWorld;
+ public readonly float timeOnPath;
+ public readonly float timeOnBezierSegment;
+ public readonly int closestSegmentIndex;
+
+
+ public MouseInfo(float mouseDstToLine, Vector3 closestWorldPointToMouse, float distanceAlongPathWorld, float timeOnPath, float timeOnBezierSegment, int closestSegmentIndex)
+ {
+ this.mouseDstToLine = mouseDstToLine;
+ this.closestWorldPointToMouse = closestWorldPointToMouse;
+ this.distanceAlongPathWorld = distanceAlongPathWorld;
+ this.timeOnPath = timeOnPath;
+ this.timeOnBezierSegment = timeOnBezierSegment;
+ this.closestSegmentIndex = closestSegmentIndex;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Editor/Helper/ScreenSpacePolyLine.cs.meta b/game/Assets/PathCreator/Core/Editor/Helper/ScreenSpacePolyLine.cs.meta
new file mode 100644
index 0000000..d860ffe
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/Helper/ScreenSpacePolyLine.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 05aed72a972059e45a62e31c2bb60fc4
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Editor/PathCreatorEditor.asmdef b/game/Assets/PathCreator/Core/Editor/PathCreatorEditor.asmdef
new file mode 100644
index 0000000..a53287d
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/PathCreatorEditor.asmdef
@@ -0,0 +1,16 @@
+{
+ "name": "PathCreatorEditor",
+ "references": [
+ "PathCreator"
+ ],
+ "optionalUnityReferences": [],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": []
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Editor/PathCreatorEditor.asmdef.meta b/game/Assets/PathCreator/Core/Editor/PathCreatorEditor.asmdef.meta
new file mode 100644
index 0000000..0c83f71
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/PathCreatorEditor.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 92ee438f32d811247a22ca14bf2a3fe0
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Editor/PathEditor.cs b/game/Assets/PathCreator/Core/Editor/PathEditor.cs
new file mode 100644
index 0000000..7c52cc6
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/PathEditor.cs
@@ -0,0 +1,736 @@
+using System.Collections.Generic;
+using PathCreation;
+using PathCreation.Utility;
+using UnityEditor;
+using UnityEditor.IMGUI.Controls;
+using UnityEngine;
+
+namespace PathCreationEditor {
+ /// Editor class for the creation of Bezier and Vertex paths
+
+ [CustomEditor (typeof (PathCreator))]
+ public class PathEditor : Editor {
+
+ #region Fields
+
+ // Interaction:
+ const float segmentSelectDistanceThreshold = 10f;
+ const float screenPolylineMaxAngleError = .3f;
+ const float screenPolylineMinVertexDst = .01f;
+
+ // Help messages:
+ const string helpInfo = "Shift-click to add or insert new points. Control-click to delete points. For more detailed infomation, please refer to the documentation.";
+ static readonly string[] spaceNames = { "3D (xyz)", "2D (xy)", "Top-down (xz)" };
+ static readonly string[] tabNames = { "Bézier Path", "Vertex Path" };
+ const string constantSizeTooltip = "If true, anchor and control points will keep a constant size when zooming in the editor.";
+
+ // Display
+ const int inspectorSectionSpacing = 10;
+ const float constantHandleScale = .01f;
+ const float normalsSpacing = .2f;
+ GUIStyle boldFoldoutStyle;
+
+ // References:
+ PathCreator creator;
+ Editor globalDisplaySettingsEditor;
+ ScreenSpacePolyLine screenSpaceLine;
+ ScreenSpacePolyLine.MouseInfo pathMouseInfo;
+ GlobalDisplaySettings globalDisplaySettings;
+ PathHandle.HandleColours splineAnchorColours;
+ PathHandle.HandleColours splineControlColours;
+ Dictionary capFunctions;
+ ArcHandle anchorAngleHandle = new ArcHandle ();
+ VertexPath normalsVertexPath;
+
+ // State variables:
+ int selectedSegmentIndex;
+ int draggingHandleIndex;
+ int mouseOverHandleIndex;
+ int handleIndexToDisplayAsTransform;
+
+ bool shiftLastFrame;
+ bool hasUpdatedScreenSpaceLine;
+ bool hasUpdatedNormalsVertexPath;
+ bool editingNormalsOld;
+
+ Vector3 transformPos;
+ Vector3 transformScale;
+ Quaternion transformRot;
+
+ Color handlesStartCol;
+
+ // Constants
+ const int bezierPathTab = 0;
+ const int vertexPathTab = 1;
+
+ #endregion
+
+ #region Inspectors
+
+ public override void OnInspectorGUI () {
+ // Initialize GUI styles
+ if (boldFoldoutStyle == null) {
+ boldFoldoutStyle = new GUIStyle (EditorStyles.foldout);
+ boldFoldoutStyle.fontStyle = FontStyle.Bold;
+ }
+
+ Undo.RecordObject (creator, "Path settings changed");
+
+ // Draw Bezier and Vertex tabs
+ int tabIndex = GUILayout.Toolbar (data.tabIndex, tabNames);
+ if (tabIndex != data.tabIndex) {
+ data.tabIndex = tabIndex;
+ TabChanged ();
+ }
+
+ // Draw inspector for active tab
+ switch (data.tabIndex) {
+ case bezierPathTab:
+ DrawBezierPathInspector ();
+ break;
+ case vertexPathTab:
+ DrawVertexPathInspector ();
+ break;
+ }
+
+ // Notify of undo/redo that might modify the path
+ if (Event.current.type == EventType.ValidateCommand && Event.current.commandName == "UndoRedoPerformed") {
+ data.PathModifiedByUndo ();
+ }
+ }
+
+ void DrawBezierPathInspector () {
+ using (var check = new EditorGUI.ChangeCheckScope ()) {
+ // Path options:
+ data.showPathOptions = EditorGUILayout.Foldout (data.showPathOptions, new GUIContent ("Bézier Path Options"), true, boldFoldoutStyle);
+ if (data.showPathOptions) {
+ bezierPath.Space = (PathSpace) EditorGUILayout.Popup ("Space", (int) bezierPath.Space, spaceNames);
+ bezierPath.ControlPointMode = (BezierPath.ControlMode) EditorGUILayout.EnumPopup (new GUIContent ("Control Mode"), bezierPath.ControlPointMode);
+ if (bezierPath.ControlPointMode == BezierPath.ControlMode.Automatic) {
+ bezierPath.AutoControlLength = EditorGUILayout.Slider (new GUIContent ("Control Spacing"), bezierPath.AutoControlLength, 0, 1);
+ }
+
+ bezierPath.IsClosed = EditorGUILayout.Toggle ("Closed Path", bezierPath.IsClosed);
+ data.showTransformTool = EditorGUILayout.Toggle (new GUIContent ("Enable Transforms"), data.showTransformTool);
+
+ Tools.hidden = !data.showTransformTool;
+
+ // Check if out of bounds (can occur after undo operations)
+ if (handleIndexToDisplayAsTransform >= bezierPath.NumPoints) {
+ handleIndexToDisplayAsTransform = -1;
+ }
+
+ // If a point has been selected
+ if (handleIndexToDisplayAsTransform != -1) {
+ EditorGUILayout.LabelField ("Selected Point:");
+
+ using (new EditorGUI.IndentLevelScope ()) {
+ var currentPosition = creator.bezierPath[handleIndexToDisplayAsTransform];
+ var newPosition = EditorGUILayout.Vector3Field ("Position", currentPosition);
+ if (newPosition != currentPosition) {
+ Undo.RecordObject (creator, "Move point");
+ creator.bezierPath.MovePoint (handleIndexToDisplayAsTransform, newPosition);
+ }
+ // Don't draw the angle field if we aren't selecting an anchor point/not in 3d space
+ if (handleIndexToDisplayAsTransform % 3 == 0 && creator.bezierPath.Space == PathSpace.xyz) {
+ var anchorIndex = handleIndexToDisplayAsTransform / 3;
+ var currentAngle = creator.bezierPath.GetAnchorNormalAngle (anchorIndex);
+ var newAngle = EditorGUILayout.FloatField ("Angle", currentAngle);
+ if (newAngle != currentAngle) {
+ Undo.RecordObject (creator, "Set Angle");
+ creator.bezierPath.SetAnchorNormalAngle (anchorIndex, newAngle);
+ }
+ }
+ }
+ }
+
+ if (data.showTransformTool & (handleIndexToDisplayAsTransform == -1)) {
+ if (GUILayout.Button ("Centre Transform")) {
+
+ Vector3 worldCentre = bezierPath.CalculateBoundsWithTransform (creator.transform).center;
+ Vector3 transformPos = creator.transform.position;
+ if (bezierPath.Space == PathSpace.xy) {
+ transformPos = new Vector3 (transformPos.x, transformPos.y, 0);
+ } else if (bezierPath.Space == PathSpace.xz) {
+ transformPos = new Vector3 (transformPos.x, 0, transformPos.z);
+ }
+ Vector3 worldCentreToTransform = transformPos - worldCentre;
+
+ if (worldCentre != creator.transform.position) {
+ //Undo.RecordObject (creator, "Centralize Transform");
+ if (worldCentreToTransform != Vector3.zero) {
+ Vector3 localCentreToTransform = MathUtility.InverseTransformVector (worldCentreToTransform, creator.transform, bezierPath.Space);
+ for (int i = 0; i < bezierPath.NumPoints; i++) {
+ bezierPath.SetPoint (i, bezierPath.GetPoint (i) + localCentreToTransform, true);
+ }
+ }
+
+ creator.transform.position = worldCentre;
+ bezierPath.NotifyPathModified ();
+ }
+ }
+ }
+
+ if (GUILayout.Button ("Reset Path")) {
+ Undo.RecordObject (creator, "Reset Path");
+ bool in2DEditorMode = EditorSettings.defaultBehaviorMode == EditorBehaviorMode.Mode2D;
+ data.ResetBezierPath (creator.transform.position, in2DEditorMode);
+ EditorApplication.QueuePlayerLoopUpdate ();
+ }
+
+ GUILayout.Space (inspectorSectionSpacing);
+ }
+
+ data.showNormals = EditorGUILayout.Foldout (data.showNormals, new GUIContent ("Normals Options"), true, boldFoldoutStyle);
+ if (data.showNormals) {
+ bezierPath.FlipNormals = EditorGUILayout.Toggle (new GUIContent ("Flip Normals"), bezierPath.FlipNormals);
+ if (bezierPath.Space == PathSpace.xyz) {
+ bezierPath.GlobalNormalsAngle = EditorGUILayout.Slider (new GUIContent ("Global Angle"), bezierPath.GlobalNormalsAngle, 0, 360);
+
+ if (GUILayout.Button ("Reset Normals")) {
+ Undo.RecordObject (creator, "Reset Normals");
+ bezierPath.FlipNormals = false;
+ bezierPath.ResetNormalAngles ();
+ }
+ }
+ GUILayout.Space (inspectorSectionSpacing);
+ }
+
+ // Editor display options
+ data.showDisplayOptions = EditorGUILayout.Foldout (data.showDisplayOptions, new GUIContent ("Display Options"), true, boldFoldoutStyle);
+ if (data.showDisplayOptions) {
+ data.showPathBounds = GUILayout.Toggle (data.showPathBounds, new GUIContent ("Show Path Bounds"));
+ data.showPerSegmentBounds = GUILayout.Toggle (data.showPerSegmentBounds, new GUIContent ("Show Segment Bounds"));
+ data.displayAnchorPoints = GUILayout.Toggle (data.displayAnchorPoints, new GUIContent ("Show Anchor Points"));
+ if (!(bezierPath.ControlPointMode == BezierPath.ControlMode.Automatic && globalDisplaySettings.hideAutoControls)) {
+ data.displayControlPoints = GUILayout.Toggle (data.displayControlPoints, new GUIContent ("Show Control Points"));
+ }
+ data.keepConstantHandleSize = GUILayout.Toggle (data.keepConstantHandleSize, new GUIContent ("Constant Point Size", constantSizeTooltip));
+ data.bezierHandleScale = Mathf.Max (0, EditorGUILayout.FloatField (new GUIContent ("Handle Scale"), data.bezierHandleScale));
+ DrawGlobalDisplaySettingsInspector ();
+ }
+
+ if (check.changed) {
+ SceneView.RepaintAll ();
+ EditorApplication.QueuePlayerLoopUpdate ();
+ }
+ }
+ }
+
+ void DrawVertexPathInspector () {
+
+ GUILayout.Space (inspectorSectionSpacing);
+ EditorGUILayout.LabelField ("Vertex count: " + creator.path.NumPoints);
+ GUILayout.Space (inspectorSectionSpacing);
+
+ data.showVertexPathOptions = EditorGUILayout.Foldout (data.showVertexPathOptions, new GUIContent ("Vertex Path Options"), true, boldFoldoutStyle);
+ if (data.showVertexPathOptions) {
+ using (var check = new EditorGUI.ChangeCheckScope ()) {
+ data.vertexPathMaxAngleError = EditorGUILayout.Slider (new GUIContent ("Max Angle Error"), data.vertexPathMaxAngleError, 0, 45);
+ data.vertexPathMinVertexSpacing = EditorGUILayout.Slider (new GUIContent ("Min Vertex Dst"), data.vertexPathMinVertexSpacing, 0, 1);
+
+ GUILayout.Space (inspectorSectionSpacing);
+ if (check.changed) {
+ data.VertexPathSettingsChanged ();
+ SceneView.RepaintAll ();
+ EditorApplication.QueuePlayerLoopUpdate ();
+ }
+ }
+ }
+
+ data.showVertexPathDisplayOptions = EditorGUILayout.Foldout (data.showVertexPathDisplayOptions, new GUIContent ("Display Options"), true, boldFoldoutStyle);
+ if (data.showVertexPathDisplayOptions) {
+ using (var check = new EditorGUI.ChangeCheckScope ()) {
+ data.showNormalsInVertexMode = GUILayout.Toggle (data.showNormalsInVertexMode, new GUIContent ("Show Normals"));
+ data.showBezierPathInVertexMode = GUILayout.Toggle (data.showBezierPathInVertexMode, new GUIContent ("Show Bezier Path"));
+
+ if (check.changed) {
+ SceneView.RepaintAll ();
+ EditorApplication.QueuePlayerLoopUpdate ();
+ }
+ }
+ DrawGlobalDisplaySettingsInspector ();
+ }
+ }
+
+ void DrawGlobalDisplaySettingsInspector () {
+ using (var check = new EditorGUI.ChangeCheckScope ()) {
+ data.globalDisplaySettingsFoldout = EditorGUILayout.InspectorTitlebar (data.globalDisplaySettingsFoldout, globalDisplaySettings);
+ if (data.globalDisplaySettingsFoldout) {
+ CreateCachedEditor (globalDisplaySettings, null, ref globalDisplaySettingsEditor);
+ globalDisplaySettingsEditor.OnInspectorGUI ();
+ }
+ if (check.changed) {
+ UpdateGlobalDisplaySettings ();
+ SceneView.RepaintAll ();
+ }
+ }
+ }
+
+ #endregion
+
+ #region Scene GUI
+
+ void OnSceneGUI () {
+ if (!globalDisplaySettings.visibleBehindObjects) {
+ Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual;
+ }
+
+ EventType eventType = Event.current.type;
+
+ using (var check = new EditorGUI.ChangeCheckScope ()) {
+ handlesStartCol = Handles.color;
+ switch (data.tabIndex) {
+ case bezierPathTab:
+ if (eventType != EventType.Repaint && eventType != EventType.Layout) {
+ ProcessBezierPathInput (Event.current);
+ }
+
+ DrawBezierPathSceneEditor ();
+ break;
+ case vertexPathTab:
+ if (eventType == EventType.Repaint) {
+ DrawVertexPathSceneEditor ();
+ }
+ break;
+ }
+
+ // Don't allow clicking over empty space to deselect the object
+ if (eventType == EventType.Layout) {
+ HandleUtility.AddDefaultControl (0);
+ }
+
+ if (check.changed) {
+ EditorApplication.QueuePlayerLoopUpdate ();
+ }
+ }
+
+ SetTransformState ();
+ }
+
+ void DrawVertexPathSceneEditor () {
+
+ Color bezierCol = globalDisplaySettings.bezierPath;
+ bezierCol.a *= .5f;
+
+ if (data.showBezierPathInVertexMode) {
+ for (int i = 0; i < bezierPath.NumSegments; i++) {
+ Vector3[] points = bezierPath.GetPointsInSegment (i);
+ for (int j = 0; j < points.Length; j++) {
+ points[j] = MathUtility.TransformPoint (points[j], creator.transform, bezierPath.Space);
+ }
+ Handles.DrawBezier (points[0], points[3], points[1], points[2], bezierCol, null, 2);
+ }
+ }
+
+ Handles.color = globalDisplaySettings.vertexPath;
+
+ for (int i = 0; i < creator.path.NumPoints; i++) {
+ int nextIndex = (i + 1) % creator.path.NumPoints;
+ if (nextIndex != 0 || bezierPath.IsClosed) {
+ Handles.DrawLine (creator.path.GetPoint (i), creator.path.GetPoint (nextIndex));
+ }
+ }
+
+ if (data.showNormalsInVertexMode) {
+ Handles.color = globalDisplaySettings.normals;
+ Vector3[] normalLines = new Vector3[creator.path.NumPoints * 2];
+ for (int i = 0; i < creator.path.NumPoints; i++) {
+ normalLines[i * 2] = creator.path.GetPoint (i);
+ normalLines[i * 2 + 1] = creator.path.GetPoint (i) + creator.path.localNormals[i] * globalDisplaySettings.normalsLength;
+ }
+ Handles.DrawLines (normalLines);
+ }
+ }
+
+ void ProcessBezierPathInput (Event e) {
+ // Find which handle mouse is over. Start by looking at previous handle index first, as most likely to still be closest to mouse
+ int previousMouseOverHandleIndex = (mouseOverHandleIndex == -1) ? 0 : mouseOverHandleIndex;
+ mouseOverHandleIndex = -1;
+ for (int i = 0; i < bezierPath.NumPoints; i += 3) {
+
+ int handleIndex = (previousMouseOverHandleIndex + i) % bezierPath.NumPoints;
+ float handleRadius = GetHandleDiameter (globalDisplaySettings.anchorSize * data.bezierHandleScale, bezierPath[handleIndex]) / 2f;
+ Vector3 pos = MathUtility.TransformPoint (bezierPath[handleIndex], creator.transform, bezierPath.Space);
+ float dst = HandleUtility.DistanceToCircle (pos, handleRadius);
+ if (dst == 0) {
+ mouseOverHandleIndex = handleIndex;
+ break;
+ }
+ }
+
+ // Shift-left click (when mouse not over a handle) to split or add segment
+ if (mouseOverHandleIndex == -1) {
+ if (e.type == EventType.MouseDown && e.button == 0 && e.shift) {
+ UpdatePathMouseInfo ();
+ // Insert point along selected segment
+ if (selectedSegmentIndex != -1 && selectedSegmentIndex < bezierPath.NumSegments) {
+ Vector3 newPathPoint = pathMouseInfo.closestWorldPointToMouse;
+ newPathPoint = MathUtility.InverseTransformPoint (newPathPoint, creator.transform, bezierPath.Space);
+ Undo.RecordObject (creator, "Split segment");
+ bezierPath.SplitSegment (newPathPoint, selectedSegmentIndex, pathMouseInfo.timeOnBezierSegment);
+ }
+ // If path is not a closed loop, add new point on to the end of the path
+ else if (!bezierPath.IsClosed) {
+ // insert new point at same dst from scene camera as the point that comes before it (for a 3d path)
+ float dstCamToEndpoint = (Camera.current.transform.position - bezierPath[bezierPath.NumPoints - 1]).magnitude;
+ Vector3 newPathPoint = MouseUtility.GetMouseWorldPosition (bezierPath.Space, dstCamToEndpoint);
+ newPathPoint = MathUtility.InverseTransformPoint (newPathPoint, creator.transform, bezierPath.Space);
+
+ Undo.RecordObject (creator, "Add segment");
+ if (e.control || e.command) {
+ bezierPath.AddSegmentToStart (newPathPoint);
+ } else {
+ bezierPath.AddSegmentToEnd (newPathPoint);
+ }
+
+ }
+
+ }
+ }
+
+ // Control click or backspace/delete to remove point
+ if (e.keyCode == KeyCode.Backspace || e.keyCode == KeyCode.Delete || ((e.control || e.command) && e.type == EventType.MouseDown && e.button == 0)) {
+
+ if (mouseOverHandleIndex != -1) {
+ Undo.RecordObject (creator, "Delete segment");
+ bezierPath.DeleteSegment (mouseOverHandleIndex);
+ if (mouseOverHandleIndex == handleIndexToDisplayAsTransform) {
+ handleIndexToDisplayAsTransform = -1;
+ }
+ mouseOverHandleIndex = -1;
+ Repaint ();
+ }
+ }
+
+ // Holding shift and moving mouse (but mouse not over a handle/dragging a handle)
+ if (draggingHandleIndex == -1 && mouseOverHandleIndex == -1) {
+ bool shiftDown = e.shift && !shiftLastFrame;
+ if (shiftDown || ((e.type == EventType.MouseMove || e.type == EventType.MouseDrag) && e.shift)) {
+
+ UpdatePathMouseInfo ();
+
+ if (pathMouseInfo.mouseDstToLine < segmentSelectDistanceThreshold) {
+ if (pathMouseInfo.closestSegmentIndex != selectedSegmentIndex) {
+ selectedSegmentIndex = pathMouseInfo.closestSegmentIndex;
+ HandleUtility.Repaint ();
+ }
+ } else {
+ selectedSegmentIndex = -1;
+ HandleUtility.Repaint ();
+ }
+
+ }
+ }
+
+ shiftLastFrame = e.shift;
+
+ }
+
+ void DrawBezierPathSceneEditor () {
+
+ bool displayControlPoints = data.displayControlPoints && (bezierPath.ControlPointMode != BezierPath.ControlMode.Automatic || !globalDisplaySettings.hideAutoControls);
+ Bounds bounds = bezierPath.CalculateBoundsWithTransform (creator.transform);
+
+ if (Event.current.type == EventType.Repaint) {
+ for (int i = 0; i < bezierPath.NumSegments; i++) {
+ Vector3[] points = bezierPath.GetPointsInSegment (i);
+ for (int j = 0; j < points.Length; j++) {
+ points[j] = MathUtility.TransformPoint (points[j], creator.transform, bezierPath.Space);
+ }
+
+ if (data.showPerSegmentBounds) {
+ Bounds segmentBounds = CubicBezierUtility.CalculateSegmentBounds (points[0], points[1], points[2], points[3]);
+ Handles.color = globalDisplaySettings.segmentBounds;
+ Handles.DrawWireCube (segmentBounds.center, segmentBounds.size);
+ }
+
+ // Draw lines between control points
+ if (displayControlPoints) {
+ Handles.color = (bezierPath.ControlPointMode == BezierPath.ControlMode.Automatic) ? globalDisplaySettings.handleDisabled : globalDisplaySettings.controlLine;
+ Handles.DrawLine (points[1], points[0]);
+ Handles.DrawLine (points[2], points[3]);
+ }
+
+ // Draw path
+ bool highlightSegment = (i == selectedSegmentIndex && Event.current.shift && draggingHandleIndex == -1 && mouseOverHandleIndex == -1);
+ Color segmentCol = (highlightSegment) ? globalDisplaySettings.highlightedPath : globalDisplaySettings.bezierPath;
+ Handles.DrawBezier (points[0], points[3], points[1], points[2], segmentCol, null, 2);
+ }
+
+ if (data.showPathBounds) {
+ Handles.color = globalDisplaySettings.bounds;
+ Handles.DrawWireCube (bounds.center, bounds.size);
+ }
+
+ // Draw normals
+ if (data.showNormals) {
+ if (!hasUpdatedNormalsVertexPath) {
+ normalsVertexPath = new VertexPath (bezierPath, creator.transform, normalsSpacing);
+ hasUpdatedNormalsVertexPath = true;
+ }
+
+ if (editingNormalsOld != data.showNormals) {
+ editingNormalsOld = data.showNormals;
+ Repaint ();
+ }
+
+ Vector3[] normalLines = new Vector3[normalsVertexPath.NumPoints * 2];
+ Handles.color = globalDisplaySettings.normals;
+ for (int i = 0; i < normalsVertexPath.NumPoints; i++) {
+ normalLines[i * 2] = normalsVertexPath.GetPoint (i);
+ normalLines[i * 2 + 1] = normalsVertexPath.GetPoint (i) + normalsVertexPath.GetNormal (i) * globalDisplaySettings.normalsLength;
+ }
+ Handles.DrawLines (normalLines);
+ }
+ }
+
+ if (data.displayAnchorPoints) {
+ for (int i = 0; i < bezierPath.NumPoints; i += 3) {
+ DrawHandle (i);
+ }
+ }
+ if (displayControlPoints) {
+ for (int i = 1; i < bezierPath.NumPoints - 1; i += 3) {
+ DrawHandle (i);
+ DrawHandle (i + 1);
+ }
+ }
+ }
+
+ void DrawHandle (int i) {
+ Vector3 handlePosition = MathUtility.TransformPoint (bezierPath[i], creator.transform, bezierPath.Space);
+
+ float anchorHandleSize = GetHandleDiameter (globalDisplaySettings.anchorSize * data.bezierHandleScale, bezierPath[i]);
+ float controlHandleSize = GetHandleDiameter (globalDisplaySettings.controlSize * data.bezierHandleScale, bezierPath[i]);
+
+ bool isAnchorPoint = i % 3 == 0;
+ bool isInteractive = isAnchorPoint || bezierPath.ControlPointMode != BezierPath.ControlMode.Automatic;
+ float handleSize = (isAnchorPoint) ? anchorHandleSize : controlHandleSize;
+ bool doTransformHandle = i == handleIndexToDisplayAsTransform;
+
+ PathHandle.HandleColours handleColours = (isAnchorPoint) ? splineAnchorColours : splineControlColours;
+ if (i == handleIndexToDisplayAsTransform) {
+ handleColours.defaultColour = (isAnchorPoint) ? globalDisplaySettings.anchorSelected : globalDisplaySettings.controlSelected;
+ }
+ var cap = capFunctions[(isAnchorPoint) ? globalDisplaySettings.anchorShape : globalDisplaySettings.controlShape];
+ PathHandle.HandleInputType handleInputType;
+ handlePosition = PathHandle.DrawHandle (handlePosition, bezierPath.Space, isInteractive, handleSize, cap, handleColours, out handleInputType, i);
+
+ if (doTransformHandle) {
+ // Show normals rotate tool
+ if (data.showNormals && Tools.current == Tool.Rotate && isAnchorPoint && bezierPath.Space == PathSpace.xyz) {
+ Handles.color = handlesStartCol;
+
+ int attachedControlIndex = (i == bezierPath.NumPoints - 1) ? i - 1 : i + 1;
+ Vector3 dir = (bezierPath[attachedControlIndex] - handlePosition).normalized;
+ float handleRotOffset = (360 + bezierPath.GlobalNormalsAngle) % 360;
+ anchorAngleHandle.radius = handleSize * 3;
+ anchorAngleHandle.angle = handleRotOffset + bezierPath.GetAnchorNormalAngle (i / 3);
+ Vector3 handleDirection = Vector3.Cross (dir, Vector3.up);
+ Matrix4x4 handleMatrix = Matrix4x4.TRS (
+ handlePosition,
+ Quaternion.LookRotation (handleDirection, dir),
+ Vector3.one
+ );
+
+ using (new Handles.DrawingScope (handleMatrix)) {
+ // draw the handle
+ EditorGUI.BeginChangeCheck ();
+ anchorAngleHandle.DrawHandle ();
+ if (EditorGUI.EndChangeCheck ()) {
+ Undo.RecordObject (creator, "Set angle");
+ bezierPath.SetAnchorNormalAngle (i / 3, anchorAngleHandle.angle - handleRotOffset);
+ }
+ }
+
+ } else {
+ handlePosition = Handles.DoPositionHandle (handlePosition, Quaternion.identity);
+ }
+
+ }
+
+ switch (handleInputType) {
+ case PathHandle.HandleInputType.LMBDrag:
+ draggingHandleIndex = i;
+ handleIndexToDisplayAsTransform = -1;
+ Repaint ();
+ break;
+ case PathHandle.HandleInputType.LMBRelease:
+ draggingHandleIndex = -1;
+ handleIndexToDisplayAsTransform = -1;
+ Repaint ();
+ break;
+ case PathHandle.HandleInputType.LMBClick:
+ draggingHandleIndex = -1;
+ if (Event.current.shift) {
+ handleIndexToDisplayAsTransform = -1; // disable move tool if new point added
+ } else {
+ if (handleIndexToDisplayAsTransform == i) {
+ handleIndexToDisplayAsTransform = -1; // disable move tool if clicking on point under move tool
+ } else {
+ handleIndexToDisplayAsTransform = i;
+ }
+ }
+ Repaint ();
+ break;
+ case PathHandle.HandleInputType.LMBPress:
+ if (handleIndexToDisplayAsTransform != i) {
+ handleIndexToDisplayAsTransform = -1;
+ Repaint ();
+ }
+ break;
+ }
+
+ Vector3 localHandlePosition = MathUtility.InverseTransformPoint (handlePosition, creator.transform, bezierPath.Space);
+
+ if (bezierPath[i] != localHandlePosition) {
+ Undo.RecordObject (creator, "Move point");
+ bezierPath.MovePoint (i, localHandlePosition);
+
+ }
+
+ }
+
+ #endregion
+
+ #region Internal methods
+
+ void OnDisable () {
+ Tools.hidden = false;
+ }
+
+ void OnEnable () {
+ creator = (PathCreator) target;
+ bool in2DEditorMode = EditorSettings.defaultBehaviorMode == EditorBehaviorMode.Mode2D;
+ creator.InitializeEditorData (in2DEditorMode);
+
+ data.bezierCreated -= ResetState;
+ data.bezierCreated += ResetState;
+ Undo.undoRedoPerformed -= OnUndoRedo;
+ Undo.undoRedoPerformed += OnUndoRedo;
+
+ LoadDisplaySettings ();
+ UpdateGlobalDisplaySettings ();
+ ResetState ();
+ SetTransformState (true);
+ }
+
+ void SetTransformState (bool initialize = false) {
+ Transform t = creator.transform;
+ if (!initialize) {
+ if (transformPos != t.position || t.localScale != transformScale || t.rotation != transformRot) {
+ data.PathTransformed ();
+ }
+ }
+ transformPos = t.position;
+ transformScale = t.localScale;
+ transformRot = t.rotation;
+ }
+
+ void OnUndoRedo () {
+ hasUpdatedScreenSpaceLine = false;
+ hasUpdatedNormalsVertexPath = false;
+ selectedSegmentIndex = -1;
+
+ Repaint ();
+ }
+
+ void TabChanged () {
+ SceneView.RepaintAll ();
+ RepaintUnfocusedSceneViews ();
+ }
+
+ void LoadDisplaySettings () {
+ globalDisplaySettings = GlobalDisplaySettings.Load ();
+
+ capFunctions = new Dictionary ();
+ capFunctions.Add (GlobalDisplaySettings.HandleType.Circle, Handles.CylinderHandleCap);
+ capFunctions.Add (GlobalDisplaySettings.HandleType.Sphere, Handles.SphereHandleCap);
+ capFunctions.Add (GlobalDisplaySettings.HandleType.Square, Handles.CubeHandleCap);
+ }
+
+ void UpdateGlobalDisplaySettings () {
+ var gds = globalDisplaySettings;
+ splineAnchorColours = new PathHandle.HandleColours (gds.anchor, gds.anchorHighlighted, gds.anchorSelected, gds.handleDisabled);
+ splineControlColours = new PathHandle.HandleColours (gds.control, gds.controlHighlighted, gds.controlSelected, gds.handleDisabled);
+
+ anchorAngleHandle.fillColor = new Color (1, 1, 1, .05f);
+ anchorAngleHandle.wireframeColor = Color.grey;
+ anchorAngleHandle.radiusHandleColor = Color.clear;
+ anchorAngleHandle.angleHandleColor = Color.white;
+ }
+
+ void ResetState () {
+ selectedSegmentIndex = -1;
+ draggingHandleIndex = -1;
+ mouseOverHandleIndex = -1;
+ handleIndexToDisplayAsTransform = -1;
+ hasUpdatedScreenSpaceLine = false;
+ hasUpdatedNormalsVertexPath = false;
+
+ bezierPath.OnModified -= OnPathModifed;
+ bezierPath.OnModified += OnPathModifed;
+
+ SceneView.RepaintAll ();
+ EditorApplication.QueuePlayerLoopUpdate ();
+ }
+
+ void OnPathModifed () {
+ hasUpdatedScreenSpaceLine = false;
+ hasUpdatedNormalsVertexPath = false;
+
+ RepaintUnfocusedSceneViews ();
+ }
+
+ void RepaintUnfocusedSceneViews () {
+ // If multiple scene views are open, repaint those which do not have focus.
+ if (SceneView.sceneViews.Count > 1) {
+ foreach (SceneView sv in SceneView.sceneViews) {
+ if (EditorWindow.focusedWindow != (EditorWindow) sv) {
+ sv.Repaint ();
+ }
+ }
+ }
+ }
+
+ void UpdatePathMouseInfo () {
+
+ if (!hasUpdatedScreenSpaceLine || (screenSpaceLine != null && screenSpaceLine.TransformIsOutOfDate ())) {
+ screenSpaceLine = new ScreenSpacePolyLine (bezierPath, creator.transform, screenPolylineMaxAngleError, screenPolylineMinVertexDst);
+ hasUpdatedScreenSpaceLine = true;
+ }
+ pathMouseInfo = screenSpaceLine.CalculateMouseInfo ();
+ }
+
+ float GetHandleDiameter (float diameter, Vector3 handlePosition) {
+ float scaledDiameter = diameter * constantHandleScale;
+ if (data.keepConstantHandleSize) {
+ scaledDiameter *= HandleUtility.GetHandleSize (handlePosition) * 2.5f;
+ }
+ return scaledDiameter;
+ }
+
+ BezierPath bezierPath {
+ get {
+ return data.bezierPath;
+ }
+ }
+
+ PathCreatorData data {
+ get {
+ return creator.EditorData;
+ }
+ }
+
+ bool editingNormals {
+ get {
+ return Tools.current == Tool.Rotate && handleIndexToDisplayAsTransform % 3 == 0 && bezierPath.Space == PathSpace.xyz;
+ }
+ }
+
+ #endregion
+
+ }
+
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Editor/PathEditor.cs.meta b/game/Assets/PathCreator/Core/Editor/PathEditor.cs.meta
new file mode 100644
index 0000000..40e26f1
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Editor/PathEditor.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 45d81a20743ff42a3b0dfbd499d4797e
+timeCreated: 1516864234
+licenseType: Store
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime.meta b/game/Assets/PathCreator/Core/Runtime.meta
new file mode 100644
index 0000000..3756548
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c62dae0f992c5174a951248617cc5720
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects.meta b/game/Assets/PathCreator/Core/Runtime/Objects.meta
new file mode 100644
index 0000000..be235b4
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2b76edb14a39ed944b9c906e5f1d3aaa
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/BezierPath.cs b/game/Assets/PathCreator/Core/Runtime/Objects/BezierPath.cs
new file mode 100644
index 0000000..a3912b2
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/BezierPath.cs
@@ -0,0 +1,678 @@
+using System.Collections.Generic;
+using System.Linq;
+using PathCreation.Utility;
+using UnityEngine;
+
+namespace PathCreation {
+ /// A bezier path is a path made by stitching together any number of (cubic) bezier curves.
+ /// A single cubic bezier curve is defined by 4 points: anchor1, control1, control2, anchor2
+ /// The curve moves between the 2 anchors, and the shape of the curve is affected by the positions of the 2 control points
+
+ /// When two curves are stitched together, they share an anchor point (end anchor of curve 1 = start anchor of curve 2).
+ /// So while one curve alone consists of 4 points, two curves are defined by 7 unique points.
+
+ /// Apart from storing the points, this class also provides methods for working with the path.
+ /// For example, adding, inserting, and deleting points.
+
+ [System.Serializable]
+ public class BezierPath {
+ public event System.Action OnModified;
+ public enum ControlMode { Aligned, Mirrored, Free, Automatic };
+
+ #region Fields
+
+ [SerializeField, HideInInspector]
+ List points;
+ [SerializeField, HideInInspector]
+ bool isClosed;
+ [SerializeField, HideInInspector]
+ PathSpace space;
+ [SerializeField, HideInInspector]
+ ControlMode controlMode;
+ [SerializeField, HideInInspector]
+ float autoControlLength = .3f;
+ [SerializeField, HideInInspector]
+ bool boundsUpToDate;
+ [SerializeField, HideInInspector]
+ Bounds bounds;
+
+ // Normals settings
+ [SerializeField, HideInInspector]
+ List perAnchorNormalsAngle;
+ [SerializeField, HideInInspector]
+ float globalNormalsAngle;
+ [SerializeField, HideInInspector]
+ bool flipNormals;
+
+ #endregion
+
+ #region Constructors
+
+ /// Creates a two-anchor path centred around the given centre point
+ /// Should the end point connect back to the start point?
+ /// Determines if the path is in 3d space, or clamped to the xy/xz plane
+ public BezierPath (Vector3 centre, bool isClosed = false, PathSpace space = PathSpace.xyz) {
+
+ Vector3 dir = (space == PathSpace.xz) ? Vector3.forward : Vector3.up;
+ float width = 2;
+ float controlHeight = .5f;
+ float controlWidth = 1f;
+ points = new List {
+ centre + Vector3.left * width,
+ centre + Vector3.left * controlWidth + dir * controlHeight,
+ centre + Vector3.right * controlWidth - dir * controlHeight,
+ centre + Vector3.right * width
+ };
+
+ perAnchorNormalsAngle = new List () { 0, 0 };
+
+ Space = space;
+ IsClosed = isClosed;
+ }
+
+ /// Creates a path from the supplied 3D points
+ /// List or array of points to create the path from.
+ /// Should the end point connect back to the start point?
+ /// Determines if the path is in 3d space, or clamped to the xy/xz plane
+ public BezierPath (IEnumerable points, bool isClosed = false, PathSpace space = PathSpace.xyz) {
+ Vector3[] pointsArray = points.ToArray ();
+
+ if (pointsArray.Length < 2) {
+ Debug.LogError ("Path requires at least 2 anchor points.");
+ } else {
+ controlMode = ControlMode.Automatic;
+ this.points = new List { pointsArray[0], Vector3.zero, Vector3.zero, pointsArray[1] };
+ perAnchorNormalsAngle = new List (new float[] { 0, 0 });
+
+ for (int i = 2; i < pointsArray.Length; i++) {
+ AddSegmentToEnd (pointsArray[i]);
+ perAnchorNormalsAngle.Add (0);
+ }
+ }
+
+ this.Space = space;
+ this.IsClosed = isClosed;
+ }
+
+ /// Creates a path from the positions of the supplied 2D points
+ /// List or array of transforms to create the path from.
+ /// Should the end point connect back to the start point?
+ /// Determines if the path is in 3d space, or clamped to the xy/xz plane
+ public BezierPath (IEnumerable transforms, bool isClosed = false, PathSpace space = PathSpace.xy):
+ this (transforms.Select (p => new Vector3 (p.x, p.y)), isClosed, space) { }
+
+ /// Creates a path from the positions of the supplied transforms
+ /// List or array of transforms to create the path from.
+ /// Should the end point connect back to the start point?
+ /// Determines if the path is in 3d space, or clamped to the xy/xz plane
+ public BezierPath (IEnumerable transforms, bool isClosed = false, PathSpace space = PathSpace.xy):
+ this (transforms.Select (t => t.position), isClosed, space) { }
+
+ /// Creates a path from the supplied 2D points
+ /// List or array of 2d points to create the path from.
+ /// Should the end point connect back to the start point?
+ /// Determines if the path is in 3d space, or clamped to the xy/xz plane
+ public BezierPath (IEnumerable points, PathSpace space = PathSpace.xyz, bool isClosed = false):
+ this (points.Select (p => new Vector3 (p.x, p.y)), isClosed, space) { }
+
+ #endregion
+
+ #region Public methods and accessors
+
+ /// Get world space position of point
+ public Vector3 this [int i] {
+ get {
+ return GetPoint (i);
+ }
+ }
+
+ /// Get world space position of point
+ public Vector3 GetPoint (int i) {
+ return points[i];
+ }
+
+ /// Get world space position of point
+ public void SetPoint (int i, Vector3 localPosition, bool suppressPathModifiedEvent = false) {
+ points[i] = localPosition;
+ if (!suppressPathModifiedEvent) {
+ NotifyPathModified();
+ }
+ }
+
+ /// Total number of points in the path (anchors and controls)
+ public int NumPoints {
+ get {
+ return points.Count;
+ }
+ }
+
+ /// Number of anchor points making up the path
+ public int NumAnchorPoints {
+ get {
+ return (IsClosed) ? points.Count / 3 : (points.Count + 2) / 3;
+ }
+ }
+
+ /// Number of bezier curves making up this path
+ public int NumSegments {
+ get {
+ return points.Count / 3;
+ }
+ }
+
+ /// Path can exist in 3D (xyz), 2D (xy), or Top-Down (xz) space
+ /// In xy or xz space, points will be clamped to that plane (so in a 2D path, for example, points will always be at 0 on z axis)
+ public PathSpace Space {
+ get {
+ return space;
+ }
+ set {
+ if (value != space) {
+ PathSpace previousSpace = space;
+ space = value;
+ UpdateToNewPathSpace (previousSpace);
+ }
+ }
+ }
+
+ /// If closed, path will loop back from end point to start point
+ public bool IsClosed {
+ get {
+ return isClosed;
+ }
+ set {
+ if (isClosed != value) {
+ isClosed = value;
+ UpdateClosedState ();
+ }
+ }
+ }
+
+ /// The control mode determines the behaviour of control points.
+ /// Possible modes are:
+ /// Aligned = controls stay in straight line around their anchor
+ /// Mirrored = controls stay in straight, equidistant line around their anchor
+ /// Free = no constraints (use this if sharp corners are needed)
+ /// Automatic = controls placed automatically to try make the path smooth
+ public ControlMode ControlPointMode {
+ get {
+ return controlMode;
+ }
+ set {
+ if (controlMode != value) {
+ controlMode = value;
+ if (controlMode == ControlMode.Automatic) {
+ AutoSetAllControlPoints ();
+ NotifyPathModified ();
+ }
+ }
+ }
+ }
+
+ /// When using automatic control point placement, this value scales how far apart controls are placed
+ public float AutoControlLength {
+ get {
+ return autoControlLength;
+ }
+ set {
+ value = Mathf.Max (value, .01f);
+ if (autoControlLength != value) {
+ autoControlLength = value;
+ AutoSetAllControlPoints ();
+ NotifyPathModified ();
+ }
+ }
+ }
+
+ /// Add new anchor point to end of the path
+ public void AddSegmentToEnd (Vector3 anchorPos) {
+ if (isClosed) {
+ return;
+ }
+
+ int lastAnchorIndex = points.Count - 1;
+ // Set position for new control to be mirror of its counterpart
+ Vector3 secondControlForOldLastAnchorOffset = (points[lastAnchorIndex] - points[lastAnchorIndex - 1]);
+ if (controlMode != ControlMode.Mirrored && controlMode != ControlMode.Automatic) {
+ // Set position for new control to be aligned with its counterpart, but with a length of half the distance from prev to new anchor
+ float dstPrevToNewAnchor = (points[lastAnchorIndex] - anchorPos).magnitude;
+ secondControlForOldLastAnchorOffset = (points[lastAnchorIndex] - points[lastAnchorIndex - 1]).normalized * dstPrevToNewAnchor * .5f;
+ }
+ Vector3 secondControlForOldLastAnchor = points[lastAnchorIndex] + secondControlForOldLastAnchorOffset;
+ Vector3 controlForNewAnchor = (anchorPos + secondControlForOldLastAnchor) * .5f;
+
+ points.Add (secondControlForOldLastAnchor);
+ points.Add (controlForNewAnchor);
+ points.Add (anchorPos);
+ perAnchorNormalsAngle.Add (perAnchorNormalsAngle[perAnchorNormalsAngle.Count - 1]);
+
+ if (controlMode == ControlMode.Automatic) {
+ AutoSetAllAffectedControlPoints (points.Count - 1);
+ }
+
+ NotifyPathModified ();
+ }
+
+ /// Add new anchor point to start of the path
+ public void AddSegmentToStart (Vector3 anchorPos) {
+ if (isClosed) {
+ return;
+ }
+
+ // Set position for new control to be mirror of its counterpart
+ Vector3 secondControlForOldFirstAnchorOffset = (points[0] - points[1]);
+ if (controlMode != ControlMode.Mirrored && controlMode != ControlMode.Automatic) {
+ // Set position for new control to be aligned with its counterpart, but with a length of half the distance from prev to new anchor
+ float dstPrevToNewAnchor = (points[0] - anchorPos).magnitude;
+ secondControlForOldFirstAnchorOffset = secondControlForOldFirstAnchorOffset.normalized * dstPrevToNewAnchor * .5f;
+ }
+
+ Vector3 secondControlForOldFirstAnchor = points[0] + secondControlForOldFirstAnchorOffset;
+ Vector3 controlForNewAnchor = (anchorPos + secondControlForOldFirstAnchor) * .5f;
+ points.Insert (0, anchorPos);
+ points.Insert (1, controlForNewAnchor);
+ points.Insert (2, secondControlForOldFirstAnchor);
+ perAnchorNormalsAngle.Insert (0, perAnchorNormalsAngle[0]);
+
+ if (controlMode == ControlMode.Automatic) {
+ AutoSetAllAffectedControlPoints (0);
+ }
+ NotifyPathModified ();
+ }
+
+ /// Insert new anchor point at given position. Automatically place control points around it so as to keep shape of curve the same
+ public void SplitSegment (Vector3 anchorPos, int segmentIndex, float splitTime) {
+ splitTime = Mathf.Clamp01 (splitTime);
+
+ if (controlMode == ControlMode.Automatic) {
+ points.InsertRange (segmentIndex * 3 + 2, new Vector3[] { Vector3.zero, anchorPos, Vector3.zero });
+ AutoSetAllAffectedControlPoints (segmentIndex * 3 + 3);
+ } else {
+ // Split the curve to find where control points can be inserted to least affect shape of curve
+ // Curve will probably be deformed slightly since splitTime is only an estimate (for performance reasons, and so doesn't correspond exactly with anchorPos)
+ Vector3[][] splitSegment = CubicBezierUtility.SplitCurve (GetPointsInSegment (segmentIndex), splitTime);
+ points.InsertRange (segmentIndex * 3 + 2, new Vector3[] { splitSegment[0][2], splitSegment[1][0], splitSegment[1][1] });
+ int newAnchorIndex = segmentIndex * 3 + 3;
+ MovePoint (newAnchorIndex - 2, splitSegment[0][1], true);
+ MovePoint (newAnchorIndex + 2, splitSegment[1][2], true);
+ MovePoint (newAnchorIndex, anchorPos, true);
+
+ if (controlMode == ControlMode.Mirrored) {
+ float avgDst = ((splitSegment[0][2] - anchorPos).magnitude + (splitSegment[1][1] - anchorPos).magnitude) / 2;
+ MovePoint (newAnchorIndex + 1, anchorPos + (splitSegment[1][1] - anchorPos).normalized * avgDst, true);
+ }
+ }
+
+ // Insert angle for new anchor (value should be set inbetween neighbour anchor angles)
+ int newAnchorAngleIndex = (segmentIndex + 1) % perAnchorNormalsAngle.Count;
+ int numAngles = perAnchorNormalsAngle.Count;
+ float anglePrev = perAnchorNormalsAngle[segmentIndex];
+ float angleNext = perAnchorNormalsAngle[newAnchorAngleIndex];
+ float splitAngle = Mathf.LerpAngle (anglePrev, angleNext, splitTime);
+ perAnchorNormalsAngle.Insert (newAnchorAngleIndex, splitAngle);
+
+ NotifyPathModified ();
+ }
+
+ /// Delete the anchor point at given index, as well as its associated control points
+ public void DeleteSegment (int anchorIndex) {
+ // Don't delete segment if its the last one remaining (or if only two segments in a closed path)
+ if (NumSegments > 2 || !isClosed && NumSegments > 1) {
+ if (anchorIndex == 0) {
+ if (isClosed) {
+ points[points.Count - 1] = points[2];
+ }
+ points.RemoveRange (0, 3);
+ } else if (anchorIndex == points.Count - 1 && !isClosed) {
+ points.RemoveRange (anchorIndex - 2, 3);
+ } else {
+ points.RemoveRange (anchorIndex - 1, 3);
+ }
+
+ perAnchorNormalsAngle.RemoveAt (anchorIndex / 3);
+
+ if (controlMode == ControlMode.Automatic) {
+ AutoSetAllControlPoints ();
+ }
+
+ NotifyPathModified ();
+ }
+ }
+
+ /// Returns an array of the 4 points making up the segment (anchor1, control1, control2, anchor2)
+ public Vector3[] GetPointsInSegment (int segmentIndex) {
+ segmentIndex = Mathf.Clamp (segmentIndex, 0, NumSegments - 1);
+ return new Vector3[] { this [segmentIndex * 3], this [segmentIndex * 3 + 1], this [segmentIndex * 3 + 2], this [LoopIndex (segmentIndex * 3 + 3)] };
+ }
+
+ /// Move an existing point to a new position
+ public void MovePoint (int i, Vector3 pointPos, bool suppressPathModifiedEvent = false) {
+
+ if (space == PathSpace.xy) {
+ pointPos.z = 0;
+ } else if (space == PathSpace.xz) {
+ pointPos.y = 0;
+ }
+ Vector3 deltaMove = pointPos - points[i];
+ bool isAnchorPoint = i % 3 == 0;
+
+ // Don't process control point if control mode is set to automatic
+ if (isAnchorPoint || controlMode != ControlMode.Automatic) {
+ points[i] = pointPos;
+
+ if (controlMode == ControlMode.Automatic) {
+ AutoSetAllAffectedControlPoints (i);
+ } else {
+ // Move control points with anchor point
+ if (isAnchorPoint) {
+ if (i + 1 < points.Count || isClosed) {
+ points[LoopIndex (i + 1)] += deltaMove;
+ }
+ if (i - 1 >= 0 || isClosed) {
+ points[LoopIndex (i - 1)] += deltaMove;
+ }
+ }
+ // If not in free control mode, then move attached control point to be aligned/mirrored (depending on mode)
+ else if (controlMode != ControlMode.Free) {
+ bool nextPointIsAnchor = (i + 1) % 3 == 0;
+ int attachedControlIndex = (nextPointIsAnchor) ? i + 2 : i - 2;
+ int anchorIndex = (nextPointIsAnchor) ? i + 1 : i - 1;
+
+ if (attachedControlIndex >= 0 && attachedControlIndex < points.Count || isClosed) {
+ float distanceFromAnchor = 0;
+ // If in aligned mode, then attached control's current distance from anchor point should be maintained
+ if (controlMode == ControlMode.Aligned) {
+ distanceFromAnchor = (points[LoopIndex (anchorIndex)] - points[LoopIndex (attachedControlIndex)]).magnitude;
+ }
+ // If in mirrored mode, then both control points should have the same distance from the anchor point
+ else if (controlMode == ControlMode.Mirrored) {
+ distanceFromAnchor = (points[LoopIndex (anchorIndex)] - points[i]).magnitude;
+
+ }
+ Vector3 dir = (points[LoopIndex (anchorIndex)] - pointPos).normalized;
+ points[LoopIndex (attachedControlIndex)] = points[LoopIndex (anchorIndex)] + dir * distanceFromAnchor;
+ }
+ }
+ }
+
+ if (!suppressPathModifiedEvent) {
+ NotifyPathModified ();
+ }
+ }
+ }
+
+ /// Update the bounding box of the path
+ public Bounds CalculateBoundsWithTransform (Transform transform) {
+ // Loop through all segments and keep track of the minmax points of all their bounding boxes
+ MinMax3D minMax = new MinMax3D ();
+
+ for (int i = 0; i < NumSegments; i++) {
+ Vector3[] p = GetPointsInSegment (i);
+ for (int j = 0; j < p.Length; j++) {
+ p[j] = MathUtility.TransformPoint (p[j], transform, space);
+ }
+
+ minMax.AddValue (p[0]);
+ minMax.AddValue (p[3]);
+
+ List extremePointTimes = CubicBezierUtility.ExtremePointTimes (p[0], p[1], p[2], p[3]);
+ foreach (float t in extremePointTimes) {
+ minMax.AddValue (CubicBezierUtility.EvaluateCurve (p, t));
+ }
+ }
+
+ return new Bounds ((minMax.Min + minMax.Max) / 2, minMax.Max - minMax.Min);
+ }
+
+ /// Flip the normal vectors 180 degrees
+ public bool FlipNormals {
+ get {
+ return flipNormals;
+ }
+ set {
+ if (flipNormals != value) {
+ flipNormals = value;
+ NotifyPathModified ();
+ }
+ }
+ }
+
+ /// Global angle that all normal vectors are rotated by (only relevant for paths in 3D space)
+ public float GlobalNormalsAngle {
+ get {
+ return globalNormalsAngle;
+ }
+ set {
+ if (value != globalNormalsAngle) {
+ globalNormalsAngle = value;
+ NotifyPathModified ();
+ }
+ }
+ }
+
+ /// Get the desired angle of the normal vector at a particular anchor (only relevant for paths in 3D space)
+ public float GetAnchorNormalAngle (int anchorIndex) {
+ return perAnchorNormalsAngle[anchorIndex] % 360;
+ }
+
+ /// Set the desired angle of the normal vector at a particular anchor (only relevant for paths in 3D space)
+ public void SetAnchorNormalAngle (int anchorIndex, float angle) {
+ angle = (angle + 360) % 360;
+ if (perAnchorNormalsAngle[anchorIndex] != angle) {
+ perAnchorNormalsAngle[anchorIndex] = angle;
+ NotifyPathModified ();
+ }
+ }
+
+ /// Reset global and anchor normal angles to 0
+ public void ResetNormalAngles () {
+ for (int i = 0; i < perAnchorNormalsAngle.Count; i++) {
+ perAnchorNormalsAngle[i] = 0;
+ }
+ globalNormalsAngle = 0;
+ NotifyPathModified ();
+ }
+
+ /// Bounding box containing the path
+ public Bounds PathBounds {
+ get {
+ if (!boundsUpToDate) {
+ UpdateBounds ();
+ }
+ return bounds;
+ }
+ }
+
+ #endregion
+
+ #region Internal methods and accessors
+
+ /// Update the bounding box of the path
+ void UpdateBounds () {
+ if (boundsUpToDate) {
+ return;
+ }
+
+ // Loop through all segments and keep track of the minmax points of all their bounding boxes
+ MinMax3D minMax = new MinMax3D ();
+
+ for (int i = 0; i < NumSegments; i++) {
+ Vector3[] p = GetPointsInSegment (i);
+ minMax.AddValue (p[0]);
+ minMax.AddValue (p[3]);
+
+ List extremePointTimes = CubicBezierUtility.ExtremePointTimes (p[0], p[1], p[2], p[3]);
+ foreach (float t in extremePointTimes) {
+ minMax.AddValue (CubicBezierUtility.EvaluateCurve (p, t));
+ }
+ }
+
+ boundsUpToDate = true;
+ bounds = new Bounds ((minMax.Min + minMax.Max) / 2, minMax.Max - minMax.Min);
+ }
+
+ /// Determines good positions (for a smooth path) for the control points affected by a moved/inserted anchor point
+ void AutoSetAllAffectedControlPoints (int updatedAnchorIndex) {
+ for (int i = updatedAnchorIndex - 3; i <= updatedAnchorIndex + 3; i += 3) {
+ if (i >= 0 && i < points.Count || isClosed) {
+ AutoSetAnchorControlPoints (LoopIndex (i));
+ }
+ }
+
+ AutoSetStartAndEndControls ();
+ }
+
+ /// Determines good positions (for a smooth path) for all control points
+ void AutoSetAllControlPoints () {
+ if (NumAnchorPoints > 2) {
+ for (int i = 0; i < points.Count; i += 3) {
+ AutoSetAnchorControlPoints (i);
+ }
+ }
+
+ AutoSetStartAndEndControls ();
+ }
+
+ /// Calculates good positions (to result in smooth path) for the controls around specified anchor
+ void AutoSetAnchorControlPoints (int anchorIndex) {
+ // Calculate a vector that is perpendicular to the vector bisecting the angle between this anchor and its two immediate neighbours
+ // The control points will be placed along that vector
+ Vector3 anchorPos = points[anchorIndex];
+ Vector3 dir = Vector3.zero;
+ float[] neighbourDistances = new float[2];
+
+ if (anchorIndex - 3 >= 0 || isClosed) {
+ Vector3 offset = points[LoopIndex (anchorIndex - 3)] - anchorPos;
+ dir += offset.normalized;
+ neighbourDistances[0] = offset.magnitude;
+ }
+ if (anchorIndex + 3 >= 0 || isClosed) {
+ Vector3 offset = points[LoopIndex (anchorIndex + 3)] - anchorPos;
+ dir -= offset.normalized;
+ neighbourDistances[1] = -offset.magnitude;
+ }
+
+ dir.Normalize ();
+
+ // Set the control points along the calculated direction, with a distance proportional to the distance to the neighbouring control point
+ for (int i = 0; i < 2; i++) {
+ int controlIndex = anchorIndex + i * 2 - 1;
+ if (controlIndex >= 0 && controlIndex < points.Count || isClosed) {
+ points[LoopIndex (controlIndex)] = anchorPos + dir * neighbourDistances[i] * autoControlLength;
+ }
+ }
+ }
+
+ /// Determines good positions (for a smooth path) for the control points at the start and end of a path
+ void AutoSetStartAndEndControls () {
+ if (isClosed) {
+ // Handle case with only 2 anchor points separately, as will otherwise result in straight line ()
+ if (NumAnchorPoints == 2) {
+ Vector3 dirAnchorAToB = (points[3] - points[0]).normalized;
+ float dstBetweenAnchors = (points[0] - points[3]).magnitude;
+ Vector3 perp = Vector3.Cross (dirAnchorAToB, (space == PathSpace.xy) ? Vector3.forward : Vector3.up);
+ points[1] = points[0] + perp * dstBetweenAnchors / 2f;
+ points[5] = points[0] - perp * dstBetweenAnchors / 2f;
+ points[2] = points[3] + perp * dstBetweenAnchors / 2f;
+ points[4] = points[3] - perp * dstBetweenAnchors / 2f;
+
+ } else {
+ AutoSetAnchorControlPoints (0);
+ AutoSetAnchorControlPoints (points.Count - 3);
+ }
+ } else {
+ // Handle case with 2 anchor points separately, as otherwise minor adjustments cause path to constantly flip
+ if (NumAnchorPoints == 2) {
+ points[1] = points[0] + (points[3] - points[0]) * .25f;
+ points[2] = points[3] + (points[0] - points[3]) * .25f;
+ } else {
+ points[1] = (points[0] + points[2]) * .5f;
+ points[points.Count - 2] = (points[points.Count - 1] + points[points.Count - 3]) * .5f;
+ }
+ }
+ }
+
+ /// Update point positions for new path space
+ /// (for example, if changing from xy to xz path, y and z axes will be swapped so the path keeps its shape in the new space)
+ void UpdateToNewPathSpace (PathSpace previousSpace) {
+ // If changing from 3d to 2d space, first find the bounds of the 3d path.
+ // The axis with the smallest bounds will be discarded.
+ if (previousSpace == PathSpace.xyz) {
+ Vector3 boundsSize = PathBounds.size;
+ float minBoundsSize = Mathf.Min (boundsSize.x, boundsSize.y, boundsSize.z);
+
+ for (int i = 0; i < NumPoints; i++) {
+ if (space == PathSpace.xy) {
+ float x = (minBoundsSize == boundsSize.x) ? points[i].z : points[i].x;
+ float y = (minBoundsSize == boundsSize.y) ? points[i].z : points[i].y;
+ points[i] = new Vector3 (x, y, 0);
+ } else if (space == PathSpace.xz) {
+ float x = (minBoundsSize == boundsSize.x) ? points[i].y : points[i].x;
+ float z = (minBoundsSize == boundsSize.z) ? points[i].y : points[i].z;
+ points[i] = new Vector3 (x, 0, z);
+ }
+ }
+ } else {
+ // Nothing needs to change when going to 3d space
+ if (space != PathSpace.xyz) {
+ for (int i = 0; i < NumPoints; i++) {
+ // from xz to xy
+ if (space == PathSpace.xy) {
+ points[i] = new Vector3 (points[i].x, points[i].z, 0);
+ }
+ // from xy to xz
+ else if (space == PathSpace.xz) {
+ points[i] = new Vector3 (points[i].x, 0, points[i].y);
+ }
+ }
+ }
+ }
+
+ NotifyPathModified ();
+ }
+
+ /// Add/remove the extra 2 controls required for a closed path
+ void UpdateClosedState () {
+ if (isClosed) {
+ // Set positions for new controls to mirror their counterparts
+ Vector3 lastAnchorSecondControl = points[points.Count - 1] * 2 - points[points.Count - 2];
+ Vector3 firstAnchorSecondControl = points[0] * 2 - points[1];
+ if (controlMode != ControlMode.Mirrored && controlMode != ControlMode.Automatic) {
+ // Set positions for new controls to be aligned with their counterparts, but with a length of half the distance between start/end anchor
+ float dstBetweenStartAndEndAnchors = (points[points.Count - 1] - points[0]).magnitude;
+ lastAnchorSecondControl = points[points.Count - 1] + (points[points.Count - 1] - points[points.Count - 2]).normalized * dstBetweenStartAndEndAnchors * .5f;
+ firstAnchorSecondControl = points[0] + (points[0] - points[1]).normalized * dstBetweenStartAndEndAnchors * .5f;
+ }
+ points.Add (lastAnchorSecondControl);
+ points.Add (firstAnchorSecondControl);
+ } else {
+ points.RemoveRange (points.Count - 2, 2);
+
+ }
+
+ if (controlMode == ControlMode.Automatic) {
+ AutoSetStartAndEndControls ();
+ }
+
+ if (OnModified != null) {
+ OnModified ();
+ }
+ }
+
+ /// Loop index around to start/end of points array if out of bounds (useful when working with closed paths)
+ int LoopIndex (int i) {
+ return (i + points.Count) % points.Count;
+ }
+
+ // Called when the path is modified
+ public void NotifyPathModified () {
+ boundsUpToDate = false;
+ if (OnModified != null) {
+ OnModified ();
+ }
+ }
+
+ #endregion
+
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/BezierPath.cs.meta b/game/Assets/PathCreator/Core/Runtime/Objects/BezierPath.cs.meta
new file mode 100644
index 0000000..c1c193e
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/BezierPath.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 756209f371f304fb1920c53a8a25a5e2
+timeCreated: 1516786483
+licenseType: Store
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/EndOfPathInstruction.cs b/game/Assets/PathCreator/Core/Runtime/Objects/EndOfPathInstruction.cs
new file mode 100644
index 0000000..697e361
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/EndOfPathInstruction.cs
@@ -0,0 +1,3 @@
+namespace PathCreation {
+ public enum EndOfPathInstruction {Loop, Reverse, Stop};
+}
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/EndOfPathInstruction.cs.meta b/game/Assets/PathCreator/Core/Runtime/Objects/EndOfPathInstruction.cs.meta
new file mode 100644
index 0000000..6f25bdf
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/EndOfPathInstruction.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c0d7fa70c03166e4180909b6e5d546c7
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/GlobalDisplaySettings.cs b/game/Assets/PathCreator/Core/Runtime/Objects/GlobalDisplaySettings.cs
new file mode 100644
index 0000000..0d9254d
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/GlobalDisplaySettings.cs
@@ -0,0 +1,70 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace PathCreation
+{
+ //[CreateAssetMenu()]
+ public class GlobalDisplaySettings : ScriptableObject
+ {
+
+ public enum HandleType { Sphere, Circle, Square };
+
+ [Header("Appearance")]
+ public float anchorSize = 10;
+ public float controlSize = 7f;
+
+ [Tooltip("Should the path still be drawn when behind objects in the scene?")]
+ public bool visibleBehindObjects = true;
+ [Tooltip("Should the path be drawn even when the path object is not selected?")]
+ public bool visibleWhenNotSelected = true;
+ [Tooltip("If true, control points will be hidden when the control point mode is set to automatic. Otherwise they will inactive, but still visible.")]
+ public bool hideAutoControls = true;
+ public HandleType anchorShape;
+ public HandleType controlShape;
+
+
+ [Header("Anchor Colours")]
+ public Color anchor = new Color(0.95f, 0.25f, 0.25f, 0.85f);
+ public Color anchorHighlighted = new Color(1, 0.57f, 0.4f);
+ public Color anchorSelected = Color.white;
+
+ [Header("Control Colours")]
+ public Color control = new Color(0.35f, 0.6f, 1, 0.85f);
+ public Color controlHighlighted = new Color(0.8f, 0.67f, 0.97f);
+ public Color controlSelected = Color.white;
+ public Color handleDisabled = new Color(1, 1, 1, 0.2f);
+ public Color controlLine = new Color(0, 0, 0, 0.35f);
+
+ [Header("Bezier Path Colours")]
+ public Color bezierPath = Color.green;
+ public Color highlightedPath = new Color(1, 0.6f, 0);
+ public Color bounds = new Color(1, 1, 1, .4f);
+ public Color segmentBounds = new Color(1, 1, 1, .4f);
+
+ [Header("Vertex Path Colours")]
+ public Color vertexPath = Color.white;
+
+ [Header("Normals")]
+ public Color normals = Color.yellow;
+ [Range(0,1)]
+ public float normalsLength = .1f;
+
+#if UNITY_EDITOR
+ public static GlobalDisplaySettings Load() {
+ string[] guids = UnityEditor.AssetDatabase.FindAssets("t:GlobalDisplaySettings");
+ if (guids.Length == 0)
+ {
+ Debug.LogWarning("Could not find DisplaySettings asset. Will use default settings instead.");
+ return ScriptableObject.CreateInstance();
+ }
+ else
+ {
+ string path = UnityEditor.AssetDatabase.GUIDToAssetPath(guids[0]);
+ return UnityEditor.AssetDatabase.LoadAssetAtPath(path);
+ }
+ }
+#endif
+
+ }
+}
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/GlobalDisplaySettings.cs.meta b/game/Assets/PathCreator/Core/Runtime/Objects/GlobalDisplaySettings.cs.meta
new file mode 100644
index 0000000..cd66ac9
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/GlobalDisplaySettings.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 46d5e8d803e252f4499b52e657f8e1a2
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/MinMax3D.cs b/game/Assets/PathCreator/Core/Runtime/Objects/MinMax3D.cs
new file mode 100644
index 0000000..4229602
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/MinMax3D.cs
@@ -0,0 +1,21 @@
+using UnityEngine;
+
+namespace PathCreation {
+ public class MinMax3D {
+
+ public Vector3 Min { get; private set; }
+ public Vector3 Max { get; private set; }
+
+ public MinMax3D()
+ {
+ Min = Vector3.one * float.MaxValue;
+ Max = Vector3.one * float.MinValue;
+ }
+
+ public void AddValue(Vector3 v)
+ {
+ Min = new Vector3(Mathf.Min(Min.x, v.x), Mathf.Min(Min.y,v.y), Mathf.Min(Min.z,v.z));
+ Max = new Vector3(Mathf.Max(Max.x, v.x), Mathf.Max(Max.y,v.y), Mathf.Max(Max.z,v.z));
+ }
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/MinMax3D.cs.meta b/game/Assets/PathCreator/Core/Runtime/Objects/MinMax3D.cs.meta
new file mode 100644
index 0000000..f96e783
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/MinMax3D.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 194e1b7893dcbf940a71eb507d8b10f3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/PathCreator.cs b/game/Assets/PathCreator/Core/Runtime/Objects/PathCreator.cs
new file mode 100644
index 0000000..e8ecc19
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/PathCreator.cs
@@ -0,0 +1,112 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace PathCreation {
+ public class PathCreator : MonoBehaviour {
+
+ /// This class stores data for the path editor, and provides accessors to get the current vertex and bezier path.
+ /// Attach to a GameObject to create a new path editor.
+
+ public event System.Action pathUpdated;
+
+ [SerializeField, HideInInspector]
+ PathCreatorData editorData;
+ [SerializeField, HideInInspector]
+ bool initialized;
+
+ GlobalDisplaySettings globalEditorDisplaySettings;
+
+ // Vertex path created from the current bezier path
+ public VertexPath path {
+ get {
+ if (!initialized) {
+ InitializeEditorData (false);
+ }
+ return editorData.GetVertexPath(transform);
+ }
+ }
+
+ // The bezier path created in the editor
+ public BezierPath bezierPath {
+ get {
+ if (!initialized) {
+ InitializeEditorData (false);
+ }
+ return editorData.bezierPath;
+ }
+ set {
+ if (!initialized) {
+ InitializeEditorData (false);
+ }
+ editorData.bezierPath = value;
+ }
+ }
+
+ #region Internal methods
+
+ /// Used by the path editor to initialise some data
+ public void InitializeEditorData (bool in2DMode) {
+ if (editorData == null) {
+ editorData = new PathCreatorData ();
+ }
+ editorData.bezierOrVertexPathModified -= TriggerPathUpdate;
+ editorData.bezierOrVertexPathModified += TriggerPathUpdate;
+
+ editorData.Initialize (in2DMode);
+ initialized = true;
+ }
+
+ public PathCreatorData EditorData {
+ get {
+ return editorData;
+ }
+
+ }
+
+ public void TriggerPathUpdate () {
+ if (pathUpdated != null) {
+ pathUpdated ();
+ }
+ }
+
+#if UNITY_EDITOR
+
+ // Draw the path when path objected is not selected (if enabled in settings)
+ void OnDrawGizmos () {
+
+ // Only draw path gizmo if the path object is not selected
+ // (editor script is resposible for drawing when selected)
+ GameObject selectedObj = UnityEditor.Selection.activeGameObject;
+ if (selectedObj != gameObject) {
+
+ if (path != null) {
+ path.UpdateTransform (transform);
+
+ if (globalEditorDisplaySettings == null) {
+ globalEditorDisplaySettings = GlobalDisplaySettings.Load ();
+ }
+
+ if (globalEditorDisplaySettings.visibleWhenNotSelected) {
+
+ Gizmos.color = globalEditorDisplaySettings.bezierPath;
+
+ for (int i = 0; i < path.NumPoints; i++) {
+ int nextI = i + 1;
+ if (nextI >= path.NumPoints) {
+ if (path.isClosedLoop) {
+ nextI %= path.NumPoints;
+ } else {
+ break;
+ }
+ }
+ Gizmos.DrawLine (path.GetPoint (i), path.GetPoint (nextI));
+ }
+ }
+ }
+ }
+ }
+#endif
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/PathCreator.cs.meta b/game/Assets/PathCreator/Core/Runtime/Objects/PathCreator.cs.meta
new file mode 100644
index 0000000..242d3f5
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/PathCreator.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 8e5ac92bc18f545cc84cd886ece82b4d
+timeCreated: 1516864223
+licenseType: Store
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/PathCreatorData.cs b/game/Assets/PathCreator/Core/Runtime/Objects/PathCreatorData.cs
new file mode 100644
index 0000000..8002be6
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/PathCreatorData.cs
@@ -0,0 +1,136 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace PathCreation {
+ /// Stores state data for the path creator editor
+
+ [System.Serializable]
+ public class PathCreatorData {
+ public event System.Action bezierOrVertexPathModified;
+ public event System.Action bezierCreated;
+
+ [SerializeField]
+ BezierPath _bezierPath;
+ VertexPath _vertexPath;
+
+ [SerializeField]
+ bool vertexPathUpToDate;
+
+ // vertex path settings
+ public float vertexPathMaxAngleError = .3f;
+ public float vertexPathMinVertexSpacing = 0.01f;
+
+ // bezier display settings
+ public bool showTransformTool = true;
+ public bool showPathBounds;
+ public bool showPerSegmentBounds;
+ public bool displayAnchorPoints = true;
+ public bool displayControlPoints = true;
+ public float bezierHandleScale = 1;
+ public bool globalDisplaySettingsFoldout;
+ public bool keepConstantHandleSize;
+
+ // vertex display settings
+ public bool showNormalsInVertexMode;
+ public bool showBezierPathInVertexMode;
+
+ // Editor display states
+ public bool showDisplayOptions;
+ public bool showPathOptions = true;
+ public bool showVertexPathDisplayOptions;
+ public bool showVertexPathOptions = true;
+ public bool showNormals;
+ public bool showNormalsHelpInfo;
+ public int tabIndex;
+
+ public void Initialize (bool defaultIs2D) {
+ if (_bezierPath == null) {
+ CreateBezier (Vector3.zero, defaultIs2D);
+ }
+ vertexPathUpToDate = false;
+ _bezierPath.OnModified -= BezierPathEdited;
+ _bezierPath.OnModified += BezierPathEdited;
+ }
+
+ public void ResetBezierPath (Vector3 centre, bool defaultIs2D = false) {
+ CreateBezier (centre, defaultIs2D);
+ }
+
+ void CreateBezier (Vector3 centre, bool defaultIs2D = false) {
+ if (_bezierPath != null) {
+ _bezierPath.OnModified -= BezierPathEdited;
+ }
+
+ var space = (defaultIs2D) ? PathSpace.xy : PathSpace.xyz;
+ _bezierPath = new BezierPath (centre, false, space);
+
+ _bezierPath.OnModified += BezierPathEdited;
+ vertexPathUpToDate = false;
+
+ if (bezierOrVertexPathModified != null) {
+ bezierOrVertexPathModified ();
+ }
+ if (bezierCreated != null) {
+ bezierCreated ();
+ }
+ }
+
+ public BezierPath bezierPath {
+ get {
+ return _bezierPath;
+ }
+ set {
+ _bezierPath.OnModified -= BezierPathEdited;
+ vertexPathUpToDate = false;
+ _bezierPath = value;
+ _bezierPath.OnModified += BezierPathEdited;
+
+ if (bezierOrVertexPathModified != null) {
+ bezierOrVertexPathModified ();
+ }
+ if (bezierCreated != null) {
+ bezierCreated ();
+ }
+
+ }
+ }
+
+ // Get the current vertex path
+ public VertexPath GetVertexPath (Transform transform) {
+ // create new vertex path if path was modified since this vertex path was created
+ if (!vertexPathUpToDate || _vertexPath == null) {
+ vertexPathUpToDate = true;
+ _vertexPath = new VertexPath (bezierPath, transform, vertexPathMaxAngleError, vertexPathMinVertexSpacing);
+ }
+ return _vertexPath;
+ }
+
+ public void PathTransformed () {
+ if (bezierOrVertexPathModified != null) {
+ bezierOrVertexPathModified ();
+ }
+ }
+
+ public void VertexPathSettingsChanged () {
+ vertexPathUpToDate = false;
+ if (bezierOrVertexPathModified != null) {
+ bezierOrVertexPathModified ();
+ }
+ }
+
+ public void PathModifiedByUndo () {
+ vertexPathUpToDate = false;
+ if (bezierOrVertexPathModified != null) {
+ bezierOrVertexPathModified ();
+ }
+ }
+
+ void BezierPathEdited () {
+ vertexPathUpToDate = false;
+ if (bezierOrVertexPathModified != null) {
+ bezierOrVertexPathModified ();
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/PathCreatorData.cs.meta b/game/Assets/PathCreator/Core/Runtime/Objects/PathCreatorData.cs.meta
new file mode 100644
index 0000000..b626c46
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/PathCreatorData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 19547029ffb83484e90d00c182104817
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/PathSpace.cs b/game/Assets/PathCreator/Core/Runtime/Objects/PathSpace.cs
new file mode 100644
index 0000000..8bb0052
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/PathSpace.cs
@@ -0,0 +1,3 @@
+namespace PathCreation {
+ public enum PathSpace {xyz, xy, xz};
+}
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/PathSpace.cs.meta b/game/Assets/PathCreator/Core/Runtime/Objects/PathSpace.cs.meta
new file mode 100644
index 0000000..2c89861
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/PathSpace.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 407af8f85a5bae449bce4730c5d97d1a
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/VertexPath.cs b/game/Assets/PathCreator/Core/Runtime/Objects/VertexPath.cs
new file mode 100644
index 0000000..5fd6e6b
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/VertexPath.cs
@@ -0,0 +1,345 @@
+using System.Collections.Generic;
+using PathCreation.Utility;
+using UnityEngine;
+
+
+namespace PathCreation {
+ /// A vertex path is a collection of points (vertices) that lie along a bezier path.
+ /// This allows one to do things like move at a constant speed along the path,
+ /// which is not possible with a bezier path directly due to how they're constructed mathematically.
+
+ /// This class also provides methods for getting the position along the path at a certain distance or time
+ /// (where time = 0 is the start of the path, and time = 1 is the end of the path).
+ /// Other info about the path (tangents, normals, rotation) can also be retrieved in this manner.
+
+ public class VertexPath {
+ #region Fields
+
+ public readonly PathSpace space;
+ public readonly bool isClosedLoop;
+ public readonly Vector3[] localPoints;
+ public readonly Vector3[] localTangents;
+ public readonly Vector3[] localNormals;
+
+ /// Percentage along the path at each vertex (0 being start of path, and 1 being the end)
+ public readonly float[] times;
+ /// Total distance between the vertices of the polyline
+ public readonly float length;
+ /// Total distance from the first vertex up to each vertex in the polyline
+ public readonly float[] cumulativeLengthAtEachVertex;
+ /// Bounding box of the path
+ public readonly Bounds bounds;
+ /// Equal to (0,0,-1) for 2D paths, and (0,1,0) for XZ paths
+ public readonly Vector3 up;
+
+ // Default values and constants:
+ const int accuracy = 10; // A scalar for how many times bezier path is divided when determining vertex positions
+ const float minVertexSpacing = .01f;
+
+ Transform transform;
+
+ #endregion
+
+ #region Constructors
+
+ /// Splits bezier path into array of vertices along the path.
+ ///How much can the angle of the path change before a vertex is added. This allows fewer vertices to be generated in straighter sections.
+ ///Vertices won't be added closer together than this distance, regardless of angle error.
+ public VertexPath (BezierPath bezierPath, Transform transform, float maxAngleError = 0.3f, float minVertexDst = 0):
+ this (bezierPath, VertexPathUtility.SplitBezierPathByAngleError (bezierPath, maxAngleError, minVertexDst, VertexPath.accuracy), transform) { }
+
+ /// Splits bezier path into array of vertices along the path.
+ ///How much can the angle of the path change before a vertex is added. This allows fewer vertices to be generated in straighter sections.
+ ///Vertices won't be added closer together than this distance, regardless of angle error.
+ ///Higher value means the change in angle is checked more frequently.
+ public VertexPath (BezierPath bezierPath, Transform transform, float vertexSpacing):
+ this (bezierPath, VertexPathUtility.SplitBezierPathEvenly (bezierPath, Mathf.Max (vertexSpacing, minVertexSpacing), VertexPath.accuracy), transform) { }
+
+ /// Internal contructor
+ VertexPath (BezierPath bezierPath, VertexPathUtility.PathSplitData pathSplitData, Transform transform) {
+ this.transform = transform;
+ space = bezierPath.Space;
+ isClosedLoop = bezierPath.IsClosed;
+ int numVerts = pathSplitData.vertices.Count;
+ length = pathSplitData.cumulativeLength[numVerts - 1];
+
+ localPoints = new Vector3[numVerts];
+ localNormals = new Vector3[numVerts];
+ localTangents = new Vector3[numVerts];
+ cumulativeLengthAtEachVertex = new float[numVerts];
+ times = new float[numVerts];
+ bounds = new Bounds ((pathSplitData.minMax.Min + pathSplitData.minMax.Max) / 2, pathSplitData.minMax.Max - pathSplitData.minMax.Min);
+
+ // Figure out up direction for path
+ up = (bounds.size.z > bounds.size.y) ? Vector3.up : -Vector3.forward;
+ Vector3 lastRotationAxis = up;
+
+ // Loop through the data and assign to arrays.
+ for (int i = 0; i < localPoints.Length; i++) {
+ localPoints[i] = pathSplitData.vertices[i];
+ localTangents[i] = pathSplitData.tangents[i];
+ cumulativeLengthAtEachVertex[i] = pathSplitData.cumulativeLength[i];
+ times[i] = cumulativeLengthAtEachVertex[i] / length;
+
+ // Calculate normals
+ if (space == PathSpace.xyz) {
+ if (i == 0) {
+ localNormals[0] = Vector3.Cross (lastRotationAxis, pathSplitData.tangents[0]).normalized;
+ } else {
+ // First reflection
+ Vector3 offset = (localPoints[i] - localPoints[i - 1]);
+ float sqrDst = offset.sqrMagnitude;
+ Vector3 r = lastRotationAxis - offset * 2 / sqrDst * Vector3.Dot (offset, lastRotationAxis);
+ Vector3 t = localTangents[i - 1] - offset * 2 / sqrDst * Vector3.Dot (offset, localTangents[i - 1]);
+
+ // Second reflection
+ Vector3 v2 = localTangents[i] - t;
+ float c2 = Vector3.Dot (v2, v2);
+
+ Vector3 finalRot = r - v2 * 2 / c2 * Vector3.Dot (v2, r);
+ Vector3 n = Vector3.Cross (finalRot, localTangents[i]).normalized;
+ localNormals[i] = n;
+ lastRotationAxis = finalRot;
+ }
+ } else {
+ localNormals[i] = Vector3.Cross (localTangents[i], up) * ((bezierPath.FlipNormals) ? 1 : -1);
+ }
+ }
+
+ // Apply correction for 3d normals along a closed path
+ if (space == PathSpace.xyz && isClosedLoop) {
+ // Get angle between first and last normal (if zero, they're already lined up, otherwise we need to correct)
+ float normalsAngleErrorAcrossJoin = Vector3.SignedAngle (localNormals[localNormals.Length - 1], localNormals[0], localTangents[0]);
+ // Gradually rotate the normals along the path to ensure start and end normals line up correctly
+ if (Mathf.Abs (normalsAngleErrorAcrossJoin) > 0.1f) // don't bother correcting if very nearly correct
+ {
+ for (int i = 1; i < localNormals.Length; i++) {
+ float t = (i / (localNormals.Length - 1f));
+ float angle = normalsAngleErrorAcrossJoin * t;
+ Quaternion rot = Quaternion.AngleAxis (angle, localTangents[i]);
+ localNormals[i] = rot * localNormals[i] * ((bezierPath.FlipNormals) ? -1 : 1);
+ }
+ }
+ }
+
+ // Rotate normals to match up with user-defined anchor angles
+ if (space == PathSpace.xyz) {
+ for (int anchorIndex = 0; anchorIndex < pathSplitData.anchorVertexMap.Count - 1; anchorIndex++) {
+ int nextAnchorIndex = (isClosedLoop) ? (anchorIndex + 1) % bezierPath.NumSegments : anchorIndex + 1;
+
+ float startAngle = bezierPath.GetAnchorNormalAngle (anchorIndex) + bezierPath.GlobalNormalsAngle;
+ float endAngle = bezierPath.GetAnchorNormalAngle (nextAnchorIndex) + bezierPath.GlobalNormalsAngle;
+ float deltaAngle = Mathf.DeltaAngle (startAngle, endAngle);
+
+ int startVertIndex = pathSplitData.anchorVertexMap[anchorIndex];
+ int endVertIndex = pathSplitData.anchorVertexMap[anchorIndex + 1];
+
+ int num = endVertIndex - startVertIndex;
+ if (anchorIndex == pathSplitData.anchorVertexMap.Count - 2) {
+ num += 1;
+ }
+ for (int i = 0; i < num; i++) {
+ int vertIndex = startVertIndex + i;
+ float t = i / (num - 1f);
+ float angle = startAngle + deltaAngle * t;
+ Quaternion rot = Quaternion.AngleAxis (angle, localTangents[vertIndex]);
+ localNormals[vertIndex] = (rot * localNormals[vertIndex]) * ((bezierPath.FlipNormals) ? -1 : 1);
+ }
+ }
+ }
+ }
+
+ #endregion
+
+ #region Public methods and accessors
+
+ public void UpdateTransform (Transform transform) {
+ this.transform = transform;
+ }
+ public int NumPoints {
+ get {
+ return localPoints.Length;
+ }
+ }
+
+ public Vector3 GetTangent (int index) {
+ return MathUtility.TransformDirection (localTangents[index], transform, space);
+ }
+
+ public Vector3 GetNormal (int index) {
+ return MathUtility.TransformDirection (localNormals[index], transform, space);
+ }
+
+ public Vector3 GetPoint (int index) {
+ return MathUtility.TransformPoint (localPoints[index], transform, space);
+ }
+
+ /// Gets point on path based on distance travelled.
+ public Vector3 GetPointAtDistance (float dst, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop) {
+ float t = dst / length;
+ return GetPointAtTime (t, endOfPathInstruction);
+ }
+
+ /// Gets forward direction on path based on distance travelled.
+ public Vector3 GetDirectionAtDistance (float dst, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop) {
+ float t = dst / length;
+ return GetDirection (t, endOfPathInstruction);
+ }
+
+ /// Gets normal vector on path based on distance travelled.
+ public Vector3 GetNormalAtDistance (float dst, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop) {
+ float t = dst / length;
+ return GetNormal (t, endOfPathInstruction);
+ }
+
+ /// Gets a rotation that will orient an object in the direction of the path at this point, with local up point along the path's normal
+ public Quaternion GetRotationAtDistance (float dst, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop) {
+ float t = dst / length;
+ return GetRotation (t, endOfPathInstruction);
+ }
+
+ /// Gets point on path based on 'time' (where 0 is start, and 1 is end of path).
+ public Vector3 GetPointAtTime (float t, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop) {
+ var data = CalculatePercentOnPathData (t, endOfPathInstruction);
+ return Vector3.Lerp (GetPoint (data.previousIndex), GetPoint (data.nextIndex), data.percentBetweenIndices);
+ }
+
+ /// Gets forward direction on path based on 'time' (where 0 is start, and 1 is end of path).
+ public Vector3 GetDirection (float t, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop) {
+ var data = CalculatePercentOnPathData (t, endOfPathInstruction);
+ Vector3 dir = Vector3.Lerp (localTangents[data.previousIndex], localTangents[data.nextIndex], data.percentBetweenIndices);
+ return MathUtility.TransformDirection (dir, transform, space);
+ }
+
+ /// Gets normal vector on path based on 'time' (where 0 is start, and 1 is end of path).
+ public Vector3 GetNormal (float t, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop) {
+ var data = CalculatePercentOnPathData (t, endOfPathInstruction);
+ Vector3 normal = Vector3.Lerp (localNormals[data.previousIndex], localNormals[data.nextIndex], data.percentBetweenIndices);
+ return MathUtility.TransformDirection (normal, transform, space);
+ }
+
+ /// Gets a rotation that will orient an object in the direction of the path at this point, with local up point along the path's normal
+ public Quaternion GetRotation (float t, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop) {
+ var data = CalculatePercentOnPathData (t, endOfPathInstruction);
+ Vector3 direction = Vector3.Lerp (localTangents[data.previousIndex], localTangents[data.nextIndex], data.percentBetweenIndices);
+ Vector3 normal = Vector3.Lerp (localNormals[data.previousIndex], localNormals[data.nextIndex], data.percentBetweenIndices);
+ return Quaternion.LookRotation (MathUtility.TransformDirection (direction, transform, space), MathUtility.TransformDirection (normal, transform, space));
+ }
+
+ /// Finds the closest point on the path from any point in the world
+ public Vector3 GetClosestPointOnPath (Vector3 worldPoint) {
+ TimeOnPathData data = CalculateClosestPointOnPathData (worldPoint);
+ return Vector3.Lerp (GetPoint (data.previousIndex), GetPoint (data.nextIndex), data.percentBetweenIndices);
+ }
+
+ /// Finds the 'time' (0=start of path, 1=end of path) along the path that is closest to the given point
+ public float GetClosestTimeOnPath (Vector3 worldPoint) {
+ TimeOnPathData data = CalculateClosestPointOnPathData (worldPoint);
+ return Mathf.Lerp (times[data.previousIndex], times[data.nextIndex], data.percentBetweenIndices);
+ }
+
+ /// Finds the distance along the path that is closest to the given point
+ public float GetClosestDistanceAlongPath (Vector3 worldPoint) {
+ TimeOnPathData data = CalculateClosestPointOnPathData (worldPoint);
+ return Mathf.Lerp (cumulativeLengthAtEachVertex[data.previousIndex], cumulativeLengthAtEachVertex[data.nextIndex], data.percentBetweenIndices);
+ }
+
+ #endregion
+
+ #region Internal methods
+
+ /// For a given value 't' between 0 and 1, calculate the indices of the two vertices before and after t.
+ /// Also calculate how far t is between those two vertices as a percentage between 0 and 1.
+ TimeOnPathData CalculatePercentOnPathData (float t, EndOfPathInstruction endOfPathInstruction) {
+ // Constrain t based on the end of path instruction
+ switch (endOfPathInstruction) {
+ case EndOfPathInstruction.Loop:
+ // If t is negative, make it the equivalent value between 0 and 1
+ if (t < 0) {
+ t += Mathf.CeilToInt (Mathf.Abs (t));
+ }
+ t %= 1;
+ break;
+ case EndOfPathInstruction.Reverse:
+ t = Mathf.PingPong (t, 1);
+ break;
+ case EndOfPathInstruction.Stop:
+ t = Mathf.Clamp01 (t);
+ break;
+ }
+
+ int prevIndex = 0;
+ int nextIndex = NumPoints - 1;
+ int i = Mathf.RoundToInt (t * (NumPoints - 1)); // starting guess
+
+ // Starts by looking at middle vertex and determines if t lies to the left or to the right of that vertex.
+ // Continues dividing in half until closest surrounding vertices have been found.
+ while (true) {
+ // t lies to left
+ if (t <= times[i]) {
+ nextIndex = i;
+ }
+ // t lies to right
+ else {
+ prevIndex = i;
+ }
+ i = (nextIndex + prevIndex) / 2;
+
+ if (nextIndex - prevIndex <= 1) {
+ break;
+ }
+ }
+
+ float abPercent = Mathf.InverseLerp (times[prevIndex], times[nextIndex], t);
+ return new TimeOnPathData (prevIndex, nextIndex, abPercent);
+ }
+
+ /// Calculate time data for closest point on the path from given world point
+ TimeOnPathData CalculateClosestPointOnPathData (Vector3 worldPoint) {
+ float minSqrDst = float.MaxValue;
+ Vector3 closestPoint = Vector3.zero;
+ int closestSegmentIndexA = 0;
+ int closestSegmentIndexB = 0;
+
+ for (int i = 0; i < localPoints.Length; i++) {
+ int nextI = i + 1;
+ if (nextI >= localPoints.Length) {
+ if (isClosedLoop) {
+ nextI %= localPoints.Length;
+ } else {
+ break;
+ }
+ }
+
+ Vector3 closestPointOnSegment = MathUtility.ClosestPointOnLineSegment (worldPoint, GetPoint (i), GetPoint (nextI));
+ float sqrDst = (worldPoint - closestPointOnSegment).sqrMagnitude;
+ if (sqrDst < minSqrDst) {
+ minSqrDst = sqrDst;
+ closestPoint = closestPointOnSegment;
+ closestSegmentIndexA = i;
+ closestSegmentIndexB = nextI;
+ }
+
+ }
+ float closestSegmentLength = (GetPoint (closestSegmentIndexA) - GetPoint (closestSegmentIndexB)).magnitude;
+ float t = (closestPoint - GetPoint (closestSegmentIndexA)).magnitude / closestSegmentLength;
+ return new TimeOnPathData (closestSegmentIndexA, closestSegmentIndexB, t);
+ }
+
+ public struct TimeOnPathData {
+ public readonly int previousIndex;
+ public readonly int nextIndex;
+ public readonly float percentBetweenIndices;
+
+ public TimeOnPathData (int prev, int next, float percentBetweenIndices) {
+ this.previousIndex = prev;
+ this.nextIndex = next;
+ this.percentBetweenIndices = percentBetweenIndices;
+ }
+ }
+
+ #endregion
+
+ }
+
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Runtime/Objects/VertexPath.cs.meta b/game/Assets/PathCreator/Core/Runtime/Objects/VertexPath.cs.meta
new file mode 100644
index 0000000..b8cf388
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Objects/VertexPath.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 223183313f20d4049a397d83fab3151e
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/PathCreator.asmdef b/game/Assets/PathCreator/Core/Runtime/PathCreator.asmdef
new file mode 100644
index 0000000..26c0dac
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/PathCreator.asmdef
@@ -0,0 +1,3 @@
+{
+ "name": "PathCreator"
+}
diff --git a/game/Assets/PathCreator/Core/Runtime/PathCreator.asmdef.meta b/game/Assets/PathCreator/Core/Runtime/PathCreator.asmdef.meta
new file mode 100644
index 0000000..4b98d32
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/PathCreator.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 626070ea3273cb844a310aa4f53b31fa
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Utility.meta b/game/Assets/PathCreator/Core/Runtime/Utility.meta
new file mode 100644
index 0000000..14dfdff
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Utility.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4c55bdfe2cdafc04ba5f909d4f1f192b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Utility/CubicBezierUtility.cs b/game/Assets/PathCreator/Core/Runtime/Utility/CubicBezierUtility.cs
new file mode 100644
index 0000000..ceded9f
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Utility/CubicBezierUtility.cs
@@ -0,0 +1,136 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace PathCreation.Utility {
+
+ /// Collection of functions related to cubic bezier curves
+ /// (a curve with a start and end 'anchor' point, and two 'control' points to define the shape of the curve between the anchors)
+ public static class CubicBezierUtility {
+
+ /// Returns point at time 't' (between 0 and 1) along bezier curve defined by 4 points (anchor_1, control_1, control_2, anchor_2)
+ public static Vector3 EvaluateCurve (Vector3[] points, float t) {
+ return EvaluateCurve (points[0], points[1], points[2], points[3], t);
+ }
+
+ /// Returns point at time 't' (between 0 and 1) along bezier curve defined by 4 points (anchor_1, control_1, control_2, anchor_2)
+ public static Vector3 EvaluateCurve (Vector3 a1, Vector3 c1, Vector3 c2, Vector3 a2, float t) {
+ t = Mathf.Clamp01 (t);
+ return (1 - t) * (1 - t) * (1 - t) * a1 + 3 * (1 - t) * (1 - t) * t * c1 + 3 * (1 - t) * t * t * c2 + t * t * t * a2;
+ }
+
+ /// Returns a vector tangent to the point at time 't'
+ /// This is the vector tangent to the curve at that point
+ public static Vector3 EvaluateCurveDerivative (Vector3[] points, float t) {
+ return EvaluateCurveDerivative (points[0], points[1], points[2], points[3], t);
+ }
+
+ /// Calculates the derivative of the curve at time 't'
+ /// This is the vector tangent to the curve at that point
+ public static Vector3 EvaluateCurveDerivative (Vector3 a1, Vector3 c1, Vector3 c2, Vector3 a2, float t) {
+ t = Mathf.Clamp01 (t);
+ return 3 * (1 - t) * (1 - t) * (c1 - a1) + 6 * (1 - t) * t * (c2 - c1) + 3 * t * t * (a2 - c2);
+ }
+
+ /// Returns the second derivative of the curve at time 't'
+ public static Vector3 EvaluateCurveSecondDerivative (Vector3[] points, float t) {
+ return EvaluateCurveSecondDerivative (points[0], points[1], points[2], points[3], t);
+ }
+
+ ///Returns the second derivative of the curve at time 't'
+ public static Vector3 EvaluateCurveSecondDerivative (Vector3 a1, Vector3 c1, Vector3 c2, Vector3 a2, float t) {
+ t = Mathf.Clamp01 (t);
+ return 6 * (1 - t) * (c2 - 2 * c1 + a1) + 6 * t * (a2 - 2 * c2 + c1);
+ }
+
+ /// Calculates the normal vector (vector perpendicular to the curve) at specified time
+ public static Vector3 Normal (Vector3[] points, float t) {
+ return Normal (points[0], points[1], points[2], points[3], t);
+ }
+
+ /// Calculates the normal vector (vector perpendicular to the curve) at specified time
+ public static Vector3 Normal (Vector3 a1, Vector3 c1, Vector3 c2, Vector3 a2, float t) {
+ Vector3 tangent = EvaluateCurveDerivative (a1, c1, c2, a2, t);
+ Vector3 nextTangent = EvaluateCurveSecondDerivative (a1, c1, c2, a2, t);
+ Vector3 c = Vector3.Cross (nextTangent, tangent);
+ return Vector3.Cross (c, tangent).normalized;
+ }
+
+ public static Bounds CalculateSegmentBounds (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3) {
+ MinMax3D minMax = new MinMax3D ();
+ minMax.AddValue (p0);
+ minMax.AddValue (p3);
+
+ List extremePointTimes = ExtremePointTimes (p0,p1,p2,p3);
+ foreach (float t in extremePointTimes) {
+ minMax.AddValue (CubicBezierUtility.EvaluateCurve (p0, p1, p2, p3, t));
+ }
+
+ return new Bounds ((minMax.Min + minMax.Max) / 2, minMax.Max - minMax.Min);
+ }
+
+ /// Splits curve into two curves at time t. Returns 2 arrays of 4 points.
+ public static Vector3[][] SplitCurve (Vector3[] points, float t) {
+ Vector3 a1 = Vector3.Lerp (points[0], points[1], t);
+ Vector3 a2 = Vector3.Lerp (points[1], points[2], t);
+ Vector3 a3 = Vector3.Lerp (points[2], points[3], t);
+ Vector3 b1 = Vector3.Lerp (a1, a2, t);
+ Vector3 b2 = Vector3.Lerp (a2, a3, t);
+ Vector3 pointOnCurve = Vector3.Lerp (b1, b2, t);
+
+ return new Vector3[][] {
+ new Vector3[] { points[0], a1, b1, pointOnCurve },
+ new Vector3[] { pointOnCurve, b2, a3, points[3] }
+ };
+ }
+
+ // Crude, but fast estimation of curve length.
+ public static float EstimateCurveLength (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3) {
+ float controlNetLength = (p0 - p1).magnitude + (p1 - p2).magnitude + (p2 - p3).magnitude;
+ float estimatedCurveLength = (p0 - p3).magnitude + controlNetLength / 2f;
+ return estimatedCurveLength;
+ }
+
+ /// Times of stationary points on curve (points where derivative is zero on any axis)
+ public static List ExtremePointTimes (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3) {
+ // coefficients of derivative function
+ Vector3 a = 3 * (-p0 + 3 * p1 - 3 * p2 + p3);
+ Vector3 b = 6 * (p0 - 2 * p1 + p2);
+ Vector3 c = 3 * (p1 - p0);
+
+ List times = new List ();
+ times.AddRange (StationaryPointTimes (a.x, b.x, c.x));
+ times.AddRange (StationaryPointTimes (a.y, b.y, c.y));
+ times.AddRange (StationaryPointTimes (a.z, b.z, c.z));
+ return times;
+ }
+
+ // Finds times of stationary points on curve defined by ax^2 + bx + c.
+ // Only times between 0 and 1 are considered as Bezier only uses values in that range
+ static IEnumerable StationaryPointTimes (float a, float b, float c) {
+ List times = new List ();
+
+ // from quadratic equation: y = [-b +- sqrt(b^2 - 4ac)]/2a
+ if (a != 0) {
+ float discriminant = b * b - 4 * a * c;
+ if (discriminant >= 0) {
+ float s = Mathf.Sqrt (discriminant);
+ float t1 = (-b + s) / (2 * a);
+ if (t1 >= 0 && t1 <= 1) {
+ times.Add (t1);
+ }
+
+ if (discriminant != 0) {
+ float t2 = (-b - s) / (2 * a);
+
+ if (t2 >= 0 && t2 <= 1) {
+ times.Add (t2);
+ }
+ }
+ }
+ }
+ return times;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Runtime/Utility/CubicBezierUtility.cs.meta b/game/Assets/PathCreator/Core/Runtime/Utility/CubicBezierUtility.cs.meta
new file mode 100644
index 0000000..ebf6cae
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Utility/CubicBezierUtility.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: c66a6536bb2d641558729d6da1ec7594
+timeCreated: 1519565538
+licenseType: Store
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Utility/MathUtility.cs b/game/Assets/PathCreator/Core/Runtime/Utility/MathUtility.cs
new file mode 100644
index 0000000..af862ba
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Utility/MathUtility.cs
@@ -0,0 +1,162 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace PathCreation.Utility {
+ public static class MathUtility {
+
+ static PosRotScale LockTransformToSpace (Transform t, PathSpace space) {
+ var original = new PosRotScale (t);
+ if (space == PathSpace.xy) {
+ t.eulerAngles = new Vector3 (0, 0, t.eulerAngles.z);
+ t.position = new Vector3 (t.position.x, t.position.y, 0);
+ } else if (space == PathSpace.xz) {
+ t.eulerAngles = new Vector3 (0, t.eulerAngles.y, 0);
+ t.position = new Vector3 (t.position.x, 0, t.position.z);
+ }
+
+ //float maxScale = Mathf.Max (t.localScale.x * t.parent.localScale.x, t.localScale.y * t.parent.localScale.y, t.localScale.z * t.parent.localScale.z);
+ float maxScale = Mathf.Max (t.lossyScale.x, t.lossyScale.y, t.lossyScale.z);
+
+ t.localScale = Vector3.one * maxScale;
+
+ return original;
+ }
+
+ public static Vector3 TransformPoint (Vector3 p, Transform t, PathSpace space) {
+ var original = LockTransformToSpace (t, space);
+ Vector3 transformedPoint = t.TransformPoint (p);
+ original.SetTransform (t);
+ return transformedPoint;
+ }
+
+ public static Vector3 InverseTransformPoint (Vector3 p, Transform t, PathSpace space) {
+ var original = LockTransformToSpace (t, space);
+ Vector3 transformedPoint = t.InverseTransformPoint (p);
+ original.SetTransform (t);
+ return transformedPoint;
+ }
+
+ public static Vector3 TransformVector (Vector3 p, Transform t, PathSpace space) {
+ var original = LockTransformToSpace (t, space);
+ Vector3 transformedPoint = t.TransformVector (p);
+ original.SetTransform (t);
+ return transformedPoint;
+ }
+
+ public static Vector3 InverseTransformVector (Vector3 p, Transform t, PathSpace space) {
+ var original = LockTransformToSpace (t, space);
+ Vector3 transformedPoint = t.InverseTransformVector (p);
+ original.SetTransform (t);
+ return transformedPoint;
+ }
+
+ public static Vector3 TransformDirection (Vector3 p, Transform t, PathSpace space) {
+ var original = LockTransformToSpace (t, space);
+ Vector3 transformedPoint = t.TransformDirection (p);
+ original.SetTransform (t);
+ return transformedPoint;
+ }
+
+ public static Vector3 InverseTransformDirection (Vector3 p, Transform t, PathSpace space) {
+ var original = LockTransformToSpace (t, space);
+ Vector3 transformedPoint = t.InverseTransformDirection (p);
+ original.SetTransform (t);
+ return transformedPoint;
+ }
+
+ public static bool LineSegmentsIntersect (Vector2 a1, Vector2 a2, Vector2 b1, Vector2 b2) {
+ float d = (b2.x - b1.x) * (a1.y - a2.y) - (a1.x - a2.x) * (b2.y - b1.y);
+ if (d == 0)
+ return false;
+ float t = ((b1.y - b2.y) * (a1.x - b1.x) + (b2.x - b1.x) * (a1.y - b1.y)) / d;
+ float u = ((a1.y - a2.y) * (a1.x - b1.x) + (a2.x - a1.x) * (a1.y - b1.y)) / d;
+
+ return t >= 0 && t <= 1 && u >= 0 && u <= 1;
+ }
+
+ public static bool LinesIntersect (Vector2 a1, Vector2 a2, Vector2 a3, Vector2 a4) {
+ return (a1.x - a2.x) * (a3.y - a4.y) - (a1.y - a2.y) * (a3.x - a4.x) != 0;
+ }
+
+ public static Vector2 PointOfLineLineIntersection (Vector2 a1, Vector2 a2, Vector2 a3, Vector2 a4) {
+ float d = (a1.x - a2.x) * (a3.y - a4.y) - (a1.y - a2.y) * (a3.x - a4.x);
+ if (d == 0) {
+ Debug.LogError ("Lines are parallel, please check that this is not the case before calling line intersection method");
+ return Vector2.zero;
+ } else {
+ float n = (a1.x - a3.x) * (a3.y - a4.y) - (a1.y - a3.y) * (a3.x - a4.x);
+ float t = n / d;
+ return a1 + (a2 - a1) * t;
+ }
+ }
+
+ public static Vector2 ClosestPointOnLineSegment (Vector2 p, Vector2 a, Vector2 b) {
+ Vector2 aB = b - a;
+ Vector2 aP = p - a;
+ float sqrLenAB = aB.sqrMagnitude;
+
+ if (sqrLenAB == 0)
+ return a;
+
+ float t = Mathf.Clamp01 (Vector2.Dot (aP, aB) / sqrLenAB);
+ return a + aB * t;
+ }
+
+ public static Vector3 ClosestPointOnLineSegment (Vector3 p, Vector3 a, Vector3 b) {
+ Vector3 aB = b - a;
+ Vector3 aP = p - a;
+ float sqrLenAB = aB.sqrMagnitude;
+
+ if (sqrLenAB == 0)
+ return a;
+
+ float t = Mathf.Clamp01 (Vector3.Dot (aP, aB) / sqrLenAB);
+ return a + aB * t;
+ }
+
+ public static int SideOfLine (Vector2 a, Vector2 b, Vector2 c) {
+ return (int) Mathf.Sign ((c.x - a.x) * (-b.y + a.y) + (c.y - a.y) * (b.x - a.x));
+ }
+
+ /// returns the smallest angle between ABC. Never greater than 180
+ public static float MinAngle (Vector3 a, Vector3 b, Vector3 c) {
+ return Vector3.Angle ((a - b), (c - b));
+ }
+
+ public static bool PointInTriangle (Vector2 a, Vector2 b, Vector2 c, Vector2 p) {
+ float area = 0.5f * (-b.y * c.x + a.y * (-b.x + c.x) + a.x * (b.y - c.y) + b.x * c.y);
+ float s = 1 / (2 * area) * (a.y * c.x - a.x * c.y + (c.y - a.y) * p.x + (a.x - c.x) * p.y);
+ float t = 1 / (2 * area) * (a.x * b.y - a.y * b.x + (a.y - b.y) * p.x + (b.x - a.x) * p.y);
+ return s >= 0 && t >= 0 && (s + t) <= 1;
+ }
+
+ public static bool PointsAreClockwise (Vector2[] points) {
+ float signedArea = 0;
+ for (int i = 0; i < points.Length; i++) {
+ int nextIndex = (i + 1) % points.Length;
+ signedArea += (points[nextIndex].x - points[i].x) * (points[nextIndex].y + points[i].y);
+ }
+
+ return signedArea >= 0;
+ }
+
+ class PosRotScale {
+ public readonly Vector3 position;
+ public readonly Quaternion rotation;
+ public readonly Vector3 scale;
+
+ public PosRotScale (Transform t) {
+ this.position = t.position;
+ this.rotation = t.rotation;
+ this.scale = t.localScale;
+ }
+
+ public void SetTransform (Transform t) {
+ t.position = position;
+ t.rotation = rotation;
+ t.localScale = scale;
+
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Runtime/Utility/MathUtility.cs.meta b/game/Assets/PathCreator/Core/Runtime/Utility/MathUtility.cs.meta
new file mode 100644
index 0000000..277ff19
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Utility/MathUtility.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 096bae1d1ed960d4bb7605dce06767c1
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Runtime/Utility/VertexPathUtility.cs b/game/Assets/PathCreator/Core/Runtime/Utility/VertexPathUtility.cs
new file mode 100644
index 0000000..69ab950
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Utility/VertexPathUtility.cs
@@ -0,0 +1,139 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace PathCreation.Utility
+{
+ public static class VertexPathUtility
+ {
+
+ public static PathSplitData SplitBezierPathByAngleError(BezierPath bezierPath, float maxAngleError, float minVertexDst, float accuracy)
+ {
+ PathSplitData splitData = new PathSplitData();
+
+ splitData.vertices.Add(bezierPath[0]);
+ splitData.tangents.Add(CubicBezierUtility.EvaluateCurveDerivative(bezierPath.GetPointsInSegment(0), 0).normalized);
+ splitData.cumulativeLength.Add(0);
+ splitData.anchorVertexMap.Add(0);
+ splitData.minMax.AddValue(bezierPath[0]);
+
+ Vector3 prevPointOnPath = bezierPath[0];
+ Vector3 lastAddedPoint = bezierPath[0];
+
+ float currentPathLength = 0;
+ float dstSinceLastVertex = 0;
+
+ // Go through all segments and split up into vertices
+ for (int segmentIndex = 0; segmentIndex < bezierPath.NumSegments; segmentIndex++)
+ {
+ Vector3[] segmentPoints = bezierPath.GetPointsInSegment(segmentIndex);
+ float estimatedSegmentLength = CubicBezierUtility.EstimateCurveLength(segmentPoints[0], segmentPoints[1], segmentPoints[2], segmentPoints[3]);
+ int divisions = Mathf.CeilToInt(estimatedSegmentLength * accuracy);
+ float increment = 1f / divisions;
+
+ for (float t = increment; t <= 1; t += increment)
+ {
+ bool isLastPointOnPath = (t + increment > 1 && segmentIndex == bezierPath.NumSegments - 1);
+ if (isLastPointOnPath)
+ {
+ t = 1;
+ }
+ Vector3 pointOnPath = CubicBezierUtility.EvaluateCurve(segmentPoints, t);
+ Vector3 nextPointOnPath = CubicBezierUtility.EvaluateCurve(segmentPoints, t + increment);
+
+ // angle at current point on path
+ float localAngle = 180 - MathUtility.MinAngle(prevPointOnPath, pointOnPath, nextPointOnPath);
+ // angle between the last added vertex, the current point on the path, and the next point on the path
+ float angleFromPrevVertex = 180 - MathUtility.MinAngle(lastAddedPoint, pointOnPath, nextPointOnPath);
+ float angleError = Mathf.Max(localAngle, angleFromPrevVertex);
+
+
+ if ((angleError > maxAngleError && dstSinceLastVertex >= minVertexDst) || isLastPointOnPath)
+ {
+
+ currentPathLength += (lastAddedPoint - pointOnPath).magnitude;
+ splitData.cumulativeLength.Add(currentPathLength);
+ splitData.vertices.Add(pointOnPath);
+ splitData.tangents.Add(CubicBezierUtility.EvaluateCurveDerivative(segmentPoints, t).normalized);
+ splitData.minMax.AddValue(pointOnPath);
+ dstSinceLastVertex = 0;
+ lastAddedPoint = pointOnPath;
+ }
+ else
+ {
+ dstSinceLastVertex += (pointOnPath - prevPointOnPath).magnitude;
+ }
+ prevPointOnPath = pointOnPath;
+ }
+ splitData.anchorVertexMap.Add(splitData.vertices.Count - 1);
+ }
+ return splitData;
+ }
+
+ public static PathSplitData SplitBezierPathEvenly(BezierPath bezierPath, float spacing, float accuracy)
+ {
+ PathSplitData splitData = new PathSplitData();
+
+ splitData.vertices.Add(bezierPath[0]);
+ splitData.tangents.Add(CubicBezierUtility.EvaluateCurveDerivative(bezierPath.GetPointsInSegment(0), 0).normalized);
+ splitData.cumulativeLength.Add(0);
+ splitData.anchorVertexMap.Add(0);
+ splitData.minMax.AddValue(bezierPath[0]);
+
+ Vector3 prevPointOnPath = bezierPath[0];
+ Vector3 lastAddedPoint = bezierPath[0];
+
+ float currentPathLength = 0;
+ float dstSinceLastVertex = 0;
+
+ // Go through all segments and split up into vertices
+ for (int segmentIndex = 0; segmentIndex < bezierPath.NumSegments; segmentIndex++)
+ {
+ Vector3[] segmentPoints = bezierPath.GetPointsInSegment(segmentIndex);
+ float estimatedSegmentLength = CubicBezierUtility.EstimateCurveLength(segmentPoints[0], segmentPoints[1], segmentPoints[2], segmentPoints[3]);
+ int divisions = Mathf.CeilToInt(estimatedSegmentLength * accuracy);
+ float increment = 1f / divisions;
+
+ for (float t = increment; t <= 1; t += increment)
+ {
+ bool isLastPointOnPath = (t + increment > 1 && segmentIndex == bezierPath.NumSegments - 1);
+ if (isLastPointOnPath)
+ {
+ t = 1;
+ }
+ Vector3 pointOnPath = CubicBezierUtility.EvaluateCurve(segmentPoints, t);
+ dstSinceLastVertex += (pointOnPath - prevPointOnPath).magnitude;
+
+ // If vertices are now too far apart, go back by amount we overshot by
+ if (dstSinceLastVertex > spacing) {
+ float overshootDst = dstSinceLastVertex - spacing;
+ pointOnPath += (prevPointOnPath-pointOnPath).normalized * overshootDst;
+ t-=increment;
+ }
+
+ if (dstSinceLastVertex >= spacing || isLastPointOnPath)
+ {
+ currentPathLength += (lastAddedPoint - pointOnPath).magnitude;
+ splitData.cumulativeLength.Add(currentPathLength);
+ splitData.vertices.Add(pointOnPath);
+ splitData.tangents.Add(CubicBezierUtility.EvaluateCurveDerivative(segmentPoints, t).normalized);
+ splitData.minMax.AddValue(pointOnPath);
+ dstSinceLastVertex = 0;
+ lastAddedPoint = pointOnPath;
+ }
+ prevPointOnPath = pointOnPath;
+ }
+ splitData.anchorVertexMap.Add(splitData.vertices.Count - 1);
+ }
+ return splitData;
+ }
+
+
+ public class PathSplitData {
+ public List vertices = new List();
+ public List tangents = new List();
+ public List cumulativeLength = new List();
+ public List anchorVertexMap = new List();
+ public MinMax3D minMax = new MinMax3D();
+ }
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Core/Runtime/Utility/VertexPathUtility.cs.meta b/game/Assets/PathCreator/Core/Runtime/Utility/VertexPathUtility.cs.meta
new file mode 100644
index 0000000..a36c3a7
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Runtime/Utility/VertexPathUtility.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5505526f3c472e8499fa7ce169410ace
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Settings.meta b/game/Assets/PathCreator/Core/Settings.meta
new file mode 100644
index 0000000..8ecf40c
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Settings.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4f9b1508dc64040469b4b1ee117d27a9
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Core/Settings/GlobalDisplaySettings.asset b/game/Assets/PathCreator/Core/Settings/GlobalDisplaySettings.asset
new file mode 100644
index 0000000..53dbd17
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Settings/GlobalDisplaySettings.asset
@@ -0,0 +1,36 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 46d5e8d803e252f4499b52e657f8e1a2, type: 3}
+ m_Name: GlobalDisplaySettings
+ m_EditorClassIdentifier:
+ anchorSize: 10
+ controlSize: 7
+ visibleBehindObjects: 1
+ visibleWhenNotSelected: 1
+ hideAutoControls: 1
+ anchorShape: 0
+ controlShape: 0
+ anchor: {r: 1, g: 0.3726415, b: 0.3726415, a: 1}
+ anchorHighlighted: {r: 0.735849, g: 0.03818085, b: 0.03818085, a: 1}
+ anchorSelected: {r: 1, g: 1, b: 1, a: 1}
+ control: {r: 0.35, g: 0.6, b: 1, a: 1}
+ controlHighlighted: {r: 0.19579923, g: 0.19579923, b: 0.754717, a: 1}
+ controlSelected: {r: 1, g: 1, b: 1, a: 1}
+ handleDisabled: {r: 1, g: 1, b: 1, a: 0.2}
+ controlLine: {r: 0, g: 0, b: 0, a: 0.7254902}
+ bezierPath: {r: 0, g: 1, b: 0, a: 1}
+ highlightedPath: {r: 1, g: 0.6, b: 0, a: 1}
+ bounds: {r: 1, g: 1, b: 1, a: 0.4}
+ segmentBounds: {r: 1, g: 1, b: 1, a: 0.4}
+ vertexPath: {r: 1, g: 1, b: 1, a: 1}
+ normals: {r: 1, g: 0.92156863, b: 0.015686275, a: 1}
+ normalsLength: 0.198
diff --git a/game/Assets/PathCreator/Core/Settings/GlobalDisplaySettings.asset.meta b/game/Assets/PathCreator/Core/Settings/GlobalDisplaySettings.asset.meta
new file mode 100644
index 0000000..b4c86c8
--- /dev/null
+++ b/game/Assets/PathCreator/Core/Settings/GlobalDisplaySettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 35fab21375bf12f4b96eba4dafa4ad30
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Documentation.meta b/game/Assets/PathCreator/Documentation.meta
new file mode 100644
index 0000000..10b2fce
--- /dev/null
+++ b/game/Assets/PathCreator/Documentation.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7f53e212088d741abad12e1f2315eee7
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Documentation/Documentation.pdf b/game/Assets/PathCreator/Documentation/Documentation.pdf
new file mode 100644
index 0000000..208013a
Binary files /dev/null and b/game/Assets/PathCreator/Documentation/Documentation.pdf differ
diff --git a/game/Assets/PathCreator/Documentation/Documentation.pdf.meta b/game/Assets/PathCreator/Documentation/Documentation.pdf.meta
new file mode 100644
index 0000000..1d3a49c
--- /dev/null
+++ b/game/Assets/PathCreator/Documentation/Documentation.pdf.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e7b865996e4d342a39bbea59a2e43a53
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples.meta b/game/Assets/PathCreator/Examples.meta
new file mode 100644
index 0000000..f397761
--- /dev/null
+++ b/game/Assets/PathCreator/Examples.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 856133338e5935c4ea7215ea837b00da
+folderAsset: yes
+timeCreated: 1546380202
+licenseType: Store
+DefaultImporter:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Materials.meta b/game/Assets/PathCreator/Examples/Materials.meta
new file mode 100644
index 0000000..4b6d20e
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ba68311e0a74e694fbd8f64185d03175
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Materials/Black.mat b/game/Assets/PathCreator/Examples/Materials/Black.mat
new file mode 100644
index 0000000..11377dd
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Black.mat
@@ -0,0 +1,76 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: Black
+ m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+ m_ShaderKeywords:
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 0
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _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}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - _BumpScale: 1
+ - _Cutoff: 0.5
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _GlossMapScale: 1
+ - _Glossiness: 0.2
+ - _GlossyReflections: 1
+ - _Metallic: 0
+ - _Mode: 0
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _UVSec: 0
+ - _ZWrite: 1
+ m_Colors:
+ - _Color: {r: 0.103773594, g: 0.103773594, b: 0.103773594, a: 1}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
diff --git a/game/Assets/PathCreator/Examples/Materials/Black.mat.meta b/game/Assets/PathCreator/Examples/Materials/Black.mat.meta
new file mode 100644
index 0000000..5c81f46
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Black.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 69561553b86bde34da494d1ffed3ba45
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Materials/Blue.mat b/game/Assets/PathCreator/Examples/Materials/Blue.mat
new file mode 100644
index 0000000..16b3943
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Blue.mat
@@ -0,0 +1,76 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: Blue
+ m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+ m_ShaderKeywords:
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 0
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _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}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - _BumpScale: 1
+ - _Cutoff: 0.5
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _GlossMapScale: 1
+ - _Glossiness: 0.2
+ - _GlossyReflections: 1
+ - _Metallic: 0
+ - _Mode: 0
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _UVSec: 0
+ - _ZWrite: 1
+ m_Colors:
+ - _Color: {r: 0.30584726, g: 0.5791927, b: 0.8207547, a: 1}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
diff --git a/game/Assets/PathCreator/Examples/Materials/Blue.mat.meta b/game/Assets/PathCreator/Examples/Materials/Blue.mat.meta
new file mode 100644
index 0000000..dff321d
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Blue.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5c270a73328a99e439fec44a0cf3a17d
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Materials/Brown.mat b/game/Assets/PathCreator/Examples/Materials/Brown.mat
new file mode 100644
index 0000000..f4b31a5
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Brown.mat
@@ -0,0 +1,77 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Brown
+ m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+ m_ShaderKeywords:
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 0
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _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}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 10.66}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 10.66}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - _BumpScale: 1
+ - _Cutoff: 0.5
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _GlossMapScale: 1
+ - _Glossiness: 0
+ - _GlossyReflections: 1
+ - _Metallic: 0
+ - _Mode: 0
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _UVSec: 0
+ - _ZWrite: 1
+ m_Colors:
+ - _Color: {r: 0.4528302, g: 0.19663213, b: 0.10466359, a: 1}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
diff --git a/game/Assets/PathCreator/Examples/Materials/Brown.mat.meta b/game/Assets/PathCreator/Examples/Materials/Brown.mat.meta
new file mode 100644
index 0000000..d3fa293
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Brown.mat.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: d5b3a558a1e7f4a4182b166bb2f27cf7
+timeCreated: 1519840206
+licenseType: Store
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Materials/Dark Grey.mat b/game/Assets/PathCreator/Examples/Materials/Dark Grey.mat
new file mode 100644
index 0000000..498e755
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Dark Grey.mat
@@ -0,0 +1,77 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Dark Grey
+ m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+ m_ShaderKeywords:
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 0
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _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}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - _BumpScale: 1
+ - _Cutoff: 0.5
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _GlossMapScale: 1
+ - _Glossiness: 0
+ - _GlossyReflections: 1
+ - _Metallic: 0
+ - _Mode: 0
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _UVSec: 0
+ - _ZWrite: 1
+ m_Colors:
+ - _Color: {r: 0.16037738, g: 0.16037738, b: 0.16037738, a: 1}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
diff --git a/game/Assets/PathCreator/Examples/Materials/Dark Grey.mat.meta b/game/Assets/PathCreator/Examples/Materials/Dark Grey.mat.meta
new file mode 100644
index 0000000..b494506
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Dark Grey.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 407e3de4fbbcf4a99b17bf5aac2d28d8
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Materials/Green.mat b/game/Assets/PathCreator/Examples/Materials/Green.mat
new file mode 100644
index 0000000..ad0bc71
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Green.mat
@@ -0,0 +1,76 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: Green
+ m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+ m_ShaderKeywords:
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 0
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _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}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - _BumpScale: 1
+ - _Cutoff: 0.5
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _GlossMapScale: 1
+ - _Glossiness: 0.2
+ - _GlossyReflections: 1
+ - _Metallic: 0
+ - _Mode: 0
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _UVSec: 0
+ - _ZWrite: 1
+ m_Colors:
+ - _Color: {r: 0.46839345, g: 0.81960785, b: 0.30588233, a: 1}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
diff --git a/game/Assets/PathCreator/Examples/Materials/Green.mat.meta b/game/Assets/PathCreator/Examples/Materials/Green.mat.meta
new file mode 100644
index 0000000..cfbf57e
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Green.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9ca80467a033e954a8b9ad8601d6f4c7
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Materials/Red.mat b/game/Assets/PathCreator/Examples/Materials/Red.mat
new file mode 100644
index 0000000..c792f37
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Red.mat
@@ -0,0 +1,76 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_Name: Red
+ m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+ m_ShaderKeywords:
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 0
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _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}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - _BumpScale: 1
+ - _Cutoff: 0.5
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _GlossMapScale: 1
+ - _Glossiness: 0.2
+ - _GlossyReflections: 1
+ - _Metallic: 0
+ - _Mode: 0
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _UVSec: 0
+ - _ZWrite: 1
+ m_Colors:
+ - _Color: {r: 0.9528302, g: 0.23820755, b: 0.26590508, a: 1}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
diff --git a/game/Assets/PathCreator/Examples/Materials/Red.mat.meta b/game/Assets/PathCreator/Examples/Materials/Red.mat.meta
new file mode 100644
index 0000000..a21a9ae
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Red.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 01763a1c279a5cd4d8f897f6b6cdbae5
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Materials/Road Texture.png b/game/Assets/PathCreator/Examples/Materials/Road Texture.png
new file mode 100644
index 0000000..450ca73
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Road Texture.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c0965315b4f955d722046987876c1e37ea2d3897bd7ea6f26c843cbbc6d3dde8
+size 5809
diff --git a/game/Assets/PathCreator/Examples/Materials/Road Texture.png.meta b/game/Assets/PathCreator/Examples/Materials/Road Texture.png.meta
new file mode 100644
index 0000000..5cb01c8
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Road Texture.png.meta
@@ -0,0 +1,74 @@
+fileFormatVersion: 2
+guid: eef7def8a6d89134284369bbe0145515
+timeCreated: 1546381451
+licenseType: Store
+TextureImporter:
+ fileIDToRecycleName: {}
+ serializedVersion: 4
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ 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: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ spritePackingTag:
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Materials/Road Underside.mat b/game/Assets/PathCreator/Examples/Materials/Road Underside.mat
new file mode 100644
index 0000000..13a6dc3
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Road Underside.mat
@@ -0,0 +1,76 @@
+%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: Road Underside
+ m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+ m_ShaderKeywords:
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 0
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _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}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 10.66}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 10.66}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - _BumpScale: 1
+ - _Cutoff: 0.5
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _GlossMapScale: 1
+ - _Glossiness: 0
+ - _GlossyReflections: 1
+ - _Metallic: 0
+ - _Mode: 0
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _UVSec: 0
+ - _ZWrite: 1
+ m_Colors:
+ - _Color: {r: 0.047169805, g: 0.047169805, b: 0.047169805, a: 1}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
diff --git a/game/Assets/PathCreator/Examples/Materials/Road Underside.mat.meta b/game/Assets/PathCreator/Examples/Materials/Road Underside.mat.meta
new file mode 100644
index 0000000..40a068b
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Road Underside.mat.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: c1d8d882244c5344fa86a8fd23246f81
+timeCreated: 1519840206
+licenseType: Store
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Materials/Road.mat b/game/Assets/PathCreator/Examples/Materials/Road.mat
new file mode 100644
index 0000000..3af20a1
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Road.mat
@@ -0,0 +1,76 @@
+%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: Road
+ m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+ m_ShaderKeywords:
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 0
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _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}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 2800000, guid: eef7def8a6d89134284369bbe0145515, type: 3}
+ m_Scale: {x: 1, y: 8}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Floats:
+ - _BumpScale: 1
+ - _Cutoff: 0.5
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _GlossMapScale: 1
+ - _Glossiness: 0.153
+ - _GlossyReflections: 1
+ - _Metallic: 0
+ - _Mode: 0
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _UVSec: 0
+ - _ZWrite: 1
+ m_Colors:
+ - _Color: {r: 1, g: 1, b: 1, a: 1}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
diff --git a/game/Assets/PathCreator/Examples/Materials/Road.mat.meta b/game/Assets/PathCreator/Examples/Materials/Road.mat.meta
new file mode 100644
index 0000000..f875c87
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Materials/Road.mat.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: b5df4735192845740bd11076dc9cdc99
+timeCreated: 1546381442
+licenseType: Store
+NativeFormatImporter:
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Prefabs.meta b/game/Assets/PathCreator/Examples/Prefabs.meta
new file mode 100644
index 0000000..6bab42a
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Prefabs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3331696fd1c6e4ce399332471e58fe60
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Prefabs/Cube.prefab b/game/Assets/PathCreator/Examples/Prefabs/Cube.prefab
new file mode 100644
index 0000000..3c53ba0
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Prefabs/Cube.prefab
@@ -0,0 +1,79 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &4033822839321833552
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 979840955744105011}
+ - component: {fileID: 590364381998773281}
+ - component: {fileID: 5190809732636690155}
+ m_Layer: 0
+ m_Name: Cube
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &979840955744105011
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4033822839321833552}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -1.1922646, y: -0.4048736, z: -0.2549243}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &590364381998773281
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4033822839321833552}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &5190809732636690155
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4033822839321833552}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
diff --git a/game/Assets/PathCreator/Examples/Prefabs/Cube.prefab.meta b/game/Assets/PathCreator/Examples/Prefabs/Cube.prefab.meta
new file mode 100644
index 0000000..f8ce78f
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Prefabs/Cube.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f19b52bc2573b4e508c60232d5ba4c53
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Prefabs/Follower.prefab b/game/Assets/PathCreator/Examples/Prefabs/Follower.prefab
new file mode 100644
index 0000000..c1b17e3
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Prefabs/Follower.prefab
@@ -0,0 +1,450 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1576909240372392}
+ m_IsPrefabParent: 1
+--- !u!1 &1048366265463928
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 4175983145834568}
+ - component: {fileID: 33949624754287046}
+ - component: {fileID: 23998214817209668}
+ m_Layer: 0
+ m_Name: Body
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1142303417255900
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 4919219541973858}
+ - component: {fileID: 33545565440070206}
+ - component: {fileID: 23648042348708658}
+ m_Layer: 0
+ m_Name: Left
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1179929860508712
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 4969400159738430}
+ m_Layer: 0
+ m_Name: Model
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1402382065157418
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 4420413991641732}
+ - component: {fileID: 33735273466746142}
+ - component: {fileID: 23463250516226866}
+ m_Layer: 0
+ m_Name: Forward
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1466481028253768
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 4175567933537352}
+ - component: {fileID: 33944734216049334}
+ - component: {fileID: 23616845451545226}
+ m_Layer: 0
+ m_Name: Right
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1576909240372392
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 4125965570099986}
+ - component: {fileID: 114548013775708692}
+ m_Layer: 0
+ m_Name: Follower
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!1 &1591658747683034
+GameObject:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 4243308877940266}
+ - component: {fileID: 33880363704101016}
+ - component: {fileID: 23486494810615104}
+ m_Layer: 0
+ m_Name: Up
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4125965570099986
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1576909240372392}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 4969400159738430}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &4175567933537352
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1466481028253768}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0.75, y: 0, z: 0}
+ m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+ m_Children: []
+ m_Father: {fileID: 4969400159738430}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &4175983145834568
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048366265463928}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 4969400159738430}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &4243308877940266
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1591658747683034}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.75, z: 0}
+ m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+ m_Children: []
+ m_Father: {fileID: 4969400159738430}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &4420413991641732
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1402382065157418}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0.75}
+ m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+ m_Children: []
+ m_Father: {fileID: 4969400159738430}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &4919219541973858
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1142303417255900}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -0.75, y: 0, z: 0}
+ m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+ m_Children: []
+ m_Father: {fileID: 4969400159738430}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!4 &4969400159738430
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1179929860508712}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+ m_Children:
+ - {fileID: 4175983145834568}
+ - {fileID: 4420413991641732}
+ - {fileID: 4243308877940266}
+ - {fileID: 4919219541973858}
+ - {fileID: 4175567933537352}
+ m_Father: {fileID: 4125965570099986}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &23463250516226866
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1402382065157418}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 4294967295
+ m_Materials:
+ - {fileID: 2100000, guid: 5c270a73328a99e439fec44a0cf3a17d, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!23 &23486494810615104
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1591658747683034}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 4294967295
+ m_Materials:
+ - {fileID: 2100000, guid: 9ca80467a033e954a8b9ad8601d6f4c7, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!23 &23616845451545226
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1466481028253768}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 4294967295
+ m_Materials:
+ - {fileID: 2100000, guid: 01763a1c279a5cd4d8f897f6b6cdbae5, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!23 &23648042348708658
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1142303417255900}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 4294967295
+ m_Materials:
+ - {fileID: 2100000, guid: 01763a1c279a5cd4d8f897f6b6cdbae5, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!23 &23998214817209668
+MeshRenderer:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048366265463928}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 4294967295
+ m_Materials:
+ - {fileID: 2100000, guid: 69561553b86bde34da494d1ffed3ba45, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &33545565440070206
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1142303417255900}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!33 &33735273466746142
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1402382065157418}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!33 &33880363704101016
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1591658747683034}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!33 &33944734216049334
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1466481028253768}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!33 &33949624754287046
+MeshFilter:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1048366265463928}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!114 &114548013775708692
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1576909240372392}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 33aabe1a2dec93349b06e6e5dc51bc06, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ pathCreator: {fileID: 0}
+ endOfPathInstruction: 0
+ speed: 5
diff --git a/game/Assets/PathCreator/Examples/Prefabs/Follower.prefab.meta b/game/Assets/PathCreator/Examples/Prefabs/Follower.prefab.meta
new file mode 100644
index 0000000..7ddb1d0
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Prefabs/Follower.prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 761d600d1e80341ac97f3228771ce637
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Prefabs/Path.prefab b/game/Assets/PathCreator/Examples/Prefabs/Path.prefab
new file mode 100644
index 0000000..13e486f
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Prefabs/Path.prefab
@@ -0,0 +1,106 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &100100000
+Prefab:
+ m_ObjectHideFlags: 1
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications: []
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 0}
+ m_RootGameObject: {fileID: 1801384024788032}
+ m_IsPrefabParent: 1
+--- !u!1 &1801384024788032
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 4050403524429934}
+ - component: {fileID: 114462757500385858}
+ m_Layer: 0
+ m_Name: Path
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4050403524429934
+Transform:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1801384024788032}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &114462757500385858
+MonoBehaviour:
+ m_ObjectHideFlags: 1
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 100100000}
+ m_GameObject: {fileID: 1801384024788032}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 8e5ac92bc18f545cc84cd886ece82b4d, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ editorData:
+ _bezierPath:
+ points:
+ - {x: -4.350084, y: -0.6192361, z: 0.36958665}
+ - {x: -4.3119984, y: -0.27224493, z: 2.7627096}
+ - {x: -2.500093, y: 1.7315861, z: 2.2386506}
+ - {x: 0.14839771, y: 1.7105651, z: 2.2219813}
+ - {x: 2.7968912, y: 1.6895441, z: 2.205312}
+ - {x: 4.16408, y: -0.44785511, z: 2.1293974}
+ - {x: 4.3446193, y: -0.6192361, z: 0.36958665}
+ - {x: 4.5251584, y: -0.7906171, z: -1.390224}
+ - {x: 3.2920637, y: 0.7694727, z: -2.9261537}
+ - {x: 0.77272415, y: 0.83640313, z: -3.0503848}
+ - {x: -1.7466154, y: 0.90333354, z: -3.1746159}
+ - {x: -4.3881693, y: -0.9662273, z: -2.0235362}
+ isClosed: 1
+ space: 0
+ controlMode: 1
+ autoControlLength: 0.3
+ boundsUpToDate: 0
+ bounds:
+ m_Center: {x: 0.005727291, y: 0.5250117, z: -0.39030027}
+ m_Extent: {x: 4.3562183, y: 1.1872373, z: 2.6691647}
+ rotation: {x: 0, y: 0, z: 0, w: 1}
+ scale: {x: 2.1736755, y: 2.1736755, z: 2.1736755}
+ perAnchorNormalsAngle:
+ - 0
+ - 0
+ - 0
+ - 0
+ globalNormalsAngle: 69
+ flipNormals: 0
+ vertexPathUpToDate: 1
+ vertexPathMaxAngleError: 0.3
+ vertexPathMinVertexSpacing: 0
+ showTransformTool: 1
+ showPathBounds: 0
+ showPerSegmentBounds: 0
+ displayAnchorPoints: 1
+ displayControlPoints: 1
+ bezierHandleScale: 1
+ globalDisplaySettingsFoldout: 0
+ keepConstantHandleSize: 0
+ showNormalsInVertexMode: 0
+ showBezierPathInVertexMode: 0
+ showDisplayOptions: 0
+ showPathOptions: 1
+ showVertexPathDisplayOptions: 0
+ showVertexPathOptions: 1
+ showNormals: 1
+ showNormalsHelpInfo: 0
+ tabIndex: 0
+ initialized: 1
diff --git a/game/Assets/PathCreator/Examples/Prefabs/Path.prefab.meta b/game/Assets/PathCreator/Examples/Prefabs/Path.prefab.meta
new file mode 100644
index 0000000..d08ab98
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Prefabs/Path.prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2791553a612d84e7c9f3c0a95308376f
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 100100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Prefabs/Sphere.prefab b/game/Assets/PathCreator/Examples/Prefabs/Sphere.prefab
new file mode 100644
index 0000000..80dd763
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Prefabs/Sphere.prefab
@@ -0,0 +1,79 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1284304205642556215
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3168392299219943901}
+ - component: {fileID: 7484263716245627173}
+ - component: {fileID: 4367022514524041713}
+ m_Layer: 0
+ m_Name: Sphere
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &3168392299219943901
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1284304205642556215}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &7484263716245627173
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1284304205642556215}
+ m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &4367022514524041713
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1284304205642556215}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
diff --git a/game/Assets/PathCreator/Examples/Prefabs/Sphere.prefab.meta b/game/Assets/PathCreator/Examples/Prefabs/Sphere.prefab.meta
new file mode 100644
index 0000000..6c54355
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Prefabs/Sphere.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: cb2e1e8aa0d44489c8d332b91c9a4202
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scenes.meta b/game/Assets/PathCreator/Examples/Scenes.meta
new file mode 100644
index 0000000..e53a358
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7fa8a76a6a31dba43b3f224aa4c8ef31
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scenes/Follow Path.unity b/game/Assets/PathCreator/Examples/Scenes/Follow Path.unity
new file mode 100644
index 0000000..a481f50
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes/Follow Path.unity
@@ -0,0 +1,393 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.4465934, g: 0.49642956, b: 0.57482487, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_GIWorkflowMode: 0
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_TemporalCoherenceThreshold: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 1
+ m_LightmapEditorSettings:
+ serializedVersion: 10
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 500
+ m_PVRBounces: 2
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringMode: 2
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ShowResolutionOverlay: 1
+ m_LightingDataAsset: {fileID: 0}
+ m_UseShadowmask: 1
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &184727957
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 184727959}
+ - component: {fileID: 184727958}
+ m_Layer: 0
+ m_Name: Path
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &184727958
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 184727957}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 8e5ac92bc18f545cc84cd886ece82b4d, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ editorData:
+ _bezierPath:
+ points:
+ - {x: -4.350084, y: -0.6192361, z: 0.36958665}
+ - {x: -4.3119984, y: -0.27224493, z: 2.7627096}
+ - {x: -2.500093, y: 1.7315861, z: 2.2386506}
+ - {x: 0.14839771, y: 1.7105651, z: 2.2219813}
+ - {x: 2.7968912, y: 1.6895441, z: 2.205312}
+ - {x: 4.16408, y: -0.44785511, z: 2.1293974}
+ - {x: 4.3446193, y: -0.6192361, z: 0.36958665}
+ - {x: 4.5251584, y: -0.7906171, z: -1.390224}
+ - {x: 3.2920637, y: 0.7694727, z: -2.9261537}
+ - {x: 0.77272415, y: 0.83640313, z: -3.0503848}
+ - {x: -1.7466154, y: 0.90333354, z: -3.1746159}
+ - {x: -4.3881693, y: -0.9662273, z: -2.0235362}
+ isClosed: 1
+ space: 0
+ controlMode: 1
+ autoControlLength: 0.3
+ boundsUpToDate: 0
+ bounds:
+ m_Center: {x: 0.005727291, y: 0.5250117, z: -0.39030027}
+ m_Extent: {x: 4.3562183, y: 1.1872373, z: 2.6691647}
+ rotation: {x: 0, y: 0, z: 0, w: 1}
+ scale: {x: 2.1736755, y: 2.1736755, z: 2.1736755}
+ perAnchorNormalsAngle:
+ - 0
+ - 0
+ - 0
+ - 0
+ globalNormalsAngle: 69
+ flipNormals: 0
+ vertexPathUpToDate: 1
+ vertexPathMaxAngleError: 0.3
+ vertexPathMinVertexSpacing: 0
+ showTransformTool: 1
+ showPathBounds: 0
+ showPerSegmentBounds: 0
+ displayAnchorPoints: 1
+ displayControlPoints: 1
+ bezierHandleScale: 1
+ globalDisplaySettingsFoldout: 0
+ keepConstantHandleSize: 0
+ showNormalsInVertexMode: 0
+ showBezierPathInVertexMode: 0
+ showDisplayOptions: 0
+ showPathOptions: 1
+ showVertexPathDisplayOptions: 0
+ showVertexPathOptions: 1
+ showNormals: 0
+ showNormalsHelpInfo: 0
+ tabIndex: 0
+ initialized: 1
+--- !u!4 &184727959
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 184727957}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &1266884696
+Prefab:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 4125965570099986, guid: 761d600d1e80341ac97f3228771ce637, type: 2}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4125965570099986, guid: 761d600d1e80341ac97f3228771ce637, type: 2}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4125965570099986, guid: 761d600d1e80341ac97f3228771ce637, type: 2}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4125965570099986, guid: 761d600d1e80341ac97f3228771ce637, type: 2}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4125965570099986, guid: 761d600d1e80341ac97f3228771ce637, type: 2}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4125965570099986, guid: 761d600d1e80341ac97f3228771ce637, type: 2}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4125965570099986, guid: 761d600d1e80341ac97f3228771ce637, type: 2}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 4125965570099986, guid: 761d600d1e80341ac97f3228771ce637, type: 2}
+ propertyPath: m_RootOrder
+ value: 3
+ objectReference: {fileID: 0}
+ - target: {fileID: 114548013775708692, guid: 761d600d1e80341ac97f3228771ce637,
+ type: 2}
+ propertyPath: pathCreator
+ value:
+ objectReference: {fileID: 184727958}
+ m_RemovedComponents: []
+ m_ParentPrefab: {fileID: 100100000, guid: 761d600d1e80341ac97f3228771ce637, type: 2}
+ m_IsPrefabParent: 0
+--- !u!1 &1308570505
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1308570508}
+ - component: {fileID: 1308570507}
+ - component: {fileID: 1308570506}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &1308570506
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1308570505}
+ m_Enabled: 1
+--- !u!20 &1308570507
+Camera:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1308570505}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &1308570508
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1308570505}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 1, z: -10}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1844901808
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1844901810}
+ - component: {fileID: 1844901809}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &1844901809
+Light:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1844901808}
+ m_Enabled: 1
+ serializedVersion: 8
+ m_Type: 1
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_Lightmapping: 4
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &1844901810
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1844901808}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
diff --git a/game/Assets/PathCreator/Examples/Scenes/Follow Path.unity.meta b/game/Assets/PathCreator/Examples/Scenes/Follow Path.unity.meta
new file mode 100644
index 0000000..5ccda69
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes/Follow Path.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c1e712ad623461e418f182144cf61384
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scenes/Generate Path.unity b/game/Assets/PathCreator/Examples/Scenes/Generate Path.unity
new file mode 100644
index 0000000..706981d
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes/Generate Path.unity
@@ -0,0 +1,973 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.44657892, g: 0.4964127, b: 0.5748172, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_GIWorkflowMode: 0
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 1
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 500
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 500
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 2
+ m_PVRDenoiserTypeDirect: 0
+ m_PVRDenoiserTypeIndirect: 0
+ m_PVRDenoiserTypeAO: 0
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 0
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ShowResolutionOverlay: 1
+ m_ExportTrainingData: 0
+ m_LightingDataAsset: {fileID: 0}
+ m_UseShadowmask: 1
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &244891480
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 244891483}
+ - component: {fileID: 244891482}
+ - component: {fileID: 244891481}
+ m_Layer: 0
+ m_Name: Follower
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!96 &244891481
+TrailRenderer:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 244891480}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 0
+ m_ReflectionProbeUsage: 0
+ m_RenderingLayerMask: 4294967295
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10306, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_Time: 5
+ m_Parameters:
+ serializedVersion: 3
+ widthMultiplier: 1
+ widthCurve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 1
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: 0
+ outWeight: 0
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ colorGradient:
+ serializedVersion: 2
+ key0: {r: 0.16470587, g: 0.47597936, b: 1, a: 1}
+ key1: {r: 0.7216981, g: 0.89121073, b: 1, a: 0}
+ key2: {r: 0, g: 0, b: 0, a: 0}
+ key3: {r: 0, g: 0, b: 0, a: 0}
+ key4: {r: 0, g: 0, b: 0, a: 0}
+ key5: {r: 0, g: 0, b: 0, a: 0}
+ key6: {r: 0, g: 0, b: 0, a: 0}
+ key7: {r: 0, g: 0, b: 0, a: 0}
+ ctime0: 0
+ ctime1: 65535
+ ctime2: 0
+ ctime3: 0
+ ctime4: 0
+ ctime5: 0
+ ctime6: 0
+ ctime7: 0
+ atime0: 0
+ atime1: 65535
+ atime2: 0
+ atime3: 0
+ atime4: 0
+ atime5: 0
+ atime6: 0
+ atime7: 0
+ m_Mode: 0
+ m_NumColorKeys: 2
+ m_NumAlphaKeys: 2
+ numCornerVertices: 0
+ numCapVertices: 8
+ alignment: 0
+ textureMode: 0
+ shadowBias: 0
+ generateLightingData: 0
+ m_MinVertexDistance: 0.1
+ m_Autodestruct: 0
+ m_Emitting: 1
+--- !u!114 &244891482
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 244891480}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 33aabe1a2dec93349b06e6e5dc51bc06, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ pathCreator: {fileID: 839433806}
+ endOfPathInstruction: 0
+ speed: 5
+--- !u!4 &244891483
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 244891480}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &315902406
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 315902409}
+ - component: {fileID: 315902408}
+ - component: {fileID: 315902407}
+ m_Layer: 0
+ m_Name: Sphere (4)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!23 &315902407
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 315902406}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 4294967295
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &315902408
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 315902406}
+ m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &315902409
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 315902406}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 6.54, y: -1.75, z: 6.2}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 762964052}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &729862344
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 729862347}
+ - component: {fileID: 729862346}
+ - component: {fileID: 729862345}
+ m_Layer: 0
+ m_Name: Sphere (3)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!23 &729862345
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 729862344}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 4294967295
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &729862346
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 729862344}
+ m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &729862347
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 729862344}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 9.1, y: 6.39, z: -3.51}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 762964052}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &762964051
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 762964052}
+ m_Layer: 0
+ m_Name: Waypoints
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &762964052
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 762964051}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1295418884}
+ - {fileID: 2107402768}
+ - {fileID: 1544419622}
+ - {fileID: 729862347}
+ - {fileID: 315902409}
+ m_Father: {fileID: 0}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &839433805
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 839433807}
+ - component: {fileID: 839433808}
+ - component: {fileID: 839433806}
+ m_Layer: 0
+ m_Name: Path
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &839433806
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 839433805}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 8e5ac92bc18f545cc84cd886ece82b4d, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ editorData:
+ _bezierPath:
+ points:
+ - {x: -2, y: 0, z: 0}
+ - {x: -1, y: 0.5, z: 0}
+ - {x: 1, y: -0.5, z: 0}
+ - {x: 2, y: 0, z: 0}
+ isClosed: 0
+ space: 0
+ controlMode: 0
+ autoControlLength: 0.3
+ boundsUpToDate: 0
+ bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ rotation: {x: 0, y: 0, z: 0, w: 1}
+ scale: {x: 1, y: 1, z: 1}
+ perAnchorNormalsAngle:
+ - 0
+ - 0
+ globalNormalsAngle: 0
+ flipNormals: 0
+ vertexPathUpToDate: 0
+ vertexPathMaxAngleError: 0.3
+ vertexPathMinVertexSpacing: 0.01
+ showTransformTool: 1
+ showPathBounds: 0
+ showPerSegmentBounds: 0
+ displayAnchorPoints: 1
+ displayControlPoints: 1
+ bezierHandleScale: 1
+ globalDisplaySettingsFoldout: 0
+ keepConstantHandleSize: 0
+ showNormalsInVertexMode: 0
+ showBezierPathInVertexMode: 0
+ showDisplayOptions: 0
+ showPathOptions: 1
+ showVertexPathDisplayOptions: 0
+ showVertexPathOptions: 1
+ showNormals: 0
+ showNormalsHelpInfo: 0
+ tabIndex: 0
+ initialized: 1
+--- !u!4 &839433807
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 839433805}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &839433808
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 839433805}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f417e74782fffcd40b77b0fdbe82af04, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ closedLoop: 1
+ waypoints:
+ - {fileID: 1295418884}
+ - {fileID: 2107402768}
+ - {fileID: 1544419622}
+ - {fileID: 729862347}
+ - {fileID: 315902409}
+--- !u!1 &1295418881
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1295418884}
+ - component: {fileID: 1295418883}
+ - component: {fileID: 1295418882}
+ m_Layer: 0
+ m_Name: Sphere
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!23 &1295418882
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1295418881}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 4294967295
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1295418883
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1295418881}
+ m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1295418884
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1295418881}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 762964052}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1407856702
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1407856705}
+ - component: {fileID: 1407856704}
+ - component: {fileID: 1407856703}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &1407856703
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1407856702}
+ m_Enabled: 1
+--- !u!20 &1407856704
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1407856702}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_FocalLength: 50
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &1407856705
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1407856702}
+ m_LocalRotation: {x: 0.12969545, y: -0.1184572, z: 0.015607949, w: 0.9843289}
+ m_LocalPosition: {x: 3, y: 8.92, z: -18.23}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 15.012001, y: -13.724001, z: 0}
+--- !u!1 &1544419619
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1544419622}
+ - component: {fileID: 1544419621}
+ - component: {fileID: 1544419620}
+ m_Layer: 0
+ m_Name: Sphere (2)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!23 &1544419620
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1544419619}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 4294967295
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1544419621
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1544419619}
+ m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1544419622
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1544419619}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -6.17, y: 6.39, z: -10.04}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 762964052}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1612519935
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1612519937}
+ - component: {fileID: 1612519936}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &1612519936
+Light:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1612519935}
+ m_Enabled: 1
+ serializedVersion: 9
+ m_Type: 1
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_InnerSpotAngle: 21.802082
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_CullingMatrixOverride:
+ e00: 1
+ e01: 0
+ e02: 0
+ e03: 0
+ e10: 0
+ e11: 1
+ e12: 0
+ e13: 0
+ e20: 0
+ e21: 0
+ e22: 1
+ e23: 0
+ e30: 0
+ e31: 0
+ e32: 0
+ e33: 1
+ m_UseCullingMatrixOverride: 0
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingLayerMask: 1
+ m_Lightmapping: 4
+ m_LightShadowCasterMode: 0
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_UseBoundingSphereOverride: 0
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &1612519937
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1612519935}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!1 &2107402765
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2107402768}
+ - component: {fileID: 2107402767}
+ - component: {fileID: 2107402766}
+ m_Layer: 0
+ m_Name: Sphere (1)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!23 &2107402766
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2107402765}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 4294967295
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 0
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &2107402767
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2107402765}
+ m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &2107402768
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2107402765}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -6.17, y: 1.4746776, z: 2.67}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 762964052}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
diff --git a/game/Assets/PathCreator/Examples/Scenes/Generate Path.unity.meta b/game/Assets/PathCreator/Examples/Scenes/Generate Path.unity.meta
new file mode 100644
index 0000000..d2ff05c
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes/Generate Path.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 3145d476fb2c7f242875d23b77320de4
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scenes/Object Placement.unity b/game/Assets/PathCreator/Examples/Scenes/Object Placement.unity
new file mode 100644
index 0000000..dd0a3b9
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes/Object Placement.unity
@@ -0,0 +1,1944 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.4465934, g: 0.49642956, b: 0.57482487, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_GIWorkflowMode: 0
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_TemporalCoherenceThreshold: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 1
+ m_LightmapEditorSettings:
+ serializedVersion: 10
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringMode: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ShowResolutionOverlay: 1
+ m_LightingDataAsset: {fileID: 0}
+ m_UseShadowmask: 1
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &70188142
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 70188143}
+ - component: {fileID: 70188145}
+ - component: {fileID: 70188144}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &70188143
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 70188142}
+ m_LocalRotation: {x: -0.39927244, y: 0.39927244, z: -0.5835936, w: 0.5835936}
+ m_LocalPosition: {x: 9.822016, y: 0.4048736, z: -10.503309}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 18
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &70188144
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 70188142}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &70188145
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 70188142}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &473136262
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 473136263}
+ - component: {fileID: 473136265}
+ - component: {fileID: 473136264}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &473136263
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 473136262}
+ m_LocalRotation: {x: 0.6124736, y: -0.6124736, z: 0.3533781, w: -0.3533781}
+ m_LocalPosition: {x: -7.4458857, y: 0.4048736, z: -8.243549}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 15
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &473136264
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 473136262}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &473136265
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 473136262}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &664526678
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 664526679}
+ - component: {fileID: 664526681}
+ - component: {fileID: 664526680}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &664526679
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 664526678}
+ m_LocalRotation: {x: 0.25204316, y: -0.25204316, z: -0.66066194, w: 0.660662}
+ m_LocalPosition: {x: 14.085798, y: 0.4048736, z: 17.422533}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 5
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &664526680
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 664526678}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &664526681
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 664526678}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &702570136
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 702570137}
+ - component: {fileID: 702570139}
+ - component: {fileID: 702570138}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &702570137
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 702570136}
+ m_LocalRotation: {x: 0.334829, y: -0.334829, z: -0.6228078, w: 0.6228078}
+ m_LocalPosition: {x: 9.585267, y: 0.4048736, z: 21.53287}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 6
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &702570138
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 702570136}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &702570139
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 702570136}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &877217990
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 877217991}
+ - component: {fileID: 877217993}
+ - component: {fileID: 877217992}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &877217991
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 877217990}
+ m_LocalRotation: {x: -0.497745, y: 0.497745, z: -0.50224495, w: 0.5022449}
+ m_LocalPosition: {x: 9.432941, y: 0.4048736, z: 0.568121}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &877217992
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 877217990}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &877217993
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 877217990}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &947851089
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 947851090}
+ - component: {fileID: 947851092}
+ - component: {fileID: 947851091}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &947851090
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 947851089}
+ m_LocalRotation: {x: -0.2508529, y: 0.2508529, z: -0.6611149, w: 0.6611148}
+ m_LocalPosition: {x: 14.984689, y: 0.4048736, z: -7.3686123}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 19
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &947851091
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 947851089}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &947851092
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 947851089}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &987899030
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 987899031}
+ - component: {fileID: 987899033}
+ - component: {fileID: 987899032}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &987899031
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 987899030}
+ m_LocalRotation: {x: 0.70505685, y: -0.70505685, z: -0.05380449, w: 0.05380449}
+ m_LocalPosition: {x: -14.578905, y: 0.4048736, z: 13.0229435}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 11
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &987899032
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 987899030}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &987899033
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 987899030}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1017046790
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1017046791}
+ - component: {fileID: 1017046793}
+ - component: {fileID: 1017046792}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1017046791
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1017046790}
+ m_LocalRotation: {x: 0.6906611, y: -0.690661, z: -0.15161571, w: 0.15161571}
+ m_LocalPosition: {x: -12.987309, y: 0.4048736, z: 18.90274}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 10
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1017046792
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1017046790}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1017046793
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1017046790}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1035122922
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1035122923}
+ - component: {fileID: 1035122925}
+ - component: {fileID: 1035122924}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1035122923
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1035122922}
+ m_LocalRotation: {x: 0.7070882, y: -0.7070881, z: -0.005134826, w: 0.005134826}
+ m_LocalPosition: {x: -15.071617, y: 0.4048736, z: 6.9375906}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 12
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1035122924
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1035122922}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1035122925
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1035122922}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1045485630
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1045485633}
+ - component: {fileID: 1045485632}
+ - component: {fileID: 1045485631}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &1045485631
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1045485630}
+ m_Enabled: 1
+--- !u!20 &1045485632
+Camera:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1045485630}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &1045485633
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1045485630}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 1, z: -10}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1100876285
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1100876286}
+ m_Layer: 0
+ m_Name: Object Holder
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1100876286
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1100876285}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -1.1922646, y: -0.4048736, z: -0.2549243}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1489228399}
+ - {fileID: 877217991}
+ - {fileID: 1305567046}
+ - {fileID: 1726925215}
+ - {fileID: 1836065500}
+ - {fileID: 664526679}
+ - {fileID: 702570137}
+ - {fileID: 1653420825}
+ - {fileID: 1239443495}
+ - {fileID: 1631447300}
+ - {fileID: 1017046791}
+ - {fileID: 987899031}
+ - {fileID: 1035122923}
+ - {fileID: 1451327458}
+ - {fileID: 1863139043}
+ - {fileID: 473136263}
+ - {fileID: 1551300063}
+ - {fileID: 1413329164}
+ - {fileID: 70188143}
+ - {fileID: 947851090}
+ - {fileID: 1743644112}
+ m_Father: {fileID: 0}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1163749077
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1163749079}
+ - component: {fileID: 1163749078}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &1163749078
+Light:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1163749077}
+ m_Enabled: 1
+ serializedVersion: 8
+ m_Type: 1
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_Lightmapping: 4
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &1163749079
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1163749077}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!1 &1173081723
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1173081726}
+ - component: {fileID: 1173081725}
+ - component: {fileID: 1173081724}
+ m_Layer: 0
+ m_Name: Path
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1173081724
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1173081723}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 8e5ac92bc18f545cc84cd886ece82b4d, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ editorData:
+ _bezierPath:
+ points:
+ - {x: 2.177661, y: 0, z: 1.0135708}
+ - {x: 5.2159348, y: 0, z: 0.51950216}
+ - {x: 8.254209, y: 0, z: 0.02543357}
+ - {x: 9.880889, y: 0, z: 0.51335144}
+ - {x: 12.122741, y: 0, z: 1.185788}
+ - {x: 18.025703, y: 0, z: 4.6161985}
+ - {x: 18.365267, y: 0, z: 6.931963}
+ - {x: 18.953577, y: 0, z: 10.944124}
+ - {x: 11.143806, y: 0, z: 20.072712}
+ - {x: 7.4771137, y: 0, z: 21.80445}
+ - {x: 3.4255772, y: 0, z: 23.717943}
+ - {x: -9.652585, y: 0, z: 23.788317}
+ - {x: -12.857204, y: 0, z: 20.656733}
+ - {x: -16.654, y: 0, z: 16.946468}
+ - {x: -17.266878, y: 0, z: 1.2884617}
+ - {x: -14.771961, y: 0, z: -3.397377}
+ - {x: -12.861416, y: 0, z: -6.9856763}
+ - {x: -2.7150939, y: 0, z: -12.051621}
+ - {x: 1.3291776, y: 0, z: -12.463868}
+ - {x: 3.8740497, y: 0, z: -12.723276}
+ - {x: 10.303253, y: 0, z: -10.38054}
+ - {x: 12.403621, y: 0, z: -8.9203615}
+ - {x: 13.973428, y: 0, z: -7.82903}
+ - {x: 15.871395, y: 0, z: -4.956673}
+ - {x: 17.769363, y: 0, z: -2.0843163}
+ isClosed: 0
+ localPosition: {x: 0, y: 0, z: 0}
+ space: 2
+ controlMode: 3
+ autoControlLength: 0.22
+ boundsUpToDate: 1
+ pivot: {x: 1.0637436, y: 0, z: 5.3302784}
+ bounds:
+ m_Center: {x: 1.0637436, y: 0, z: 5.3302784}
+ m_Extent: {x: 17.332994, y: 0, z: 17.813997}
+ rotation: {x: 0, y: 0, z: 0, w: 1}
+ scale: {x: 1, y: 1, z: 1}
+ perAnchorNormalsAngle:
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ globalNormalsAngle: 0
+ flipNormals: 0
+ vertexPathUpToDate: 1
+ vertexPathMaxAngleError: 0.3
+ vertexPathMinVertexSpacing: 0.01
+ pathTransformationEnabled: 0
+ showPathBounds: 0
+ showPerSegmentBounds: 0
+ displayAnchorPoints: 1
+ displayControlPoints: 1
+ bezierHandleScale: 7.64
+ globalDisplaySettingsFoldout: 0
+ keepConstantHandleSize: 0
+ showNormalsInVertexMode: 0
+ showBezierPathInVertexMode: 0
+ showDisplayOptions: 0
+ showPathOptions: 0
+ showVertexPathDisplayOptions: 0
+ showVertexPathOptions: 1
+ showNormals: 0
+ showNormalsHelpInfo: 0
+ tabIndex: 0
+ initialized: 1
+--- !u!114 &1173081725
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1173081723}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d12b1fe1b42884d7692049d7f6f79ee9, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ pathCreator: {fileID: 1173081724}
+ autoUpdate: 1
+ prefab: {fileID: 4033822839321833552, guid: f19b52bc2573b4e508c60232d5ba4c53, type: 2}
+ holder: {fileID: 1100876285}
+ spacing: 6.11
+--- !u!4 &1173081726
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1173081723}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1239443494
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1239443495}
+ - component: {fileID: 1239443497}
+ - component: {fileID: 1239443496}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1239443495
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1239443494}
+ m_LocalRotation: {x: 0.51114064, y: -0.5111407, z: -0.4886054, w: 0.4886054}
+ m_LocalPosition: {x: -2.3383734, y: 0.4048736, z: 23.356722}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 8
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1239443496
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1239443494}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1239443497
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1239443494}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1305567045
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1305567046}
+ - component: {fileID: 1305567048}
+ - component: {fileID: 1305567047}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1305567046
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1305567045}
+ m_LocalRotation: {x: -0.34406978, y: 0.34406978, z: -0.61775076, w: 0.61775076}
+ m_LocalPosition: {x: 15.058696, y: 0.4048736, z: 2.730334}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1305567047
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1305567045}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1305567048
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1305567045}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1413329163
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1413329164}
+ - component: {fileID: 1413329166}
+ - component: {fileID: 1413329165}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1413329164
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1413329163}
+ m_LocalRotation: {x: -0.46657854, y: 0.46657854, z: -0.5313234, w: 0.5313234}
+ m_LocalPosition: {x: 3.9528432, y: 0.4048736, z: -12.155033}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 17
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1413329165
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1413329163}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1413329166
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1413329163}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1451327457
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1451327458}
+ - component: {fileID: 1451327460}
+ - component: {fileID: 1451327459}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1451327458
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1451327457}
+ m_LocalRotation: {x: 0.7051131, y: -0.7051131, z: 0.053061392, w: -0.053061392}
+ m_LocalPosition: {x: -14.709441, y: 0.4048736, z: 0.8449825}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 13
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1451327459
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1451327457}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1451327460
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1451327457}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1489228398
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1489228399}
+ - component: {fileID: 1489228401}
+ - component: {fileID: 1489228400}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1489228399
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1489228398}
+ m_LocalRotation: {x: 0.53863406, y: -0.53863406, z: 0.4581194, w: -0.4581194}
+ m_LocalPosition: {x: 3.3699255, y: 0.4048736, z: 1.2684951}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1489228400
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1489228398}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1489228401
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1489228398}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1551300062
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1551300063}
+ - component: {fileID: 1551300065}
+ - component: {fileID: 1551300064}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1551300063
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1551300062}
+ m_LocalRotation: {x: 0.5853645, y: -0.5853645, z: 0.39667162, w: -0.39667162}
+ m_LocalPosition: {x: -1.9577849, y: 0.4048736, z: -10.917622}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 16
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1551300064
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1551300062}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1551300065
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1551300062}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1631447299
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1631447300}
+ - component: {fileID: 1631447302}
+ - component: {fileID: 1631447301}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1631447300
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1631447299}
+ m_LocalRotation: {x: 0.5621399, y: -0.56213987, z: -0.42895082, w: 0.42895082}
+ m_LocalPosition: {x: -8.37764, y: 0.4048736, z: 22.51158}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 9
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1631447301
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1631447299}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1631447302
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1631447299}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1653420824
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1653420825}
+ - component: {fileID: 1653420827}
+ - component: {fileID: 1653420826}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1653420825
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1653420824}
+ m_LocalRotation: {x: 0.47242323, y: -0.47242323, z: -0.5261334, w: 0.52613336}
+ m_LocalPosition: {x: 3.7633872, y: 0.4048736, z: 23.181543}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 7
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1653420826
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1653420824}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1653420827
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1653420824}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1726925214
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1726925215}
+ - component: {fileID: 1726925217}
+ - component: {fileID: 1726925216}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1726925215
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1726925214}
+ m_LocalRotation: {x: -0.12087492, y: 0.12087492, z: -0.6966989, w: 0.69669884}
+ m_LocalPosition: {x: 19.46735, y: 0.4048736, z: 6.836807}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1726925216
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1726925214}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1726925217
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1726925214}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1743644111
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1743644112}
+ - component: {fileID: 1743644114}
+ - component: {fileID: 1743644113}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1743644112
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1743644111}
+ m_LocalRotation: {x: -0.20450312, y: 0.20450312, z: -0.6768888, w: 0.6768888}
+ m_LocalPosition: {x: 18.56629, y: 0.4048736, z: -2.4241676}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 20
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1743644113
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1743644111}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1743644114
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1743644111}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1836065499
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1836065500}
+ - component: {fileID: 1836065502}
+ - component: {fileID: 1836065501}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1836065500
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1836065499}
+ m_LocalRotation: {x: 0.19032404, y: -0.19032404, z: -0.6810116, w: 0.6810116}
+ m_LocalPosition: {x: 17.74937, y: 0.4048736, z: 12.543003}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1836065501
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1836065499}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1836065502
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1836065499}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &1863139042
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1863139043}
+ - component: {fileID: 1863139045}
+ - component: {fileID: 1863139044}
+ m_Layer: 0
+ m_Name: Cube(Clone)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1863139043
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1863139042}
+ m_LocalRotation: {x: 0.6531901, y: -0.65319, z: 0.27081865, w: -0.27081865}
+ m_LocalPosition: {x: -12.382312, y: 0.4048736, z: -4.669839}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1100876286}
+ m_RootOrder: 14
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &1863139044
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1863139042}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1863139045
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1863139042}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
diff --git a/game/Assets/PathCreator/Examples/Scenes/Object Placement.unity.meta b/game/Assets/PathCreator/Examples/Scenes/Object Placement.unity.meta
new file mode 100644
index 0000000..23a9ebb
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes/Object Placement.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f9d700f5f914447f48566abe5b02d921
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scenes/Path as Prefab.unity b/game/Assets/PathCreator/Examples/Scenes/Path as Prefab.unity
new file mode 100644
index 0000000..c3c7f7e
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes/Path as Prefab.unity
@@ -0,0 +1,517 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.4465934, g: 0.49642956, b: 0.57482487, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_GIWorkflowMode: 0
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_TemporalCoherenceThreshold: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 1
+ m_LightmapEditorSettings:
+ serializedVersion: 10
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 500
+ m_PVRBounces: 2
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringMode: 2
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ShowResolutionOverlay: 1
+ m_LightingDataAsset: {fileID: 0}
+ m_UseShadowmask: 1
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &854113292
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 854113295}
+ - component: {fileID: 854113294}
+ - component: {fileID: 854113293}
+ m_Layer: 0
+ m_Name: Spawn 1
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!23 &854113293
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 854113292}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 2100000, guid: 5c270a73328a99e439fec44a0cf3a17d, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &854113294
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 854113292}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &854113295
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 854113292}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -6, y: 0, z: 0}
+ m_LocalScale: {x: 3.7376, y: 0.14671586, z: 3.7376}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1001367091
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1001367094}
+ - component: {fileID: 1001367093}
+ - component: {fileID: 1001367092}
+ m_Layer: 0
+ m_Name: Spawn 3
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!23 &1001367092
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1001367091}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 2100000, guid: 01763a1c279a5cd4d8f897f6b6cdbae5, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1001367093
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1001367091}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1001367094
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1001367091}
+ m_LocalRotation: {x: -0.3582922, y: -0, z: -0, w: 0.9336095}
+ m_LocalPosition: {x: 0, y: 2.6, z: 5.85}
+ m_LocalScale: {x: 3.7376, y: 0.14671586, z: 3.7376}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 5
+ m_LocalEulerAnglesHint: {x: -41.991, y: 0, z: 0}
+--- !u!1 &1170195241
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1170195244}
+ - component: {fileID: 1170195243}
+ - component: {fileID: 1170195242}
+ m_Layer: 0
+ m_Name: Spawn 2
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!23 &1170195242
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1170195241}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_Materials:
+ - {fileID: 2100000, guid: 9ca80467a033e954a8b9ad8601d6f4c7, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1170195243
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1170195241}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1170195244
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1170195241}
+ m_LocalRotation: {x: -0, y: -0, z: 0.480542, w: 0.87697166}
+ m_LocalPosition: {x: 6, y: 0, z: 0}
+ m_LocalScale: {x: 3.7376, y: 0.14671586, z: 3.7376}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 57.442}
+--- !u!1 &1308570505
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1308570508}
+ - component: {fileID: 1308570507}
+ - component: {fileID: 1308570506}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &1308570506
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1308570505}
+ m_Enabled: 1
+--- !u!20 &1308570507
+Camera:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1308570505}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &1308570508
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1308570505}
+ m_LocalRotation: {x: 0.17410469, y: -0, z: -0, w: 0.9847272}
+ m_LocalPosition: {x: 0, y: 6.41, z: -11.71}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 20.053001, y: 0, z: 0}
+--- !u!1 &1518276650
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1518276652}
+ - component: {fileID: 1518276651}
+ m_Layer: 0
+ m_Name: Spawner
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1518276651
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1518276650}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: b617cc208d0104cad9534d503ff3e1cf, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ pathPrefab: {fileID: 114462757500385858, guid: 2791553a612d84e7c9f3c0a95308376f,
+ type: 2}
+ followerPrefab: {fileID: 114548013775708692, guid: 761d600d1e80341ac97f3228771ce637,
+ type: 2}
+ spawnPoints:
+ - {fileID: 854113295}
+ - {fileID: 1170195244}
+ - {fileID: 1001367094}
+--- !u!4 &1518276652
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1518276650}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1844901808
+GameObject:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ serializedVersion: 5
+ m_Component:
+ - component: {fileID: 1844901810}
+ - component: {fileID: 1844901809}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &1844901809
+Light:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1844901808}
+ m_Enabled: 1
+ serializedVersion: 8
+ m_Type: 1
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_Lightmapping: 4
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &1844901810
+Transform:
+ m_ObjectHideFlags: 0
+ m_PrefabParentObject: {fileID: 0}
+ m_PrefabInternal: {fileID: 0}
+ m_GameObject: {fileID: 1844901808}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
diff --git a/game/Assets/PathCreator/Examples/Scenes/Path as Prefab.unity.meta b/game/Assets/PathCreator/Examples/Scenes/Path as Prefab.unity.meta
new file mode 100644
index 0000000..0b21ff1
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes/Path as Prefab.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7c3960531f0fd44beaacc5037d708071
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scenes/Road.unity b/game/Assets/PathCreator/Examples/Scenes/Road.unity
new file mode 100644
index 0000000..b9e3831
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes/Road.unity
@@ -0,0 +1,678 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.44657892, g: 0.4964127, b: 0.5748172, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 11
+ m_GIWorkflowMode: 0
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 1
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 500
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 500
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 2
+ m_PVRDenoiserTypeDirect: 0
+ m_PVRDenoiserTypeIndirect: 0
+ m_PVRDenoiserTypeAO: 0
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 0
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ShowResolutionOverlay: 1
+ m_ExportTrainingData: 0
+ m_LightingDataAsset: {fileID: 0}
+ m_UseShadowmask: 1
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &1073702040
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1073702042}
+ - component: {fileID: 1073702041}
+ - component: {fileID: 1073702043}
+ m_Layer: 0
+ m_Name: Road Creator
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1073702041
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1073702040}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 8e5ac92bc18f545cc84cd886ece82b4d, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ editorData:
+ _bezierPath:
+ points:
+ - {x: -3.2247634, y: 0.8263334, z: 2.3792875}
+ - {x: -1.283143, y: 0.23846622, z: 3.1646647}
+ - {x: 0.6584772, y: -0.34940097, z: 3.950042}
+ - {x: 2.3595712, y: -0.7624575, z: 2.901955}
+ - {x: 3.6594722, y: -1.0780971, z: 2.1010528}
+ - {x: 4.583452, y: -1.0509282, z: 0.2846942}
+ - {x: 4.092701, y: -1.0053874, z: -1.1944623}
+ - {x: 3.579156, y: -0.95773137, z: -2.7423213}
+ - {x: 1.7052363, y: -0.72001815, z: -3.5153677}
+ - {x: 0.08291578, y: -0.54737484, z: -3.5271394}
+ - {x: -1.112274, y: -0.42018574, z: -3.5358117}
+ - {x: -2.006318, y: -0.33657387, z: -2.6937559}
+ - {x: -2.900362, y: -0.252962, z: -1.8517001}
+ isClosed: 0
+ space: 0
+ controlMode: 3
+ autoControlLength: 0.35
+ boundsUpToDate: 0
+ bounds:
+ m_Center: {x: 1.2616136, y: 0.54719853, z: -2.224142}
+ m_Extent: {x: 3.2442577, y: 0.8264315, z: 3.3909774}
+ rotation: {x: 0, y: 0.0023407342, z: 0, w: 0.9999979}
+ scale: {x: 1, y: 1, z: 1}
+ perAnchorNormalsAngle:
+ - 335.08722
+ - 345.02103
+ - 327.71606
+ - 320.15445
+ - 320.15445
+ globalNormalsAngle: 0
+ flipNormals: 0
+ vertexPathUpToDate: 1
+ vertexPathMaxAngleError: 0.3
+ vertexPathMinVertexSpacing: 0
+ showTransformTool: 1
+ showPathBounds: 0
+ showPerSegmentBounds: 0
+ displayAnchorPoints: 1
+ displayControlPoints: 1
+ bezierHandleScale: 1
+ globalDisplaySettingsFoldout: 1
+ keepConstantHandleSize: 1
+ showNormalsInVertexMode: 0
+ showBezierPathInVertexMode: 0
+ showDisplayOptions: 0
+ showPathOptions: 1
+ showVertexPathDisplayOptions: 0
+ showVertexPathOptions: 1
+ showNormals: 1
+ showNormalsHelpInfo: 0
+ tabIndex: 0
+ initialized: 1
+--- !u!4 &1073702042
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1073702040}
+ m_LocalRotation: {x: 0.067577064, y: -0, z: -0, w: 0.99771404}
+ m_LocalPosition: {x: 1.86, y: 0.54729664, z: 2.44}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 7.7500005, y: 0, z: 0}
+--- !u!114 &1073702043
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1073702040}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: b275c3b78f8717c4cbc60f74a3247f67, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ pathCreator: {fileID: 1073702041}
+ autoUpdate: 1
+ roadWidth: 1
+ thickness: 0.127
+ flattenSurface: 0
+ roadMaterial: {fileID: 2100000, guid: b5df4735192845740bd11076dc9cdc99, type: 2}
+ undersideMaterial: {fileID: 2100000, guid: c1d8d882244c5344fa86a8fd23246f81, type: 2}
+ textureTiling: 8
+ meshHolder: {fileID: 1646890433}
+--- !u!1 &1646890433
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1646890436}
+ - component: {fileID: 1646890435}
+ - component: {fileID: 1646890434}
+ m_Layer: 0
+ m_Name: Road Mesh Holder
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!23 &1646890434
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1646890433}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: b5df4735192845740bd11076dc9cdc99, type: 2}
+ - {fileID: 2100000, guid: c1d8d882244c5344fa86a8fd23246f81, type: 2}
+ - {fileID: 2100000, guid: c1d8d882244c5344fa86a8fd23246f81, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!33 &1646890435
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1646890433}
+ m_Mesh: {fileID: 1712268210}
+--- !u!4 &1646890436
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1646890433}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!43 &1712268210
+Mesh:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ serializedVersion: 10
+ m_SubMeshes:
+ - serializedVersion: 2
+ firstByte: 0
+ indexCount: 1566
+ topology: 0
+ baseVertex: 0
+ firstVertex: 0
+ vertexCount: 2090
+ localAABB:
+ m_Center: {x: 2.7326906, y: 0.30216432, z: 2.4225621}
+ m_Extent: {x: 4.332015, y: 1.0258145, z: 4.353405}
+ - serializedVersion: 2
+ firstByte: 3132
+ indexCount: 1566
+ topology: 0
+ baseVertex: 0
+ firstVertex: 2
+ vertexCount: 2090
+ localAABB:
+ m_Center: {x: 2.7212982, y: 0.18137878, z: 2.391499}
+ m_Extent: {x: 4.369539, y: 1.0316021, z: 4.398033}
+ - serializedVersion: 2
+ firstByte: 6264
+ indexCount: 3132
+ topology: 0
+ baseVertex: 0
+ firstVertex: 4
+ vertexCount: 2092
+ localAABB:
+ m_Center: {x: 2.7212982, y: 0.23887771, z: 2.391499}
+ m_Extent: {x: 4.369539, y: 1.0891011, z: 4.398033}
+ m_Shapes:
+ vertices: []
+ shapes: []
+ channels: []
+ fullWeights: []
+ m_BindPose: []
+ m_BoneNameHashes:
+ m_RootBoneNameHash: 0
+ m_BonesAABB: []
+ m_VariableBoneCountWeights:
+ m_Data:
+ m_MeshCompression: 0
+ m_IsReadable: 1
+ m_KeepVertices: 0
+ m_KeepIndices: 0
+ m_IndexFormat: 0
+ m_IndexBuffer: 0000080001000100080009000800100009000900100011001000180011001100180019001800200019001900200021002000280021002100280029002800300029002900300031003000380031003100380039003800400039003900400041004000480041004100480049004800500049004900500051005000580051005100580059005800600059005900600061006000680061006100680069006800700069006900700071007000780071007100780079007800800079007900800081008000880081008100880089008800900089008900900091009000980091009100980099009800a00099009900a000a100a000a800a100a100a800a900a800b000a900a900b000b100b000b800b100b100b800b900b800c000b900b900c000c100c000c800c100c100c800c900c800d000c900c900d000d100d000d800d100d100d800d900d800e000d900d900e000e100e000e800e100e100e800e900e800f000e900e900f000f100f000f800f100f100f800f900f8000001f900f900000101010001080101010101080109010801100109010901100111011001180111011101180119011801200119011901200121012001280121012101280129012801300129012901300131013001380131013101380139013801400139013901400141014001480141014101480149014801500149014901500151015001580151015101580159015801600159015901600161016001680161016101680169016801700169016901700171017001780171017101780179017801800179017901800181018001880181018101880189018801900189018901900191019001980191019101980199019801a00199019901a001a101a001a801a101a101a801a901a801b001a901a901b001b101b001b801b101b101b801b901b801c001b901b901c001c101c001c801c101c101c801c901c801d001c901c901d001d101d001d801d101d101d801d901d801e001d901d901e001e101e001e801e101e101e801e901e801f001e901e901f001f101f001f801f101f101f801f901f8010002f901f901000201020002080201020102080209020802100209020902100211021002180211021102180219021802200219021902200221022002280221022102280229022802300229022902300231023002380231023102380239023802400239023902400241024002480241024102480249024802500249024902500251025002580251025102580259025802600259025902600261026002680261026102680269026802700269026902700271027002780271027102780279027802800279027902800281028002880281028102880289028802900289028902900291029002980291029102980299029802a00299029902a002a102a002a802a102a102a802a902a802b002a902a902b002b102b002b802b102b102b802b902b802c002b902b902c002c102c002c802c102c102c802c902c802d002c902c902d002d102d002d802d102d102d802d902d802e002d902d902e002e102e002e802e102e102e802e902e802f002e902e902f002f102f002f802f102f102f802f902f8020003f902f902000301030003080301030103080309030803100309030903100311031003180311031103180319031803200319031903200321032003280321032103280329032803300329032903300331033003380331033103380339033803400339033903400341034003480341034103480349034803500349034903500351035003580351035103580359035803600359035903600361036003680361036103680369036803700369036903700371037003780371037103780379037803800379037903800381038003880381038103880389038803900389038903900391039003980391039103980399039803a00399039903a003a103a003a803a103a103a803a903a803b003a903a903b003b103b003b803b103b103b803b903b803c003b903b903c003c103c003c803c103c103c803c903c803d003c903c903d003d103d003d803d103d103d803d903d803e003d903d903e003e103e003e803e103e103e803e903e803f003e903e903f003f103f003f803f103f103f803f903f8030004f903f903000401040004080401040104080409040804100409040904100411041004180411041104180419041804200419041904200421042004280421042104280429042804300429042904300431043004380431043104380439043804400439043904400441044004480441044104480449044804500449044904500451045004580451045104580459045804600459045904600461046004680461046104680469046804700469046904700471047004780471047104780479047804800479047904800481048004880481048104880489048804900489048904900491049004980491049104980499049804a00499049904a004a104a004a804a104a104a804a904a804b004a904a904b004b104b004b804b104b104b804b904b804c004b904b904c004c104c004c804c104c104c804c904c804d004c904c904d004d104d004d804d104d104d804d904d804e004d904d904e004e104e004e804e104e104e804e904e804f004e904e904f004f104f004f804f104f104f804f904f8040005f904f904000501050005080501050105080509050805100509050905100511051005180511051105180519051805200519051905200521052005280521052105280529052805300529052905300531053005380531053105380539053805400539053905400541054005480541054105480549054805500549054905500551055005580551055105580559055805600559055905600561056005680561056105680569056805700569056905700571057005780571057105780579057805800579057905800581058005880581058105880589058805900589058905900591059005980591059105980599059805a00599059905a005a105a005a805a105a105a805a905a805b005a905a905b005b105b005b805b105b105b805b905b805c005b905b905c005c105c005c805c105c105c805c905c805d005c905c905d005d105d005d805d105d105d805d905d805e005d905d905e005e105e005e805e105e105e805e905e805f005e905e905f005f105f005f805f105f105f805f905f8050006f905f905000601060006080601060106080609060806100609060906100611061006180611061106180619061806200619061906200621062006280621062106280629062806300629062906300631063006380631063106380639063806400639063906400641064006480641064106480649064806500649064906500651065006580651065106580659065806600659065906600661066006680661066106680669066806700669066906700671067006780671067106780679067806800679067906800681068006880681068106880689068806900689068906900691069006980691069106980699069806a00699069906a006a106a006a806a106a106a806a906a806b006a906a906b006b106b006b806b106b106b806b906b806c006b906b906c006c106c006c806c106c106c806c906c806d006c906c906d006d106d006d806d106d106d806d906d806e006d906d906e006e106e006e806e106e106e806e906e806f006e906e906f006f106f006f806f106f106f806f906f8060007f906f906000701070007080701070107080709070807100709070907100711071007180711071107180719071807200719071907200721072007280721072107280729072807300729072907300731073007380731073107380739073807400739073907400741074007480741074107480749074807500749074907500751075007580751075107580759075807600759075907600761076007680761076107680769076807700769076907700771077007780771077107780779077807800779077907800781078007880781078107880789078807900789078907900791079007980791079107980799079807a00799079907a007a107a007a807a107a107a807a907a807b007a907a907b007b107b007b807b107b107b807b907b807c007b907b907c007c107c007c807c107c107c807c907c807d007c907c907d007d107d007d807d107d107d807d907d807e007d907d907e007e107e007e807e107e107e807e907e807f007e907e907f007f107f007f807f107f107f807f907f8070008f907f907000801080008080801080108080809080808100809080908100811081008180811081108180819081808200819081908200821082008280821082108280829080b000a00030003000a000200130012000b000b0012000a001b001a00130013001a001200230022001b001b0022001a002b002a00230023002a002200330032002b002b0032002a003b003a00330033003a003200430042003b003b0042003a004b004a00430043004a004200530052004b004b0052004a005b005a00530053005a005200630062005b005b0062005a006b006a00630063006a006200730072006b006b0072006a007b007a00730073007a007200830082007b007b0082007a008b008a00830083008a008200930092008b008b0092008a009b009a00930093009a009200a300a2009b009b00a2009a00ab00aa00a300a300aa00a200b300b200ab00ab00b200aa00bb00ba00b300b300ba00b200c300c200bb00bb00c200ba00cb00ca00c300c300ca00c200d300d200cb00cb00d200ca00db00da00d300d300da00d200e300e200db00db00e200da00eb00ea00e300e300ea00e200f300f200eb00eb00f200ea00fb00fa00f300f300fa00f20003010201fb00fb000201fa000b010a01030103010a010201130112010b010b0112010a011b011a01130113011a011201230122011b011b0122011a012b012a01230123012a012201330132012b012b0132012a013b013a01330133013a013201430142013b013b0142013a014b014a01430143014a014201530152014b014b0152014a015b015a01530153015a015201630162015b015b0162015a016b016a01630163016a016201730172016b016b0172016a017b017a01730173017a017201830182017b017b0182017a018b018a01830183018a018201930192018b018b0192018a019b019a01930193019a019201a301a2019b019b01a2019a01ab01aa01a301a301aa01a201b301b201ab01ab01b201aa01bb01ba01b301b301ba01b201c301c201bb01bb01c201ba01cb01ca01c301c301ca01c201d301d201cb01cb01d201ca01db01da01d301d301da01d201e301e201db01db01e201da01eb01ea01e301e301ea01e201f301f201eb01eb01f201ea01fb01fa01f301f301fa01f20103020202fb01fb010202fa010b020a02030203020a020202130212020b020b0212020a021b021a02130213021a021202230222021b021b0222021a022b022a02230223022a022202330232022b022b0232022a023b023a02330233023a023202430242023b023b0242023a024b024a02430243024a024202530252024b024b0252024a025b025a02530253025a025202630262025b025b0262025a026b026a02630263026a026202730272026b026b0272026a027b027a02730273027a027202830282027b027b0282027a028b028a02830283028a028202930292028b028b0292028a029b029a02930293029a029202a302a2029b029b02a2029a02ab02aa02a302a302aa02a202b302b202ab02ab02b202aa02bb02ba02b302b302ba02b202c302c202bb02bb02c202ba02cb02ca02c302c302ca02c202d302d202cb02cb02d202ca02db02da02d302d302da02d202e302e202db02db02e202da02eb02ea02e302e302ea02e202f302f202eb02eb02f202ea02fb02fa02f302f302fa02f20203030203fb02fb020203fa020b030a03030303030a030203130312030b030b0312030a031b031a03130313031a031203230322031b031b0322031a032b032a03230323032a032203330332032b032b0332032a033b033a03330333033a033203430342033b033b0342033a034b034a03430343034a034203530352034b034b0352034a035b035a03530353035a035203630362035b035b0362035a036b036a03630363036a036203730372036b036b0372036a037b037a03730373037a037203830382037b037b0382037a038b038a03830383038a038203930392038b038b0392038a039b039a03930393039a039203a303a2039b039b03a2039a03ab03aa03a303a303aa03a203b303b203ab03ab03b203aa03bb03ba03b303b303ba03b203c303c203bb03bb03c203ba03cb03ca03c303c303ca03c203d303d203cb03cb03d203ca03db03da03d303d303da03d203e303e203db03db03e203da03eb03ea03e303e303ea03e203f303f203eb03eb03f203ea03fb03fa03f303f303fa03f20303040204fb03fb030204fa030b040a04030403040a040204130412040b040b0412040a041b041a04130413041a041204230422041b041b0422041a042b042a04230423042a042204330432042b042b0432042a043b043a04330433043a043204430442043b043b0442043a044b044a04430443044a044204530452044b044b0452044a045b045a04530453045a045204630462045b045b0462045a046b046a04630463046a046204730472046b046b0472046a047b047a04730473047a047204830482047b047b0482047a048b048a04830483048a048204930492048b048b0492048a049b049a04930493049a049204a304a2049b049b04a2049a04ab04aa04a304a304aa04a204b304b204ab04ab04b204aa04bb04ba04b304b304ba04b204c304c204bb04bb04c204ba04cb04ca04c304c304ca04c204d304d204cb04cb04d204ca04db04da04d304d304da04d204e304e204db04db04e204da04eb04ea04e304e304ea04e204f304f204eb04eb04f204ea04fb04fa04f304f304fa04f20403050205fb04fb040205fa040b050a05030503050a050205130512050b050b0512050a051b051a05130513051a051205230522051b051b0522051a052b052a05230523052a052205330532052b052b0532052a053b053a05330533053a053205430542053b053b0542053a054b054a05430543054a054205530552054b054b0552054a055b055a05530553055a055205630562055b055b0562055a056b056a05630563056a056205730572056b056b0572056a057b057a05730573057a057205830582057b057b0582057a058b058a05830583058a058205930592058b058b0592058a059b059a05930593059a059205a305a2059b059b05a2059a05ab05aa05a305a305aa05a205b305b205ab05ab05b205aa05bb05ba05b305b305ba05b205c305c205bb05bb05c205ba05cb05ca05c305c305ca05c205d305d205cb05cb05d205ca05db05da05d305d305da05d205e305e205db05db05e205da05eb05ea05e305e305ea05e205f305f205eb05eb05f205ea05fb05fa05f305f305fa05f20503060206fb05fb050206fa050b060a06030603060a060206130612060b060b0612060a061b061a06130613061a061206230622061b061b0622061a062b062a06230623062a062206330632062b062b0632062a063b063a06330633063a063206430642063b063b0642063a064b064a06430643064a064206530652064b064b0652064a065b065a06530653065a065206630662065b065b0662065a066b066a06630663066a066206730672066b066b0672066a067b067a06730673067a067206830682067b067b0682067a068b068a06830683068a068206930692068b068b0692068a069b069a06930693069a069206a306a2069b069b06a2069a06ab06aa06a306a306aa06a206b306b206ab06ab06b206aa06bb06ba06b306b306ba06b206c306c206bb06bb06c206ba06cb06ca06c306c306ca06c206d306d206cb06cb06d206ca06db06da06d306d306da06d206e306e206db06db06e206da06eb06ea06e306e306ea06e206f306f206eb06eb06f206ea06fb06fa06f306f306fa06f20603070207fb06fb060207fa060b070a07030703070a070207130712070b070b0712070a071b071a07130713071a071207230722071b071b0722071a072b072a07230723072a072207330732072b072b0732072a073b073a07330733073a073207430742073b073b0742073a074b074a07430743074a074207530752074b074b0752074a075b075a07530753075a075207630762075b075b0762075a076b076a07630763076a076207730772076b076b0772076a077b077a07730773077a077207830782077b077b0782077a078b078a07830783078a078207930792078b078b0792078a079b079a07930793079a079207a307a2079b079b07a2079a07ab07aa07a307a307aa07a207b307b207ab07ab07b207aa07bb07ba07b307b307ba07b207c307c207bb07bb07c207ba07cb07ca07c307c307ca07c207d307d207cb07cb07d207ca07db07da07d307d307da07d207e307e207db07db07e207da07eb07ea07e307e307ea07e207f307f207eb07eb07f207ea07fb07fa07f307f307fa07f20703080208fb07fb070208fa070b080a08030803080a080208130812080b080b0812080a081b081a08130813081a081208230822081b081b0822081a082b082a08230823082a082208040006000e000c0004000e0005000f0007000d000f0005000c000e00160014000c0016000d0017000f00150017000d00140016001e001c0014001e0015001f0017001d001f0015001c001e00260024001c0026001d0027001f00250027001d00240026002e002c0024002e0025002f0027002d002f0025002c002e00360034002c0036002d0037002f00350037002d00340036003e003c0034003e0035003f0037003d003f0035003c003e00460044003c0046003d0047003f00450047003d00440046004e004c0044004e0045004f0047004d004f0045004c004e00560054004c0056004d0057004f00550057004d00540056005e005c0054005e0055005f0057005d005f0055005c005e00660064005c0066005d0067005f00650067005d00640066006e006c0064006e0065006f0067006d006f0065006c006e00760074006c0076006d0077006f00750077006d00740076007e007c0074007e0075007f0077007d007f0075007c007e00860084007c0086007d0087007f00850087007d00840086008e008c0084008e0085008f0087008d008f0085008c008e00960094008c0096008d0097008f00950097008d00940096009e009c0094009e0095009f0097009d009f0095009c009e00a600a4009c00a6009d00a7009f00a500a7009d00a400a600ae00ac00a400ae00a500af00a700ad00af00a500ac00ae00b600b400ac00b600ad00b700af00b500b700ad00b400b600be00bc00b400be00b500bf00b700bd00bf00b500bc00be00c600c400bc00c600bd00c700bf00c500c700bd00c400c600ce00cc00c400ce00c500cf00c700cd00cf00c500cc00ce00d600d400cc00d600cd00d700cf00d500d700cd00d400d600de00dc00d400de00d500df00d700dd00df00d500dc00de00e600e400dc00e600dd00e700df00e500e700dd00e400e600ee00ec00e400ee00e500ef00e700ed00ef00e500ec00ee00f600f400ec00f600ed00f700ef00f500f700ed00f400f600fe00fc00f400fe00f500ff00f700fd00ff00f500fc00fe0006010401fc000601fd000701ff0005010701fd00040106010e010c0104010e0105010f0107010d010f0105010c010e01160114010c0116010d0117010f01150117010d01140116011e011c0114011e0115011f0117011d011f0115011c011e01260124011c0126011d0127011f01250127011d01240126012e012c0124012e0125012f0127012d012f0125012c012e01360134012c0136012d0137012f01350137012d01340136013e013c0134013e0135013f0137013d013f0135013c013e01460144013c0146013d0147013f01450147013d01440146014e014c0144014e0145014f0147014d014f0145014c014e01560154014c0156014d0157014f01550157014d01540156015e015c0154015e0155015f0157015d015f0155015c015e01660164015c0166015d0167015f01650167015d01640166016e016c0164016e0165016f0167016d016f0165016c016e01760174016c0176016d0177016f01750177016d01740176017e017c0174017e0175017f0177017d017f0175017c017e01860184017c0186017d0187017f01850187017d01840186018e018c0184018e0185018f0187018d018f0185018c018e01960194018c0196018d0197018f01950197018d01940196019e019c0194019e0195019f0197019d019f0195019c019e01a601a4019c01a6019d01a7019f01a501a7019d01a401a601ae01ac01a401ae01a501af01a701ad01af01a501ac01ae01b601b401ac01b601ad01b701af01b501b701ad01b401b601be01bc01b401be01b501bf01b701bd01bf01b501bc01be01c601c401bc01c601bd01c701bf01c501c701bd01c401c601ce01cc01c401ce01c501cf01c701cd01cf01c501cc01ce01d601d401cc01d601cd01d701cf01d501d701cd01d401d601de01dc01d401de01d501df01d701dd01df01d501dc01de01e601e401dc01e601dd01e701df01e501e701dd01e401e601ee01ec01e401ee01e501ef01e701ed01ef01e501ec01ee01f601f401ec01f601ed01f701ef01f501f701ed01f401f601fe01fc01f401fe01f501ff01f701fd01ff01f501fc01fe0106020402fc010602fd010702ff0105020702fd01040206020e020c0204020e0205020f0207020d020f0205020c020e02160214020c0216020d0217020f02150217020d02140216021e021c0214021e0215021f0217021d021f0215021c021e02260224021c0226021d0227021f02250227021d02240226022e022c0224022e0225022f0227022d022f0225022c022e02360234022c0236022d0237022f02350237022d02340236023e023c0234023e0235023f0237023d023f0235023c023e02460244023c0246023d0247023f02450247023d02440246024e024c0244024e0245024f0247024d024f0245024c024e02560254024c0256024d0257024f02550257024d02540256025e025c0254025e0255025f0257025d025f0255025c025e02660264025c0266025d0267025f02650267025d02640266026e026c0264026e0265026f0267026d026f0265026c026e02760274026c0276026d0277026f02750277026d02740276027e027c0274027e0275027f0277027d027f0275027c027e02860284027c0286027d0287027f02850287027d02840286028e028c0284028e0285028f0287028d028f0285028c028e02960294028c0296028d0297028f02950297028d02940296029e029c0294029e0295029f0297029d029f0295029c029e02a602a4029c02a6029d02a7029f02a502a7029d02a402a602ae02ac02a402ae02a502af02a702ad02af02a502ac02ae02b602b402ac02b602ad02b702af02b502b702ad02b402b602be02bc02b402be02b502bf02b702bd02bf02b502bc02be02c602c402bc02c602bd02c702bf02c502c702bd02c402c602ce02cc02c402ce02c502cf02c702cd02cf02c502cc02ce02d602d402cc02d602cd02d702cf02d502d702cd02d402d602de02dc02d402de02d502df02d702dd02df02d502dc02de02e602e402dc02e602dd02e702df02e502e702dd02e402e602ee02ec02e402ee02e502ef02e702ed02ef02e502ec02ee02f602f402ec02f602ed02f702ef02f502f702ed02f402f602fe02fc02f402fe02f502ff02f702fd02ff02f502fc02fe0206030403fc020603fd020703ff0205030703fd02040306030e030c0304030e0305030f0307030d030f0305030c030e03160314030c0316030d0317030f03150317030d03140316031e031c0314031e0315031f0317031d031f0315031c031e03260324031c0326031d0327031f03250327031d03240326032e032c0324032e0325032f0327032d032f0325032c032e03360334032c0336032d0337032f03350337032d03340336033e033c0334033e0335033f0337033d033f0335033c033e03460344033c0346033d0347033f03450347033d03440346034e034c0344034e0345034f0347034d034f0345034c034e03560354034c0356034d0357034f03550357034d03540356035e035c0354035e0355035f0357035d035f0355035c035e03660364035c0366035d0367035f03650367035d03640366036e036c0364036e0365036f0367036d036f0365036c036e03760374036c0376036d0377036f03750377036d03740376037e037c0374037e0375037f0377037d037f0375037c037e03860384037c0386037d0387037f03850387037d03840386038e038c0384038e0385038f0387038d038f0385038c038e03960394038c0396038d0397038f03950397038d03940396039e039c0394039e0395039f0397039d039f0395039c039e03a603a4039c03a6039d03a7039f03a503a7039d03a403a603ae03ac03a403ae03a503af03a703ad03af03a503ac03ae03b603b403ac03b603ad03b703af03b503b703ad03b403b603be03bc03b403be03b503bf03b703bd03bf03b503bc03be03c603c403bc03c603bd03c703bf03c503c703bd03c403c603ce03cc03c403ce03c503cf03c703cd03cf03c503cc03ce03d603d403cc03d603cd03d703cf03d503d703cd03d403d603de03dc03d403de03d503df03d703dd03df03d503dc03de03e603e403dc03e603dd03e703df03e503e703dd03e403e603ee03ec03e403ee03e503ef03e703ed03ef03e503ec03ee03f603f403ec03f603ed03f703ef03f503f703ed03f403f603fe03fc03f403fe03f503ff03f703fd03ff03f503fc03fe0306040404fc030604fd030704ff0305040704fd03040406040e040c0404040e0405040f0407040d040f0405040c040e04160414040c0416040d0417040f04150417040d04140416041e041c0414041e0415041f0417041d041f0415041c041e04260424041c0426041d0427041f04250427041d04240426042e042c0424042e0425042f0427042d042f0425042c042e04360434042c0436042d0437042f04350437042d04340436043e043c0434043e0435043f0437043d043f0435043c043e04460444043c0446043d0447043f04450447043d04440446044e044c0444044e0445044f0447044d044f0445044c044e04560454044c0456044d0457044f04550457044d04540456045e045c0454045e0455045f0457045d045f0455045c045e04660464045c0466045d0467045f04650467045d04640466046e046c0464046e0465046f0467046d046f0465046c046e04760474046c0476046d0477046f04750477046d04740476047e047c0474047e0475047f0477047d047f0475047c047e04860484047c0486047d0487047f04850487047d04840486048e048c0484048e0485048f0487048d048f0485048c048e04960494048c0496048d0497048f04950497048d04940496049e049c0494049e0495049f0497049d049f0495049c049e04a604a4049c04a6049d04a7049f04a504a7049d04a404a604ae04ac04a404ae04a504af04a704ad04af04a504ac04ae04b604b404ac04b604ad04b704af04b504b704ad04b404b604be04bc04b404be04b504bf04b704bd04bf04b504bc04be04c604c404bc04c604bd04c704bf04c504c704bd04c404c604ce04cc04c404ce04c504cf04c704cd04cf04c504cc04ce04d604d404cc04d604cd04d704cf04d504d704cd04d404d604de04dc04d404de04d504df04d704dd04df04d504dc04de04e604e404dc04e604dd04e704df04e504e704dd04e404e604ee04ec04e404ee04e504ef04e704ed04ef04e504ec04ee04f604f404ec04f604ed04f704ef04f504f704ed04f404f604fe04fc04f404fe04f504ff04f704fd04ff04f504fc04fe0406050405fc040605fd040705ff0405050705fd04040506050e050c0504050e0505050f0507050d050f0505050c050e05160514050c0516050d0517050f05150517050d05140516051e051c0514051e0515051f0517051d051f0515051c051e05260524051c0526051d0527051f05250527051d05240526052e052c0524052e0525052f0527052d052f0525052c052e05360534052c0536052d0537052f05350537052d05340536053e053c0534053e0535053f0537053d053f0535053c053e05460544053c0546053d0547053f05450547053d05440546054e054c0544054e0545054f0547054d054f0545054c054e05560554054c0556054d0557054f05550557054d05540556055e055c0554055e0555055f0557055d055f0555055c055e05660564055c0566055d0567055f05650567055d05640566056e056c0564056e0565056f0567056d056f0565056c056e05760574056c0576056d0577056f05750577056d05740576057e057c0574057e0575057f0577057d057f0575057c057e05860584057c0586057d0587057f05850587057d05840586058e058c0584058e0585058f0587058d058f0585058c058e05960594058c0596058d0597058f05950597058d05940596059e059c0594059e0595059f0597059d059f0595059c059e05a605a4059c05a6059d05a7059f05a505a7059d05a405a605ae05ac05a405ae05a505af05a705ad05af05a505ac05ae05b605b405ac05b605ad05b705af05b505b705ad05b405b605be05bc05b405be05b505bf05b705bd05bf05b505bc05be05c605c405bc05c605bd05c705bf05c505c705bd05c405c605ce05cc05c405ce05c505cf05c705cd05cf05c505cc05ce05d605d405cc05d605cd05d705cf05d505d705cd05d405d605de05dc05d405de05d505df05d705dd05df05d505dc05de05e605e405dc05e605dd05e705df05e505e705dd05e405e605ee05ec05e405ee05e505ef05e705ed05ef05e505ec05ee05f605f405ec05f605ed05f705ef05f505f705ed05f405f605fe05fc05f405fe05f505ff05f705fd05ff05f505fc05fe0506060406fc050606fd050706ff0505060706fd05040606060e060c0604060e0605060f0607060d060f0605060c060e06160614060c0616060d0617060f06150617060d06140616061e061c0614061e0615061f0617061d061f0615061c061e06260624061c0626061d0627061f06250627061d06240626062e062c0624062e0625062f0627062d062f0625062c062e06360634062c0636062d0637062f06350637062d06340636063e063c0634063e0635063f0637063d063f0635063c063e06460644063c0646063d0647063f06450647063d06440646064e064c0644064e0645064f0647064d064f0645064c064e06560654064c0656064d0657064f06550657064d06540656065e065c0654065e0655065f0657065d065f0655065c065e06660664065c0666065d0667065f06650667065d06640666066e066c0664066e0665066f0667066d066f0665066c066e06760674066c0676066d0677066f06750677066d06740676067e067c0674067e0675067f0677067d067f0675067c067e06860684067c0686067d0687067f06850687067d06840686068e068c0684068e0685068f0687068d068f0685068c068e06960694068c0696068d0697068f06950697068d06940696069e069c0694069e0695069f0697069d069f0695069c069e06a606a4069c06a6069d06a7069f06a506a7069d06a406a606ae06ac06a406ae06a506af06a706ad06af06a506ac06ae06b606b406ac06b606ad06b706af06b506b706ad06b406b606be06bc06b406be06b506bf06b706bd06bf06b506bc06be06c606c406bc06c606bd06c706bf06c506c706bd06c406c606ce06cc06c406ce06c506cf06c706cd06cf06c506cc06ce06d606d406cc06d606cd06d706cf06d506d706cd06d406d606de06dc06d406de06d506df06d706dd06df06d506dc06de06e606e406dc06e606dd06e706df06e506e706dd06e406e606ee06ec06e406ee06e506ef06e706ed06ef06e506ec06ee06f606f406ec06f606ed06f706ef06f506f706ed06f406f606fe06fc06f406fe06f506ff06f706fd06ff06f506fc06fe0606070407fc060607fd060707ff0605070707fd06040706070e070c0704070e0705070f0707070d070f0705070c070e07160714070c0716070d0717070f07150717070d07140716071e071c0714071e0715071f0717071d071f0715071c071e07260724071c0726071d0727071f07250727071d07240726072e072c0724072e0725072f0727072d072f0725072c072e07360734072c0736072d0737072f07350737072d07340736073e073c0734073e0735073f0737073d073f0735073c073e07460744073c0746073d0747073f07450747073d07440746074e074c0744074e0745074f0747074d074f0745074c074e07560754074c0756074d0757074f07550757074d07540756075e075c0754075e0755075f0757075d075f0755075c075e07660764075c0766075d0767075f07650767075d07640766076e076c0764076e0765076f0767076d076f0765076c076e07760774076c0776076d0777076f07750777076d07740776077e077c0774077e0775077f0777077d077f0775077c077e07860784077c0786077d0787077f07850787077d07840786078e078c0784078e0785078f0787078d078f0785078c078e07960794078c0796078d0797078f07950797078d07940796079e079c0794079e0795079f0797079d079f0795079c079e07a607a4079c07a6079d07a7079f07a507a7079d07a407a607ae07ac07a407ae07a507af07a707ad07af07a507ac07ae07b607b407ac07b607ad07b707af07b507b707ad07b407b607be07bc07b407be07b507bf07b707bd07bf07b507bc07be07c607c407bc07c607bd07c707bf07c507c707bd07c407c607ce07cc07c407ce07c507cf07c707cd07cf07c507cc07ce07d607d407cc07d607cd07d707cf07d507d707cd07d407d607de07dc07d407de07d507df07d707dd07df07d507dc07de07e607e407dc07e607dd07e707df07e507e707dd07e407e607ee07ec07e407ee07e507ef07e707ed07ef07e507ec07ee07f607f407ec07f607ed07f707ef07f507f707ed07f407f607fe07fc07f407fe07f507ff07f707fd07ff07f507fc07fe0706080408fc070608fd070708ff0705080708fd07040806080e080c0804080e0805080f0807080d080f0805080c080e08160814080c0816080d0817080f08150817080d08140816081e081c0814081e0815081f0817081d081f0815081c081e08260824081c0826081d0827081f08250827081d08240826082e082c0824082e0825082f0827082d082f082508
+ m_VertexData:
+ serializedVersion: 3
+ m_VertexCount: 2096
+ m_Channels:
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 3
+ - stream: 0
+ offset: 12
+ format: 0
+ dimension: 3
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ - stream: 0
+ offset: 24
+ format: 0
+ dimension: 2
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ - stream: 0
+ offset: 0
+ format: 0
+ dimension: 0
+ m_DataSize: 67072
+ _typelessdata: acb6ccbf36fba93f97d9ba401c34c53e8ace673fb26536be000000000000000076aa90bf4134433f66a67e401c34c53e8ace673fb26536be0000803f000000008bf9d2bff6429b3fe892bb401c34c5be8ace67bfb265363e000000000000000055ed96bfc0c3253f840c80401c34c5be8ace67bfb265363e0000000000000000acb6ccbf36fba93f97d9ba40d53070be2ac2903e8e196e3f000000000000000076aa90bf4134433f66a67e40d530703e2ac290be8e196ebf00000000000000008bf9d2bff6429b3fe892bb40d53070be2ac2903e8e196e3f000000000000000055ed96bfc0c3253f840c8040d530703e2ac290be8e196ebf0000000000000000605a82bf41558f3f4f83c14075a9c33e1c34683f49f534be000000003eb2083d65370fbfda21103fb5d2854075a9c33e1c34683f49f534be0000803f3eb2083db79088bf8e96803f293bc24075a9c3be1c3468bf49f5343e000000000000000013a41bbfe648e53e8f8a864075a9c3be1c3468bf49f5343e0000000000000000605a82bf41558f3f4f83c140b4fa6abea9888e3e6bc26e3f000000000000000065370fbfda21103fb5d28540b4fa6a3ea9888ebe6bc26ebf0000000000000000b79088bf8e96803f293bc240b4fa6abea9888e3e6bc26e3f000000000000000013a41bbfe648e53e8f8a8640b4fa6a3ea9888ebe6bc26ebf00000000000000001dd241bf613c833f1370c440ee02c23ee19d683f329233be00000000ff27453d0e809ebeeb88f43ec5928840ee02c23ee19d683f329233be0000803fff27453df7234ebfeced683f8526c540ee02c2bee19d68bf3292333e0000000000000000c123b7be4073b93e37498940ee02c2bee19d68bf3292333e00000000000000001dd241bf613c833f1370c4402b2465be4d348c3e39756f3f00000000000000000e809ebeeb88f43ec59288402b24653e4d348cbe39756fbf0000000000000000f7234ebfeced683f8526c5402b2465be4d348c3e39756f3f0000000000000000c123b7be4073b93e374989402b24653e4d348cbe39756fbf0000000000000000515a0fbf5726743f2d97c6402760c03e4506693f452532be00000000954c723ddaadfdbdc28bd43e2f8e8a402760c03e4506693f452532be0000803f954c723d93911bbf3f8e563f2c4cc7402760c0be450669bf4525323e0000000000000000f5b32fbe935b993e2e438b402760c0be450669bf4525323e0000000000000000515a0fbf5726743f2d97c6402b495fbe76e0893ef823703f0000000000000000daadfdbdc28bd43e2f8e8a402b495f3e76e089bef82370bf000000000000000093911bbf3f8e563f2c4cc7402b495fbe76e0893ef823703f0000000000000000f5b32fbe935b993e2e438b402b495f3e76e089bef82370bf00000000000000005225b9be43d2613fd4b0c8409774be3e917a693f77e030be00000000059d8f3dcc08763d4a10b53e5c758c409774be3e917a693f77e030be0000803f059d8f3d6855d1be662b443f8964c9409774bebe917a69bf77e0303e00000000000000006820523c2185733e11298d409774bebe917a69bf77e0303e00000000000000005225b9be43d2613fd4b0c8406be657be1e4a873ee1ed703f0000000000000000cc08763d4a10b53e5c758c406be6573e1e4a87bee1ed70bf00000000000000006855d1be662b443f8964c9406be657be1e4a873ee1ed703f00000000000000006820523c2185733e11298d406be6573e1e4a87bee1ed70bf0000000000000000d47c6abe166b553f430fca40c6edbc3e9bdc693fe3522fbe0000000041859e3d34513a3e7bc3a03e51ac8d40c6edbc3e9bdc693fe3522fbe0000803f41859e3dde3c8dbec6b7373f64c1ca40c6edbcbe9bdc69bfe3522f3e00000000000000004c540a3eb6b94a3e725e8e40c6edbcbe9bdc69bfe3522f3e0000000000000000d47c6abe166b553f430fca40046752be5909853eca8b713f000000000000000034513a3e7bc3a03e51ac8d400467523e590985beca8b71bf0000000000000000de3c8dbec6b7373f64c1ca40046752be5909853eca8b713f00000000000000004c540a3eb6b94a3e725e8e400467523e590985beca8b71bf0000000000000000ee39c4bdca06493f2b65cb40aa46bb3e85436a3fe5d22dbe00000000ec5dad3df41c9b3e98ba8c3e25d88e40aa46bb3e85436a3fe5d22dbe0000803fec5dad3d67ae11be68462b3fc615cc40aa46bbbe85436abfe5d22d3e00000000000000003c54833ea873223ec0888f40aa46bbbe85436abfe5d22d3e0000000000000000ee39c4bdca06493f2b65cb406f2b4cbe7ea9823e1834723f0000000000000000f41c9b3e98ba8c3e25d88e406f2b4c3e7ea982be183472bf000000000000000067ae11be68462b3fc615cc406f2b4cbe7ea9823e1834723f00000000000000003c54833ea873223ec0888f406f2b4c3e7ea982be183472bf0000000000000000305c1b3dd2a63c3f83b1cc40d07eb93e49af6a3fb85e2cbe00000000cc25bc3d0299d83e9af3713e05f88f40d07eb93e49af6a3fb85e2cbe0000803fcc25bc3da86904bcc0d81e3fa460cd40d07eb9be49af6abfb85e2c3e00000000000000002f0ac13ea676f53d26a79040d07eb9be49af6abfb85e2c3e0000000000000000305c1b3dd2a63c3f83b1cc407c2d45beec29803ef6e5723f00000000000000000299d83e9af3713e05f88f407c2d453eec2980bef6e572bf0000000000000000a86904bcc0d81e3fa460cd407c2d45beec29803ef6e5723f00000000000000002f0ac13ea676f53d26a790407c2d453eec2980bef6e572bf0000000000000000f661303ec24c303f3bf3cd40cc95b73ed91f6b3fe8f42abe00000000bedbca3daecb0a3ff2094b3e210b9140cc95b73ed91f6b3fe8f42abe0000803fbedbca3d85c0013e6570123feca0ce40cc95b7bed91f6bbfe8f42a3e0000000000000000a446fe3ef930a73dd2b89140cc95b7bed91f6bbfe8f42a3e0000000000000000f661303ec24c303f3bf3cd4062663dbe8a147b3e66a0733f0000000000000000aecb0a3ff2094b3e210b914062663d3e8a147bbe66a073bf000000000000000085c0013e6570123feca0ce4062663dbe8a147b3e66a0733f0000000000000000a446fe3ef930a73dd2b8914062663d3e8a147bbe66a073bf0000000000000000e5ee743ec9d8293f6e91ce40b077b63e4c6d6b3f091229be00000000ad2fd23d630f1a3f11f7383efe8d9140b077b63e4c6d6b3f091229be0000803fad2fd23d2096463e96f20b3f353dcf40b077b6be4c6d6bbf0912293e000000000000000032790e3f86bc823dc5399240b077b6be4c6d6bbf0912293e0000000000000000e5ee743ec9d8293f6e91ce4053a739be0936773ebf0d743f0000000000000000630f1a3f11f7383efe8d914053a7393e093677bebf0d74bf00000000000000002096463e96f20b3f353dcf4053a739be0936773ebf0d743f000000000000000032790e3f86bc823dc539924053a7393e093677bebf0d74bf000000000000000002d29c3e9e66233f8a2ccf406052b53e6fbb6b3fc12f27be00000000bf7ed93dff41293f150e273e620d92406052b53e6fbb6b3fc12f27be0000803fbf7ed93de0ca853e7e76053f67d6cf406052b5be6fbb6bbfc12f273e00000000000000006ebe1d3f56363d3d3fb792406052b5be6fbb6bbfc12f273e000000000000000002d29c3e9e66233f8a2ccf40fbb135be3146733e9e7c743f0000000000000000ff41293f150e273e620d9240fbb1353e314673be9e7c74bf0000000000000000e0ca853e7e76053f67d6cf40fbb135be3146733e9e7c743f00000000000000006ebe1d3f56363d3d3fb79240fbb1353e314673be9e7c74bf00000000000000000441bf3e8ef61c3f6cc4cf40ea25b43e330a6c3f2b4e25be00000000d4c8e03d1a63383fae4f153e38899240ea25b43e330a6c3f2b4e25be0000803fd4c8e03d0a60a83edbf8fd3e5f6cd040ea25b4be330a6cbf2b4e253e00000000000000009df22c3f5c39eb3c2b319340ea25b4be330a6cbf2b4e253e00000000000000000441bf3e8ef61c3f6cc4cf40318531be44456f3eceec743f00000000000000001a63383fae4f153e388992403185313e44456fbeceec74bf00000000000000000a60a83edbf8fd3e5f6cd040318531be44456f3eceec743f00000000000000009df22c3f5c39eb3c2b3193403185313e44456fbeceec74bf0000000000000000b0c4e13ea688163ff158d04049f2b23e99596c3f8c6c23be00000000d40de83d5c72473f35bd033e6701934049f2b23e99596c3f8c6c23be0000803fd40de83dc80acb3ee008f13efbfed04049f2b2be99596cbf8c6c233e000000000000000068153c3fd0c53a3c71a7934049f2b2be99596cbf8c6c233e0000000000000000b0c4e13ea688163ff158d04009202dbeb1326b3e265e753f00000000000000005c72473f35bd033e6701934009202d3eb1326bbe265e75bf0000000000000000c80acb3ee008f13efbfed04009202dbeb1326b3e265e753f000000000000000068153c3fd0c53a3c71a7934009202d3eb1326bbe265e75bf0000000000000000a32e023f1c1d103ff5e9d0408eb7b13ea1a96c3f958a21be00000000a24def3d616f563f64afe43dd77593408eb7b13ea1a96c3f958a21be0000803fa24def3d56cbed3e781de43e158ed1408eb7b1bea1a96cbf958a213e000000000000000069264b3fc039bcbbf71994408eb7b1bea1a96cbf958a213e0000000000000000a32e023f1c1d103ff5e9d0407c8128be5e0e673e77d0753f0000000000000000616f563f64afe43dd77593407c81283e5e0e67be77d075bf000000000000000056cbed3e781de43e158ed1407c8128be5e0e673e77d0753f000000000000000069264b3fc039bcbbf71994407c81283e5e0e67be77d075bf00000000000000008d85133f2cb4093f5377d140bb75b03e3cfa6c3f2ba81fbe000000002588f63db759653fe43fc23d71e69340bb75b03e3cfa6c3f2ba81fbe0000803f2588f63d0551083f1f37d73e8919d240bb75b0be3cfa6cbf2ba81f3e00000000000000002f255a3f0414babca7889440bb75b0be3cfa6cbf2ba81f3e00000000000000008d85133f2cb4093f5377d14055a823be60d8623e8643763f0000000000000000b759653fe43fc23d71e6934055a8233e60d862be864376bf00000000000000000551083f1f37d73e8919d24055a823be60d8623e8643763f00000000000000002f255a3f0414babca788944055a8233e60d862be864376bf00000000000000003ee7243f024e033fe500d240db2caf3e694b6d3fdac41dbe0000000049bdfd3d0631743f142ea03d1f539440db2caf3e694b6d3fdac41dbe0000803f49bdfd3d98c7193f2c56ca3e30a1d240db2cafbe694b6dbfdac41d3e00000000000000006011693f96d221bd6af39440db2cafbe694b6dbfdac41d3e00000000000000003ee7243f024e033fe500d2408e931ebe7e905e3e1ab7763f00000000000000000631743f142ea03d1f5394408e931e3e7e905ebe1ab776bf000000000000000098c7193f2c56ca3e30a1d2408e931ebe7e905e3e1ab7763f00000000000000006011693f96d221bd6af394408e931e3e7e905ebe1ab776bf0000000000000000da53363f92d5f93e8786d240f8dcad3e219d6d3f37e01bbe000000007c76023e6e7a813f24f87c3dc9bb9440f8dcad3e219d6d3f37e01bbe0000803f7c76023e88492b3ff87abd3ee624d340f8dcadbe219d6dbf37e01b3e00000000000000008aea773fa8dc65bd285a9540f8dcadbe219d6dbf37e01b3e0000000000000000da53363f92d5f93e8786d240034219be8d365a3ef72a773f00000000000000006e7a813f24f87c3dc9bb94400342193e8d365abef72a77bf000000000000000088492b3ff87abd3ee624d340034219be8d365a3ef72a773f00000000000000008aea773fa8dc65bd285a95400342193e8d365abef72a77bf000000000000000089cb473f6915ed3e1108d3401786ac3e5fef6d3feaf919be00000000900b063e6ad2883f78573a3d5b2095401786ac3e5fef6d3feaf919be0000803f900b063efdd63c3feca5b03e82a4d3401786acbe5fef6dbfeaf9193e00000000000000002458833f389294bdccbc95401786acbe5fef6dbfeaf9193e000000000000000089cb473f6915ed3e1108d34097b213be7aca553edb9e773f00000000000000006ad2883f78573a3d5b20954097b2133e7aca55bedb9e77bf0000000000000000fdd63c3feca5b03e82a4d34097b213be7aca553edb9e773f00000000000000002458833f389294bdccbc954097b2133e7aca55bedb9e77bf0000000000000000764e593fde5be03e5e85d3404628ab3e1c426e3f6b1118be00000000d99d093e4620903f68fdf03cbe8095404628ab3e1c426e3f6b1118be0000803fd99d093e21704e3f5dd7a33ede1fd4404628abbe1c426ebf6b11183e00000000000000001bb18a3faad2b5bd3e1b96404628abbe1c426ebf6b11183e0000000000000000764e593fde5be03e5e85d3402de40dbe074c513e8012783f00000000000000004620903f68fdf03cbe8095402de40d3e074c51be801278bf000000000000000021704e3f5dd7a33ede1fd4402de40dbe074c513e8012783f00000000000000001bb18a3faad2b5bd3e1b96402de40d3e074c51be801278bf0000000000000000c7dc6a3f73a9d33e46fed34090c3a93e51956e3f932616be00000000502d0d3ec863973fa0c25d3ce0dc954090c3a93e51956e3f932616be0000803f502d0d3e1815603fd00f973ed496d44090c3a9be51956ebf9326163e0000000000000000f1ff913f3aaed6bd6e75964090c3a9be51956ebf9326163e0000000000000000c7dc6a3f73a9d33e46fed34094d507be5ebb4c3e9985783f0000000000000000c863973fa0c25d3ce0dc954094d5073e5ebb4cbe998578bf00000000000000001815603fd00f973ed496d44094d507be5ebb4c3e9985783f0000000000000000f1ff913f3aaed6bd6e75964094d5073e5ebb4cbe998578bf0000000000000000ab767c3f8afec63ea172d4400558a83ef4e86e3fec3814be00000000f0b9103ebe9c9e3f40ec0cbbab3496400558a83ef4e86e3fec3814be0000803ff0b9103e12c6713fa84f8a3e3909d5400558a8bef4e86ebfec38143e00000000000000007244993fea22f7bd43cb96400558a8bef4e86ebfec38143e0000000000000000ab767c3f8afec63ea172d440a48501be6318483ed6f7783f0000000000000000be9c9e3f40ec0cbbab349640a485013e631848bed6f778bf000000000000000012c6713fa84f8a3e3909d540a48501be6318483ed6f7783f00000000000000007244993fea22f7bd43cb9640a485013e631848bed6f778bf00000000000000001f0e873f665bba3e45e2d440ace5a63e033d6f3faf4712be00000000b243143ef5caa53fe87490bc0b889640ace5a63e033d6f3faf4712be0000803fb243143e95c1813f542e7b3ee476d540ace5a6be033d6fbfaf47123e00000000000000006b7ea03f14970bbeaa1c9740ace5a6be033d6fbfaf47123e00000000000000001f0e873f665bba3e45e2d440b5e6f5bdb562433ee668793f0000000000000000f5caa53fe87490bc0b889640b5e6f53db56243bee66879bf000000000000000095c1813f542e7b3ee476d540b5e6f5bdb562433ee668793f00000000000000006b7ea03f14970bbeaa1c9740b5e6f53db56243bee66879bf0000000000000000d9e68f3f9ec0ad3e0a4dd5409d6ca53e70916f3fc85210be0000000095ca173e37eeac3f34d006bdf0d696409d6ca53e70916f3fc85210be0000803f95ca173e47a68a3fe1cd613eacdfd5409d6ca5be70916fbfc852103e0000000000000000a5ada73f68671bbe926997409d6ca5be70916fbfc852103e0000000000000000d9e68f3f9ec0ad3e0a4dd540f43ae8bda59a3e3e6bd8793f000000000000000037eeac3f34d006bdf0d69640f43ae83da59a3ebe6bd879bf000000000000000047a68a3fe1cd613eacdfd540f43ae8bda59a3e3e6bd8793f0000000000000000a5ada73f68671bbe92699740f43ae83da59a3ebe6bd879bf000000000000000099c5983f9d2ea13ec8b2d540eaeca33e33e66f3fc0590ebe00000000984e1b3e5106b43f688c44bd46219740eaeca33e33e66f3fc0590ebe0000803f984e1b3e3691933fd07e483e6943d640eaeca3be33e66fbfc0590e3e0000000000000000eed1ae3f84012bbee7b19740eaeca3be33e66fbfc0590e3e000000000000000099c5983f9d2ea13ec8b2d540bc05dabd2ac0393e04467a3f00000000000000005106b43f688c44bd46219740bc05da3d2ac039be04467abf00000000000000003691933fd07e483e6943d640bc05dabd2ac0393e04467a3f0000000000000000eed1ae3f84012bbee7b19740bc05da3d2ac039be04467abf00000000000000006aaaa13faaa5943e5013d640a366a23e483b703fb65b0cbe00000000b8cf1e3e1013bb3f02b580bdfc669740a366a23e483b703fb65b0cbe0000803fb8cf1e3e6b829c3fb1412f3eeba1d640a366a2be483b70bfb65b0c3e000000000000000011ebb53f24643abe97f59740a366a2be483b70bfb65b0c3e00000000000000006aaaa13faaa5943e5013d6403445cbbdebd2343e53b17a3f00000000000000001013bb3f02b580bdfc6697403445cb3debd234be53b17abf00000000000000006b829c3fb1412f3eeba1d6403445cbbdebd2343e53b17a3f000000000000000011ebb53f24643abe97f597403445cb3debd234be53b17abf00000000000000006495aa3f5426883e7b6ed640e2d9a03ea490703f73580abe00000000f94d223e4414c23f5ab39ebd01a89740e2d9a03ea490703f73580abe0000803ff94d223efe79a53fa817163e0afbd640e2d9a0bea49070bf73580a3e0000000000000000def8bc3fac8e49be90349840e2d9a0bea49070bf73580a3e00000000000000006495aa3f5426883e7b6ed64001f7bbbd2bd32f3ee8197b3f00000000000000004414c23f5ab39ebd01a8974001f7bb3d2bd32fbee8197bbf0000000000000000fe79a53fa817163e0afbd64001f7bbbd2bd32f3ee8197b3f0000000000000000def8bc3fac8e49be9034984001f7bb3d2bd32fbee8197bbf00000000000000009786b33f6a62773e1cc4d640c5469f3e37e6703fb54f08be000000005bc9253eb509c93f1440bcbd48e49740c5469f3e37e6703fb54f08be0000803f5bc9253efe77ae3fe303fa3d9a4ed740c5469fbe37e670bfb54f083e00000000000000001cfbc33f828058bec66e9840c5469fbe37e670bfb54f083e00000000000000009786b33f6a62773e1cc4d640ee18acbd3ac12a3e517f7b3f0000000000000000b509c93f1440bcbd48e49740ee18ac3d3ac12abe517f7bbf0000000000000000fe77ae3fe303fa3d9a4ed740ee18acbd3ac12a3e517f7b3f00000000000000001cfbc33f828058bec66e9840ee18ac3d3ac12abe517f7bbf0000000000000000147ebc3f258d5e3e0514d74062ad9d3efb3b713f944006be00000000e441293e3cf3cf3ff258d9bdbf1b984062ad9d3efb3b713f944006be0000803fe441293e7a7cb73f3602c83d6b9cd74062ad9dbefb3b71bf9440063e0000000000000000a2f1ca3f833867be25a4984062ad9dbefb3b71bf9440063e0000000000000000147ebc3f258d5e3e0514d74046a99bbdcf9c253e19e17b3f00000000000000003cf3cf3ff258d9bdbf1b984046a99b3dcf9c25be19e17bbf00000000000000007a7cb73f3602c83d6b9cd74046a99bbdcf9c253e19e17b3f0000000000000000a2f1ca3f833867be25a4984046a99b3dcf9c25be19e17bbf0000000000000000e37bc53fefcd453e095ed740e10d9c3ee691713f8d2a04be0000000099b72c3ea9d0d63f5efcf5bd574e9840e10d9c3ee691713f8d2a04be0000803f99b72c3e7a87c03f7f2c963d51e4d740e10d9cbee69171bf8d2a043e000000000000000040dcd13fdeb575be9fd49840e10d9cbee69171bf8d2a043e0000000000000000e37bc53fefcd453e095ed74031a68abd0f66203ec63e7c3f0000000000000000a9d0d63f5efcf5bd574e984031a68a3d0f6620bec63e7cbf00000000000000007a87c03f7f2c963d51e4d74031a68abd0f66203ec63e7c3f000000000000000040dcd13fdeb575be9fd4984031a68a3d0f6620bec63e7cbf00000000000000001480ce3f09262d3ef8a1d74061689a3ee9e7713f530d02be00000000802a303ecca1dd3fa91409be047c984061689a3ee9e7713f530d02be0000803f802a303e0d99c93fa00a493d1a26d84061689abee9e771bf530d023e0000000000000000c5bad83f05fc81be2600994061689abee9e771bf530d023e00000000000000001480ce3f09262d3ef8a1d740771b72bd591d1b3ed2977c3f0000000000000000cca1dd3fa91409be047c9840771b723d591d1bbed2977cbf00000000000000000d99c93fa00a493d1a26d840771b72bd591d1b3ed2977c3f0000000000000000c5bad83f05fc81be26009940771b723d591d1bbed2977cbf0000000000000000b18ad73f5d96143ea8dfd7400cbd983ef93d723f75d0ffbd00000000a49a333e7f66e43f2def16bebaa498400cbd983ef93d723f75d0ffbd0000803fa49a333e3cb1d23f1c3acc3c9c61d8400cbd98bef93d72bf75d0ff3d00000000000000000a8ddf3f23ff88beae2699400cbd98bef93d72bf75d0ff3d0000000000000000b18ad73f5d96143ea8dfd740dabc4dbdc5c2153eb4eb7c3f00000000000000007f66e43f2def16bebaa49840dabc4d3dc5c215beb4eb7cbf00000000000000003cb1d23f1c3acc3c9c61d840dabc4dbdc5c2153eb4eb7c3f00000000000000000a8ddf3f23ff88beae269940dabc4d3dc5c215beb4eb7cbf0000000000000000be9be03fe83ff83de416d8400f0c973e0894723f3275fbbd000000001008373e981eeb3ff48c24be6cc898400f0c973e0894723f3275fbbd0000803f1008373e08d0db3f0023653aa296d8400f0c97be089472bf3275fb3d0000000000000000e252e63fe2e38fbe2a4899400f0c97be089472bf3275fb3d0000000000000000be9be03fe83ff83de416d840ac2d28bd7456103ede397d3f0000000000000000981eeb3ff48c24be6cc89840ac2d283d745610bede397dbf000000000000000008d0db3f0023653aa296d840ac2d28bd7456103ede397d3f0000000000000000e252e63fe2e38fbe2a489940ac2d283d745610bede397dbf000000000000000043b3e93fa088c73d7d47d8409a55953e05ea723f6b08f7bd00000000cf723a3ef5c9f13fb8ed31be0fe798409a55953e05ea723f6b08f7bd0000803fcf723a3e79f5e43f7c11bdbcfbc4d8409a5595be05ea72bf6b08f73d00000000000000002b0ced3f1caa96be8d6499409a5595be05ea72bf6b08f73d000000000000000043b3e93fa088c73d7d47d8401b6b01bd04d90a3eb8817d3f0000000000000000f5c9f13fb8ed31be0fe798401b6b013d04d90abeb8817dbf000000000000000079f5e43f7c11bdbcfbc4d8401b6b01bd04d90a3eb8817d3f00000000000000002b0ced3f1caa96be8d6499401b6b013d04d90abeb8817dbf00000000000000003ed1f23f9408973d4171d840e699933ee93f733f4288f2bd00000000f1da3d3e7468f83f92103fbe97009940e699933ee93f733f4288f2bd0000803ff1da3d3e8a21ee3f5e3740bd76ecd840e69993bee93f73bf4288f23d0000000000000000c0b8f33f5a519dbecc7b9940e69993bee93f73bf4288f23d00000000000000003ed1f23f9408973d4171d840dde6b2bc6e4a053eaac27d3f00000000000000007468f83f92103fbe97009940dde6b23c6e4a05beaac27dbf00000000000000008a21ee3f5e3740bd76ecd840dde6b2bc6e4a053eaac27d3f0000000000000000c0b8f33f5a519dbecc7b9940dde6b23c6e4a05beaac27dbf0000000000000000acf5fb3f80844d3d0094d84028d9913e9b95733f97f3edbd000000008640413efcf9fe3f10f54bbefc14994028d9913e9b95733f97f3edbd0000803f8640413e3854f73f14b990bde10cd94028d991be9b9573bf97f3ed3d00000000000000008858fa3f5dd9a3bedd8d994028d991be9b9573bf97f3ed3d0000000000000000acf5fb3f80844d3d0094d840de1341bc3056ff3d10fc7d3f0000000000000000fcf9fe3f10f54bbefc149940de13413c3056ffbd10fc7dbf00000000000000003854f73f14b990bde10cd940de1341bc3056ff3d10fc7d3f00000000000000008858fa3f5dd9a3bedd8d9940de13413c3056ffbd10fc7dbf00000000000000004490024050e4da3c85afd840a713903e11eb733f054ae9bd00000000a1a3443e36bf0240129b58be33249940a713903e11eb733f054ae9bd0000803fa1a3443ebd4600401419c1bd0826d940a71390be11eb73bf054ae93d0000000000000000af7500401342aabeb69a9940a71390be11eb73bf054ae93d00000000000000004490024050e4da3c85afd8400cc6bbba9cf7f33d452d7e3f000000000000000036bf0240129b58be332499400cc6bb3a9cf7f3bd452d7ebf0000000000000000bd4600401419c1bd0826d9400cc6bbba9cf7f33d452d7e3f0000000000000000af7500401342aabeb69a99400cc6bb3a9cf7f3bd452d7ebf0000000000000000e328074000df5d3b9ec3d840a2498e3e3740743fa289e4bd000000005604483edbfa0540e40165be382e9940a2498e3e3740743fa289e4bd0000803f5604483ea1e60440b339f1bdb737d940a2498ebe374074bfa289e43d000000000000000099b803401d8bb0be51a29940a2498ebe374074bfa289e43d0000000000000000e328074000df5d3b9ec3d8402104173c6079e83d9c557e3f0000000000000000dbfa0540e40165be382e9940210417bc6079e8bd9c557ebf0000000000000000a1e60440b339f1bdb737d9402104173c6079e83d9c557e3f000000000000000099b803401d8bb0be51a29940210417bc6079e8bd9c557ebf0000000000000000a9c40b409863a2bc16d0d8406a7b8c3efc94743f8cb1dfbd00000000bd624b3ee32f0940452971befe3299406a7b8c3efc94743f8cb1dfbd0000803fbd624b3ebe890940d88b10beb941d9406a7b8cbefc9474bf8cb1df3d0000000000000000f8f4064055b4b6bea1a499406a7b8cbefc9474bf8cb1df3d0000000000000000a9c40b409863a2bc16d0d840b831a53cd2dcdc3d63747e3f0000000000000000e32f0940452971befe329940b831a5bcd2dcdcbd63747ebf0000000000000000be890940d88b10beb941d940b831a53cd2dcdc3d63747e3f0000000000000000f8f4064055b4b6bea1a49940b831a5bcd2dcdcbd63747ebf00000000000000008e6310408cb72fbdb9d4d84051a98a3e4ee9743f66c0dabd00000000eebe4e3e4a5e0c40d5107dbe7f32994051a98a3e4ee9743f66c0dabd0000803feebe4e3e09300e401e5828bed943d94051a98abe4ee974bf66c0da3d0000000000000000c52a0a4088bdbcbe9fa1994051a98abe4ee974bf66c0da3d00000000000000008e6310408cb72fbdb9d4d8406ba8003df222d13de5887e3f00000000000000004a5e0c40d5107dbe7f3299406ba800bdf222d1bde5887ebf000000000000000009300e401e5828bed943d9406ba8003df222d13de5887e3f0000000000000000c52a0a4088bdbcbe9fa199406ba800bdf222d1bde5887ebf00000000000000008205154020d686bd51d1d840b0d3883e163d753f90b5d5bd000000000419523e0e860f40505c84beb72c9940b0d3883e163d753f90b5d5bd0000803f0419523e71d91240dbff3fbee13dd940b0d388be163d75bf90b5d53d0000000000000000fd590d40b6a6c2be47999940b0d388be163d75bf90b5d53d00000000000000008205154020d686bd51d1d84087ee2f3d904dc53d66927e3f00000000000000000e860f40505c84beb72c994087ee2fbd904dc5bd66927ebf000000000000000071d91240dbff3fbee13dd94087ee2f3d904dc53d66927e3f0000000000000000fd590d40b6a6c2be4799994087ee2fbd904dc5bd66927ebf000000000000000077aa1940ac84b5bda9c5d840e3fa863e4190753f0490d0bd000000001c71553e2fa7124045108abe9f219940e3fa863e4190753f0490d0bd0000803f1c71553ee8851740618157be9c2fd940e3fa86be419075bf0490d03d0000000000000000a0821040ca6fc8be928b9940e3fa86be419075bf0490d03d000000000000000077aa1940ac84b5bda9c5d8400969603d345eb93d29907e3f00000000000000002fa7124045108abe9f219940096960bd345eb9bd29907ebf0000000000000000e8851740618157be9c2fd9400969603d345eb93d29907e3f0000000000000000a0821040ca6fc8be928b9940096960bd345eb9bd29907ebf000000000000000055521e40d0e4e3bd8ab1d840551f853ebfe2753fe64dcbbd0000000056c7583eb1c115400ca48fbe2e119940551f853ebfe2753fe64dcbbd0000803f56c7583e53351c405adb6ebed118d940551f85bebfe275bfe64dcb3d0000000000000000afa413408518cebe75789940551f85bebfe275bfe64dcb3d000000000000000055521e40d0e4e3bd8ab1d840430a893db055ad3d71817e3f0000000000000000b1c115400ca48fbe2e119940430a89bdb055adbd71817ebf000000000000000053351c405adb6ebed118d940430a893db055ad3d71817e3f0000000000000000afa413408518cebe75789940430a89bdb055adbd71817ebf000000000000000007fd22403cf908bebf94d8407241833e7334763fc1eec5bd00000000d61b5c3e9dd51840c61795be61fb98407241833e7334763fc1eec5bd0000803fd61b5c3e9be72040d80583be4cf9d840724183be733476bfc1eec53d000000000000000031c0164000a1d3beee5f9940724183be733476bfc1eec53d000000000000000007fd22403cf908bebf94d840a576a23d5036a13d78657e3f00000000000000009dd51840c61795be61fb9840a576a2bd5036a1bd78657ebf00000000000000009be72040d80583be4cf9d840a576a23d5036a13d78657e3f000000000000000031c0164000a1d3beee5f9940a576a2bd5036a1bd78657ebf000000000000000071aa2740d2d41fbe116fd840aa61813e4985763f2272c0bd00000000be6e5f3efbe21b409f6b9abe33e09840aa61813e4985763f2272c0bd0000803fbe6e5f3ea39c25402b888ebed4d0d840aa6181be498576bf2272c03d00000000000000002dd519406109d9bef6419940aa6181be498576bf2272c03d000000000000000071aa2740d2d41fbe116fd8406f77bc3d6c02953d793b7e3f0000000000000000fbe21b409f6b9abe33e098406f77bcbd6c0295bd793b7ebf0000000000000000a39c25402b888ebed4d0d8406f77bc3d6c02953d793b7e3f00000000000000002dd519406109d9bef64199406f77bcbd6c0295bd793b7ebf0000000000000000745a2c40978336be4a40d840fa007f3e2ad5763f5fd6babd0000000035c0623edce91e40749f9fbe9ebf9840fa007f3e2ad5763f5fd6babd0000803f35c0623e49542a40d8f399be349fd840fa007fbe2ad576bf5fd6ba3d0000000000000000b1e31c408051debe881e9940fa007fbe2ad576bf5fd6ba3d0000000000000000745a2c40978336be4a40d8407a09d73d52bb883db4027e3f0000000000000000dce91e40749f9fbe9ebf98407a09d7bd52bb88bdb4027ebf000000000000000049542a40d8f399be349fd8407a09d73d52bb883db4027e3f0000000000000000b1e31c408051debe881e99407a09d7bd52bb88bdb4027ebf0000000000000000eb0c314092034dbe3408d840e33c7b3e0124773fbe1ab5bd000000006610663e55ea214067b3a4be9a999840e33c7b3e0124773fbe1ab5bd0000803f6610663e670e2f40dc47a5be3464d840e33c7bbe012477bfbe1ab53d0000000000000000d1eb1f407a79e3be9af59840e33c7bbe012477bfbe1ab53d0000000000000000eb0c314092034dbe3408d8406f29f23d78c6783d66ba7d3f000000000000000055ea214067b3a4be9a9998406f29f2bd78c678bd66ba7dbf0000000000000000670e2f40dc47a5be3464d8406f29f23d78c6783d66ba7d3f0000000000000000d1eb1f407a79e3be9af598406f29f2bd78c678bd66ba7dbf0000000000000000b2c13540695263be97c6d7401078773eaf71773f273fafbd000000007b5f693e7ae42440c4a7a9be256e98401078773eaf71773f273fafbd0000803f7b5f693ed7ca33400283b0be9d1fd840107877beaf7177bf273faf3d00000000000000009fed22409281e8be2bc79840107877beaf7177bf273faf3d0000000000000000b2c13540695263be97c6d740c2e9063e3cfa5f3dcb617d3f00000000000000007ae42440c4a7a9be256e9840c2e906be3cfa5fbdcb617dbf0000000000000000d7ca33400283b0be9d1fd840c2e9063e3cfa5f3dcb617d3f00000000000000009fed22409281e8be2bc79840c2e906be3cfa5fbdcb617dbf00000000000000009b783a40526e79be3f7bd740b2b3733e22be773f3f42a9bd00000000a3ad6c3e69d82740837caebe353d9840b2b3733e22be773f3f42a9bd0000803fa3ad6c3e6789384062a4bbbe3bd1d740b2b373be22be77bf3f42a93d000000000000000035e92540bc69edbe31939840b2b373be22be77bf3f42a93d00000000000000009b783a40526e79be3f7bd7408a01153e6815473d28f87c3f000000000000000069d82740837caebe353d98408a0115be681547bd28f87cbf00000000000000006789384062a4bbbe3bd1d7408a01153e6815473d28f87c3f000000000000000035e92540bc69edbe319398408a0115be681547bd28f87cbf000000000000000075313f4096aa87bef825d740f5f06f3e3f09783f8a23a3bd000000000efb6f3e43c62a40e631b3bec6069840f5f06f3e3f09783f8a23a3bd0000803f0efb6f3ee5493d40e3aac6bed878d740f5f06fbe3f0978bf8a23a33d0000000000000000b3de28403332f2bea6599840f5f06fbe3f0978bf8a23a33d000000000000000075313f4096aa87bef825d7408d59233e441d2e3dc67c7c3f000000000000000043c62a40e631b3bec60698408d5923be441d2ebdc67c7cbf0000000000000000e5493d40e3aac6bed878d7408d59233e441d2e3dc67c7c3f0000000000000000b3de28403332f2bea65998408d5923be441d2ebdc67c7cbf00000000000000000dec4340428292be8cc6d6400e316c3eeb52783fffe29cbd00000000f147733e2bae2d403ec8b7bed0ca97400e316c3eeb52783fffe29cbd0000803ff147733e1c0c42404695d1be3f16d7400e316cbeeb5278bfffe29c3d00000000000000003ace2b4042dbf6be831a98400e316cbeeb5278bfffe29c3d00000000000000000dec4340428292be8cc6d64012ef313ef017153dedee7b3f00000000000000002bae2d403ec8b7bed0ca974012ef31bef01715bdedee7bbf00000000000000001c0c42404695d1be3f16d74012ef313ef017153dedee7b3f00000000000000003ace2b4042dbf6be831a984012ef31bef01715bdedee7bbf00000000000000002aa84840133d9dbec75cd6404375683e109b783f1d8096bd000000008294763e4a903040c13fbcbe498997404375683e109b783f1d8096bd0000803f8294763ecfcf46406a62dcbe3ba9d640437568be109b78bf1d80963d0000000000000000efb72e401865fbbebdd59740437568be109b78bf1d80963d00000000000000002aa84840133d9dbec75cd640fbbe403e7015f83cf54d7b3f00000000000000004a903040c13fbcbe49899740fbbe40be7015f8bcf54d7bbf0000000000000000cfcf46406a62dcbe3ba9d640fbbe403e7015f83cf54d7b3f0000000000000000efb72e401865fbbebdd59740fbbe40be7015f8bcf54d7bbf00000000000000008d654d40e3d9a7be78e8d540efbe643e91e1783fadfa8fbd00000000f8e0793ecf6c3340b998c0be2a429740efbe643e91e1783fadfa8fbd0000803ff8e0793ebd944b402211e7be9c31d640efbe64be91e178bfadfa8f3d0000000000000000ff9b3140f8cfffbe4e8b9740efbe64be91e178bfadfa8f3d00000000000000008d654d40e3d9a7be78e8d540f1c54f3eb0f6c53c3a997a3f0000000000000000cf6c3340b998c0be2a429740f1c54fbeb0f6c5bc3a997abf0000000000000000bd944b402211e7be9c31d640f1c54f3eb0f6c53c3a997a3f0000000000000000ff9b3140f8cfffbe4e8b9740f1c54fbeb0f6c5bc3a997abf0000000000000000f42352408057b2be6e69d540610f613e5726793fa05289bd000000008f2d7d3eea43364078d3c4be66f59640610f613e5726793fa05289bd0000803f8f2d7d3ea25a504037a0f1be31afd540610f61be572679bfa052893d0000000000000000987a3440180e02bf293b9740610f61be572679bfa052893d0000000000000000f42352408057b2be6e69d5404b005f3eb8df933c23d0793f0000000000000000ea43364078d3c4be66f596404b005fbeb8df93bc23d079bf0000000000000000a25a504037a0f1be31afd5404b005f3eb8df933c23d0793f0000000000000000987a3440180e02bf293b97404b005fbeb8df93bc23d079bf000000000000000019e35640b2b4bcbe79dfd4400c685d3e4969793f158882bd00000000413d803ed31539404ef0c8beefa296400c685d3e4969793f158882bd0000803f413d803e332155406a0efcbec821d5400c685dbe496979bf1588823d0000000000000000ed533740032504bf3ee596400c685dbe496979bf1588823d000000000000000019e35640b2b4bcbe79dfd4402b6a6e3ec0b9433c25f2783f0000000000000000d31539404ef0c8beefa296402b6a6ebec0b943bc25f278bf0000000000000000332155406a0efcbec821d5402b6a6e3ec0b9433c25f2783f0000000000000000ed533740032504bf3ee596402b6a6ebec0b943bc25f278bf0000000000000000afa25b4052f0c6be6a4ad44054ca593e4faa793f083677bd000000000be4813ec5e23b408eefccbeba4a964054ca593e4faa793f083677bd0000803f0be4813e22e85940472d03bf3589d44054ca59be4faa79bf0836773d000000000000000038283a40e52c06bf8589964054ca59be4faa79bf0836773d0000000000000000afa25b4052f0c6be6a4ad44054ff7d3e60e7bf3bc1fe773f0000000000000000c5e23b408eefccbeba4a964054ff7dbe60e7bfbbc1fe77bf000000000000000022e85940472d03bf3589d44054ff7d3e60e7bf3bc1fe773f000000000000000038283a40e52c06bf8589964054ff7dbe60e7bfbbc1fe77bf00000000000000006b626040f208d1be18aad3409f37563e4fe9793f181969bd00000000448b833efdaa3e40bad1d0beb8ec95409f37563e4fe9793f181969bd0000803f448b833e21af5e40974108bf4de5d3409f3756be4fe979bf1819693d0000000000000000b3f73c40fb2508bfed2796409f3756be4fe979bf1819693d00000000000000006b626040f208d1be18aad340badd863e00e45cb984f5763f0000000000000000fdaa3e40bad1d0beb8ec9540badd86be00e45c3984f576bf000000000000000021af5e40974108bf4de5d340badd863e00e45cb984f5763f0000000000000000b3f73c40fb2508bfed279640badd86be00e45c3984f576bf0000000000000000f82165408efddabe58fed2407ab1523e35267a3fa8b85abd000000001133853ec06e4140fa96d4bed48895407ab1523e35267a3fa8b85abd0000803f1133853ed7756340a1430dbfe635d3407ab152be35267abfa8b85a3d00000000000000009fc23f4057100abf62c095407ab152be35267abfa8b85a3d0000000000000000f82165408efddabe58fed240e2cc8e3e70d2ccbb13d6753f0000000000000000c06e4140fa96d4bed4889540e2cc8ebe70d2cc3b13d675bf0000000000000000d7756340a1430dbfe635d340e2cc8e3e70d2ccbb13d6753f00000000000000009fc23f4057100abf62c09540e2cc8ebe70d2cc3b13d675bf000000000000000000e16940bbcce4be0247d24044394f3eea607a3f75174cbd0000000095db863e522e4440d93fd8befa1e954044394f3eea607a3f75174cbd0000803f95db863eec3b6840ac3212bfd97ad24044394fbeea607abf75174c3d00000000000000003e8942403bec0bbfd152954044394fbeea607abf75174c3d000000000000000000e16940bbcce4be0247d240bcca963e18ce48bc1ca0743f0000000000000000522e4440d93fd8befa1e9540bcca96be18ce483c1ca074bf0000000000000000ec3b6840ac3212bfd97ad240bcca963e18ce48bc1ca0743f00000000000000003e8942403bec0bbfd1529540bcca96be18ce483c1ca074bf00000000000000002c9f6e403475eebeef83d14074d04b3e5c997a3f64373dbd00000000f484883efce94640b8ccdbbe15af944074d04b3e5c997a3f64373dbd0000803ff484883e05016d40140e17bfffb3d14074d04bbe5c997abf64373d3d0000000000000000d54b4540d6b90dbf25df944074d04bbe5c997abf64373d3d00000000000000002c9f6e403475eebeef83d140bdd49e3ed84395bc6553733f0000000000000000fce94640b8ccdbbe15af9440bdd49ebed843953c655373bf000000000000000005016d40140e17bfffb3d140bdd49e3ed84395bc6553733f0000000000000000d54b4540d6b90dbf25df9440bdd49ebed843953c655373bf00000000000000001c5c7340eaf5f7befcb4d0409878483e71cf7a3f21192ebd00000000552f8a3e0ca24940c63ddfbe0c3994409878483e71cf7a3f21192ebd0000803f552f8a3ec1c471404dd51bbf35e1d040987848be71cf7abf21192e3d0000000000000000b10a48403b790fbf45659440987848be71cf7abf21192e3d00000000000000001c5c7340eaf5f7befcb4d0403de8a63e18c1c5bcc4ef713f00000000000000000ca24940c63ddfbe0c3994403de8a6be18c1c53cc4ef71bf0000000000000000c1c471404dd51bbf35e1d0403de8a63e18c1c5bcc4ef713f0000000000000000b10a48403b790fbf456594403de8a6be18c1c53cc4ef71bf000000000000000074177840baa600bf0ddacf400433453e1a037b3f9bc01ebd00000000dfda8b3ed0564c409493e2bec3bc93400433453e1a037b3f9bc01ebd0000803fdfda8b3ebf867640a28720bf6002d040043345be1a037bbf9bc01e3d00000000000000001bc64a40b22a11bf16e59340043345be1a037bbf9bc01e3d000000000000000074177840baa600bf0ddacf408d02af3efccef5bc2775703f0000000000000000d0564c409493e2bec3bc93408d02afbefccef53c277570bf0000000000000000bf867640a28720bf6002d0408d02af3efccef5bc2775703f00000000000000001bc64a40b22a11bf16e593408d02afbefccef53c277570bf0000000000000000d2d07c40523d05bf00f3ce402501423e46347b3f23300fbd00000000ba878d3e96084f4064cee5be1c3a93402501423e46347b3f23300fbd0000803fba878d3e9a467b40792425bf5f17cf40250142be46347bbf23300f3d00000000000000005e7e4d4059ce12bf7b5e9340250142be46347bbf23300f3d0000000000000000d2d07c40523d05bf00f3ce40ec20b73e00b112bd91e36e3f000000000000000096084f4064cee5be1c3a9340ec20b7be00b1123d91e36ebf00000000000000009a467b40792425bf5f17cf40ec20b73e00b112bd91e36e3f00000000000000005e7e4d4059ce12bf7b5e9340ec20b7be00b1123d91e36ebf0000000000000000ebc380402cbe09bfbcffcd406be43e3ee6627b3fc7d4febc000000000f368f3eb4b7514078eee8bef6b092406be43e3ee6627b3fc7d4febc0000803f0f368f3ef90180403eab29bf1920ce406be43ebee6627bbfc7d4fe3c0000000000000000cf3350404e6414bf53d192406be43ebee6627bbfc7d4fe3c0000000000000000ebc380402cbe09bfbcffcd408640bf3e7c372abd1a3b6d3f0000000000000000b4b7514078eee8bef6b092408640bfbe7c372a3d1a3b6dbf0000000000000000f90180403eab29bf1920ce408640bf3e7c372abd1a3b6d3f0000000000000000cf3350404e6414bf53d192408640bfbe7c372a3d1a3b6dbf00000000000000000e1e8340a4280ebf2800cd4012de3b3eef8e7b3f63e7debc000000000ae6903e7a64544041f4ebbe2c21924012de3b3eef8e7b3f63e7debc0000803f0ae6903e2e5f82404e1b2ebf771ccd4012de3bbeef8e7bbf63e7de3c0000000000000000bbe65240cbec15bf7b3d924012de3bbeef8e7bbf63e7de3c00000000000000000e1e8340a4280ebf2800cd408a5ec73e1a7441bdf17b6b3f00000000000000007a64544041f4ebbe2c2192408a5ec7be1a74413df17b6bbf00000000000000002e5f82404e1b2ebf771ccd408a5ec73e1a7441bdf17b6b3f0000000000000000bbe65240cbec15bf7b3d92408a5ec7be1a74413df17b6bbf0000000000000000a1768540247c12bf30f4cb405eef383e52b87b3fad9fbebc00000000d497923e3a0f5740ffdfeebe9a8a91405eef383e52b87b3fad9fbebc0000803fd497923ebcba8440107432bf660ccc405eef38be52b87bbfad9fbe3c000000000000000070975540eb6717bfd0a291405eef38be52b87bbfad9fbe3c0000000000000000a1768540247c12bf30f4cb401e78cf3e266158bd5ba6693f00000000000000003a0f5740ffdfeebe9a8a91401e78cfbe2661583d5ba669bf0000000000000000bcba8440107432bf660ccc401e78cf3e266158bd5ba6693f000000000000000070975540eb6717bfd0a291401e78cfbe2661583d5ba669bf000000000000000071cd874038b816bfc0dbca40aa19363e04df7b3ffe029ebc000000009b4b943e4ab85940c1b1f1be14ed9040aa19363e04df7b3ffe029ebc0000803f9b4b943e6d1487400eb536bfd1efca40aa1936be04df7bbffe029e3c000000000000000043465840b6d518bf25019140aa1936be04df7bbffe029e3c000000000000000071cd874038b816bfc0dbca40638ad73eb8fa6ebdb4ba673f00000000000000004ab85940c1b1f1be14ed9040638ad7beb8fa6e3db4ba67bf00000000000000006d1487400eb536bfd1efca40638ad73eb8fa6ebdb4ba673f000000000000000043465840b6d518bf25019140638ad7beb8fa6e3db4ba67bf00000000000000004f228a4048dc1abfcab6c9400a5e333e02037c3f88367abc000000008b01963efb5f5c40cf69f4be6e4890400a5e333e02037c3f88367abc0000803f8b01963e126c8940b0dd3abfadc6c9400a5e33be02037cbf88367a3c000000000000000082f35a4050361abf515890400a5e33be02037cbf88367a3c00000000000000004f228a4048dc1abfcab6c9408b92df3e849d82bd6eb9653f0000000000000000fb5f5c40cf69f4be6e4890408b92dfbe849d823d6eb965bf0000000000000000126c8940b0dd3abfadc6c9408b92df3e849d82bd6eb9653f000000000000000082f35a4050361abf515890408b92dfbe849d823d6eb965bf000000000000000009758c40c2e71ebf3f85c8406fbd303e45247c3f18e737bc00000000d3b9973e9d065f407308f7be7b9c8f406fbd303e45247c3f18e737bc0000803fd3b9973e78c18b4064ed3ebfed90c8406fbd30be45247cbf18e7373c00000000000000007a9f5d40db891bbf29a88f406fbd30be45247cbf18e7373c000000000000000009758c40c2e71ebf3f85c840d58de73e238e8dbd10a3633f00000000000000009d065f407308f7be7b9c8f40d58de7be238e8d3d10a363bf000000000000000078c18b4064ed3ebfed90c840d58de73e238e8dbd10a3633f00000000000000007a9f5d40db891bbf29a88f40d58de7be238e8d3d10a363bf000000000000000070c58e403eda22bf1747c740fe382e3ec9427c3ff94aeabb00000000a074993e80ac61409c8df9be09e98e40fe382e3ec9427c3ff94aeabb0000803fa074993e6d148e40c0e342bf874ec740fe382ebec9427cbff94aea3b00000000000000007b4a604050d01cbf79f08e40fe382ebec9427cbff94aea3b000000000000000070c58e403eda22bf1747c7408079ef3ec24d98bd3778613f000000000000000080ac61409c8df9be09e98e408079efbec24d983d377861bf00000000000000006d148e40c0e342bf874ec7408079ef3ec24d98bd3778613f00000000000000007b4a604050d01cbf79f08e408079efbec24d983d377861bf0000000000000000551391404ab326bf47fcc540a7d12b3e8d5e7c3f5e1248bb0000000024329b3ef251644054f9fbbee32d8e40a7d12b3e8d5e7c3f5e1248bb0000803f24329b3ec464904052c046bf74ffc540a7d12bbe8d5e7cbf5e12483b0000000000000000cff46240b2091ebf10318e40a7d12bbe8d5e7cbf5e12483b0000000000000000551391404ab326bf47fcc540dd52f73e82daa2bd92395f3f0000000000000000f251644054f9fbbee32d8e40dd52f7be82daa23d92395fbf0000000000000000c464904052c046bf74ffc540dd52f73e82daa2bd92395f3f0000000000000000cff46240b2091ebf10318e40dd52f7be82daa23d92395fbf00000000000000008b5e93405d722abfcda4c4400788293e92777c3ff3158b3a000000008cf29c3e3bf76640be4bfebed36a8d400788293e92777c3ff3158b3a0000803f8cf29c3e4db2924093824abfb2a3c440078829be92777cbff3158bba0000000000000000be9e654015361fbfb8698d40078829be92777cbff3158bba00000000000000008b5e93405d722abfcda4c4406917ff3ef631adbde5e75c3f00000000000000003bf76640be4bfebed36a8d406917ffbef631ad3de5e75cbf00000000000000004db2924093824abfb2a3c4406917ff3ef631adbde5e75c3f0000000000000000be9e654015361fbfb8698d406917ffbef631ad3de5e75cbf0000000000000000e7a6954022172ebfa040c340035d273eda8d7c3fcd00aa3b000000000bb69e3ea39c6940524200bfa09f8c40035d273eda8d7c3fcd00aa3b0000803f0bb69e3edcfc94402c2a4ebf3a3bc340035d27beda8d7cbfcd00aabb00000000000000008e4868405c5520bf3a9a8c40035d27beda8d7cbfcd00aabb0000000000000000e7a6954022172ebfa040c3405562033f4153b7bd01845a3f0000000000000000a39c6940524200bfa09f8c40556203bf4153b73d01845abf0000000000000000dcfc94402c2a4ebf3a3bc3405562033f4153b7bd01845a3f00000000000000008e4868405c5520bf3a9a8c40556203bf4153b73d01845abf000000000000000076ef9740460331bff0cfc1400eff233e54b07c3f22f5ed3b00000000d07ca03efc3b6c40eeef01bfe8cb8b400eff233e54b07c3f22f5ed3b0000803fd07ca03ed7489740b11a51bf62c8c1400eff23be54b07cbf22f5edbb0000000000000000beee6a40590722bf5ac48b400eff23be54b07cbf22f5edbb000000000000000076ef9740460331bff0cfc140de45073f644dbcbd1f10583f0000000000000000fc3b6c40eeef01bfe8cb8b40de4507bf644dbc3d1f1058bf0000000000000000d7489740b11a51bf62c8c140de45073f644dbcbd1f10583f0000000000000000beee6a40590722bf5ac48b40de4507bf644dbc3d1f1058bf00000000000000006a359a407ba932bff255c0406d741b3e87067d3fe381f63b00000000733ca23e73b06e40b99204bfbef98a406d741b3e87067d3fe381f63b0000803f733ca23e79979940d8cb52bf1e4ec0406d741bbe87067dbfe381f6bb000000000000000091746d4016b524bfeaf18a406d741bbe87067dbfe381f6bb00000000000000006a359a407ba932bff255c040c4740b3f075bb8bdd470553f000000000000000073b06e40b99204bfbef98a40c4740bbf075bb83dd47055bf000000000000000079979940d8cb52bf1e4ec040c4740b3f075bb8bdd470553f000000000000000091746d4016b524bfeaf18a40c4740bbf075bb83dd47055bf00000000000000000d749c40c81d34bf9cd1be40f801133e14577d3f9907013c0000000038fda33e51247140341e07bf901f8a40f801133e14577d3f9907013c0000803f38fda33eb1de9b40604a54bf6ac9be40f80113be14577dbf990701bc000000000000000099f96f40cc4a27bf5e178a40f80113be14577dbf990701bc00000000000000000d749c40c81d34bf9cd1be4093870f3f4efeb3bd30c8523f000000000000000051247140341e07bf901f8a4093870fbf4efeb33d30c852bf0000000000000000b1de9b40604a54bf6ac9be4093870f3f4efeb3bd30c8523f000000000000000099f96f40cc4a27bf5e178a4093870fbf4efeb33d30c852bf00000000000000004cab9e40466135bf3043bd408fa70a3e26a27d3f3c38083c0000000020bfa53e27977340529209bf763d89408fa70a3e26a27d3f3c38083c0000803f20bfa53e6d1e9e40679755bf8a3abd408fa70abe26a27dbf3c3808bc0000000000000000687d724073c829bfd03489408fa70abe26a27dbf3c3808bc00000000000000004cab9e40466135bf3043bd40e37e133fd33bafbde816503f000000000000000027977340529209bf763d8940e37e13bfd33baf3de81650bf00000000000000006d1e9e40679755bf8a3abd40e37e133fd33bafbde816503f0000000000000000687d724073c829bfd0348940e37e13bfd33baf3de81650bf000000000000000019dba0402a7536bff0aabb401965023ee9e77d3f95c1103c000000002c82a73e860876400aef0bbf8a5388401965023ee9e77d3f95c1103c0000803f2c82a73e9e56a04027b456bfbfa1bb40196502bee9e77dbf95c110bc000000000000000090ff7440072e2cbf594a8840196502bee9e77dbf95c110bc000000000000000019dba0402a7536bff0aabb40565b173f7f18aabd9c5d4d3f0000000000000000860876400aef0bbf8a538840565b17bf7f18aa3d9c5d4dbf00000000000000009e56a04027b456bfbfa1bb40565b173f7f18aabd9c5d4d3f000000000000000090ff7440072e2cbf594a8840565b17bf7f18aa3d9c5d4dbf00000000000000006003a3408b5a37bf1c09ba40b074f43d86287e3fcd921a3c000000005946a93ef877784055340ebfe6618740b074f43d86287e3fcd921a3c0000803f5946a93e3187a240bda157bf4bffb940b074f4bd86287ebfcd921abc00000000000000009a7f7740877b2ebf15588740b074f4bd86287ebfcd921abc00000000000000006003a3408b5a37bf1c09ba408f1d1b3fd598a4bdd59c4a3f0000000000000000f877784055340ebfe66187408f1d1bbfd598a43dd59c4abf00000000000000003187a240bda157bf4bffb9408f1d1b3fd598a4bdd59c4a3f00000000000000009a7f7740877b2ebf155887408f1d1bbfd598a43dd59c4abf00000000000000001624a540801238bfed5db840034ee43d25647e3f409c253c00000000a60bab3e0fe57a40386210bfab688640034ee43d25647e3f409c253c0000803fa60bab3e1bb0a440446158bf6953b840034ee4bd25647ebf409c25bc00000000000000001afd7940fcb030bf275e8640034ee4bd25647ebf409c25bc00000000000000001624a540801238bfed5db8403bc61e3f20c19ebd0bd5473f00000000000000000fe57a40386210bfab6886403bc61ebf20c19e3d0bd547bf00000000000000001bb0a440446158bf6953b8403bc61e3f20c19ebd0bd5473f00000000000000001afd7940fcb030bf275e86403bc61ebf20c19e3d0bd547bf00000000000000002a3da7401c9e38bfa3a9b6407255d43df09a7e3ffacf313c000000000bd2ac3e534f7d40c07812bff96785407255d43df09a7e3ffacf313c0000803f0bd2ac3e4cd1a640d6f358bf589eb6407255d4bdf09a7ebffacf31bc000000000000000098777c407ace32bfae5c85407255d4bdf09a7ebffacf31bc00000000000000002a3da7401c9e38bfa3a9b6400356223f719598bda906453f0000000000000000534f7d40c07812bff9678540035622bf7195983da90645bf00000000000000004cd1a640d6f358bf589eb6400356223f719598bda906453f000000000000000098777c407ace32bfae5c8540035622bf7195983da90645bf00000000000000008c4ea94068fe38bf71ecb4402a8ac43d0acd7e3fb9213f3c000000008499ae3e4fb67f40fc7714bff15f84402a8ac43d0acd7e3fb9213f3c0000803f8499ae3eb4eaa8407e5a59bf4ee0b4402a8ac4bd0acd7ebfb9213fbc0000000000000000a0ee7e4012d434bfce5384402a8ac4bd0acd7ebfb9213fbc00000000000000008c4ea94068fe38bf71ecb44093cd253fac1992bd0332423f00000000000000004fb67f40fc7714bff15f844093cd25bfac19923d033242bf0000000000000000b4eaa8407e5a59bf4ee0b44093cd253fac1992bd0332423f0000000000000000a0ee7e4012d434bfce53844093cd25bfac19923d033242bf00000000000000002f58ab406f3439bf9026b3406febb43d99fa7e3fe5874d3c000000000b62b03ec90c8140016016bfba5083406febb43d99fa7e3fe5874d3c0000803f0b62b03e47fcaa404f9659bf8319b3406febb4bd99fa7ebfe5874dbc0000000000000000e1b08040e1c136bfad4383406febb4bd99fa7ebfe5874dbc00000000000000002f58ab406f3439bf9026b3409a2d293fba518bbd5c573f3f0000000000000000c90c8140016016bfba5083409a2d29bfba518b3d5c573fbf000000000000000047fcaa404f9659bf8319b3409a2d293fba518bbd5c573f3f0000000000000000e1b08040e1c136bfad4383409a2d29bfba518b3d5c573fbf0000000000000000035aad40244139bf3658b1402578a53dc4237f3f93f75c3c00000000972bb23e533c8240f03018bf7a3a82402578a53dc4237f3f93f75c3c0000803f972bb23ef405ad403ea859bf2e4ab1402578a5bdc4237fbf93f75cbc000000000000000044e881400a9838bf722c82402578a5bdc4237fbf93f75cbc0000000000000000035aad40244139bf3658b140c1762c3fd14084bdf2763c3f0000000000000000533c8240f03018bf7a3a8240c1762cbfd140843df2763cbf0000000000000000f405ad403ea859bf2e4ab140c1762c3fd14084bdf2763c3f000000000000000044e881400a9838bf722c8240c1762cbfd140843df2763cbf0000000000000000f853af407a2539bf9381af401a2f963da6487f3f8b676d3c000000001ff6b33e8c698340faea19bf591d81401a2f963da6487f3f8b676d3c0000803f1ff6b33ead07af40439159bf8072af401a2f96bda6487fbf8b676dbc0000000000000000411d8340c3563abf460e81401a2f96bda6487fbf8b676dbc0000000000000000f853af407a2539bf9381af40b4a92f3ffdd379bde690393f00000000000000008c698340faea19bf591d8140b4a92fbffdd3793de69039bf0000000000000000ad07af40439159bf8072af40b4a92f3ffdd379bde690393f0000000000000000411d8340c3563abf460e8140b4a92fbffdd3793de69039bf00000000000000000146b14063e238bfd8a2ad406f0f873d65697f3f43d27e3c0000000099c1b53e3b948440418e1bbf04f37f406f0f873d65697f3f43d27e3c0000803f99c1b53e6501b140555259bfaa92ad406f0f87bd65697fbf43d27ebc00000000000000009f4f844033fe3bbfa7d27f406f0f87bd65697fbf43d27ebc00000000000000000146b14063e238bfd8a2ad4015c7323f13a16abd57a5363f00000000000000003b948440418e1bbf04f37f4015c732bf13a16a3d57a536bf00000000000000006501b140555259bfaa92ad4015c7323f13a16abd57a5363f00000000000000009f4f844033fe3bbfa7d27f4015c732bf13a16a3d57a536bf00000000000000000a30b340d57838bf35bcab407130703d19867f3f0b9a883c00000000fb8db73e28bc8540ef1a1dbf429e7d407130703d19867f3f0b9a883c0000803ffb8db73e08f3b2406cec58bfdcaaab40713070bd19867fbf0b9a88bc0000000000000000267f8540868e3dbf907b7d40713070bd19867fbf0b9a88bc00000000000000000a30b340d57838bf35bcab4086cf353f2cef5abd50b4333f000000000000000028bc8540ef1a1dbf429e7d4086cf35bf2cef5a3d50b433bf000000000000000008f3b2406cec58bfdcaaab4086cf353f2cef5abd50b4333f0000000000000000267f8540868e3dbf907b7d4086cf35bf2cef5a3d50b433bf00000000000000000412b540a2e937bfd9cda9400a90523de39e7f3fe742923c00000000375bb93e1ae186404e911ebfc63c7b400a90523de39e7f3fe742923c0000803f375bb93e88dcb4405f6058bf46bba9400a9052bde39e7fbfe74292bc00000000000000009eab86400b083fbfa0177b400a9052bde39e7fbfe74292bc00000000000000000412b540a2e937bfd9cda940a5c3383f98c24abdd8bd303f00000000000000001ae186404e911ebfc63c7b40a5c338bf98c24a3dd8bd30bf000000000000000088dcb4405f6058bf46bba940a5c3383f98c24abdd8bd303f00000000000000009eab86400b083fbfa0177b40a5c338bf98c24a3dd8bd30bf0000000000000000dcebb640a43537bfeed7a740703b353dddb37f3f62629c3c000000004229bb3eda02884098f11fbfecce7840703b353dddb37f3f62629c3c0000803f4229bb3ed4bdb6400baf57bf12c4a740703b35bdddb37fbf62629cbc0000000000000000d2d48740ff6a40bf33a77840703b35bdddb37fbf62629cbc0000000000000000dcebb640a43537bfeed7a7400ba43b3f5d203abde0c12d3f0000000000000000da02884098f11fbfecce78400ba43bbf5d203a3de0c12dbf0000000000000000d4bdb6400baf57bf12c4a7400ba43b3f5d203abde0c12d3f0000000000000000d2d48740ff6a40bf33a778400ba43bbf5d203a3de0c12dbf000000000000000081bdb840d35d36bfa1daa540a231183d1fc57f3fa7f9a63c000000000ef8bc3e2f218940fd3b21bf16557640a231183d1fc57f3fa7f9a63c0000803f0ef8bc3ed996b8406bd956bf6cc5a540a23118bd1fc57fbfa7f9a6bc000000000000000087fa884095b741bfad2a7640a23118bd1fc57fbfa7f9a6bc000000000000000081bdb840d35d36bfa1daa54047713e3faf0e29bd58c02a3f00000000000000002f218940fd3b21bf1655764047713ebfaf0e293d58c02abf0000000000000000d996b8406bd956bf6cc5a54047713e3faf0e29bd58c02a3f000000000000000087fa884095b741bfad2a764047713ebfaf0e293d58c02abf0000000000000000e186ba40de6235bf1ad6a34052def63cc0d27f3f2e06b23c000000008fc7be3ee73b8a40da7022bfa7cf734052def63cc0d27f3f2e06b23c0000803f8fc7be3e8767ba4031e055bf7ebfa34052def6bcc0d27fbf2e06b2bc00000000000000008d1c8a402dee42bf6fa2734052def6bcc0d27fbf2e06b2bc0000000000000000e186ba40de6235bf1ad6a340e92b413f259017bd1cb9273f0000000000000000e73b8a40da7022bfa7cf7340e92b41bf2590173d1cb927bf00000000000000008767ba4031e055bf7ebfa340e92b413f259017bd1cb9273f00000000000000008d1c8a402dee42bf6fa27340e92b41bf2590173d1cb927bf0000000000000000e647bc40ad4534bf84caa140a7e5bd3cd7dc7f3fc989bd3c00000000b497c03eca528b406f9023bf043f7140a7e5bd3cd7dc7f3fc989bd3c0000803fb497c03ec82fbc4048c454bf72b2a140a7e5bdbcd7dc7fbfc989bdbc0000000000000000ac3a8b400a0f44bfdf0e7140a7e5bdbcd7dc7fbfc989bdbc0000000000000000e647bc40ad4534bf84caa14071d4433ff0a905bd0aac243f0000000000000000ca528b406f9023bf043f714071d443bff0a9053d0aac24bf0000000000000000c82fbc4048c454bf72b2a14071d4433ff0a905bd0aac243f0000000000000000ac3a8b400a0f44bfdf0e714071d443bff0a9053d0aac24bf00000000000000007d00be40f20633bf05b89f404073853c79e37f3fb483c93c000000006f68c23ea5658c40229b24bf92a36e404073853c79e37f3fb483c93c0000803f6f68c23e8aefbd40658653bf6d9e9f40407385bc79e37fbfb483c9bc0000000000000000b2548c40951a45bf63706e40407385bc79e37fbfb483c9bc00000000000000007d00be40f20633bf05b89f40626b463f0cbde6bcf098213f0000000000000000a5658c40229b24bf92a36e40626b46bf0cbde63cf09821bf00000000000000008aefbd40658653bf6d9e9f40626b463f0cbde6bcf098213f0000000000000000b2548c40951a45bf63706e40626b46bf0cbde63cf09821bf00000000000000008fb0bf407aa731bfc39e9d401e081b3cb6e67f3fecf5d53c00000000b139c43e43748d403e9125bfbdfd6b401e081b3cb6e67f3fecf5d53c0000803fb139c43eb7a6bf40562752bf97839d401e081bbcb6e67fbfecf5d5bc00000000000000006b6a8d401a1146bf64c76b401e081bbcb6e67fbfecf5d5bc00000000000000008fb0bf407aa731bfc39e9d4032f1483fb663c1bc937f1e3f000000000000000043748d403e9125bfbdfd6b4032f148bfb663c13c937f1ebf0000000000000000b7a6bf40562752bf97839d4032f1483fb663c1bc937f1e3f00000000000000006b6a8d401a1146bf64c76b4032f148bfb663c13c937f1ebf00000000000000000758c1400e2830bfe57e9b40cea7303b9ee67f3fd0e2e23c00000000690bc63e737e8e401e7326bff14d6940cea7303b9ee67f3fd0e2e23c0000803f690bc63e3955c140e7a750bf14629b40cea730bb9ee67fbfd0e2e2bc0000000000000000a57b8e40f7f246bf50146940cea730bb9ee67fbfd0e2e2bc00000000000000000758c1400e2830bfe57e9b404f664b3f004f9bbcb35f1b3f0000000000000000737e8e401e7326bff14d69404f664bbf004f9b3cb35f1bbf00000000000000003955c140e7a750bf14629b404f664b3f004f9bbcb35f1b3f0000000000000000a57b8e40f7f246bf501469404f664bbf004f9b3cb35f1bbf0000000000000000ccf6c24051892ebf8f5899407b7d83bb45e37f3f464bf03c0000000089ddc73e02848f402b4127bf9a9466407b7d83bb45e37f3f464bf03c0000803f89ddc73ef9fac240be084fbf0b3a99407b7d833b45e37fbf464bf0bc00000000000000002f888f4098c047bf915766407b7d833b45e37fbf464bf0bc0000000000000000ccf6c24051892ebf8f58994024cb4d3fb00469bc0739183f000000000000000002848f402b4127bf9a94664024cb4dbfb004693c073918bf0000000000000000f9fac240be084fbf0b3a994024cb4d3fb00469bc0739183f00000000000000002f888f4098c047bf9157664024cb4dbfb004693c073918bf0000000000000000c58cc44008cc2cbfe32b97408bb72ebcb6dc7f3f8332fe3c00000000ffafc93ec1849040ccfb27bf26d263408bb72ebcb6dc7f3f8332fe3c0000803fffafc93edd97c4409f4a4dbf9b0b97408bb72e3cb6dc7fbf8332febc0000000000000000d98f9040637a48bf959163408bb72e3cb6dc7fbf8332febc0000000000000000c58cc44008cc2cbfe32b97400e20503f60071abc410b153f0000000000000000c1849040ccfb27bf26d263400e2050bf60071a3c410b15bf0000000000000000dd97c4409f4a4dbf9b0b97400e20503f60071abc410b153f0000000000000000d98f9040637a48bf959163400e2050bf60071a3c410b15bf0000000000000000da19c640e4f02abf05f99440ed628dbcffd27f3f064e063d00000000ba82cb3e8080914060a328bf06076140ed628dbcffd27f3f064e063d0000803fba82cb3ecf2bc6403f6e4bbfe8d69440ed628d3cffd27fbf064e06bd000000000000000075929140bb2049bfccc26040ed628d3cffd27fbf064e06bd0000000000000000da19c640e4f02abf05f994406665523f306193bb0ad6113f00000000000000008080914060a328bf06076140666552bf3061933b0ad611bf0000000000000000cf2bc6403f6e4bbfe8d694406665523f306193bb0ad6113f000000000000000075929140bb2049bfccc26040666552bf3061933b0ad611bf0000000000000000ef9dc74082f828bf19c092402afac2bc29c67f3fedc40d3d00000000ab55cd3e117792406a3829bfae335e402afac2bc29c67f3fedc40d3d0000803fab55cd3eb2b6c7403c7449bf179c92402afac23c29c67fbfedc40dbd0000000000000000d48f924024b449bfa9eb5d402afac23c29c67fbfedc40dbd0000000000000000ef9dc74082f828bf19c09240799b543f00a2ff3907990e3f0000000000000000117792406a3829bfae335e40799b54bf00a2ffb907990ebf0000000000000000b2b6c7403c7449bf179c9240799b543f00a2ff3907990e3f0000000000000000d48f924024b449bfa9eb5d40799b54bf00a2ffb907990ebf0000000000000000eb18c940abe326bf3d8190400d21f8bc3db67f3ff780153d00000000c028cf3e4768934041bb29bf91585b400d21f8bc3db67f3ff780153d0000803fc028cf3e6e38c9405f5d47bf445b90400d21f83c3db67fbff78015bd0000000000000000ca879340f5344abf9e0c5b400d21f83c3db67fbff78015bd0000000000000000eb18c940abe326bf3d8190408dc2563f60e5b53bd3530b3f00000000000000004768934041bb29bf91585b408dc256bf60e5b5bbd3530bbf00000000000000006e38c9405f5d47bf445b90408dc2563f60e5b53bd3530b3f0000000000000000ca879340f5344abf9e0c5b408dc256bf60e5b5bbd3530bbf0000000000000000ac8aca40e9b224bf953c8e40636e16bd48a37f3f77831d3d00000000e8fbd03ef45394406b2c2abf23765840636e16bd48a37f3f77831d3d0000803fe8fbd03ee2b0ca40352a45bf93148e40636e163d48a37fbf77831dbd00000000000000002a7a9440b7a34abf1f265840636e163d48a37fbf77831dbd0000000000000000ac8aca40e9b224bf953c8e40e0da583f38302f3c0d06083f0000000000000000f45394406b2c2abf23765840e0da58bf38302fbc0d0608bf0000000000000000e2b0ca40352a45bf93148e40e0da583f38302f3c0d06083f00000000000000002a7a9440b7a34abf1f265840e0da58bf38302fbc0d0608bf000000000000000019f3cb40f46622bf3df28b40089730bd4b8d7f3f3ecf253d0000000014cfd23eef399540588c2abfd98c5540089730bd4b8d7f3f3ecf253d0000803f14cfd23ef41fcc4075db42bf1fc88b400897303d4b8d7fbf3ecf25bd0000000000000000ca669540d9004bbf9e3855400897303d4b8d7fbf3ecf25bd000000000000000019f3cb40f46622bf3df28b40a5e45a3f5056823c43af043f0000000000000000ef399540588c2abfd98c5540a5e45abf505682bc43af04bf0000000000000000f41fcc4075db42bf1fc88b40a5e45a3f5056823c43af043f0000000000000000ca669540d9004bbf9e385540a5e45abf505682bc43af04bf00000000000000000e52cd40570020bf58a28940348c4abd52747f3f57662e3d0000000030a2d43e0e1a96408ddb2abf2c9d5240348c4abd52747f3f57662e3d0000803f30a2d43e8085cd40ac7140bf0c768940348c4a3d52747fbf57662ebd0000000000000000804d9640e24c4bbf94445240348c4a3d52747fbf57662ebd00000000000000000e52cd40570020bf58a2894004e05c3f6cb3ad3c074f013f00000000000000000e1a96408ddb2abf2c9d524004e05cbf6cb3adbc074f01bf00000000000000008085cd40ac7140bf0c76894004e05c3f6cb3ad3c074f013f0000000000000000804d9640e24c4bbf9444524004e05cbf6cb3adbc074f01bf000000000000000070a7ce40ba7f1dbf044d87406e4e64bd5e587f3fb84b373d000000002e75d63e28f49640861a2bbf96a74f406e4e64bd5e587f3fb84b373d0000803f2e75d63e6de1ce4082ed3dbf751e87406e4e643d5e587fbfb84b37bd0000000000000000252e97404e884bbf794a4f406e4e643d5e587fbfb84b37bd000000000000000070a7ce40ba7f1dbf044d874020cd5e3fb8acd93cc8c9fb3e000000000000000028f49640861a2bbf96a74f4020cd5ebfb8acd9bcc8c9fbbe00000000000000006de1ce4082ed3dbf751e874020cd5e3fb8acd93cc8c9fb3e0000000000000000252e97404e884bbf794a4f4020cd5ebfb8acd9bcc8c9fbbe000000000000000018f3cf40b3e51abf5ff284406dde7dbd70397f3f2382403d00000000fe47d83e16c89740c1492bbf8eac4c406dde7dbd70397f3f2382403d0000803ffe47d83e9433d0408e4f3bbf79c184406dde7d3d70397fbf238240bd0000000000000000920898409cb34bbfc34a4c406dde7d3d70397fbf238240bd000000000000000018f3cf40b3e51abf5ff284400cac603f6c20033dc1e0f43e000000000000000016c89740c1492bbf8eac4c400cac60bf6c2003bdc1e0f4be00000000000000009433d0408e4f3bbf79c184400cac603f6c20033dc1e0f43e0000000000000000920898409cb34bbfc34a4c400cac60bf6c2003bdc1e0f4be0000000000000000e634d140ea3218bf87928240159e8bbd8e177f3ff80c4a3d000000008d1ada3eb0959840be692bbf8eac4940159e8bbd8e177f3ff80c4a3d0000803f8d1ada3ed37bd140779838bf355f8240159e8b3d8e177fbff80c4abd00000000000000009ddc98404bcf4bbfea454940159e8b3d8e177fbff80c4abd0000000000000000e634d140ea3218bf87928240d47c623fa5b6193d03e2ed3e0000000000000000b0959840be692bbf8eac4940d47c62bfa5b619bd03e2edbe0000000000000000d37bd140779838bf355f8240d47c623fa5b6193d03e2ed3e00000000000000009ddc98404bcf4bbfea454940d47c62bfa5b619bd03e2edbe0000000000000000b46cd240e36715bf9b2d8040413498bdbcf27e3f1def533d00000000ccecdb3ed65c9940097b2bbf12a84640413498bdbcf27e3f1def533d0000803fccecdb3e06bad240c3c835bf8cef7f404134983dbcf27ebf1def53bd000000000000000028aa9940e9db4bbf683c46404134983dbcf27ebf1def53bd0000000000000000b46cd240e36715bf9b2d80407a3f643f3799303d8fcce63e0000000000000000d65c9940097b2bbf12a846407a3f64bf379930bd8fcce6be000000000000000006bad240c3c835bf8cef7f407a3f643f3799303d8fcce63e000000000000000028aa9940e9db4bbf683c46407a3f64bf379930bd8fcce6be00000000000000005e9ad340288512bf6e877b400ab2a4bdf5ca7e3faa2b5e3d00000000adbedd3e621d9a40347e2bbf969f43400ab2a4bdf5ca7e3faa2b5e3d0000803fadbedd3e08eed340fbe032bf91167b400ab2a43df5ca7ebfaa2b5ebd00000000000000000c719a4007da4bbfb92e43400ab2a43df5ca7ebfaa2b5ebd00000000000000005e9ad340288512bf6e877b40f1f3653f67c8473d609fdf3e0000000000000000621d9a40347e2bbf969f4340f1f365bf67c847bd609fdfbe000000000000000008eed340fbe032bf91167b40f1f3653f67c8473d609fdf3e00000000000000000c719a4007da4bbfb92e4340f1f365bf67c847bd609fdfbe0000000000000000b9bdd4404e8b0fbff2a976405817b1bd37a07e3f3ac6683d000000002190df3e31d79a40ca732bbf969340405817b1bd37a07e3f3ac6683d0000803f2190df3eaf17d540b3e12fbfb23376405817b13d37a07ebf3ac668bd000000000000000027319b402fca4bbf561d40405817b13d37a07ebf3ac668bd0000000000000000b9bdd4404e8b0fbff2a97640229a673fe3435f3d7059d83e000000000000000031d79a40ca732bbf96934040229a67bfe3435fbd7059d8be0000000000000000af17d540b3e12fbfb2337640229a673fe3435f3d7059d83e000000000000000027319b402fca4bbf561d4040229a67bfe3435fbd7059d8be0000000000000000a1d6d540f77a0cbff9c271406863bdbd85727e3f0ac3733d000000001861e13e258a9b40415c2bbf8d843d406863bdbd85727e3f0ac3733d0000803f1861e13ed736d6408ecb2cbf244771406863bd3d85727ebf0ac373bd00000000000000005bea9b40d8ac4bbfb8083d406863bd3d85727ebf0ac373bd0000000000000000a1d6d540f77a0cbff9c27140ef31693f4a0a773db0f9d03e0000000000000000258a9b40415c2bbf8d843d40ef3169bf4a0a77bdb0f9d0be0000000000000000d736d6408ecb2cbf24477140ef31693f4a0a773db0f9d03e00000000000000005bea9b40d8ac4bbfb8083d40ef3169bf4a0a77bdb0f9d0be0000000000000000e8e4d640985409bfbfd26c409b96c9bdda417e3f48257f3d000000008431e33e1e369c403c382bbff9723a409b96c9bdda417e3f48257f3d0000803f8431e33e504bd740019f29bf22516c409b96c93dda417ebf48257fbd0000000000000000869c9c40a5824bbf5cf139409b96c93dda417ebf48257fbd0000000000000000e8e4d640985409bfbfd26c4028bb6a3f8d8e873d177fc93e00000000000000001e369c403c382bbff9723a4028bb6abf8d8e87bd177fc9be0000000000000000504bd740019f29bf22516c4028bb6a3f8d8e873d177fc93e0000000000000000869c9c40a5824bbf5cf1394028bb6abf8d8e87bd177fc9be000000000000000064e8d740c71806bf7cd967406ab0d5bd320e7e3f8378853d000000005801e53e00db9c404d082bbf585f37406ab0d5bd320e7e3f8378853d0000803f5801e53ef254d840a15c26bfe15167406ab0d53d320e7ebf837885bd00000000000000008e479d40274c4bbfbdd736406ab0d53d320e7ebf837885bd000000000000000064e8d740c71806bf7cd9674092356c3f16be933d94e8c13e000000000000000000db9c404d082bbf585f374092356cbf16be93bd94e8c1be0000000000000000f254d840a15c26bfe151674092356c3f16be933d94e8c13e00000000000000008e479d40274c4bbfbdd7364092356cbf16be93bd94e8c1be0000000000000000e7e0d8400cc802bf6bd7624035b0e1bd86d77d3f33958b3d0000000087d0e63ead789d40fccc2abf254a344035b0e1bd86d77d3f33958b3d0000803f87d0e63e8d53d940f40423bf9a49624035b0e13d86d77dbf33958bbd000000000000000053eb9d40e4094bbf54bc334035b0e13d86d77dbf33958bbd0000000000000000e7e0d8400cc802bf6bd76240e6a06d3fc313a03d1b35ba3e0000000000000000ad789d40fccc2abf254a3440e6a06dbfc313a0bd1b35babe00000000000000008d53d940f40423bf9a496240e6a06d3fc313a03d1b35ba3e000000000000000053eb9d40e4094bbf54bc3340e6a06dbfc313a0bd1b35babe000000000000000043ced940fec5febec5cc5d40f694edbdd59d7d3ff0ea913d00000000069fe83e0f0f9e40d5862abfdf333140f694edbdd59d7d3ff0ea913d0000803f069fe83ef446da4094981fbf84385d40f694ed3dd59d7dbff0ea91bd0000000000000000c0879e406abc4abf9e9f3040f694ed3dd59d7dbff0ea91bd000000000000000043ced940fec5febec5cc5d40d3fc6e3f5a8fac3d9763b23e00000000000000000f0f9e40d5862abfdf333140d3fc6ebf5a8facbd9763b2be0000000000000000f446da4094981fbf84385d40d3fc6e3f5a8fac3d9763b23e0000000000000000c0879e406abc4abf9e9f3040d3fc6ebf5a8facbd9763b2be000000000000000045b0da400bd4f7bec1b95840ce5ef9bd18617d3f807b983d00000000c96cea3e099e9e4086362abfff1c2e40ce5ef9bd18617d3f807b983d0000803fc96cea3ef32edb40e4171cbfd51e5840ce5ef93d18617dbf807b98bd0000000000000000b71c9f4064644abf13822d40ce5ef93d18617dbf807b98bd000000000000000045b0da400bd4f7bec1b95840f248703f0432b93d0b73aa3e0000000000000000099e9e4086362abfff1c2e40f24870bf0432b9bd0b73aabe0000000000000000f32edb40e4171cbfd51e5840f248703f0432b93d0b73aa3e0000000000000000b71c9f4064644abf13822d40f24870bf0432b9bd0b73aabe0000000000000000be86db4064bbf0be9f9e5340358602be45217d3f39499f3d00000000c539ec3e88259f4096dc29bf03062b40358602be45217d3f39499f3d0000803fc539ec3e5b0bdc40758318bfc9fc52403586023e45217dbf39499fbd000000000000000025aa9f4059024abf2d642a403586023e45217dbf39499fbd0000000000000000be86db4064bbf0be9f9e5340d484713f8ffbc53d6f62a23e000000000000000088259f4096dc29bf03062b40d48471bf8ffbc5bd6f62a2be00000000000000005b0bdc40758318bfc9fc5240d484713f8ffbc53d6f62a23e000000000000000025aa9f4059024abf2d642a40d48471bf8ffbc5bd6f62a2be00000000000000007551dc40277de9be967b4e404e4e08be57de7c3f5b56a63d00000000f305ee3e75a59f409c7929bf66ef27404e4e08be57de7c3f5b56a63d0000803ff305ee3ef2dbdc40d6db14bf96d24d404e4e083e57de7cbf5b56a6bd0000000000000000f22fa040df9649bf664627404e4e083e57de7cbf5b56a6bd00000000000000007551dc40277de9be967b4e40fdaf723f24ecd23dc2309a3e000000000000000075a59f409c7929bf66ef2740fdaf72bf24ecd2bdc2309abe0000000000000000f2dbdc40d6db14bf96d24d40fdaf723f24ecd23dc2309a3e0000000000000000f22fa040df9649bf66462740fdaf72bf24ecd2bdc2309abe00000000000000003710dd40651ae2bee6504940fa060ebe46987c3f34a5ad3d0000000048d1ef3ebf1da040250e29bfa2d92440fa060ebe46987c3f34a5ad3d0000803f48d1ef3e84a0dd40902111bf7aa04840fa060e3e46987cbf34a5adbd00000000000000000caea040822249bf36292440fa060e3e46987cbf34a5adbd00000000000000003710dd40651ae2bee6504940dfc9733fcb03e03d0fdd913e0000000000000000bf1da040250e29bfa2d92440dfc973bfcb03e0bd0fdd91be000000000000000084a0dd40902111bf7aa04840dfc9733fcb03e03d0fdd913e00000000000000000caea040822249bf36292440dfc973bfcb03e0bd0fdd91be0000000000000000cbc2dd40fb93dabeca1e4440dfaf13be064f7c3fd037b53d00000000bf9bf13e558ea040de9a28bf2ec52140dfaf13be064f7c3fd037b53d0000803fbf9bf13ed858de400d550dbfac664340dfaf133e064f7cbfd037b5bd00000000000000006224a140eea548bf100d2140dfaf133e064f7cbfd037b5bd0000000000000000cbc2dd40fb93dabeca1e4440dbd1743f8343ed3d7166893e0000000000000000558ea040de9a28bf2ec52140dbd174bf8343edbd716689be0000000000000000d858de400d550dbfac664340dbd1743f8343ed3d7166893e00000000000000006224a140eea548bf100d2140dbd174bf8343edbd716689be0000000000000000f868de4026ebd2be83e53e40d54719be90027c3fac10bd3d000000004f65f33e26f7a040452028bf81b21e40d54719be90027c3fac10bd3d0000803f4f65f33eb404df40ec7609bf6c253e40d547193e90027cbfac10bdbd0000000000000000e292a1409e2148bf6af21d40d547193e90027cbfac10bdbd0000000000000000f868de4026ebd2be83e53e4049c7753fcaaafa3d08cc803e000000000000000026f7a040452028bf81b21e4049c775bfcaaafabd08cc80be0000000000000000b404df40ec7609bf6c253e4049c7753fcaaafa3d08cc803e0000000000000000e292a1409e2148bf6af21d4049c775bfcaaafabd08cc80be00000000000000008202df40e820cbbe53a5394004ce1ebedcb27b3f0632c53d00000000f52df53e2658a140f09e27bf11a21b4004ce1ebedcb27b3f0632c53d0000803ff52df53edaa3df40ae8705bff9dc384004ce1e3edcb27bbf0632c5bd00000000000000007ef9a1402a9647bfb7d91a4004ce1e3edcb27bbf0632c5bd00000000000000008202df40e820cbbe53a5394070a9763ff81c043e0f1a703e00000000000000002658a140f09e27bf11a21b4070a976bff81c04be0f1a70be0000000000000000daa3df40ae8705bff9dc384070a9763ff81c043e0f1a703e00000000000000007ef9a1402a9647bfb7d91a4070a976bff81c04be0f1a70be00000000000000002b8fdf405436c3be7c5e3440804124bee05f7b3f1e9ecd3d00000000acf5f63e49b1a1407a1727bf4e941840804124bee05f7b3f1e9ecd3d0000803facf5f63e0d36e040da8701bf948d33408041243ee05f7bbf1e9ecdbd00000000000000002b58a2402a0447bf66c317408041243ee05f7bbf1e9ecdbd00000000000000002b8fdf405436c3be7c5e34408577773fa1f80a3e6a515e3e000000000000000049b1a1407a1727bf4e941840857777bfa1f80abe6a515ebe00000000000000000d36e040da8701bf948d33408577773fa1f80a3e6a515e3e00000000000000002b58a2402a0447bf66c31740857777bfa1f80abe6a515ebe0000000000000000b30ee040572cbbbe46112f4061a129be92097b3f1957d63d0000000074bcf83e8702a2407c8a26bfaa89154061a129be92097b3f1957d63d0000803f74bcf83e0bbbe040cceffabe81372e4061a1293e92097bbf1957d6bd0000000000000000dfaea240366c46bfe5af144061a1293e92097bbf1957d6bd0000000000000000b30ee040572cbbbe46112f40ae30783fa2e8113ee53c4c3e00000000000000008702a2407c8a26bfaa891540ae3078bfa2e811bee53c4cbe00000000000000000bbbe040cceffabe81372e40ae30783fa2e8113ee53c4c3e0000000000000000dfaea240366c46bfe5af1440ae3078bfa2e811bee53c4cbe0000000000000000d780e0402d04b3befdbd29404aec2ebee4af7a3f3f5fdf3d000000004982fa3ed74ba24082f825bf918212404aec2ebee4af7a3f3f5fdf3d0000803f4982fa3e9032e140dab0f2be0bdb28404aec2e3ee4af7abf3f5fdfbd000000000000000090fda240d9ce45bf9f9f11404aec2e3ee4af7abf3f5fdfbd0000000000000000d780e0402d04b3befdbd294000d4783fd6ec183e64db393e0000000000000000d74ba24082f825bf9182124000d478bfd6ec18be64db39be00000000000000009032e140dab0f2be0bdb284000d4783fd6ec183e64db393e000000000000000090fda240d9ce45bf9f9f114000d478bfd6ec18be64db39be000000000000000057e5e040d8beaabeec6424400b2134bed2527a3fadb8e83d000000002f47fc3e358da240186225bf6a7f0f400b2134bed2527a3fadb8e83d0000803f2f47fc3e5a9ce140e253eabe7a7823400b21343ed2527abfadb8e8bd00000000000000003844a3409d2c45bff8920e400b21343ed2527abfadb8e8bd000000000000000057e5e040d8beaabeec6424408760793f5905203e132c273e0000000000000000358da240186225bf6a7f0f40876079bf590520be132c27be00000000000000005a9ce140e253eabe7a7823408760793f5905203e132c273e00000000000000003844a3409d2c45bff8920e40876079bf590520be132c27be0000000000000000eb3be140935da2be65061f400c3e39be50f2793f8265f23d00000000270bfe3e9bc6a240c2c724bf9b800c400c3e39be50f2793f8265f23d0000803f270bfe3e20f8e14019dae1be1f101e400c3e393e50f279bf8265f2bd0000000000000000d082a340058644bf558a0b400c3e393e50f279bf8265f2bd0000000000000000eb3be140935da2be65061f403ed5793ff231273e532e143e00000000000000009bc6a240c2c724bf9b800c403ed579bff23127be532e14be000000000000000020f8e14019dae1be1f101e403ed5793ff231273e532e143e0000000000000000d082a340058644bf558a0b403ed579bff23127be532e14be00000000000000004c84e14070e199bebfa21940fa413ebe568e793fa467fc3d0000000036ceff3e0af8a240142a24bf83860940fa413ebe568e793fa467fc3d0000803f36ceff3e9945e2409144d9be4ea21840fa413e3e568e79bfa467fcbd000000000000000057b9a340a5db43bf12860840fa413e3e568e79bfa467fcbd00000000000000004c84e14070e199bebfa219400c317a3fb7722e3edbe1003e00000000000000000af8a240142a24bf838609400c317abfb7722ebedbe100be00000000000000009945e2409144d9be4ea218400c317a3fb7722e3edbe1003e000000000000000057b9a340a5db43bf128608400c317abfb7722ebedbe100be000000000000000033bee140954b91be553a1440502b43bed726793f7260033e0000000030c8003f7f21a3409a8923bf7f910640502b43bed726793f7260033e0000803f30c8003f7e84e2406c94d0be602f1340502b433ed72679bf726003be0000000000000000cae7a340062e43bf8a860540502b433ed72679bf726003be000000000000000033bee140954b91be553a1440ce727a3f9ec7353e5f8dda3d00000000000000007f21a3409a8923bf7f910640ce727abf9ec735be5f8ddabd00000000000000007e84e2406c94d0be602f1340ce727a3f9ec7353e5f8dda3d0000000000000000cae7a340062e43bf8a860540ce727abf9ec735be5f8ddabd000000000000000053e9e140299d88be89cd0e405ff847becbbb783f7cb9083e00000000d7a8013ffd42a340d4e622bfe3a103405ff847becbbb783f7cb9083e0000803fd7a8013f7eb4e240d0cac7beb6b70d405ff8473ecbbb78bf7cb908be0000000000000000280ea440a87d42bf108c02405ff8473ecbbb78bf7cb908be000000000000000053e9e140299d88be89cd0e4055997a3f7e303d3e63bab23d0000000000000000fd42a340d4e622bfe3a1034055997abf7e303dbe63bab2bd00000000000000007eb4e240d0cac7beb6b70d4055997a3f7e303d3e63bab23d0000000000000000280ea440a87d42bf108c024055997abf7e303dbe63bab2bd00000000000000006305e24031af7fbec05c0940ffa64cbe334d783fbe3f0e3e000000001489023f875ca3402a4222bffeb70040ffa64cbe334d783fbe3f0e3e0000803f1489023f50d5e24028e9bebeb33b0840ffa64c3e334d78bfbe3f0ebe0000000000000000742ca440f2ca41bfe22dff3fffa64c3e334d78bfbe3f0ebe00000000000000006305e24031af7fbec05c09406da37a3fbbac443e284c8a3d0000000000000000875ca3402a4222bffeb700406da37abfbbac44be284c8abd000000000000000050d5e24028e9bebeb33b08406da37a3fbbac443e284c8a3d0000000000000000742ca440f2ca41bfe22dff3f6da37abfbbac44be284c8abd00000000000000001212e240f9f76dbe6ae80340943551be02db773fdbf3133e00000000ed68033f206ea340269c21bf30a8fb3f943551be02db773fdbf3133e0000803fed68033fa0e6e2408bf0b5bec6bb02409435513e02db77bfdbf313be0000000000000000ae42a4406d1641bfe94ef93f9435513e02db77bfdbf313be00000000000000001212e240f9f76dbe6ae80340ca8f7a3f4f3c4c3e358a423d0000000000000000206ea340269c21bf30a8fb3fca8f7abf4f3c4cbe358a42bd0000000000000000a0e6e2408bf0b5bec6bb0240ca8f7a3f4f3c4c3e358a423d0000000000000000ae42a4406d1641bfe94ef93fca8f7abf4f3c4cbe358a42bd0000000000000000160fe24086175cbef7e1fc3ff4a155be3465773f61d6193e000000006a48043fce77a34036f520bfe7ecf53ff4a155be3465773f61d6193e0000803f6a48043f23e8e24065e2acbec570fa3ff4a1553e346577bf61d619be0000000000000000db50a440876040bfb57bf33ff4a1553e346577bf61d619be0000000000000000160fe24086175cbef7e1fc3f235d7a3faade533ee1a1de3c0000000000000000ce77a34036f520bfe7ecf53f235d7abfaade53bee1a1debc000000000000000023e8e24065e2acbec570fa3f235d7a3faade533ee1a1de3c0000000000000000db50a440876040bfb57bf33f235d7abfaade53bee1a1debc000000000000000020fce140a2104abee0edf13ff1e959bec9eb763fc1e71f3e000000009127053f9679a340c44d20bf923ef03ff1e959bec9eb763fc1e71f3e0000803f9127053f87d9e2401cc0a3be0564ef3ff1e9593ec9eb76bfc1e71fbe0000000000000000fd56a440aaa93fbfb7b4ed3ff1e9593ec9eb76bfc1e71fbe000000000000000020fce140a2104abee0edf13f280a7a3f36935b3e40a7d73b00000000000000009679a340c44d20bf923ef03f280a7abf36935bbe40a7d7bb000000000000000087d9e2401cc0a3be0564ef3f280a7a3f36935b3e40a7d73b0000000000000000fd56a440aaa93fbfb7b4ed3f280a7abf36935bbe40a7d7bb0000000000000000ded8e140cfe537bea0f5e63f990b5ebeba6e763f4228263e000000006d06063f7e73a3403ea61fbf929dea3f990b5ebeba6e763f4228263e0000803f6d06063f77bae240ef8a9abe5d52e43f990b5e3eba6e76bf422826be00000000000000001755a44042f23ebf4ffae73f990b5e3eba6e76bf422826be0000000000000000ded8e140cfe537bea0f5e63f7d95793f9559633e5efc69bc00000000000000007e73a3403ea61fbf929dea3f7d9579bf955963be5efc693c000000000000000077bae240ef8a9abe5d52e43f7d95793f9559633e5efc69bc00000000000000001755a44042f23ebf4ffae73f7d9579bf955963be5efc693c000000000000000002a5e140659a25be50fadb3f500462be09ee753f06982c3e0000000006e5063f8e65a340f7fe1ebf380ae53f500462be09ee753f06982c3e0000803f06e5063fa48ae2408a4491bee43cd93f5004623e09ee75bf06982cbe0000000000000000304ba440a33a3ebfcc4ce23f5004623e09ee75bf06982cbe000000000000000002a5e140659a25be50fadb3fcdfd783fbb306b3e7ffe10bd00000000000000008e65a340f7fe1ebf380ae53fcdfd78bfbb306bbe7ffe103d0000000000000000a48ae2408a4491bee43cd93fcdfd783fbb306b3e7ffe10bd0000000000000000304ba440a33a3ebfcc4ce23fcdfd78bfbb306bbe7ffe103d00000000000000003c60e140183113be20fdd03f08d265beb969753f0737333e000000006ac3073fcc4fa34052581ebfc084df3f08d265beb969753f0737333e0000803f6ac3073fbb49e24048ee87becc24ce3f08d2653eb96975bf073733be00000000000000004b39a44030833dbf6cacdc3f08d2653eb96975bf073733be00000000000000003c60e140183113be20fdd03fc141783f1818733ef17968bd0000000000000000cc4fa34052581ebfc084df3fc14178bf181873bef179683d0000000000000000bb49e24048ee87becc24ce3fc141783f1818733ef17968bd00000000000000004b39a44030833dbf6cacdc3fc14178bf181873bef179683d00000000000000003d0ae14034ad00be55ffc53f447269becee1743f0b053a3e00000000a4a1083f3b32a3409db21dbf530dda3f447269becee1743f0b053a3e0000803fa4a1083f6bf7e140a0137dbe590bc33f4472693ecee174bf0b053abe0000000000000000691fa44038cc3cbf5719d73f4472693ecee174bf0b053abe00000000000000003d0ae14034ad00be55ffc53f0860773fa00e7b3ef66fa0bd00000000000000003b32a3409db21dbf530dda3f086077bfa00e7bbef66fa03d00000000000000006bf7e140a0137dbe590bc33f0860773fa00e7b3ef66fa0bd0000000000000000691fa44038cc3cbf5719d73f086077bfa00e7bbef66fa03d0000000000000000baa2e0404824dcbd4302bb3f78e26cbe4e56743fa301413e00000000c27f093fe20ca3401b0e1dbf09a4d43f78e26cbe4e56743fa301413e0000803fc27f093f6793e140b2316abee2f1b73f78e26c3e4e5674bfa30141be00000000000000008ffda340ff153cbfa893d13f78e26c3e4e5674bfa30141be0000000000000000baa2e0404824dcbd4302bb3f5c57763f9289813e2c0ecdbd0000000000000000e20ca3401b0e1dbf09a4d43f5c5776bf928981be2c0ecd3d00000000000000006793e140b2316abee2f1b73f5c57763f9289813e2c0ecdbd00000000000000008ffda340ff153cbfa893d13f5c5776bf928981be2c0ecd3d00000000000000006429e0407cc6b6bd5807b03f3f2070be46c7733f312c483e00000000d35d0a3fc4dfa2400e6b1cbfe248cf3f3f2070be46c7733f312c483e0000803fd35d0a3f5c1de140243a57bed8d9ac3f3f20703e46c773bf312c48be0000000000000000bcd3a340c7603bbf621bcc3f3f20703e46c773bf312c48be00000000000000006429e0407cc6b6bd5807b03f8426753f3f92853e4a0cfabd0000000000000000c4dfa2400e6b1cbfe248cf3f842675bf3f9285be4a0cfa3d00000000000000005c1de140243a57bed8d9ac3f8426753f3f92853e4a0cfabd0000000000000000bcd3a340c7603bbf621bcc3f842675bf3f9285be4a0cfa3d0000000000000000f49ddf40504891bd1410a53f142973bebc34733fd2834f3e00000000e83b0b3fe0aaa240aec91bbfc8fbc93f142973bebc34733fd2834f3e0000803fe83b0b3f0195e0409c3044bebdc4a13f1429733ebc3473bfd2834fbe0000000000000000eda1a340cbac3abf71b0c63f1429733ebc3473bfd2834fbe0000000000000000f49ddf40504891bd1410a53f52cc733fa4a0893ed1ae13be0000000000000000e0aaa240aec91bbfc8fbc93f52cc73bfa4a089bed1ae133e00000000000000000195e0409c3044bebdc4a13f52cc733fa4a0893ed1ae13be0000000000000000eda1a340cbac3abf71b0c63f52cc73bfa4a089bed1ae133e00000000000000002200df40b06257bd0c1e9a3f60fa75bec99e723f6e07573e00000000121a0c3f346ea2401b2a1bbf96bcc43f60fa75bec99e723f6e07573e0000803f121a0c3f0cfadf40f41831be2bb4963f60fa753ec99e72bf6e0757be00000000000000001e68a3402dfa39bfb552c13f60fa753ec99e72bf6e0757be00000000000000002200df40b06257bd0c1e9a3fb847723ff0b38d3e267a2abe0000000000000000346ea2401b2a1bbf96bcc43fb84772bff0b38dbe267a2a3e00000000000000000cfadf40f41831be2bb4963fb847723ff0b38d3e267a2abe00000000000000001e68a3402dfa39bfb552c13fb84772bff0b38dbe267a2a3e0000000000000000a94fde4080110cbdec328f3ff89178be7505723fb7b55e3e0000000064f80c3fbb29a2408e8c1abf0c8bbf3ff89178be7505723fb7b55e3e0000803f64f80c3f354cdf40c4f61dbed4a98b3ff891783e750572bfb7b55ebe00000000000000004726a340274939bff401bc3ff891783e750572bfb7b55ebe0000000000000000a94fde4080110cbdec328f3fb597703f76cb913e7c6041be0000000000000000bb29a2408e8c1abf0c8bbf3fb59770bf76cb91be7c60413e0000000000000000354cdf40c4f61dbed4a98b3fb597703f76cb913e7c6041be00000000000000004726a340274939bff401bc3fb59770bf76cb91be7c60413e00000000000000004c8cdd40205c81bc7050843f42ed7abee268713f0b8d663e00000000f4d60d3f6edda14015f119bfd866ba3f42ed7abee268713f0b8d663e0000803ff4d60d3f3d8bde405ece0abe7aa7803f42ed7a3ee26871bf0b8d66be00000000000000005fdca240cb9938bfe2bdb63f42ed7a3ee26871bf0b8d66be00000000000000004c8cdd40205c81bc7050843f77bb6e3f34e6953e9e5958be00000000000000006edda14015f119bfd866ba3f77bb6ebf34e695be9e59583e00000000000000003d8bde405ece0abe7aa7803f77bb6e3f34e6953e9e5958be00000000000000005fdca240cb9938bfe2bdb63f77bb6ebf34e695be9e59583e000000000000000096bedc400004c5ba27ae723f93e478bece1e713fcc7e6d3e00000000d6b50e3f7280a140d04918bfed70b53f93e478bece1e713fcc7e6d3e0000803fd6b50e3f76bbdd40800ef8bdca236b3f93e4783ece1e71bfcc7e6dbe0000000000000000527da2401ee936bfbfabb13f93e4783ece1e71bfcc7e6dbe000000000000000096bedc400004c5ba27ae723f8cf86c3f4ee7973e656770be00000000000000007280a140d04918bfed70b53f8cf86cbf4ee797be6567703e000000000000000076bbdd40800ef8bdca236b3f8cf86c3f4ee7973e656770be0000000000000000527da2401ee936bfbfabb13f8cf86cbf4ee797be6567703e000000000000000023eada40d095ea3ca98d473fa21175be074b703f134b7e3e00000000fb74103fa9ada040965e15bf886dab3fa21175be074b703f134b7e3e0000803ffb74103f20e3db40d17db9bdc47a3f3fa211753e074b70bf134b7ebe0000000000000000a6a6a140ffe233bf1564a73fa211753e074b70bf134b7ebe000000000000000023eada40d095ea3ca98d473febf1683f45b39c3e664d8fbe0000000000000000a9ada040965e15bf886dab3febf168bf45b39cbe664d8f3e000000000000000020e3db40d17db9bdc47a3f3febf1683f45b39c3e664d8fbe0000000000000000a6a6a140ffe233bf1564a73febf168bf45b39cbe664d8f3e000000000000000083e6d940d0ac363da59a323fe13473be15bf6f3fa812843e00000000e053113f0338a040391314bf9e62a63fe13473be15bf6f3fa812843e0000803fe053113f9cddda40ae3e98bdab372a3fe134733e15bf6fbfa81284be00000000000000001c2fa140dc8532bf2131a23fe134733e15bf6fbfa81284be000000000000000083e6d940d0ac363da59a323fffb9663f067e9f3e962a9abe00000000000000000338a040391314bf9e62a63fffb966bf067e9fbe962a9a3e00000000000000009cddda40ae3e98bdab372a3fffb9663f067e9f3e962a9abe00000000000000001c2fa140dc8532bf2131a23fffb966bf067e9fbe962a9a3e000000000000000006d3d840f07a783d22f91d3faf1971be78316f3fd0f5883e00000000e331123f96ba9f408dc312bfd567a13faf1971be78316f3fd0f5883e0000803fe331123ffbc7d9407a8f6dbdb546153faf19713e78316fbfd0f588be00000000000000008bafa040342431bf9f0e9d3faf19713e78316fbfd0f588be000000000000000006d3d840f07a783d22f91d3fc461643f3c4ba23e88d6a4be000000000000000096ba9f408dc312bfd567a13fc46164bf3c4ba2be88d6a43e0000000000000000fbc7d9407a8f6dbdb546153fc461643f3c4ba23e88d6a4be00000000000000008bafa040342431bf9f0e9d3fc46164bf3c4ba2be88d6a43e000000000000000014b0d74030549d3deeaa093fa6c16ebe63a26e3f08cd8d3e00000000210f133f5c359f403a6f11bf397c9c3fa6c16ebe63a26e3f08cd8d3e0000803f210f133fa8a2d8404c3f2abdd0a9003fa6c16e3e63a26ebf08cd8dbe0000000000000000f027a040b5bd2fbfaafb973fa6c16e3e63a26ebf08cd8dbe000000000000000014b0d74030549d3deeaa093fddea613fc019a53e834dafbe00000000000000005c359f403a6f11bf397c9c3fddea61bfc019a5be834daf3e0000000000000000a8a2d8404c3f2abdd0a9003fddea613fc019a53e834dafbe0000000000000000f027a040b5bd2fbfaafb973fddea61bfc019a5be834daf3e0000000000000000147ed6401c95be3d7763eb3e382f6cbe07126e3f9596923e00000000b5eb133f54a89e401c1610bfe49e973f382f6cbe07126e3f9596923e0000803fb5eb133f0b6ed7403830cdbc97c5d83e382f6c3e07126ebf959692be00000000000000004b989f4041522ebf6cf7923f382f6c3e07126ebf959692be0000000000000000147ed6401c95be3d7763eb3e01575f3fbfe8a73e0d8cb9be000000000000000054a89e401c1610bfe49e973f01575fbfbfe8a7be0d8cb93e00000000000000000b6ed7403830cdbc97c5d83e01575f3fbfe8a73e0d8cb9be00000000000000004b989f4041522ebf6cf7923f01575fbfbfe8a7be0d8cb93e0000000000000000763dd540f8fadf3d0f1ec43ee86469be95806d3fd550973e00000000b9c7143f76139e40ffb70ebf0ccf923fe86469be95806d3fd550973e0000803fb9c7143f972ad64068930abc7be6b03ee864693e95806dbfd55097be000000000000000097009f40ace12cbf27018e3fe864693e95806dbfd55097be0000000000000000763dd540f8fadf3d0f1ec43effa75c3f5eb7aa3e118fc3be000000000000000076139e40ffb70ebf0ccf923fffa75cbf5eb7aabe118fc33e0000000000000000972ad64068930abc7be6b03effa75c3f5eb7aa3e118fc3be000000000000000097009f40ace12cbf27018e3fffa75cbf5eb7aabe118fc33e0000000000000000a4eed34044c0003e4d889d3e6c6566be38ee6c3f4ffa9b3e0000000047a3153fb8769d40bd540dbffd0b8e3f6c6566be38ee6c3f4ffa9b3e0000803f47a3153fb9d8d440c03e063c27b9893e6c65663e38ee6cbf4ffa9bbe0000000000000000cd609e40d36b2bbf3318893f6c65663e38ee6cbf4ffa9bbe0000000000000000a4eed34044c0003e4d889d3eaedf593fce84ad3ed353cdbe0000000000000000b8769d40bd540dbffd0b8e3faedf59bfce84adbed353cd3e0000000000000000b9d8d440c03e063c27b9893eaedf593fce84ad3ed353cdbe0000000000000000cd609e40d36b2bbf3318893faedf59bfce84adbed353cd3e00000000000000000c92d2402290113ece486f3e513363be245b6c3f9c91a03e00000000797e163f0ed29c401aec0bbf1c55893f513363be245b6c3f9c91a03e0000803f797e163fe278d34008f4cb3cfb7f463e5133633e245b6cbf9c91a0be0000000000000000e4b89d4082f029bf023c843f5133633e245b6cbf9c91a0be00000000000000000c92d2402290113ece486f3efaff563f2350b03e05d8d6be00000000000000000ed29c401aec0bbf1c55893ffaff56bf2350b0be05d8d63e0000000000000000e278d34008f4cb3cfb7f463efaff563f2350b03e05d8d6be0000000000000000e4b89d4082f029bf023c843ffaff56bf2350b0be05d8d63e00000000000000002328d140966a223e58e8243e80d15fbe81c76b3f8c15a53e000000006359173f6f259c40fc7d0abfe5a9843f80d15fbe81c76b3f8c15a53e0000803f6359173f890bd240d48f2a3dd2f3f53d80d15f3e81c76bbf8c15a5be0000000000000000d5089d40a46f28bf2ed87e3f80d15f3e81c76bbf8c15a5be00000000000000002328d140966a223e58e8243ecd0a543fa118b33eb419e0be00000000000000006f259c40fc7d0abfe5a9843fcd0a54bfa118b3beb419e03e0000000000000000890bd240d48f2a3dd2f3f53dcd0a543fa118b33eb419e0be0000000000000000d5089d40a46f28bf2ed87e3fcd0a54bfa118b3beb419e03e000000000000000052b1cf405a4d333e10e5b73d04435cbe7c336b3f1485a93e000000001c34183fcc709b40440a09bfed09803f04435cbe7c336b3f1485a93e0000803f1c34183f1b91d040aa476f3db18e433d04435c3e7c336bbf1485a9be000000000000000095509c4020e926bf2350753f04435c3e7c336bbf1485a9be000000000000000052b1cf405a4d333e10e5b73d1602513f9bddb53e3817e9be0000000000000000cc709b40440a09bfed09803f160251bf9bddb5be3817e93e00000000000000001b91d040aa476f3db18e433d1602513f9bddb53e3817e9be000000000000000095509c4020e926bf2350753f160251bf9bddb5be3817e93e00000000000000000d2ece40f435443e704ba33cb48a58be3a9f6a3f44dfad3e00000000b90e193f1db49a40d99007bfb8e9763fb48a58be3a9f6a3f44dfad3e0000803fb90e193f0f0acf40ab0b9a3d7603bebcb48a583e3a9f6abf44dfadbe00000000000000001f909b40e15c25bf41df6b3fb48a583e3a9f6abf44dfadbe00000000000000000d2ece40f435443e704ba33cbfe74d3f569eb83e5dcff1be00000000000000001db49a40d99007bfb8e9763fbfe74dbf569eb8be5dcff13e00000000000000000f0acf40ab0b9a3d7603bebcbfe74d3f569eb83e5dcff1be00000000000000001f909b40e15c25bf41df6b3fbfe74dbf569eb8be5dcff13e0000000000000000c29ecc40f621553eb0c546bd5fab54beec0a6a3f4a23b23e000000004de9193f56ef99409e1106bfefd46d3f5fab54beec0a6a3f4a23b23e0000803f4de9193fd476cd405c7abc3d50e1bdbd5fab543eec0a6abf4a23b2be000000000000000068c79a40d0ca23bf2085623f5fab543eec0a6abf4a23b2be0000000000000000c29ecc40f621553eb0c546bdb3bd4a3f1b5abb3e4a41fabe000000000000000056ef99409e1106bfefd46d3fb3bd4abf1b5abbbe4a41fa3e0000000000000000d476cd405c7abc3d50e1bdbdb3bd4a3f1b5abb3e4a41fabe000000000000000068c79a40d0ca23bf2085623fb3bd4abf1b5abbbe4a41fa3e0000000000000000de03cb407c0f663ed0b9ecbd1ea850bead76693f8e50b63e00000000eac31a3f6c2299408b8c04bf2ad5643f1ea850bead76693f8e50b63e0000803feac31a3fddd7cb4006ecde3dbcab24be1ea8503ead7669bf8e50b6be00000000000000006bf69940e93222bf7541593f1ea8503ead7669bf8e50b6be0000000000000000de03cb407c0f663ed0b9ecbdc685473f6a10be3e323601bf00000000000000006c2299408b8c04bf2ad5643fc68547bf6a10bebe3236013f0000000000000000ddd7cb4006ecde3dbcab24bec685473f6a10be3e323601bf00000000000000006bf69940e93222bf7541593fc68547bf6a10bebe3236013f0000000000000000cb5dc94092fc763ed09839bef3834cbe9de2683f9866ba3e00000000a39e1b3f5b4d9840a80103bf34ea5b3ff3834cbe9de2683f9866ba3e0000803fa39e1b3f952dca4050ae003e56f168bef3834c3e9de268bf9866babe0000000000000000251d9940389520bf1214503ff3834c3e9de268bf9866babe0000000000000000cb5dc94092fc763ed09839bec241443fcdc0c03e342805bf00000000000000005b4d9840a80103bf34ea5b3fc24144bfcdc0c0be3428053f0000000000000000952dca4050ae003e56f168bec241443fcdc0c03e342805bf0000000000000000251d9940389520bf1214503fc24144bfcdc0c0be3428053f0000000000000000f6acc74088f3833e6c657bbe824148bee74e683ff964be3e0000000085791c3f1c709740e87001bf1314533f824148bee74e683ff964be3e0000803f85791c3f6c78c840d8e3113ed0e095be8241483ee74e68bff964bebe0000000000000000923b9840b6f11ebf06fd463f8241483ee74e68bff964bebe0000000000000000f6acc74088f3833e6c657bbe6af3403fac6ac33eb7f608bf00000000000000001c709740e87001bf1314533f6af340bfac6ac3beb7f6083f00000000000000006c78c840d8e3113ed0e095be6af3403fac6ac33eb7f608bf0000000000000000923b9840b6f11ebf06fd463f6af340bfac6ac3beb7f6083f0000000000000000c1f1c540ae668c3ec0e19dbeb8e343be99bb673f794bc23e00000000a1541d3fa98a9640bab4ffbed0524a3fb8e343be99bb673f794bc23e0000803fa1541d3fc7b8c640f814233eaa8eb6beb8e3433e99bb67bf794bc2be0000000000000000af51974076481dbf5bfc3d3fb8e3433e99bb67bf794bc2be0000000000000000c1f1c540ae668c3ec0e19dbe629c3d3fb40dc63ed8a10cbf0000000000000000a98a9640bab4ffbed0524a3f629c3dbfb40dc6bed8a10c3f0000000000000000c7b8c640f814233eaa8eb6be629c3d3fb40dc63ed8a10cbf0000000000000000af51974076481dbf5bfc3d3f629c3dbfb40dc6bed8a10c3f0000000000000000962cc440cbd6943e1c5abdbe1e6d3fbed728673fe819c63e0000000002301e3f069d95401b7cfcbebea6413f1e6d3fbed728673fe819c63e0000803f02301e3f13efc440c03f343ec782d6be1e6d3f3ed72867bfe819c6be0000000000000000835f964083991bbf6912353f1e6d3f3ed72867bfe819c6be0000000000000000962cc440cbd6943e1c5abdbe443e3a3f73a9c83ee62910bf0000000000000000069d95401b7cfcbebea6413f443e3abf73a9c8bee629103f000000000000000013efc440c03f343ec782d6be443e3a3f73a9c83ee62910bf0000000000000000835f964083991bbf6912353f443e3abf73a9c8bee629103f0000000000000000d65dc24024439d3eb61cdcbe70e03abeb496663f4ad0c93e00000000b70b1f3f32a794403c38f9be1b10393f70e03abeb496663f4ad0c93e0000803fb70b1f3fb41bc340af62453e13bef5be70e03a3eb49666bf4ad0c9be00000000000000001065954004e519bf6c3f2c3f70e03a3eb49666bf4ad0c9be0000000000000000d65dc24024439d3eb61cdcbe8dda363fb03dcb3e3b8f13bf000000000000000032a794403c38f9be1b10393f8dda36bfb03dcbbe3b8f133f0000000000000000b41bc340af62453e13bef5be8dda363fb03dcb3e3b8f13bf00000000000000001065954004e519bf6c3f2c3f8dda36bfb03dcbbe3b8f133f0000000000000000df85c040deaaa53e962afabeee3f36be4805663f966ecd3e00000000c8e71f3f35a993402ee9f5be638f303fee3f36be4805663f966ecd3e0000803fc8e71f3f093fc140027c563ecc200abfee3f363e480566bf966ecdbe00000000000000005f629440052b18bfe283233fee3f363e480566bf966ecdbe0000000000000000df85c040deaaa53e962afabea872333f06cacd3e57d216bf000000000000000035a993402ee9f5be638f303fa87233bf06cacdbe57d2163f0000000000000000093fc140027c563ecc200abfa872333f06cacd3e57d216bf00000000000000005f629440052b18bfe283233fa87233bf06cacdbe57d2163f00000000000000000ca5be406a0dae3e7ac20bbf218e31bea274653f0af5d03e0000000043c4203f14a392405a8ff2be1225283f218e31bea274653f0af5d03e0000803f43c4203f7159bf40968a673e490719bf218e313ea27465bf0af5d0be000000000000000079579340bc6b16bf43e01a3f218e313ea27465bf0af5d0be00000000000000000ca5be406a0dae3e7ac20bbfe307303f624ed03ec6f319bf000000000000000014a392405a8ff2be1225283fe30730bf624ed0bec6f3193f00000000000000007159bf40968a673e490719bfe307303f624ed03ec6f319bf000000000000000079579340bc6b16bf43e01a3fe30730bf624ed0bec6f3193f0000000000000000b8bbbc40ef69b63e92161abf05cd2cbed4e4643fbc63d43e000000002da1213fda949140ef2aefbecad11f3f05cd2cbed4e4643fbc63d43e0000803f2da1213f496bbd40ae8c783e2d9327bf05cd2c3ed4e464bfbc63d4be00000000000000006b44924044a714bf2f55123f05cd2c3ed4e464bfbc63d4be0000000000000000b8bbbc40ef69b63e92161abf7c9b2c3f6fcad23e2ef41cbf0000000000000000da949140ef2aefbecad11f3f7c9b2cbf6fcad2be2ef41c3f0000000000000000496bbd40ae8c783e2d9327bf7c9b2c3f6fcad23e2ef41cbf00000000000000006b44924044a714bf2f55123f7c9b2cbf6fcad2be2ef41c3f000000000000000039caba40f3bfbe3e631228bfd0fe27beef55643f0bbbd73e00000000927e223f957e90405bbcebbe2396173fd0fe27beef55643f0bbbd73e0000803f927e223fe874bb40a6c0843e4ec535bfd0fe273eef5564bf0bbbd7be000000000000000044299140d4dd12bf38e3093fd0fe273eef5564bf0bbbd7be000000000000000039caba40f3bfbe3e631228bf932e293f273ed53e43d41fbf0000000000000000957e90405bbcebbe2396173f932e29bf273ed5be43d41f3f0000000000000000e874bb40a6c0843e4ec535bf932e293f273ed53e43d41fbf000000000000000044299140d4dd12bf38e3093f932e29bf273ed5be43d41f3f0000000000000000e3d0b840ce0ec73ea0b635bf5c2523bef8c7633f42fbda3e00000000755c233f57608f40fe43e8bee8720f3f5c2523bef8c7633f42fbda3e0000803f755c233fa576b94090338d3e639e43bf5c25233ef8c763bf42fbdabe0000000000000000190690409e0f11bf258b013f5c25233ef8c763bf42fbdabe0000000000000000e3d0b840ce0ec73ea0b635bf2ec2253f66a9d73ec49422bf000000000000000057608f40fe43e8bee8720f3f2ec225bf66a9d7bec494223f0000000000000000a576b94090338d3e639e43bf2ec2253f66a9d73ec49422bf0000000000000000190690409e0f11bf258b013f2ec225bf66a9d7bec494223f000000000000000004d0b6401e56cf3e2c0443bfaa421ebef43a633fe124de3e00000000df3a243f343a8e4066c2e4bebc68073faa421ebef43a633fe124de3e0000803fdf3a243fcf70b740b29e953e581f51bfaa421e3ef43a63bfe124debe0000000000000000ffda8e40e93c0fbf1f9bf23eaa421e3ef43a63bfe124debe000000000000000004d0b6401e56cf3e2c0443bf4057223f420cda3e743625bf0000000000000000343a8e4066c2e4bebc68073f405722bf420cdabe7436253f0000000000000000cf70b740b29e953e581f51bf4057223f420cda3e743625bf0000000000000000ffda8e40e93c0fbf1f9bf23e405722bf420cdabe7436253f0000000000000000ecc7b4402095d73eebfb4fbf045819befaae623f2738e13e00000000d419253f420c8d40c837e1be06f1fe3e045819befaae623f2738e13e0000803fd419253fb863b54042019e3e15495ebf0458193efaae62bf2738e1be00000000000000000ea88d40d3650dbfb156e23e0458193efaae62bf2738e1be0000000000000000ecc7b4402095d73eebfb4fbfa6ee1e3f7466dc3e37ba27bf0000000000000000420c8d40c837e1be06f1fe3ea6ee1ebf7466dcbe37ba273f0000000000000000b863b54042019e3e15495ebfa6ee1e3f7466dc3e37ba27bf00000000000000000ea88d40d3650dbfb156e23ea6ee1ebf7466dcbe37ba273f0000000000000000e4b8b2406fcbdf3ec89e5cbf156714be0a24623fa135e43e0000000058f9253f9ad68b40c3a4ddbef045ef3e156714be0a24623fa135e43e0000803f58f9253fab4fb340db5aa63e8e1c6bbf1567143e0a2462bfa135e4be0000000000000000616d8c40ac8a0bbf644ad23e1567143e0a2462bfa135e4be0000000000000000e4b8b2406fcbdf3ec89e5cbf26891b3f19b8de3ee0202abf00000000000000009ad68b40c3a4ddbef045ef3e26891bbf19b8debee0202a3f0000000000000000ab4fb340db5aa63e8e1c6bbf26891b3f19b8de3ee0202abf0000000000000000616d8c40ac8a0bbf644ad23e26891bbf19b8debee0202a3f000000000000000034a3b040a4f8e73ea1ed68bf45710fbe249a613fd11de73e000000006ed9263f58998a40dc09dabef2d1df3e45710fbe249a613fd11de73e0000803f6ed9263ff134b14017abae3ea99a77bf45710f3e249a61bfd11de7be0000000000000000152b8b40b5ab09bfe377c23e45710f3e249a61bfd11de7be000000000000000034a3b040a4f8e73ea1ed68bf6d27183f4001e13e4d6b2cbf000000000000000058998a40dc09dabef2d1df3e6d2718bf4001e1be4d6b2c3f0000000000000000f134b14017abae3ea99a77bf6d27183f4001e13e4d6b2cbf0000000000000000152b8b40b5ab09bfe377c23e6d2718bf4001e1be4d6b2c3f00000000000000002287ae40551cf03e63e974bfe1770abe4911613f47f1e93e0000000018ba273f9e548940b167d6beb696d03ee1770abe4911613f47f1e93e0000803f18ba273fd113af408af1b63e2ee281bfe1770a3e491161bf47f1e9be00000000000000004de189403ec907bfc6e0b23ee1770a3e491161bf47f1e9be00000000000000002287ae40551cf03e63e974bf11ca143f0342e33e5f9a2ebf00000000000000009e548940b167d6beb696d03e11ca14bf0342e3be5f9a2e3f0000000000000000d113af408af1b63e2ee281bf11ca143f0342e33e5f9a2ebf00000000000000004de189403ec907bfc6e0b23e11ca14bf0342e3be5f9a2e3f0000000000000000f164ac40fc35f83e884980bfe07b05be8389603f72b0ec3e00000000589b283f89088840a8bed2bed095c13ee07b05be8389603f72b0ec3e0000803f589b283f90ecac40ae2dbf3e57cd87bfe07b053e838960bf72b0ecbe0000000000000000289088407be305bf9286a33ee07b053e838960bf72b0ecbe0000000000000000f164ac40fc35f83e884980bfa071113f527ae53efcae30bf000000000000000089088840a8bed2bed095c13ea07111bf527ae5befcae303f000000000000000090ecac40ae2dbf3e57cd87bfa071113f527ae53efcae30bf0000000000000000289088407be305bf9286a33ea07111bf527ae5befcae303f0000000000000000e03caa40a222003fc4f585bf567e00bece02603fec5bef3e000000002f7d293f3eb58640700fcfbe0ed1b23e567e00bece02603fec5bef3e0000803f2f7d293f6dbfaa402d5fc73e478f8dbf567e003ece0260bfec5befbe0000000000000000cb378740c3fa03bf036b943e567e003ece0260bfec5befbe0000000000000000e03caa40a222003fc4f585bf8b1e0e3f5aaae73e07aa32bf00000000000000003eb58640700fcfbe0ed1b23e8b1e0ebf5aaae7be07aa323f00000000000000006dbfaa402d5fc73e478f8dbf8b1e0e3f5aaae73e07aa32bf0000000000000000cb378740c3fa03bf036b943e8b1e0ebf5aaae7be07aa323f0000000000000000300fa840e724043fdc798bbf4900f7bd277d5f3f41f4f13e000000009c5f2a3fe25a85409a5acbbe104aa43e4900f7bd277d5f3f41f4f13e0000803f9c5f2a3faa8ca840aa85cf3e762893bf4900f73d277d5fbf41f4f1be00000000000000005cd885405f0f02bfa68f853e4900f73d277d5fbf41f4f1be0000000000000000300fa840e724043fdc798bbf35d10a3f34d2e93e608c34bf0000000000000000e25a85409a5acbbe104aa43e35d10abf34d2e9be608c343f0000000000000000aa8ca840aa85cf3e762893bf35d10a3f34d2e93e608c34bf00000000000000005cd885405f0f02bfa68f853e35d10abf34d2e9be608c343f00000000000000001bdca540a221083f46d690bf2c04edbd8df85e3f087af43e000000009f422b3f9ff98340cda0c7be7a02963e2c04edbd8df85e3f087af43e0000803f9f422b3f8254a640cea0d73e619998bf2c04ed3d8df85ebf087af4be000000000000000006728440a12100bf1aec6d3e2c04ed3d8df85ebf087af4be00000000000000001bdca540a221083f46d690bfef89073f08f2eb3ee55636bf00000000000000009ff98340cda0c7be7a02963eef8907bf08f2ebbee556363f00000000000000008254a640cea0d73e619998bfef89073f08f2eb3ee55636bf000000000000000006728440a12100bf1aec6d3eef8907bf08f2ebbee556363f0000000000000000dda3a340ab180c3f6e0b96bfd409e3bdf9745e3fdeedf63e0000000036262c3f9d918240bce2c3bef8fb873ed409e3bdf9745e3fdeedf63e0000803f36262c3f3317a4404cb0df3e78e29dbfd409e33df9745ebfdeedf6be0000000000000000f3048340c663fcbe9d3f513ed409e33df9745ebfdeedf6be0000000000000000dda3a340ab180c3f6e0b96bffd48043f090aee3e6c0a38bf00000000000000009d918240bce2c3bef8fb873efd4804bf090aeebe6c0a383f00000000000000003317a4404cb0df3e78e29dbffd48043f090aee3e6c0a38bf0000000000000000f3048340c663fcbe9d3f513efd4804bf090aeebe6c0a383f0000000000000000ae66a140c609103fdb199bbff511d9bd72f25d3f2a50f93e00000000600a2d3f08238140d520c0bef86f743ef511d9bd72f25d3f2a50f93e0000803f600a2d3ff4d4a140a9b3e73e4604a3bff511d93d72f25dbf2a50f9be00000000000000004e918140b880f8bea21c353ef511d93d72f25dbf2a50f9be0000000000000000ae66a140c609103fdb199bbf940e013f311af03edaa739bf000000000000000008238140d520c0bef86f743e940e01bf311af0bedaa7393f0000000000000000f4d4a140a9b3e73e4604a3bf940e013f311af03edaa739bf00000000000000004e918140b880f8bea21c353e940e01bf311af0bedaa7393f0000000000000000c3249f40d0f4133fe701a0bfb81dcfbdf0705d3f8fa1fb3e0000000018ef2d3f195c7f40dd5bbcbe9870593eb81dcfbdf0705d3f8fa1fb3e0000803f18ef2d3ffa8d9f40a2aaef3e29ffa7bfb81dcf3df0705dbf8fa1fbbe000000000000000044178040da9af4be8886193eb81dcf3df0705dbf8fa1fbbe0000000000000000c3249f40d0f4133fe701a0bfb5b5fb3ebe22f23efa2f3bbf0000000000000000195c7f40dd5bbcbe9870593eb5b5fbbebe22f2befa2f3b3f0000000000000000fa8d9f40a2aaef3e29ffa7bfb5b5fb3ebe22f23efa2f3bbf000000000000000044178040da9af4be8886193eb5b5fbbebe22f2befa2f3b3f000000000000000055de9c40a6d9173f0cc4a4bfef2dc5bd6af05c3f9ae2fd3e000000005cd42e3fb6657c407594b8be5cfc3e3eef2dc5bd6af05c3f9ae2fd3e0000803f5cd42e3f80429d40f494f73ea0d3acbfef2dc53d6af05cbf9ae2fdbe00000000000000000c2e7d40ceb2f0be76fffc3def2dc53d6af05cbf9ae2fdbe000000000000000055de9c40a6d9173f0cc4a4bfd15bf53ee123f43e97a33cbf0000000000000000b6657c407594b8be5cfc3e3ed15bf5bee123f4be97a33c3f000000000000000080429d40f494f73ea0d3acbfd15bf53ee123f43e97a33cbf00000000000000000c2e7d40ceb2f0be76fffc3dd15bf5bee123f4be97a33c3f000000000000000096939a401bb81b3fa760a9bf3843bbbdd8705c3feb09003f0000000028ba2f3f446379405acbb4be7816253e3843bbbdd8705c3feb09003f0000803f28ba2f3fb7f29a404572ff3e0d82b1bf3843bb3dd8705cbfeb0900bf000000000000000086217a404bc9ecbe9216c83d3843bb3dd8705cbfeb0900bf000000000000000096939a401bb81b3fa760a9bf9e0fef3ec81df63e76033ebf0000000000000000446379405acbb4be7816253e9e0fefbec81df6be76033e3f0000000000000000b7f29a404572ff3e0d82b1bf9e0fef3ec81df63e76033ebf000000000000000086217a404bc9ecbe9216c83d9e0fefbec81df6be76033e3f0000000000000000b74498400a901f3f28d8adbfe95db1bd3ff25b3fe01a013f0000000076a0303f265576401901b1bec0c10b3ee95db1bd3ff25b3fe01a013f0000803f76a0303fd19e984025a1033fe30ab6bfe95db13d3ff25bbfe01a01bf00000000000000005a097740e2dee8becf57943de95db13d3ff25bbfe01a01bf0000000000000000b74498400a901f3f28d8adbf24d1e83e9610f83e60503fbf0000000000000000265576401901b1bec0c10b3e24d1e8be9610f8be60503f3f0000000000000000d19e984025a1033fe30ab6bf24d1e83e9610f83e60503fbf00000000000000005a097740e2dee8becf57943d24d1e8be9610f8be60503f3f0000000000000000ecf195404c61233fee2ab2bf727ea7bd8c745b3f7324023f000000004287313fc33b73407536adbe6801e63d727ea7bd8c745b3f7324023f0000803f4287313f024796405e82073f866ebabf727ea73d8c745bbf732402bf0000000000000000f0e5734051f4e4beca8f433d727ea73d8c745bbf732402bf0000000000000000ecf195404c61233fee2ab2bf57a0e23e86fcf93e058b40bf0000000000000000c33b73407536adbe6801e63d57a0e2be86fcf9be058b403f0000000000000000024796405e82073f866ebabf57a0e23e86fcf93e058b40bf0000000000000000f0e5734051f4e4beca8f433d57a0e2be86fcf9be058b403f0000000000000000659b9340b22b273f5859b6bfcba49dbdc3f75a3fd926033f00000000866e323f83177040016ca9be88acb53dcba49dbdc3f75a3fd926033f0000803f866e323f7aeb93409d5c0b3f59adbebfcba49d3dc3f75abfd92603bf0000000000000000aeb770402b0ae1bef0b1c13ccba49d3dc3f75abfd92603bf0000000000000000659b9340b22b273f5859b6bf197ddc3eb2e1fb3e21b441bf000000000000000083177040016ca9be88acb53d197ddcbeb2e1fbbe21b4413f00000000000000007aeb93409d5c0b3f59adbebf197ddc3eb2e1fb3e21b441bf0000000000000000aeb770402b0ae1bef0b1c13c197ddcbeb2e1fbbe21b4413f00000000000000005041914022ef2a3fc463babf3ed193bdd67b5a3f5d22043f000000003c56333fd0e86c4089a2a5be3889863d3ed193bdd67b5a3f5d22043f0000803f3c56333f678c9140ca2f0f3fbdc7c2bf3ed1933dd67b5abf5d2204bf0000000000000000ff7e6d403921ddbe004413393ed1933dd67b5abf5d2204bf00000000000000005041914022ef2a3fc463babf3f67d63e67c0fd3e57cc42bf0000000000000000d0e86c4089a2a5be3889863d3f67d6be67c0fdbe57cc423f0000000000000000678c9140ca2f0f3fbdc7c2bf3f67d63e67c0fd3e57cc42bf0000000000000000ff7e6d403921ddbe004413393f67d6be67c0fdbe57cc423f0000000000000000dce38e406bab2e3f884abebf76038abdc2005a3f2c17053f000000005c3e343f15b0694096daa1be9039313d76038abdc2005a3f2c17053f0000803f5c3e343ff8298f40b5fb123f0dbec6bf76038a3dc2005abf2c1705bf00000000000000004e3c6a40033ad9be206ebabc76038a3dc2005abf2c1705bf0000000000000000dce38e406bab2e3f884abebf895ed03eb698ff3e55d443bf000000000000000015b0694096daa1be9039313d895ed0beb698ffbe55d4433f0000000000000000f8298f40b5fb123f0dbec6bf895ed03eb698ff3e55d443bf00000000000000004e3c6a40033ad9be206ebabc895ed0beb698ffbe55d4433f000000000000000035838c407060323ffb0dc2bf743b80bd7c86593f8a05063f00000000e126353fbe6d6640f1149ebec0adaf3c743b80bd7c86593f8a05063f0000803fe126353f59c48c4041c0163fa390cabf743b803d7c8659bf8a0506bf000000000000000007f066404f55d5be1c7e38bd743b803d7c8659bf8a0506bf000000000000000035838c407060323ffb0dc2bfaf62ca3e74b5003fb2cc44bf0000000000000000be6d6640f1149ebec0adaf3caf62cabe74b500bfb2cc443f000000000000000059c48c4041c0163fa390cabfaf62ca3e74b5003fb2cc44bf000000000000000007f066404f55d5be1c7e38bdaf62cabe74b500bfb2cc443f0000000000000000881f8a40fc0d363f70aec5bf72f16cbd040d593fa2ed063f00000000c30f363f3b22634029529abe0070733972f16cbd040d593fa2ed063f0000803fc30f363fb75b8a403a7d1a3fd53fcebf72f16c3d040d59bfa2ed06bf0000000000000000999a6340ad73d1be959c88bd72f16c3d040d59bfa2ed06bf0000000000000000881f8a40fc0d363f70aec5bf5673c43e889b013f0bb645bf00000000000000003b22634029529abe007073395673c4be889b01bf0bb6453f0000000000000000b75b8a403a7d1a3fd53fcebf5673c43e889b013f0bb645bf0000000000000000999a6340ad73d1be959c88bd5673c4be889b01bf0bb6453f000000000000000003b98740efb3393f302cc9bff57559bd4c94583fadcf073f00000000f9f8363ffecd5f40fa9296bee0d0a6bcf57559bd4c94583fadcf073f0000803ff9f8363f3ff0874082321e3fefcbd1bff575593d4c9458bfadcf07bf0000000000000000763c6040d495cdbe2eb0b3bdf575593d4c9458bfadcf07bf000000000000000003b98740efb3393f302cc9bf1d90be3eb67e023fed9046bf0000000000000000fecd5f40fa9296bee0d0a6bc1d90bebeb67e02bfed90463f00000000000000003ff0874082321e3fefcbd1bf1d90be3eb67e023fed9046bf0000000000000000763c6040d495cdbe2eb0b3bd1d90bebeb67e02bfed90463f0000000000000000d04f85402a523d3f8a87ccbf990346bd4b1c583fe3ab083f000000007be2373f7a715c401cd892beb03525bd990346bd4b1c583fe3ab083f0000803f7be2373f1c828540fadf213f4535d5bf9903463d4b1c58bfe3ab08bf000000000000000011d65c407bbcc9be8a76ddbd9903463d4b1c58bfe3ab08bf0000000000000000d04f85402a523d3f8a87ccbf97b8b83e1c5f033fdd5d47bf00000000000000007a715c401cd892beb03525bd97b8b8be1c5f03bfdd5d473f00000000000000001c828540fadf213f4535d5bf97b8b83e1c5f033fdd5d47bf000000000000000011d65c407bbcc9be8a76ddbd97b8b8be1c5f03bfdd5d473f000000000000000018e4824075e8403fc4c0cfbfd79832bd02a5573f6482093f0000000041cc383f1e0d594012228fbe006c74bdd79832bd02a5573f6482093f0000803f41cc383f751183406c85253f1e7cd8bfd798323d02a557bf648209bf0000000000000000d867594024e8c5bed0f502bed798323d02a557bf648209bf000000000000000018e4824075e8403fc4c0cfbf49ecb23ebf3c043f641d48bf00000000000000001e0d594012228fbe006c74bd49ecb2bebf3c04bf641d483f0000000000000000751183406c85253f1e7cd8bf49ecb23ebf3c043f641d48bf0000000000000000d867594024e8c5bed0f502be49ecb2bebf3c04bf641d483f000000000000000007768040b476443f1ed8d2bfb7341fbd632e573f6a530a3f0000000041b6393f61a15540a9718bbe6882a0bdb7341fbd632e573f6a530a3f0000803f41b6393f779e8040bb22293fbea0dbbfb7341f3d632e57bf6a530abf000000000000000041f255409a19c2be348616beb7341f3d632e57bf6a530abf000000000000000007768040b476443f1ed8d2bfb72aad3ec417053ff7cf48bf000000000000000061a15540a9718bbe6882a0bdb72aadbec41705bff7cf483f0000000000000000779e8040bb22293fbea0dbbfb72aad3ec417053ff7cf48bf000000000000000041f255409a19c2be348616beb72aadbec41705bff7cf483f00000000000000008b0b7c40b8fc473fd6cdd5bfa1d50bbd67b8563f1a1f0b3f0000000073a03a3fb52e52407fc787bea87cc5bda1d50bbd67b8563f1a1f0b3f0000803f73a03a3f94527c40bbb72c3f65a3debfa1d50b3d67b856bf1a1f0bbf0000000000000000be7552407851bebecd6a29bea1d50b3d67b856bf1a1f0bbf00000000000000008b0b7c40b8fc473fd6cdd5bf5573a73e3cf0053f0b7649bf0000000000000000b52e52407fc787bea87cc5bd5573a7be3cf005bf0b76493f000000000000000094527c40bbb72c3f65a3debf5573a73e3cf0053f0b7649bf0000000000000000be7552407851bebecd6a29be5573a7be3cf005bf0b76493f0000000000000000f92677406a7a4b3f2ea2d8bf77f4f0bc0443563fa8e50b3f00000000cd8a3b3f95b54e404b2484be6022e9bd77f4f0bc0443563fa8e50b3f0000803fcd8a3b3f2d6477405644303f5984e1bf77f4f03c044356bfa8e50bbf0000000000000000c9f24e407490babe86a23bbe77f4f03c044356bfa8e50bbf0000000000000000f92677406a7a4b3f2ea2d8bf92c5a13e48c6063f08104abf000000000000000095b54e404b2484be6022e9bd92c5a1be48c606bf08104a3f00000000000000002d6477405644303f5984e1bf92c5a13e48c6063f08104abf0000000000000000c9f24e407490babe86a23bbe92c5a1be48c606bf08104a3f0000000000000000ab3e724084ef4e3f6055dbbf8540cabc3cce553f20a70c3f0000000044753c3f75364b40888880be00b805be8540cabc3cce553f20a70c3f0000803f44753c3f0a72724044c8333fd443e4bf8540ca3c3cce55bf20a70cbf0000000000000000d4694b4007d7b6be9e2b4dbe8540ca3c3cce55bf20a70cbf0000000000000000ab3e724084ef4e3f6055dbbfd9209c3ee499073f609e4abf000000000000000075364b40888880be00b805bed9209cbee49907bf609e4a3f00000000000000000a72724044c8333fd443e4bfd9209c3ee499073f609e4abf0000000000000000d4694b4007d7b6be9e2b4dbed9209cbee49907bf609e4a3f0000000000000000f0526d40e85b523f9ee7ddbf448ca3bc035a553fb2630d3f00000000cf5f3d3fccb14740eee979be8c3116be448ca3bc035a553fb2630d3f0000803fcf5f3d3f7b7c6d406b43373f0be2e6bf448ca33c035a55bfb2630dbf000000000000000057db4740f125b3bef6045ebe448ca33c035a55bfb2630dbf0000000000000000f0526d40e85b523f9ee7ddbf8d84963e326b083f6d214bbf0000000000000000ccb14740eee979be8c3116be8d8496be326b08bf6d214b3f00000000000000007b7c6d406b43373f0be2e6bf8d84963e326b083f6d214bbf000000000000000057db4740f125b3bef6045ebe8d8496be326b08bf6d214b3f0000000000000000176468406ebf553f1c59e0bf67a779bc50e6543f7e1b0e3f00000000634a3e3f1528444078d472bea4fc25be67a779bc50e6543f7e1b0e3f0000803f634a3e3fcc836840a3b53a3f355fe9bf67a7793c50e654bf7e1b0ebf0000000000000000ca474440d27dafbe6c2d6ebe67a7793c50e654bf7e1b0ebf0000000000000000176468406ebf553f1c59e0bf05f0903e463a093f87994bbf00000000000000001528444078d472bea4fc25be05f090be463a09bf87994b3f0000000000000000cc836840a3b53a3f355fe9bf05f0903e463a093f87994bbf0000000000000000ca474440d27dafbe6c2d6ebe05f090be463a09bf87994b3f00000000000000006f726340f019593f06aae2bfaf252cbc1b73543fa9ce0e3f00000000f6343f3fc999404012d26bbe341835beaf252cbc1b73543fa9ce0e3f0000803ff6343f3f4c886340c61e3e3f80bbebbfaf252c3c1b7354bfa9ce0ebf0000000000000000a6af40405cdfabbe01a47dbeaf252c3c1b7354bfa9ce0ebf00000000000000006f726340f019593f06aae2bf9b628b3e3a070a3fff064cbf0000000000000000c999404012d26bbe341835be9b628bbe3a070abfff064c3f00000000000000004c886340c61e3e3f80bbebbf9b628b3e3a070a3fff064cbf0000000000000000a6af40405cdfabbe01a47dbe9b628bbe3a070abfff064c3f0000000000000000487e5e40356b5c3f90dae4bf9612bdbb6400543f407d0f3f000000007d1f403f60073d40b4e364be3c8343be9612bdbb6400543f407d0f3f0000803f7d1f403f4a8a5e409d7e413f20f7edbf9612bd3b640054bf407d0fbf000000000000000062133d400a4ba8bedd3386be9612bd3b640054bf407d0fbf0000000000000000487e5e40356b5c3f90dae4bfa2db853e11d20a3f296a4cbf000000000000000060073d40b4e364be3c8343bea2db85be11d20abf296a4c3f00000000000000004a8a5e409d7e413f20f7edbfa2db853e11d20a3f296a4cbf000000000000000062133d400a4ba8bedd3386bea2db85be11d20abf296a4c3f0000000000000000ee87594018b35f3fdaeae6bffe4d86ba218e533f6327103f00000000ec09413f56713940ce0a5ebeac3c51befe4d86ba218e533f6327103f0000803fec09413f108a594003d5443f3812f0bffe4d863a218e53bf632710bf00000000000000007873394091c1a4becc3b8dbefe4d863a218e53bf632710bf0000000000000000ee87594018b35f3fdaeae6bf645a803ee69a0b3f45c34cbf000000000000000056713940ce0a5ebeac3c51be645a80bee69a0bbf45c34c3f0000000000000000108a594003d5443f3812f0bf645a803ee69a0b3f45c34cbf00000000000000007873394091c1a4becc3b8dbe645a80bee69a0bbf45c34c3f0000000000000000b08f544068f1623f16dbe8bf978c743b4c1c533f24cd103f0000000039f4413f26d83540964857beec435ebe978c743b4c1c533f24cd103f0000803f39f4413fec875440c821483ffa0cf2bf978c74bb4c1c53bf24cd10bf000000000000000062d035408c43a1be86e993be978c74bb4c1c53bf24cd10bf0000000000000000b08f544068f1623f16dbe8bf4bbc753ec7610c3f99124dbf000000000000000026d83540964857beec435ebe4bbc75bec7610cbf99124d3f0000000000000000ec875440c821483ffa0cf2bf4bbc753ec7610c3f99124dbf000000000000000062d035408c43a1be86e993be4bbc75bec7610cbf99124d3f0000000000000000d8954f400a26663f56abeabf69460b3cd5aa523faa6e113f0000000058de423f4c3c32407e9e50be30986abe69460b3cd5aa523faa6e113f0000803f58de423f28844f40d3644b3f7ce7f3bf69460bbcd5aa52bfaa6e11bf00000000000000009c2a3240aed19dbeaf3c9abe69460bbcd5aa52bfaa6e11bf0000000000000000d8954f400a26663f56abeabf5dcc6a3ed5260d3f50584dbf00000000000000004c3c32407e9e50be30986abe5dcc6abed5260dbf50584d3f000000000000000028844f40d3644b3f7ce7f3bf5dcc6a3ed5260d3f50584dbf00000000000000009c2a3240aed19dbeaf3c9abe5dcc6abed5260dbf50584d3f0000000000000000b39a4a40b050693fca5becbfaaac593cc839523fe70b123f000000003ec8433f459e2e405e0d4abeb03876beaaac593cc839523fe70b123f0000803f3ec8433f0e7f4a40d49d4e3feca1f5bfaaac59bcc83952bfe70b12bf0000000000000000a0822e40666c9abedf34a0beaaac59bcc83952bfe70b12bf0000000000000000b39a4a40b050693fca5becbf72e35f3e04ea0d3fb4944dbf0000000000000000459e2e405e0d4abeb03876be72e35fbe04ea0dbfb4944d3f00000000000000000e7f4a40d49d4e3feca1f5bf72e35f3e04ea0d3fb4944dbf0000000000000000a0822e40666c9abedf34a0be72e35fbe04ea0dbfb4944d3f00000000000000008c9e45403e716c3f8cecedbf0230943c18c9513ffaa4123f00000000dfb1443f8cfe2a40969643be809280be0230943c18c9513ffaa4123f0000803fdfb1443fe8784540b2cc513f663cf7bf023094bc18c951bffaa412bf0000000000000000e8d82a40631497bee8d1a5be023094bc18c951bffaa412bf00000000000000008c9e45403e716c3f8cecedbf0400553e72ab0e3fecc74dbf00000000000000008cfe2a40969643be809280be040055be72ab0ebfecc74d3f0000000000000000e8784540b2cc513f663cf7bf0400553e72ab0e3fecc74dbf0000000000000000e8d82a40631497bee8d1a5be040055be72ab0ebfecc74d3f0000000000000000ada1404081876f3fb25defbfecb5bb3cbd58513fee39133f000000002f9b453f9f5d27405c3b3dbe5aae85beecb5bb3cbd58513fee39133f0000803f2f9b453fff7140403af1543f02b7f8bfecb5bbbcbd5851bfee3913bf0000000000000000f12d27403cca93be9813abbeecb5bbbcbd5851bfee3913bf0000000000000000ada1404081876f3fb25defbf74204a3e2c6b0f3f1bf24dbf00000000000000009f5d27405c3b3dbe5aae85be74204abe2c6b0fbf1bf24d3f0000000000000000ff7140403af1543f02b7f8bf74204a3e2c6b0f3f1bf24dbf0000000000000000f12d27403cca93be9813abbe74204abe2c6b0fbf1bf24d3f000000000000000063a43b404b93723f50aff0bff46de33cb0e8503fcfca133f000000002284463ffdbb2340f4fc36beae6f8abef46de33cb0e8503fcfca133f0000803f2284463f9f6a3b403f0b583fd311fabff46de3bcb0e850bfcfca13bf000000000000000039822340928e90beb9f9afbef46de3bcb0e850bfcfca13bf000000000000000063a43b404b93723f50aff0bf30433f3e4429103f65134ebf0000000000000000fdbb2340f4fc36beae6f8abe30433fbe442910bf65134e3f00000000000000009f6a3b403f0b583fd311fabf30433f3e4429103f65134ebf000000000000000039822340928e90beb9f9afbe30433fbe442910bf65134e3f0000000000000000f6a636406494753f84e1f1bf36af053df478503f9e57143f00000000ad6c473f241a20406adc30be62d68ebe36af053df478503f9e57143f0000803fad6c473f0d633640881a5b3ff84cfbbf36af05bdf47850bf9e5714bf00000000000000003bd61f40ec618dbe3084b4be36af05bdf47850bf9e5714bf0000000000000000f6a636406494753f84e1f1bf8a66343ebfe5103feb2b4ebf0000000000000000241a20406adc30be62d68ebe8a6634bebfe510bfeb2b4e3f00000000000000000d633640881a5b3ff84cfbbf8a66343ebfe5103feb2b4ebf00000000000000003bd61f40ec618dbe3084b4be8a6634bebfe510bfeb2b4e3f0000000000000000aea93140a08a783f55f4f2bfc7c6193d7b09503f64e0143f00000000c354483f94781c4006db2abe5ce292bec7c6193d7b09503f64e0143f0000803fc354483f905b3140ed1e5e3f7868fcbfc7c619bd7b0950bf64e014bf0000000000000000762a1c40ea448abee8b2b8bec7c619bd7b0950bf64e014bf0000000000000000aea93140a08a783f55f4f2bfd788293eb1a0113fbe3b4ebf000000000000000094781c4006db2abe5ce292bed78829beb1a011bfbe3b4e3f0000000000000000905b3140ed1e5e3f7868fcbfd788293eb1a0113fbe3b4ebf0000000000000000762a1c40ea448abee8b2b8bed78829beb1a011bfbe3b4e3f0000000000000000d6ac2c40c6757b3fdae7f3bf0a012e3d4a9a4f3f1a65153f00000000593c493fcad71840caf924be989396be0a012e3d4a9a4f3f1a65153f0000803f593c493f71542c403218613f6a64fdbf0a012ebd4a9a4fbf1a6515bf0000000000000000657f18400e3887beda85bcbe0a012ebd4a9a4fbf1a6515bf0000000000000000d6ac2c40c6757b3fdae7f3bf5aa81e3e1c5a123ff4424ebf0000000000000000cad71840caf924be989396be5aa81ebe1c5a12bff4424e3f000000000000000071542c403218613f6a64fdbf5aa81e3e1c5a123ff4424ebf0000000000000000657f18400e3887beda85bcbe5aa81ebe1c5a12bff4424e3f0000000000000000b3b02740a8557e3f1abcf4bf5561423d592b4f3fc7e5153f0000000061234a3f49381540f6391fbe0aea99be5561423d592b4f3fc7e5153f0000803f61234a3ff44d27402b06643fd640febf556142bd592b4fbfc7e515bf00000000000000008ad51440f63b84befafcbfbe556142bd592b4fbfc7e515bf0000000000000000b3b02740a8557e3f1abcf4bf57c3133e1312133f97414ebf000000000000000049381540f6391fbe0aea99be57c313be131213bf97414e3f0000000000000000f44d27402b06643fd640febf57c3133e1312133f97414ebf00000000000000008ad51440f63b84befafcbfbe57c313be131213bf97414e3f000000000000000090b522400a95803f1c71f5bf24eb563da1bc4e3f6662163f00000000d0094b3f909a1140b29c19bedee59cbe24eb563da1bc4e3f6662163f0000803fd0094b3f62482240a6e8663fc2fdfebf24eb56bda1bc4ebf666216bf0000000000000000622d1140345181be7618c3be24eb56bda1bc4ebf666216bf000000000000000090b522400a95803f1c71f5bf07d8083ea0c8133fa5374ebf0000000000000000909a1140b29c19bedee59cbe07d808bea0c813bfa5374e3f000000000000000062482240a6e8663fc2fdfebf07d8083ea0c8133fa5374ebf0000000000000000622d1140345181be7618c3be07d808bea0c813bfa5374e3f0000000000000000b2bb1d4067f9813fe606f6bf1da26b3d214e4e3fedda163f000000009bef4b3f20ff0d400a2314be1a879fbe1da26b3d214e4e3fedda163f0000803f9bef4b3ffe431d4069bf693f339bffbf1da26bbd214e4ebfedda16bf00000000000000006c870d409ef07cbe4fd8c5be1da26bbd214e4ebfedda16bf0000000000000000b2bb1d4067f9813fe606f6bf29c9fb3dc87d143f1f254ebf000000000000000020ff0d400a2314be1a879fbe29c9fbbdc87d14bf1f254e3f0000000000000000fe431d4069bf693f339bffbf29c9fb3dc87d143f1f254ebf00000000000000006c870d409ef07cbe4fd8c5be29c9fbbdc87d14bf1f254e3f000000000000000060c31840ce57833f7e7df6bf0545803ddcdf4d3f4a4f173f00000000b4d44c3f7c660a4004ce0ebee8cda1be0545803ddcdf4d3f4a4f173f0000803fb4d44c3f0e411840388a6c3f970c00c0054580bddcdf4dbf4a4f17bf00000000000000002ae40940946377beac3cc8be054580bddcdf4dbf4a4f17bf000000000000000060c31840ce57833f7e7df6bf41cee53d8e31153f040a4ebf00000000000000007c660a4004ce0ebee8cda1be41cee5bd8e3115bf040a4e3f00000000000000000e411840388a6c3f970c00c041cee53d8e31153f040a4ebf00000000000000002ae40940946377beac3cc8be41cee5bd8e3115bf040a4e3f0000000000000000decc134025b0843fded4f6bf59d38a3dc9714d3f77bf173f000000000fb94d3f26d10640c69e09be88baa3be59d38a3dc9714d3f77bf173f0000803f0fb94d3fd23f1340e1486f3fd73b00c059d38abdc9714dbf77bf17bf00000000000000001a4406406bfc71beca45cabe59d38abdc9714dbf77bf17bf0000000000000000decc134025b0843fded4f6bf90bbcf3dfee3153f3ce64dbf000000000000000026d10640c69e09be88baa3be90bbcfbdfee315bf3ce64d3f0000000000000000d23f1340e1486f3fd73b00c090bbcf3dfee3153f3ce64dbf00000000000000001a4406406bfc71beca45cabe90bbcfbdfee315bf3ce64d3f000000000000000074d80e405502863ffd0cf7bf047e953de7034d3f692b183f00000000a19c4e3fa03f0340809604be2c4da5be047e953de7034d3f692b183f0000803fa19c4e3f92400e4035fb713f545b00c0047e95bde7034dbf692b18bf0000000000000000bea7024052bc6cbed9f3cbbe047e95bde7034dbf692b18bf000000000000000074d80e405502863ffd0cf7bf3c8db93d2595163fb2b94dbf0000000000000000a03f0340809604be2c4da5be3c8db9bd259516bfb2b94d3f000000000000000092400e4035fb713f545b00c03c8db93d2595163fb2b94dbf0000000000000000bea7024052bc6cbed9f3cbbe3c8db9bd259516bfb2b94d3f000000000000000064e60940394e873fdc25f7bf1c47a03d35964c3ffa92183f000000005c7f4f3fdf64ff3f046cffbd3e86a6be1c47a03d35964c3ffa92183f0000803f5c7f4f3f8c430940eca0743f0d6b00c01c47a0bd35964cbffa9218bf0000000000000000301ffe3f1ba467be3947cdbe1c47a0bd35964cbffa9218bf000000000000000064e60940394e873fdc25f7bf4d3fa33df944173f4d844dbf0000000000000000df64ff3f046cffbd3e86a6be4d3fa3bdf94417bf4d844d3f00000000000000008c430940eca0743f0d6b00c04d3fa33df944173f4d844dbf0000000000000000301ffe3f1ba467be3947cdbe4d3fa3bdf94417bf4d844d3f0000000000000000f4f60440b693883f681ff7bfba30ab3db6284c3f1cf6183f000000003661503f3054f83ff8fcf5bd0066a7beba30ab3db6284c3f1cf6183f0000803f3661503f06490440ce39773ff96a00c0ba30abbdb6284cbf1cf618bf000000000000000054f8f63ff6b462be2940cebeba30abbdb6284cbf1cf618bf0000000000000000f4f60440b693883f681ff7bfbdcd8c3d86f3173fe8454dbf00000000000000003054f83ff8fcf5bd0066a7bebdcd8cbd86f317bfe8454d3f000000000000000006490440ce39773ff96a00c0bdcd8c3d86f3173fe8454dbf000000000000000054f8f63ff6b462be2940cebebdcd8cbd86f317bfe8454d3f0000000000000000c407004086a3893f041df7bfa973b63df0014c3fc6f5183f000000002142513f8553f13f18efe9bd405fa7bea973b63df0014c3fc6f5183f0000803f2142513fca9cfe3f5a5e793fc46900c0a973b6bdf0014cbfc6f518bf0000000000000000c7e0ef3f539a5cbe5339cebea973b6bdf0014cbfc6f518bf0000000000000000c407004086a3893f041df7bf21c06b3d7842183f34454dbf00000000000000008553f13f18efe9bd405fa7be21c06bbd784218bf34454d3f0000000000000000ca9cfe3f5a5e793fc46900c021c06b3d7842183f34454dbf0000000000000000c7e0ef3f539a5cbe5339cebe21c06bbd784218bf34454d3f00000000000000002d74f43fd9d98a3f6ee0f6bf6819d03d3bac4b3f04e5183f00000000e727523f0bb2eb3f3486e0bdc8e9a6be6819d03d3bac4b3f04e5183f0000803fe727523f51cdf23fe3d57b3ff14a00c06819d0bd3bac4bbf04e518bf00000000000000002f0bea3f57ba57be9abfcdbe6819d0bd3bac4bbf04e518bf00000000000000002d74f43fd9d98a3f6ee0f6bf23220c3d3ce2183ffc254dbf00000000000000000bb2eb3f3486e0bdc8e9a6be23220cbd3ce218bffc254d3f000000000000000051cdf23fe3d57b3ff14a00c023220c3d3ce2183ffc254dbf00000000000000002f0bea3f57ba57be9abfcdbe23220cbd3ce218bffc254d3f0000000000000000fbeee83f26028c3f2556f6bf07b3e93deb594b3f9bbe183f00000000a10b533fe323e63f2498d7bd1cdfa5be07b3e93deb594b3f9bbe183f0000803fa10b533f1a14e73ff1307e3f940400c007b3e9bdeb594bbf9bbe18bf00000000000000000249e43f7e1953be2cabccbe07b3e9bdeb594bbf9bbe18bf0000000000000000fbeee83f26028c3f2556f6bfc6c5323ca87b193f5ede4cbf0000000000000000e323e63f2498d7bd1cdfa5bec6c532bca87b19bf5ede4c3f00000000000000001a14e73ff1307e3f940400c0c6c5323ca87b193f5ede4cbf00000000000000000249e43f7e1953be2cabccbec6c532bca87b19bf5ede4c3f00000000000000008181dd3f721c8d3f8a7ff5bf8e97013e3c0b4b3fc782183f0000000081ed533f93a6e03f681ecfbdc642a4be8e97013e3c0b4b3fc782183f0000803f81ed533fd872db3fc437803fc12effbf8e9701be3c0b4bbfc78218bf0000000000000000ea97de3fa8b44ebea4ffcabe8e9701be3c0b4bbfc78218bf00000000000000008181dd3f721c8d3f8a7ff5bf964449bc590e1a3fd96e4cbf000000000000000093a6e03f681ecfbdc642a4be9644493c590e1abfd96e4c3f0000000000000000d872db3fc437803fc12effbf964449bc590e1a3fd96e4cbf0000000000000000ea97de3fa8b44ebea4ffcabe9644493c590e1abfd96e4c3f00000000000000005e2dd23fce288e3f215ef4bf323e0e3e50c04a3ff831183f00000000bccd543fb237db3f1013c7bd9c17a2be323e0e3e50c04a3ff831183f0000803fbccd543f4bebcf3fe248813f3708febf323e0ebe50c04abff83118bf00000000000000009ff5d83fec884abef3bfc8be323e0ebe50c04abff83118bf00000000000000005e2dd23fce288e3f215ef4bf42a510bdff991a3f3ad84bbf0000000000000000b237db3f1013c7bd9c17a2be42a5103dff991abf3ad84b3f00000000000000004bebcf3fe248813f3708febf42a510bdff991a3f3ad84bbf00000000000000009ff5d83fec884abef3bfc8be42a5103dff991abf3ad84b3f000000000000000020f4c63f4e278f3f8af3f2bf0bc51a3e4c794a3fcfcc173f000000007eac553fe4d4d53f2071bfbd965f9fbe0bc51a3e4c794a3fcfcc173f0000803f7eac553f247fc43fe44b823f3397fcbf0bc51abe4c794abfcfcc17bf0000000000000000e85fd33fe19346be3beec5be0bc51abe4c794abfcfcc17bf000000000000000020f4c63f4e278f3f8af3f2bf400c6ebd601e1b3fa51b4bbf0000000000000000e4d4d53f2071bfbd965f9fbe400c6e3d601e1bbfa51b4b3f0000000000000000247fc43fe44b823f3397fcbf400c6ebd601e1b3fa51b4bbf0000000000000000e85fd33fe19346be3beec5be400c6e3d601e1bbfa51b4b3f000000000000000043d7bb3f0e18903fa441f1bf0324273e4b364a3f0e54173f00000000f889563fe37bd03f6033b8bd501c9cbe0324273e4b364a3f0e54173f0000803ff889563f0130b93fe540833fa2ddfabf032427be4b364abf0e5417bf0000000000000000a1d4cd3ff7d242be4a8cc2be032427be4b364abf0e5417bf000000000000000043d7bb3f0e18903fa441f1bfff24a5bd449b1b3f903a4abf0000000000000000e37bd03f6033b8bd501c9cbeff24a53d449b1bbf903a4a3f00000000000000000130b93fe540833fa2ddfabfff24a5bd449b1b3f903a4abf0000000000000000a1d4cd3ff7d242be4a8cc2beff24a53d449b1bbf903a4a3f000000000000000029d8b03f36fb903f6c4aefbf7853333e5ef7493fa8c8163f000000005566573f812acb3fd855b1bdd04e98be7853333e5ef7493fa8c8163f0000803f5566573f61ffad3f0c28843f90ddf8bf785333be5ef749bfa8c816bf0000000000000000b951c83f3c443fbe619bbebe785333be5ef749bfa8c816bf000000000000000029d8b03f36fb903f6c4aefbfbc92d2bd93101c3fb83649bf0000000000000000812acb3fd855b1bdd04e98bebc92d23d93101cbfb836493f000000000000000061ffad3f0c28843f90ddf8bfbc92d2bd93101c3fb83649bf0000000000000000b951c83f3c443fbe619bbebebc92d23d93101cbfb836493f000000000000000018f8a53ff2d0913ff40fedbf474c3f3e8abc493fab2b163f00000000c241583faedec53f70d4aabd7ef793be474c3f3e8abc493fab2b163f0000803fc241583fa9eea23f8401853f2099f6bf474c3fbe8abc49bfab2b16bf00000000000000003fd5c23fa5e53bbe2f1cbabe474c3fbe8abc49bfab2b16bf000000000000000018f8a53ff2d0913ff40fedbfb834ffbd397e1c3f151248bf0000000000000000aedec53f70d4aabd7ef793beb834ff3d397e1cbf1512483f0000000000000000a9eea23f8401853f2099f6bfb834ffbd397e1c3f151248bf00000000000000003fd5c23fa5e53bbe2f1cbabeb834ff3d397e1cbf1512483f00000000000000002e389b3f7999923f7094eabfdf074b3ed385493f477e153f00000000671c593f7e96c03f00aca4bd40168fbedf074b3ed385493f477e153f0000803f671c593f10ff973f85cd853f9a12f4bfdf074bbed38549bf477e15bf0000000000000000605dbd3fa2b538bee60eb5bedf074bbed38549bf477e15bf00000000000000002e389b3f7999923f7094eabf3e7915be39e41c3fe0ce46bf00000000000000007e96c03f00aca4bd40168fbe3e79153e39e41cbfe0ce463f000000000000000010ff973f85cd853f9a12f4bf3e7915be39e41c3fe0ce46bf0000000000000000605dbd3fa2b538bee60eb5be3e79153e39e41cbfe0ce463f00000000000000006a99903f0855933f33dae7bf4f80563e2e53493fc3c1143f0000000069f6593f2650bb3fa0d99ebdf4aa89be4f80563e2e53493fc3c1143f0000803f69f6593fae318d3f4b8c863f644cf1bf4f8056be2e5349bfc3c114bf00000000000000006ae8b73fb8b235beb873afbe4f8056be2e5349bfc3c114bf00000000000000006a99903f0855933f33dae7bff2da2abea2421d3f766f45bf00000000000000002650bb3fa0d99ebdf4aa89bef2da2a3ea2421dbf766f453f0000000000000000ae318d3f4b8c863f644cf1bff2da2abea2421d3f766f45bf00000000000000006ae8b73fb8b235beb873afbef2da2a3ea2421dbf766f453f0000000000000000a31c863fe103943f92e3e4bf4fb0613e8b24493f76f7133f00000000eecf5a3f090ab63fd05a99bdcab483be4fb0613e8b24493f76f7133f0000803feecf5a3f7087823f1a3e873feb48eebf4fb061be8b2449bf76f713bf0000000000000000d674b23f9edb32be2c4aa9be4fb061be8b2449bf76f713bf0000000000000000a31c863fe103943f92e3e4bf9ab53fbe8e991d3f5ff643bf0000000000000000090ab63fd05a99bdcab483be9ab53f3e8e991dbf5ff6433f00000000000000007087823f1a3e873feb48eebf9ab53fbe8e991d3f5ff643bf0000000000000000d674b23f9edb32be2c4aa9be9ab53f3e8e991dbf5ff6433f00000000000000000185773f51a6943f00b3e1bf45936c3ed6f9483fce20133f000000001ba95b3fabc2b03fb02d94bd24667abe45936c3ed6f9483fce20133f0000803f1ba95b3f1f02703f40e3873fb70aebbf45936cbed6f948bfce2013bf00000000000000003a01ad3f5c2f30beee91a2be45936cbed6f948bfce2013bf00000000000000000185773f51a6943f00b3e1bfab0054be2ce91d3f3b6642bf0000000000000000abc2b03fb02d94bd24667abeab00543e2ce91dbf3b66423f00000000000000001f02703f40e3873fb70aebbfab0054be2ce91d3f3b6642bf00000000000000003a01ad3f5c2f30beee91a2beab00543e2ce91dbf3b66423f00000000000000001117633fa53c953fea4adebf4b25773ef1d2483f373f123f000000000d825c3fc078ab3f70508fbd90496cbe4b25773ef1d2483f373f123f0000803f0d825c3f443e5b3f0d7c883f4e94e7bf4b2577bef1d248bf373f12bf00000000000000005a8ca73ffaac2dbe584a9bbe4b2577bef1d248bf373f12bf00000000000000001117633fa53c953fea4adebfddb467beac311e3fb8c140bf0000000000000000c078ab3f70508fbd90496cbeddb4673eac311ebfb8c1403f0000000000000000443e5b3f0d7c883f4e94e7bfddb467beac311e3fb8c140bf00000000000000005a8ca73ffaac2dbe584a9bbeddb4673eac311ebfb8c1403f00000000000000002df04e3f34c7953fcbaddabf93b1803ebaaf483f2854113f00000000e55a5d3f222ba63fc0c18abde8115dbe93b1803ebaaf483f2854113f0000803fe55a5d3f22c4463fd808893f42e8e3bf93b180bebaaf48bf285411bf00000000000000001c15a23fbe532bbecf7293be93b180bebaaf48bf285411bf00000000000000002df04e3f34c7953fcbaddabf2dcc7abe50731e3f8e0b3fbf0000000000000000222ba63fc0c18abde8115dbe2dcc7a3e50731ebf8e0b3f3f000000000000000022c4463fd808893f42e8e3bf2dcc7abe50731e3f8e0b3fbf00000000000000001c15a23fbe532bbecf7293be2dcc7a3e50731ebf8e0b3f3f0000000000000000b2103b3f5646963f12ded6bf25a5853e0c90483f1261103f00000000be335e3fd0d8a03f688086bd0cbd4cbe25a5853e0c90483f1261103f0000803fbe335e3f2994323ffd89893f1909e0bf25a585be0c9048bf126110bf00000000000000008c9a9c3ffb2229bea30a8bbe25a585be0c9048bf126110bf0000000000000000b2103b3f5646963f12ded6bfeda086be5cae1e3f71463dbf0000000000000000d0d8a03f688086bd0cbd4cbeeda0863e5cae1ebf71463d3f00000000000000002994323ffd89893f1909e0bfeda086be5cae1e3f71463dbf00000000000000008c9a9c3ffb2229bea30a8bbeeda0863e5cae1ebf71463d3f0000000000000000c678273f68ba963f3aded2bf676c8a3ebd73483f69670f3f00000000b40c5f3ff5809b3fa88b82bd6c493bbe676c8a3ebd73483f69670f3f0000803fb40c5f3f90ae1e3fdbff893f67f9dbbf676c8abebd7348bf69670fbf0000000000000000da1b973f3a1a27be691182be676c8abebd7348bf69670fbf0000000000000000c678273f68ba963f3aded2bf24898fbe23e31e3f0d753bbf0000000000000000f5809b3fa88b82bd6c493bbe24898f3e23e31ebf0d753b3f000000000000000090ae1e3fdbff893f67f9dbbf24898fbe23e31e3f0d753bbf0000000000000000da1b973f3a1a27be691182be24898f3e23e31ebf0d753b3f00000000000000003128143fc823973f9fb0cebfad068f3ea05a483f8f680e3f00000000dde55f3fda22963f70c57dbd08b528bead068f3ea05a483f8f680e3f0000803fdde55f3f29130b3fd46a8a3f9dbbd7bfad068fbea05a48bf8f680ebf00000000000000005698913f003925bef60c71bead068fbea05a48bf8f680ebf00000000000000003128143fc823973f9fb0cebf841d98bef4111f3ffe9939bf0000000000000000da22963f70c57dbd08b528be841d983ef4111fbffe99393f000000000000000029130b3fd46a8a3f9dbbd7bf841d98bef4111f3ffe9939bf00000000000000005698913f003925bef60c71be841d983ef4111fbffe99393f0000000000000000841e013fd782973fa857cabf9773933e8644483fde650d3f0000000051bf603feebd903fe00977bdfcfe14be9773933e8644483fde650d3f0000803f51bf603f1683ef3e4acb8a3f3952d3bf977393be864448bfde650dbf0000000000000000720f8c3fe17e23be80d35cbe977393be864448bfde650dbf0000000000000000841e013fd782973fa857cabf595da0be263b1f3fc9b737bf0000000000000000eebd903fe00977bdfcfe14be595da03e263b1fbfc9b7373f00000000000000001683ef3e4acb8a3f3952d3bf595da0be263b1f3fc9b737bf0000000000000000720f8c3fe17e23be80d35cbe595da03e263b1fbfc9b7373f000000000000000025b6dc3ef9d7973fa1d5c5bf0ab3973e3f31483fa4600c3f000000002399613fbd518b3fa0e370bd582600be0ab3973e3f31483fa4600c3f0000803f2399613f1872c93ea5218b3f9bbfcebf0ab397be3f3148bfa4600cbf0000000000000000ba80863f86eb21be287647be0ab397be3f3148bfa4600cbf000000000000000025b6dc3ef9d7973fa1d5c5bf6748a8be165f1f3fd6d035bf0000000000000000bd518b3fa0e370bd582600be6748a83e165f1fbfd6d0353f00000000000000001872c93ea5218b3f9bbfcebf6748a8be165f1f3fd6d035bf0000000000000000ba80863f86eb21be287647be6748a83e165f1fbfd6d0353f0000000000000000ecb9b73e8e23983fca2cc1bf18c59b3e9920483f1b5a0b3f000000006573623febdd853f90516bbd6055d4bd18c59b3e9920483f1b5a0b3f0000803f6573623f88f1a33e496e8b3f1806cabf18c59bbe992048bf1b5a0bbf0000000000000000d2eb803f8d7e20be22f530be18c59bbe992048bf1b5a0bbf0000000000000000ecb9b73e8e23983fca2cc1bfe0deafbe1b7e1f3f74e733bf0000000000000000ebdd853f90516bbd6055d4bde0deaf3e1b7e1fbf74e7333f000000000000000088f1a33e496e8b3f1806cabfe0deafbe1b7e1f3f74e733bf0000000000000000d2eb803f8d7e20be22f530bee0deaf3e1b7e1fbf74e7333f00000000000000003746933efa65983f5a5fbcbf16aa9f3e6812483f6d530a3f00000000294e633f3862803fd05266bda018a6bd16aa9f3e6812483f6d530a3f0000803f294e633f69fe7d3e9cb18b3ffa27c5bf16aa9fbe681248bf6d530abf0000000000000000efa0763fa8371fbe515119be16aa9fbe681248bf6d530abf00000000000000003746933efa65983f5a5fbcbf5521b7be91981f3fd0fd31bf00000000000000003862803fd05266bda018a6bd5521b73e91981fbfd0fd313f000000000000000069fe7d3e9cb18b3ffa27c5bf5521b7be91981f3fd0fd31bf0000000000000000efa0763fa8371fbe515119be5521b73e91981fbfd0fd313f0000000000000000feb05e3ea19f983f686fb7bf8162a33e7706483fb14d093f000000007c29643ff4bc753f60e661bd702f6bbd8162a33e7706483fb14d093f0000803f7c29643f0f31353e05ec8b3f6927c0bf8162a3be770648bfb14d09bf0000000000000000f85c6b3f7a161ebee78b00be8162a3be770648bfb14d09bf0000000000000000feb05e3ea19f983f686fb7bfb510bebed4ae1f3fed1530bf0000000000000000f4bc753f60e661bd702f6bbdb510be3ed4ae1fbfed15303f00000000000000000f31353e05ec8b3f6927c0bfb510bebed4ae1f3fed1530bf0000000000000000f85c6b3f7a161ebee78b00beb510be3ed4ae1fbfed15303f0000000000000000f4db173ee4d0983f0a5fb2bffeeea63e97fc473fee49083f000000006a05653f27a56a3f500b5ebdd0aa05bdfeeea63e97fc473fee49083f0000803f6a05653f88eada3de81d8c3f8d06bbbffeeea6be97fc47bfee4908bf00000000000000007b0b603fb21a1dbe934dcdbdfeeea6be97fc47bfee4908bf0000000000000000f4db173ee4d0983f0a5fb2bf2aaec4be3fc11f3fb3312ebf000000000000000027a56a3f500b5ebdd0aa05bd2aaec43e3fc11fbfb3312e3f000000000000000088eada3de81d8c3f8d06bbbf2aaec4be3fc11f3fb3312ebf00000000000000007b0b603fb21a1dbe934dcdbd2aaec43e3fc11fbfb3312e3f0000000000000000b00ea43d24fa983f3130adbf4d50aa3e98f4473f0d49073f00000000ffe1653ffe7c5f3ff0bf5abd0053ddbb4d50aa3e98f4473f0d49073f0000803fffe1653f78131b3daa478c3f64c7b5bf4d50aabe98f447bf0d4907bf000000000000000060ac543fca431cbe5e4897bd4d50aabe98f447bf0d4907bf0000000000000000b00ea43d24fa983f3130adbf28fbcabe23d01f3fde522cbf0000000000000000fe7c5f3ff0bf5abd0053ddbb28fbca3e23d01fbfde522c3f000000000000000078131b3daa478c3f64c7b5bf28fbcabe23d01f3fde522cbf000000000000000060ac543fca431cbe5e4897bd28fbca3e23d01fbfde522c3f0000000000000000c0ca523cbf1b993fcce4a7bf5187ad3e51ee473ff14b063f0000000045bf663f7944543f400358bd0090a53c5187ad3e51ee473ff14b063f0000803f45bf663fce36f7bcab698c3fec6bb0bf5187adbe51ee47bff14b06bf0000000000000000983f493f6e911bbe0c1c3ebd5187adbe51ee47bff14b06bf0000000000000000c0ca523cbf1b993fcce4a7bf4ef9d0bed9db1f3f0c7b2abf00000000000000007944543f400358bd0090a53c4ef9d03ed9db1fbf0c7b2a3f0000000000000000ce36f7bcab698c3fec6bb0bf4ef9d0bed9db1f3f0c7b2abf0000000000000000983f493f6e911bbe0c1c3ebd4ef9d03ed9db1fbf0c7b2a3f000000000000000030eb5abd1436993fae7ea2bffe94b03e93e9473f5e53053f00000000409d673fb3fb483f50d355bdb0a0453dfe94b03e93e9473f5e53053f0000803f409d673fbb29c7bd4d848c3f06f6aabffe94b0be93e947bf5e5305bf00000000000000002fc53d3f0a031bbe809492bcfe94b0be93e947bf5e5305bf000000000000000030eb5abd1436993fae7ea2bf66aad6beafe41f3fb3ab28bf0000000000000000b3fb483f50d355bdb0a0453d66aad63eafe41fbfb3ab283f0000000000000000bb29c7bd4d848c3f06f6aabf66aad6beafe41f3fb3ab28bf00000000000000002fc53d3f0a031bbe809492bc66aad63eafe41fbfb3ab283f0000000000000000146cf3bd8049993fa0ff9cbf5b7ab33e37e6473f1060043f00000000f87b683fd2a23d3f802e54bd78689e3d5b7ab33e37e6473f1060043f0000803ff87b683f6a4c27bef0978c3f8467a5bf5b7ab3be37e647bf106004bf00000000000000003a3d323f20981abe90513f3c5b7ab3be37e647bf106004bf0000000000000000146cf3bd8049993fa0ff9cbf5510dcbef4ea1f3f27e626bf0000000000000000d2a23d3f802e54bd78689e3d5510dc3ef4ea1fbf27e6263f00000000000000006a4c27bef0978c3f8467a5bf5510dcbef4ea1f3f27e626bf00000000000000003a3d323f20981abe90513f3c5510dc3ef4ea1fbf27e6263f00000000000000003ccc3bbe5a56993f546997bf7638b63e13e4473fa672033f00000000725b693f0f3a323f901253bd8024dc3d7638b63e13e4473fa672033f0000803f725b693ff2146abeeda48c3f25c29fbf7638b6be13e447bfa67203bf0000000000000000e2a7263f0e501abee22e2d3d7638b6be13e447bfa67203bf00000000000000003ccc3bbe5a56993f546997bf1e2de1beefee1f3f9c2b25bf00000000000000000f3a323f901253bd8024dc3d1e2de13eefee1fbf9c2b253f0000000000000000f2146abeeda48c3f25c29fbf1e2de1beefee1f3f9c2b25bf0000000000000000e2a7263f0e501abee22e2d3d1e2de13eefee1fbf9c2b253f0000000000000000b6047dbefd5c993f6ebd91bf6cd0b83e04e3473fb98b023f00000000b23b6a3f9ac1263f607d52bdccfd0d3e6cd0b83e04e3473fb98b023f0000803fb23b6a3f08fb95bea1ab8c3f95079abf6cd0b8be04e347bfb98b02bf000000000000000043051b3f382a1abe2859973d6cd0b8be04e347bfb98b02bf0000000000000000b6047dbefd5c993f6ebd91bfc702e6bee8f01f3f277d23bf00000000000000009ac1263f607d52bdccfd0d3ec702e63ee8f01fbf277d233f000000000000000008fb95bea1ab8c3f95079abfc702e6bee8f01f3f277d23bf000000000000000043051b3f382a1abe2859973dc702e63ee8f01fbf277d233f00000000000000005db39ebec05d993f89fd8bbf5a43bb3ee6e2473fceab013f00000000b81c6b3fba391b3f406c52bda8f12e3e5a43bb3ee6e2473fceab013f0000803fb81c6b3fa97bb6be66ac8c3f783994bf5a43bbbee6e247bfceab01bf000000000000000094550f3fe1251abe6024da3d5a43bbbee6e247bfceab01bf00000000000000005db39ebec05d993f89fd8bbf6993eabe22f11f3fbedb21bf0000000000000000ba391b3f406c52bda8f12e3e6993ea3e22f11fbfbedb213f0000000000000000a97bb6be66ac8c3f783994bf6993eabe22f11f3fbedb21bf000000000000000094550f3fe1251abe6024da3d6993ea3e22f11fbfbedb213f0000000000000000d07cbebef258993f2b2b86bf5892bd3e97e3473f56d3003f0000000085fe6b3faca20f3f50dc52bd98e8503e5892bd3e97e3473f56d3003f0000803f85fe6b3f2b90d6be8da78c3f5b598ebf5892bdbe97e347bf56d300bf0000000000000000ff98033f3f421abe17770f3e5892bdbe97e347bf56d300bf0000000000000000d07cbebef258993f2b2b86bf14e1eebed5ef1f3f3e4820bf0000000000000000aca20f3f50dc52bd98e8503e14e1ee3ed5ef1fbf3e48203f00000000000000002b90d6be8da78c3f5b598ebf14e1eebed5ef1f3f3e4820bf0000000000000000ff98033f3f421abe17770f3e14e1ee3ed5ef1fbf3e48203f000000000000000064e2ddbeec4e993fcc4780bf8cbebf3efae4473fbd02003f0000000017e16c3faafc033fb0ca53bde0dc733e8cbebf3efae4473fbd02003f0000803f17e16c3f623cf6be709d8c3fbd6888bf8cbebfbefae447bfbd0200bf0000000000000000569fef3e8c7e1abe57d5323e8cbebfbefae447bfbd0200bf000000000000000064e2ddbeec4e993fcc4780bfdcedf2be41ed1f3f68c31ebf0000000000000000aafc033fb0ca53bde0dc733edcedf23e41ed1fbf68c31e3f0000000000000000623cf6be709d8c3fbd6888bfdcedf2be41ed1f3f68c31ebf0000000000000000569fef3e8c7e1abe57d5323edcedf23e41ed1fbf68c31e3f0000000000000000b8e7fcbef93f993fc9a974bf06c9c13ef1e6473fba74fe3e000000006cc46d3fe08ff03ec03355bd02e48b3e06c9c13ef1e6473fba74fe3e0000803f6cc46d3f08c20abf5d8e8c3f1c6982bf06c9c1bef1e647bfba74febe000000000000000087f3d73ecfd91abe4626573e06c9c1bef1e647bfba74febe0000000000000000b8e7fcbef93f993fc9a974bfccbbf6be97e91f3fe54d1dbf0000000000000000e08ff03ec03355bd02e48b3eccbbf63e97e91fbfe54d1d3f000000000000000008c20abf5d8e8c3f1c6982bfccbbf6be97e91f3fe54d1dbf000000000000000087f3d73ecfd91abe4626573eccbbf63e97e91fbfe54d1d3f00000000000000002ec80dbf6a2c993fada768bfddb2c33e61e9473f10f5fc3e0000000084a86e3f6309d93e501457bdda519e3eddb2c33e61e9473f10f5fc3e0000803f84a86e3f75351abfa67a8c3fc0b778bfddb2c3be61e947bf10f5fcbe0000000000000000d52ec03e30531bbe68637c3eddb2c3be61e947bf10f5fcbe00000000000000002ec80dbf6a2c993fada768bfdf4cfabe0de51f3f4de81bbf00000000000000006309d93e501457bdda519e3edf4cfa3e0de51fbf4de81b3f000000000000000075351abfa67a8c3fc0b778bfdf4cfabe0de51f3f4de81bbf0000000000000000d52ec03e30531bbe68637c3edf4cfa3e0de51fbf4de81b3f0000000000000000ecef1cbf8a14993ff88b5cbf147dc53e33ec473f0287fb3e00000000588d6f3f2f66c13e406859bd9034b13e147dc53e33ec473f0287fb3e0000803f588d6f3f4c7a29bf99628c3fcc846cbf147dc5be33ec47bf0287fbbe00000000000000006f51a83e9be91bbee842913e147dc5be33ec47bf0287fbbe0000000000000000ecef1cbf8a14993ff88b5cbf03a3fdbeccdf1f3f20931abf00000000000000002f66c13e406859bd9034b13e03a3fd3eccdf1fbf20931a3f00000000000000004c7a29bf99628c3fcc846cbf03a3fdbeccdf1f3f20931abf00000000000000006f51a83e9be91bbee842913e03a3fd3eccdf1fbf20931a3f0000000000000000cfec2bbfa4f8983f4a5950bfac28c73e4def473f0b2bfa3e00000000e672703f86a6a93ec02b5cbda488c43eac28c73e4def473f0b2bfa3e0000803fe672703f569238bf80468c3f063c60bfac28c7be4def47bf0b2bfabe0000000000000000785b903e0e9c1cbe2cc3a43eac28c7be4def47bf0b2bfabe0000000000000000cfec2bbfa4f8983f4a5950bf096000bf02da1f3fce4e19bf000000000000000086a6a93ec02b5cbda488c43e0960003f02da1fbfce4e193f0000000000000000569238bf80468c3f063c60bf096000bf02da1f3fce4e19bf0000000000000000785b903e0e9c1cbe2cc3a43e0960003f02da1fbfce4e193f00000000000000008cc03abf03d9983f4d1244bf9fb6c83e9ef2473f92e1f83e000000002559713fa0ca913e605a5fbd4a4ad83e9fb6c83e9ef2473f92e1f83e0000803f2559713f587f47bfa9268c3f1de053bf9fb6c8be9ef247bf92e1f8be0000000000000000109a703e66691dbeaaaeb83e9fb6c8be9ef247bf92e1f8be00000000000000008cc03abf03d9983f4d1244bfeed201bfd6d31f3fb91b18bf0000000000000000a0ca913e605a5fbd4a4ad83eeed2013fd6d31fbfb91b183f0000000000000000587f47bfa9268c3f1de053bfeed201bfd6d31f3fb91b18bf0000000000000000109a703e66691dbeaaaeb83eeed2013fd6d31fbfb91b183f0000000000000000c16c49bfeab5983f78b937bfcf27ca3e10f6473febaaf73e000000001140723f34a5733ed0ef62bdd075ec3ecf27ca3e10f6473febaaf73e0000803f1140723ffe4256bf58038c3f8e7347bfcf27cabe10f647bfebaaf7be00000000000000003e4c403e82501ebea401cd3ecf27cabe10f647bfebaaf7be0000000000000000c16c49bfeab5983f78b937bf072b03bf68cd1f3f30fa16bf000000000000000034a5733ed0ef62bdd075ec3e072b033f68cd1fbf30fa163f0000000000000000fe4256bf58038c3f8e7347bf072b03bf68cd1f3f30fa16bf00000000000000003e4c403e82501ebea401cd3e072b033f68cd1fbf30fa163f000000000000000005f357bfa08f983f52512bbf1a7dcb3e93f9473f6887f63e00000000a227733fe47c433e50e766bdaa83003f1a7dcb3e93f9473f6887f63e0000803fa227733feede64bfd5dc8b3fe5f83abf1a7dcbbe93f947bf6887f6be00000000000000003ecd0f3e2a501fbe2eb8e13e1a7dcbbe93f947bf6887f6be000000000000000005f357bfa08f983f52512bbf1f6904bfdbc61f3f7eea15bf0000000000000000e47c433e50e766bdaa83003f1f69043fdbc61fbf7eea153f0000000000000000eede64bfd5dc8b3fe5f83abf1f6904bfdbc61f3f7eea15bf00000000000000003ecd0f3e2a501fbe2eb8e13e1f69043fdbc61fbf7eea153f0000000000000000ef5466bf6c66983f4bdc1ebf51b7cc3e17fd473f4277f53e00000000cf0f743f2c1c133e303c6bbd6bfd0a3f51b7cc3e17fd473f4277f53e0000803fcf0f743fcc5473bf68b38b3f96722ebf51b7ccbe17fd47bf4277f5be00000000000000006d39be3d2c6720be40cef63e51b7ccbe17fd47bf4277f5be0000000000000000ef5466bf6c66983f4bdc1ebffd8d05bf4dc01f3fdbec14bf00000000000000002c1c133e303c6bbd6bfd0a3ffd8d053f4dc01fbfdbec143f0000000000000000cc5473bf68b38b3f96722ebffd8d05bf4dc01f3fdbec14bf00000000000000006d39be3d2c6720be40cef63efd8d053f4dc01fbfdbec143f0000000000000000f39374bf8e3a983fbf5c12bf39d7cd3e8d00483fb77af43e0000000091f8743f7805c53d80e96fbd2fa6153f39d7cd3e8d00483fb77af43e0000803f91f8743f0cd380bf52878b3f01e321bf39d7cdbe8d0048bfb77af4be000000000000000097e8383d429421beed1f063f39d7cdbe8d0048bfb77af4be0000000000000000f39374bf8e3a983fbf5c12bf519a06bfdab91f3f770114bf00000000000000007805c53d80e96fbd2fa6153f519a063fdab91fbf7701143f00000000000000000cd380bf52878b3f01e321bf519a06bfdab91f3f770114bf000000000000000097e8383d429421beed1f063f519a063fdab91fbf7701143f0000000000000000c95881bf480c983f17d505bf7fddce3ee903483feb91f33e00000000dfe1753f60bf463df0e974bde77b203f7fddce3ee903483feb91f33e0000803fdfe1753f30ea87bfd5588b3f904c15bf7fddcebee90348bfeb91f3be000000000000000010d736bb12d622be6e04113f7fddcebee90348bfeb91f3be0000000000000000c95881bf480c983f17d505bfc48e07bf97b31f3f7f2813bf000000000000000060bf463df0e974bde77b203fc48e073f97b31fbf7f28133f000000000000000030ea87bfd5588b3f904c15bfc48e07bf97b31f3f7f2813bf000000000000000010d736bb12d622be6e04113fc48e073f97b31fbf7f28133f000000000000000007478fbf85a9973f9c6dd9beb69fd03e210a483f23fcf13e00000000f1b5773f609442bde0ce7fbdcea5363fb69fd03e210a483f23fcf13e0000803ff1b5773fb9e695bfadf58a3f0629f8beb69fd0be210a48bf23fcf1be00000000000000004e45cbbd779225be1948273fb69fd0be210a48bf23fcf1be000000000000000007478fbf85a9973f9c6dd9be643209bffca71f3f4eae11bf0000000000000000609442bde0ce7fbdcea5363f6432093ffca71fbf4eae113f0000000000000000b9e695bfadf58a3f0629f8be643209bffca71f3f4eae11bf00000000000000004e45cbbd779225be1948273f6432093ffca71fbf4eae113f00000000000000007cfa9cbf1840973fb427a7be8302d23e760f483fcdb6f03e00000000b68b793f54eb13be98df85bd4a6a4d3f8302d23e760f483fcdb6f03e0000803fb68b793f72a5a3bfe98b8a3fcdb9c5be8302d2be760f48bfcdb6f0be0000000000000000024349be409128be3e213e3f8302d2be760f48bfcdb6f0be00000000000000007cfa9cbf1840973fb427a7be117d0abf119e1f3f127f10bf000000000000000054eb13be98df85bd4a6a4d3f117d0a3f119e1fbf127f103f000000000000000072a5a3bfe98b8a3fcdb9c5be117d0abf119e1f3f127f10bf0000000000000000024349be409128be3e213e3f117d0a3f119e1fbf127f103f0000000000000000f661cbbf4cb5953f407c613c8118d43e3018483f91c3ee3e000000000000803fd0ccfbbef8879dbdbc70903f8118d43e3018483f91c3ee3e0000803f0000803fe01dd2bf9000893f7c363abd8118d4be301848bf91c3eebe00000000000000003c5e0bbfe06934be10dc883f8118d4be301848bf91c3eebe0000000000000000f661cbbf4cb5953f407c613cc26e0cbfcb8d1f3fc3ad0ebf0000000000000000d0ccfbbef8879dbdbc70903fc26e0c3fcb8d1fbfc3ad0e3f0000000000000000e01dd2bf9000893f7c363abdc26e0cbfcb8d1f3fc3ad0ebf00000000000000003c5e0bbfe06934be10dc883fc26e0c3fcb8d1fbfc3ad0e3f0000000000000000
+ m_CompressedMesh:
+ m_Vertices:
+ m_NumItems: 0
+ m_Range: 0
+ m_Start: 0
+ m_Data:
+ m_BitSize: 0
+ m_UV:
+ m_NumItems: 0
+ m_Range: 0
+ m_Start: 0
+ m_Data:
+ m_BitSize: 0
+ m_Normals:
+ m_NumItems: 0
+ m_Range: 0
+ m_Start: 0
+ m_Data:
+ m_BitSize: 0
+ m_Tangents:
+ m_NumItems: 0
+ m_Range: 0
+ m_Start: 0
+ m_Data:
+ m_BitSize: 0
+ m_Weights:
+ m_NumItems: 0
+ m_Data:
+ m_BitSize: 0
+ m_NormalSigns:
+ m_NumItems: 0
+ m_Data:
+ m_BitSize: 0
+ m_TangentSigns:
+ m_NumItems: 0
+ m_Data:
+ m_BitSize: 0
+ m_FloatColors:
+ m_NumItems: 0
+ m_Range: 0
+ m_Start: 0
+ m_Data:
+ m_BitSize: 0
+ m_BoneIndices:
+ m_NumItems: 0
+ m_Data:
+ m_BitSize: 0
+ m_Triangles:
+ m_NumItems: 0
+ m_Data:
+ m_BitSize: 0
+ m_UVInfo: 0
+ m_LocalAABB:
+ m_Center: {x: 2.7212982, y: 0.23887771, z: 2.391499}
+ m_Extent: {x: 4.369539, y: 1.0891011, z: 4.398033}
+ m_MeshUsageFlags: 0
+ m_BakedConvexCollisionMesh:
+ m_BakedTriangleCollisionMesh:
+ m_MeshMetrics[0]: 1
+ m_MeshMetrics[1]: 1
+ m_MeshOptimizationFlags: 1
+ m_StreamData:
+ offset: 0
+ size: 0
+ path:
+--- !u!1 &1777349640
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1777349643}
+ - component: {fileID: 1777349642}
+ - component: {fileID: 1777349641}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &1777349641
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1777349640}
+ m_Enabled: 1
+--- !u!20 &1777349642
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1777349640}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_FocalLength: 50
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &1777349643
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1777349640}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 12.48, y: -0.52, z: -31.62}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &2092520649
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2092520651}
+ - component: {fileID: 2092520650}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &2092520650
+Light:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2092520649}
+ m_Enabled: 1
+ serializedVersion: 9
+ m_Type: 1
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_InnerSpotAngle: 21.802082
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_CullingMatrixOverride:
+ e00: 1
+ e01: 0
+ e02: 0
+ e03: 0
+ e10: 0
+ e11: 1
+ e12: 0
+ e13: 0
+ e20: 0
+ e21: 0
+ e22: 1
+ e23: 0
+ e30: 0
+ e31: 0
+ e32: 0
+ e33: 1
+ m_UseCullingMatrixOverride: 0
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingLayerMask: 1
+ m_Lightmapping: 4
+ m_LightShadowCasterMode: 0
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_UseBoundingSphereOverride: 0
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &2092520651
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2092520649}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 12.48, y: 1.48, z: -21.62}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
diff --git a/game/Assets/PathCreator/Examples/Scenes/Road.unity.meta b/game/Assets/PathCreator/Examples/Scenes/Road.unity.meta
new file mode 100644
index 0000000..e3e4cc7
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scenes/Road.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8f020cfa1fb7ded47926b050b82adbe6
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scripts.meta b/game/Assets/PathCreator/Examples/Scripts.meta
new file mode 100644
index 0000000..3ad705f
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4708a8b1933bb914e98024a2cd57b3a8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scripts/Editor.meta b/game/Assets/PathCreator/Examples/Scripts/Editor.meta
new file mode 100644
index 0000000..c765fef
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 37afd3c65f48fa94bbb5a65473466658
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scripts/Editor/PathSceneToolEditor.cs b/game/Assets/PathCreator/Examples/Scripts/Editor/PathSceneToolEditor.cs
new file mode 100644
index 0000000..c8bd736
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/Editor/PathSceneToolEditor.cs
@@ -0,0 +1,108 @@
+using UnityEngine;
+using UnityEditor;
+using PathCreation;
+
+namespace PathCreation.Examples
+{
+ [CustomEditor(typeof(PathSceneTool), true)]
+ public class PathSceneToolEditor : Editor
+ {
+ protected PathSceneTool pathTool;
+ bool isSubscribed;
+
+ public override void OnInspectorGUI()
+ {
+ using (var check = new EditorGUI.ChangeCheckScope())
+ {
+ DrawDefaultInspector();
+
+ if (check.changed)
+ {
+ if (!isSubscribed)
+ {
+ TryFindPathCreator();
+ Subscribe();
+ }
+
+ if (pathTool.autoUpdate)
+ {
+ TriggerUpdate();
+
+ }
+ }
+ }
+
+ if (GUILayout.Button("Manual Update"))
+ {
+ if (TryFindPathCreator())
+ {
+ TriggerUpdate();
+ SceneView.RepaintAll();
+ }
+ }
+
+ }
+
+
+ void TriggerUpdate() {
+ if (pathTool.pathCreator != null) {
+ pathTool.TriggerUpdate();
+ }
+ }
+
+
+ protected virtual void OnPathModified()
+ {
+ if (pathTool.autoUpdate)
+ {
+ TriggerUpdate();
+ }
+ }
+
+ protected virtual void OnEnable()
+ {
+ pathTool = (PathSceneTool)target;
+ pathTool.onDestroyed += OnToolDestroyed;
+
+ if (TryFindPathCreator())
+ {
+ Subscribe();
+ TriggerUpdate();
+ }
+ }
+
+ void OnToolDestroyed() {
+ if (pathTool != null) {
+ pathTool.pathCreator.pathUpdated -= OnPathModified;
+ }
+ }
+
+
+ protected virtual void Subscribe()
+ {
+ if (pathTool.pathCreator != null)
+ {
+ isSubscribed = true;
+ pathTool.pathCreator.pathUpdated -= OnPathModified;
+ pathTool.pathCreator.pathUpdated += OnPathModified;
+ }
+ }
+
+ bool TryFindPathCreator()
+ {
+ // Try find a path creator in the scene, if one is not already assigned
+ if (pathTool.pathCreator == null)
+ {
+ if (pathTool.GetComponent() != null)
+ {
+ pathTool.pathCreator = pathTool.GetComponent();
+ }
+ else if (FindObjectOfType())
+ {
+ pathTool.pathCreator = FindObjectOfType();
+ }
+ }
+ return pathTool.pathCreator != null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Examples/Scripts/Editor/PathSceneToolEditor.cs.meta b/game/Assets/PathCreator/Examples/Scripts/Editor/PathSceneToolEditor.cs.meta
new file mode 100644
index 0000000..bf0c49c
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/Editor/PathSceneToolEditor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: db8aedf6f6cf2734cb24c49646427e96
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scripts/GeneratePathExample.cs b/game/Assets/PathCreator/Examples/Scripts/GeneratePathExample.cs
new file mode 100644
index 0000000..4659b75
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/GeneratePathExample.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+
+namespace PathCreation.Examples {
+ // Example of creating a path at runtime from a set of points.
+
+ [RequireComponent(typeof(PathCreator))]
+ public class GeneratePathExample : MonoBehaviour {
+
+ public bool closedLoop = true;
+ public Transform[] waypoints;
+
+ void Start () {
+ if (waypoints.Length > 0) {
+ // Create a new bezier path from the waypoints.
+ BezierPath bezierPath = new BezierPath (waypoints, closedLoop, PathSpace.xyz);
+ GetComponent ().bezierPath = bezierPath;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Examples/Scripts/GeneratePathExample.cs.meta b/game/Assets/PathCreator/Examples/Scripts/GeneratePathExample.cs.meta
new file mode 100644
index 0000000..ef2955f
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/GeneratePathExample.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f417e74782fffcd40b77b0fdbe82af04
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scripts/PathFollower.cs b/game/Assets/PathCreator/Examples/Scripts/PathFollower.cs
new file mode 100644
index 0000000..9b9ea27
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/PathFollower.cs
@@ -0,0 +1,38 @@
+using UnityEngine;
+
+namespace PathCreation.Examples
+{
+ // Moves along a path at constant speed.
+ // Depending on the end of path instruction, will either loop, reverse, or stop at the end of the path.
+ public class PathFollower : MonoBehaviour
+ {
+ public PathCreator pathCreator;
+ public EndOfPathInstruction endOfPathInstruction;
+ public float speed = 5;
+ float distanceTravelled;
+
+ void Start() {
+ if (pathCreator != null)
+ {
+ // Subscribed to the pathUpdated event so that we're notified if the path changes during the game
+ pathCreator.pathUpdated += OnPathChanged;
+ }
+ }
+
+ void Update()
+ {
+ if (pathCreator != null)
+ {
+ distanceTravelled += speed * Time.deltaTime;
+ transform.position = pathCreator.path.GetPointAtDistance(distanceTravelled, endOfPathInstruction);
+ transform.rotation = pathCreator.path.GetRotationAtDistance(distanceTravelled, endOfPathInstruction);
+ }
+ }
+
+ // If the path changes during the game, update the distance travelled so that the follower's position on the new path
+ // is as close as possible to its position on the old path
+ void OnPathChanged() {
+ distanceTravelled = pathCreator.path.GetClosestDistanceAlongPath(transform.position);
+ }
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Examples/Scripts/PathFollower.cs.meta b/game/Assets/PathCreator/Examples/Scripts/PathFollower.cs.meta
new file mode 100644
index 0000000..b353578
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/PathFollower.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 33aabe1a2dec93349b06e6e5dc51bc06
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scripts/PathPlacer.cs b/game/Assets/PathCreator/Examples/Scripts/PathPlacer.cs
new file mode 100644
index 0000000..8e38ee3
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/PathPlacer.cs
@@ -0,0 +1,46 @@
+using PathCreation;
+using UnityEngine;
+
+namespace PathCreation.Examples {
+
+ [ExecuteInEditMode]
+ public class PathPlacer : PathSceneTool {
+
+ public GameObject prefab;
+ public GameObject holder;
+ public float spacing = 3;
+
+ const float minSpacing = .1f;
+
+ void Generate () {
+ if (pathCreator != null && prefab != null && holder != null) {
+ DestroyObjects ();
+
+ VertexPath path = pathCreator.path;
+
+ spacing = Mathf.Max(minSpacing, spacing);
+ float dst = 0;
+
+ while (dst < path.length) {
+ Vector3 point = path.GetPointAtDistance (dst);
+ Quaternion rot = path.GetRotationAtDistance (dst);
+ Instantiate (prefab, point, rot, holder.transform);
+ dst += spacing;
+ }
+ }
+ }
+
+ void DestroyObjects () {
+ int numChildren = holder.transform.childCount;
+ for (int i = numChildren - 1; i >= 0; i--) {
+ DestroyImmediate (holder.transform.GetChild (i).gameObject, false);
+ }
+ }
+
+ protected override void PathUpdated () {
+ if (pathCreator != null) {
+ Generate ();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Examples/Scripts/PathPlacer.cs.meta b/game/Assets/PathCreator/Examples/Scripts/PathPlacer.cs.meta
new file mode 100644
index 0000000..8b69b4a
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/PathPlacer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d12b1fe1b42884d7692049d7f6f79ee9
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scripts/PathSceneTool.cs b/game/Assets/PathCreator/Examples/Scripts/PathSceneTool.cs
new file mode 100644
index 0000000..a1212c1
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/PathSceneTool.cs
@@ -0,0 +1,31 @@
+using UnityEngine;
+
+namespace PathCreation.Examples
+{
+ [ExecuteInEditMode]
+ public abstract class PathSceneTool : MonoBehaviour
+ {
+ public event System.Action onDestroyed;
+ public PathCreator pathCreator;
+ public bool autoUpdate = true;
+
+ protected VertexPath path {
+ get {
+ return pathCreator.path;
+ }
+ }
+
+ public void TriggerUpdate() {
+ PathUpdated();
+ }
+
+
+ protected virtual void OnDestroy() {
+ if (onDestroyed != null) {
+ onDestroyed();
+ }
+ }
+
+ protected abstract void PathUpdated();
+ }
+}
diff --git a/game/Assets/PathCreator/Examples/Scripts/PathSceneTool.cs.meta b/game/Assets/PathCreator/Examples/Scripts/PathSceneTool.cs.meta
new file mode 100644
index 0000000..492994c
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/PathSceneTool.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 83aca5399f4e71c44b5d6c1314b5b95f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scripts/PathSpawner.cs b/game/Assets/PathCreator/Examples/Scripts/PathSpawner.cs
new file mode 100644
index 0000000..b403917
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/PathSpawner.cs
@@ -0,0 +1,25 @@
+using System.Collections;
+using System.Collections.Generic;
+using PathCreation;
+using UnityEngine;
+
+namespace PathCreation.Examples {
+
+ public class PathSpawner : MonoBehaviour {
+
+ public PathCreator pathPrefab;
+ public PathFollower followerPrefab;
+ public Transform[] spawnPoints;
+
+ void Start () {
+ foreach (Transform t in spawnPoints) {
+ var path = Instantiate (pathPrefab, t.position, t.rotation);
+ var follower = Instantiate (followerPrefab);
+ follower.pathCreator = path;
+ path.transform.parent = t;
+
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Examples/Scripts/PathSpawner.cs.meta b/game/Assets/PathCreator/Examples/Scripts/PathSpawner.cs.meta
new file mode 100644
index 0000000..5f6171d
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/PathSpawner.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b617cc208d0104cad9534d503ff3e1cf
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/game/Assets/PathCreator/Examples/Scripts/RoadMeshCreator.cs b/game/Assets/PathCreator/Examples/Scripts/RoadMeshCreator.cs
new file mode 100644
index 0000000..d201dc4
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/RoadMeshCreator.cs
@@ -0,0 +1,155 @@
+using System.Collections.Generic;
+using PathCreation.Utility;
+using UnityEngine;
+
+namespace PathCreation.Examples {
+ public class RoadMeshCreator : PathSceneTool {
+ [Header ("Road settings")]
+ public float roadWidth = .4f;
+ [Range (0, .5f)]
+ public float thickness = .15f;
+ public bool flattenSurface;
+
+ [Header ("Material settings")]
+ public Material roadMaterial;
+ public Material undersideMaterial;
+ public float textureTiling = 1;
+
+ [SerializeField, HideInInspector]
+ GameObject meshHolder;
+
+ MeshFilter meshFilter;
+ MeshRenderer meshRenderer;
+ Mesh mesh;
+
+ protected override void PathUpdated () {
+ if (pathCreator != null) {
+ AssignMeshComponents ();
+ AssignMaterials ();
+ CreateRoadMesh ();
+ }
+ }
+
+ void CreateRoadMesh () {
+ Vector3[] verts = new Vector3[path.NumPoints * 8];
+ Vector2[] uvs = new Vector2[verts.Length];
+ Vector3[] normals = new Vector3[verts.Length];
+
+ int numTris = 2 * (path.NumPoints - 1) + ((path.isClosedLoop) ? 2 : 0);
+ int[] roadTriangles = new int[numTris * 3];
+ int[] underRoadTriangles = new int[numTris * 3];
+ int[] sideOfRoadTriangles = new int[numTris * 2 * 3];
+
+ int vertIndex = 0;
+ int triIndex = 0;
+
+ // Vertices for the top of the road are layed out:
+ // 0 1
+ // 8 9
+ // and so on... So the triangle map 0,8,1 for example, defines a triangle from top left to bottom left to bottom right.
+ int[] triangleMap = { 0, 8, 1, 1, 8, 9 };
+ int[] sidesTriangleMap = { 4, 6, 14, 12, 4, 14, 5, 15, 7, 13, 15, 5 };
+
+ bool usePathNormals = !(path.space == PathSpace.xyz && flattenSurface);
+
+ for (int i = 0; i < path.NumPoints; i++) {
+ Vector3 localUp = (usePathNormals) ? Vector3.Cross (path.GetTangent (i), path.GetNormal (i)) : path.up;
+ Vector3 localRight = (usePathNormals) ? path.GetNormal (i) : Vector3.Cross (localUp, path.GetTangent (i));
+
+ // Find position to left and right of current path vertex
+ Vector3 vertSideA = path.GetPoint (i) - localRight * Mathf.Abs (roadWidth);
+ Vector3 vertSideB = path.GetPoint (i) + localRight * Mathf.Abs (roadWidth);
+
+ // Add top of road vertices
+ verts[vertIndex + 0] = vertSideA;
+ verts[vertIndex + 1] = vertSideB;
+ // Add bottom of road vertices
+ verts[vertIndex + 2] = vertSideA - localUp * thickness;
+ verts[vertIndex + 3] = vertSideB - localUp * thickness;
+
+ // Duplicate vertices to get flat shading for sides of road
+ verts[vertIndex + 4] = verts[vertIndex + 0];
+ verts[vertIndex + 5] = verts[vertIndex + 1];
+ verts[vertIndex + 6] = verts[vertIndex + 2];
+ verts[vertIndex + 7] = verts[vertIndex + 3];
+
+ // Set uv on y axis to path time (0 at start of path, up to 1 at end of path)
+ uvs[vertIndex + 0] = new Vector2 (0, path.times[i]);
+ uvs[vertIndex + 1] = new Vector2 (1, path.times[i]);
+
+ // Top of road normals
+ normals[vertIndex + 0] = localUp;
+ normals[vertIndex + 1] = localUp;
+ // Bottom of road normals
+ normals[vertIndex + 2] = -localUp;
+ normals[vertIndex + 3] = -localUp;
+ // Sides of road normals
+ normals[vertIndex + 4] = -localRight;
+ normals[vertIndex + 5] = localRight;
+ normals[vertIndex + 6] = -localRight;
+ normals[vertIndex + 7] = localRight;
+
+ // Set triangle indices
+ if (i < path.NumPoints - 1 || path.isClosedLoop) {
+ for (int j = 0; j < triangleMap.Length; j++) {
+ roadTriangles[triIndex + j] = (vertIndex + triangleMap[j]) % verts.Length;
+ // reverse triangle map for under road so that triangles wind the other way and are visible from underneath
+ underRoadTriangles[triIndex + j] = (vertIndex + triangleMap[triangleMap.Length - 1 - j] + 2) % verts.Length;
+ }
+ for (int j = 0; j < sidesTriangleMap.Length; j++) {
+ sideOfRoadTriangles[triIndex * 2 + j] = (vertIndex + sidesTriangleMap[j]) % verts.Length;
+ }
+
+ }
+
+ vertIndex += 8;
+ triIndex += 6;
+ }
+
+ mesh.Clear ();
+ mesh.vertices = verts;
+ mesh.uv = uvs;
+ mesh.normals = normals;
+ mesh.subMeshCount = 3;
+ mesh.SetTriangles (roadTriangles, 0);
+ mesh.SetTriangles (underRoadTriangles, 1);
+ mesh.SetTriangles (sideOfRoadTriangles, 2);
+ mesh.RecalculateBounds ();
+ }
+
+ // Add MeshRenderer and MeshFilter components to this gameobject if not already attached
+ void AssignMeshComponents () {
+
+ if (meshHolder == null) {
+ meshHolder = new GameObject ("Road Mesh Holder");
+ }
+
+ meshHolder.transform.rotation = Quaternion.identity;
+ meshHolder.transform.position = Vector3.zero;
+ meshHolder.transform.localScale = Vector3.one;
+
+ // Ensure mesh renderer and filter components are assigned
+ if (!meshHolder.gameObject.GetComponent ()) {
+ meshHolder.gameObject.AddComponent ();
+ }
+ if (!meshHolder.GetComponent ()) {
+ meshHolder.gameObject.AddComponent ();
+ }
+
+ meshRenderer = meshHolder.GetComponent ();
+ meshFilter = meshHolder.GetComponent ();
+ if (mesh == null) {
+ mesh = new Mesh ();
+ }
+ meshFilter.sharedMesh = mesh;
+ }
+
+ void AssignMaterials () {
+ if (roadMaterial != null && undersideMaterial != null) {
+ meshRenderer.sharedMaterials = new Material[] { roadMaterial, undersideMaterial, undersideMaterial };
+ meshRenderer.sharedMaterials[0].mainTextureScale = new Vector3 (1, textureTiling);
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/game/Assets/PathCreator/Examples/Scripts/RoadMeshCreator.cs.meta b/game/Assets/PathCreator/Examples/Scripts/RoadMeshCreator.cs.meta
new file mode 100644
index 0000000..64ff6a3
--- /dev/null
+++ b/game/Assets/PathCreator/Examples/Scripts/RoadMeshCreator.cs.meta
@@ -0,0 +1,15 @@
+fileFormatVersion: 2
+guid: b275c3b78f8717c4cbc60f74a3247f67
+timeCreated: 1546381468
+licenseType: Store
+MonoImporter:
+ serializedVersion: 2
+ defaultReferences:
+ - pathCreator: {instanceID: 0}
+ - roadMaterial: {fileID: 2100000, guid: b5df4735192845740bd11076dc9cdc99, type: 2}
+ - undersideMaterial: {fileID: 2100000, guid: c1d8d882244c5344fa86a8fd23246f81, type: 2}
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: