@esotericsoftware/spine-core 4.0.11 → 4.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/Animation.d.ts +363 -363
  2. package/dist/Animation.js +1949 -1949
  3. package/dist/AnimationState.d.ts +396 -396
  4. package/dist/AnimationState.js +958 -958
  5. package/dist/AnimationStateData.d.ts +51 -51
  6. package/dist/AnimationStateData.js +69 -69
  7. package/dist/AssetManagerBase.d.ts +72 -72
  8. package/dist/AssetManagerBase.js +303 -303
  9. package/dist/AtlasAttachmentLoader.d.ts +51 -51
  10. package/dist/AtlasAttachmentLoader.js +73 -73
  11. package/dist/Bone.d.ts +138 -138
  12. package/dist/Bone.js +333 -333
  13. package/dist/BoneData.d.ts +72 -72
  14. package/dist/BoneData.js +73 -73
  15. package/dist/ConstraintData.d.ts +35 -35
  16. package/dist/ConstraintData.js +36 -36
  17. package/dist/Event.d.ts +44 -44
  18. package/dist/Event.js +41 -41
  19. package/dist/EventData.d.ts +41 -41
  20. package/dist/EventData.js +36 -36
  21. package/dist/IkConstraint.d.ts +64 -64
  22. package/dist/IkConstraint.js +284 -284
  23. package/dist/IkConstraintData.d.ts +54 -54
  24. package/dist/IkConstraintData.js +53 -53
  25. package/dist/PathConstraint.d.ts +71 -71
  26. package/dist/PathConstraint.js +468 -468
  27. package/dist/PathConstraintData.d.ts +80 -80
  28. package/dist/PathConstraintData.js +69 -69
  29. package/dist/Skeleton.d.ts +158 -158
  30. package/dist/Skeleton.js +570 -570
  31. package/dist/SkeletonBinary.d.ts +67 -67
  32. package/dist/SkeletonBinary.js +1093 -1093
  33. package/dist/SkeletonBounds.d.ts +77 -77
  34. package/dist/SkeletonBounds.js +218 -218
  35. package/dist/SkeletonClipping.d.ts +50 -50
  36. package/dist/SkeletonClipping.js +323 -323
  37. package/dist/SkeletonData.d.ts +114 -114
  38. package/dist/SkeletonData.js +166 -166
  39. package/dist/SkeletonJson.d.ts +51 -51
  40. package/dist/SkeletonJson.js +915 -915
  41. package/dist/Skin.d.ts +71 -71
  42. package/dist/Skin.js +200 -200
  43. package/dist/Slot.d.ts +72 -72
  44. package/dist/Slot.js +93 -93
  45. package/dist/SlotData.d.ts +57 -57
  46. package/dist/SlotData.js +54 -54
  47. package/dist/Texture.d.ts +69 -69
  48. package/dist/Texture.js +72 -72
  49. package/dist/TextureAtlas.d.ts +65 -65
  50. package/dist/TextureAtlas.js +245 -245
  51. package/dist/TransformConstraint.d.ts +60 -60
  52. package/dist/TransformConstraint.js +239 -239
  53. package/dist/TransformConstraintData.d.ts +60 -60
  54. package/dist/TransformConstraintData.js +59 -59
  55. package/dist/Triangulator.d.ts +43 -43
  56. package/dist/Triangulator.js +243 -243
  57. package/dist/Updatable.d.ts +37 -37
  58. package/dist/Updatable.js +29 -29
  59. package/dist/Utils.d.ts +168 -168
  60. package/dist/Utils.js +403 -403
  61. package/dist/VertexEffect.d.ts +35 -35
  62. package/dist/VertexEffect.js +29 -29
  63. package/dist/attachments/Attachment.d.ts +71 -71
  64. package/dist/attachments/Attachment.js +139 -139
  65. package/dist/attachments/AttachmentLoader.d.ts +53 -53
  66. package/dist/attachments/AttachmentLoader.js +29 -29
  67. package/dist/attachments/BoundingBoxAttachment.d.ts +40 -40
  68. package/dist/attachments/BoundingBoxAttachment.js +47 -47
  69. package/dist/attachments/ClippingAttachment.d.ts +42 -42
  70. package/dist/attachments/ClippingAttachment.js +47 -47
  71. package/dist/attachments/MeshAttachment.d.ts +74 -74
  72. package/dist/attachments/MeshAttachment.js +159 -159
  73. package/dist/attachments/PathAttachment.d.ts +47 -47
  74. package/dist/attachments/PathAttachment.js +56 -56
  75. package/dist/attachments/PointAttachment.d.ts +48 -48
  76. package/dist/attachments/PointAttachment.js +62 -62
  77. package/dist/attachments/RegionAttachment.d.ts +108 -108
  78. package/dist/attachments/RegionAttachment.js +196 -196
  79. package/dist/attachments/index.d.ts +8 -8
  80. package/dist/attachments/index.js +8 -8
  81. package/dist/iife/spine-core.js +3 -3
  82. package/dist/iife/spine-core.js.map +2 -2
  83. package/dist/iife/spine-core.min.js +1 -1
  84. package/dist/index.d.ts +42 -42
  85. package/dist/index.js +42 -42
  86. package/dist/polyfills.d.ts +29 -29
  87. package/dist/polyfills.js +38 -38
  88. package/dist/vertexeffects/JitterEffect.d.ts +39 -39
  89. package/dist/vertexeffects/JitterEffect.js +45 -45
  90. package/dist/vertexeffects/SwirlEffect.d.ts +44 -44
  91. package/dist/vertexeffects/SwirlEffect.js +60 -60
  92. package/package.json +32 -32
@@ -1,916 +1,916 @@
1
- /******************************************************************************
2
- * Spine Runtimes License Agreement
3
- * Last updated January 1, 2020. Replaces all prior versions.
4
- *
5
- * Copyright (c) 2013-2020, Esoteric Software LLC
6
- *
7
- * Integration of the Spine Runtimes into software or otherwise creating
8
- * derivative works of the Spine Runtimes is permitted under the terms and
9
- * conditions of Section 2 of the Spine Editor License Agreement:
10
- * http://esotericsoftware.com/spine-editor-license
11
- *
12
- * Otherwise, it is permitted to integrate the Spine Runtimes into software
13
- * or otherwise create derivative works of the Spine Runtimes (collectively,
14
- * "Products"), provided that each user of the Products must obtain their own
15
- * Spine Editor license and redistribution of the Products in any form must
16
- * include this license and copyright notice.
17
- *
18
- * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
19
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
22
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
24
- * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
25
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
- * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
- *****************************************************************************/
29
- import { Animation, AttachmentTimeline, RGBATimeline, RGBTimeline, AlphaTimeline, RGBA2Timeline, RGB2Timeline, RotateTimeline, TranslateTimeline, TranslateXTimeline, TranslateYTimeline, ScaleTimeline, ScaleXTimeline, ScaleYTimeline, ShearTimeline, ShearXTimeline, ShearYTimeline, IkConstraintTimeline, TransformConstraintTimeline, PathConstraintPositionTimeline, PathConstraintSpacingTimeline, PathConstraintMixTimeline, DeformTimeline, DrawOrderTimeline, EventTimeline } from "./Animation";
30
- import { BoneData, TransformMode } from "./BoneData";
31
- import { EventData } from "./EventData";
32
- import { Event } from "./Event";
33
- import { IkConstraintData } from "./IkConstraintData";
34
- import { PathConstraintData, PositionMode, SpacingMode, RotateMode } from "./PathConstraintData";
35
- import { SkeletonData } from "./SkeletonData";
36
- import { Skin } from "./Skin";
37
- import { SlotData, BlendMode } from "./SlotData";
38
- import { TransformConstraintData } from "./TransformConstraintData";
39
- import { Utils, Color } from "./Utils";
40
- /** Loads skeleton data in the Spine JSON format.
41
- *
42
- * See [Spine JSON format](http://esotericsoftware.com/spine-json-format) and
43
- * [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine
44
- * Runtimes Guide. */
45
- export class SkeletonJson {
46
- constructor(attachmentLoader) {
47
- /** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at
48
- * runtime than were used in Spine.
49
- *
50
- * See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */
51
- this.scale = 1;
52
- this.linkedMeshes = new Array();
53
- this.attachmentLoader = attachmentLoader;
54
- }
55
- readSkeletonData(json) {
56
- let scale = this.scale;
57
- let skeletonData = new SkeletonData();
58
- let root = typeof (json) === "string" ? JSON.parse(json) : json;
59
- // Skeleton
60
- let skeletonMap = root.skeleton;
61
- if (skeletonMap) {
62
- skeletonData.hash = skeletonMap.hash;
63
- skeletonData.version = skeletonMap.spine;
64
- skeletonData.x = skeletonMap.x;
65
- skeletonData.y = skeletonMap.y;
66
- skeletonData.width = skeletonMap.width;
67
- skeletonData.height = skeletonMap.height;
68
- skeletonData.fps = skeletonMap.fps;
69
- skeletonData.imagesPath = skeletonMap.images;
70
- }
71
- // Bones
72
- if (root.bones) {
73
- for (let i = 0; i < root.bones.length; i++) {
74
- let boneMap = root.bones[i];
75
- let parent = null;
76
- let parentName = getValue(boneMap, "parent", null);
77
- if (parentName)
78
- parent = skeletonData.findBone(parentName);
79
- let data = new BoneData(skeletonData.bones.length, boneMap.name, parent);
80
- data.length = getValue(boneMap, "length", 0) * scale;
81
- data.x = getValue(boneMap, "x", 0) * scale;
82
- data.y = getValue(boneMap, "y", 0) * scale;
83
- data.rotation = getValue(boneMap, "rotation", 0);
84
- data.scaleX = getValue(boneMap, "scaleX", 1);
85
- data.scaleY = getValue(boneMap, "scaleY", 1);
86
- data.shearX = getValue(boneMap, "shearX", 0);
87
- data.shearY = getValue(boneMap, "shearY", 0);
88
- data.transformMode = Utils.enumValue(TransformMode, getValue(boneMap, "transform", "Normal"));
89
- data.skinRequired = getValue(boneMap, "skin", false);
90
- let color = getValue(boneMap, "color", null);
91
- if (color)
92
- data.color.setFromString(color);
93
- skeletonData.bones.push(data);
94
- }
95
- }
96
- // Slots.
97
- if (root.slots) {
98
- for (let i = 0; i < root.slots.length; i++) {
99
- let slotMap = root.slots[i];
100
- let boneData = skeletonData.findBone(slotMap.bone);
101
- let data = new SlotData(skeletonData.slots.length, slotMap.name, boneData);
102
- let color = getValue(slotMap, "color", null);
103
- if (color)
104
- data.color.setFromString(color);
105
- let dark = getValue(slotMap, "dark", null);
106
- if (dark)
107
- data.darkColor = Color.fromString(dark);
108
- data.attachmentName = getValue(slotMap, "attachment", null);
109
- data.blendMode = Utils.enumValue(BlendMode, getValue(slotMap, "blend", "normal"));
110
- skeletonData.slots.push(data);
111
- }
112
- }
113
- // IK constraints
114
- if (root.ik) {
115
- for (let i = 0; i < root.ik.length; i++) {
116
- let constraintMap = root.ik[i];
117
- let data = new IkConstraintData(constraintMap.name);
118
- data.order = getValue(constraintMap, "order", 0);
119
- data.skinRequired = getValue(constraintMap, "skin", false);
120
- for (let ii = 0; ii < constraintMap.bones.length; ii++)
121
- data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
122
- data.target = skeletonData.findBone(constraintMap.target);
123
- data.mix = getValue(constraintMap, "mix", 1);
124
- data.softness = getValue(constraintMap, "softness", 0) * scale;
125
- data.bendDirection = getValue(constraintMap, "bendPositive", true) ? 1 : -1;
126
- data.compress = getValue(constraintMap, "compress", false);
127
- data.stretch = getValue(constraintMap, "stretch", false);
128
- data.uniform = getValue(constraintMap, "uniform", false);
129
- skeletonData.ikConstraints.push(data);
130
- }
131
- }
132
- // Transform constraints.
133
- if (root.transform) {
134
- for (let i = 0; i < root.transform.length; i++) {
135
- let constraintMap = root.transform[i];
136
- let data = new TransformConstraintData(constraintMap.name);
137
- data.order = getValue(constraintMap, "order", 0);
138
- data.skinRequired = getValue(constraintMap, "skin", false);
139
- for (let ii = 0; ii < constraintMap.bones.length; ii++)
140
- data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
141
- let targetName = constraintMap.target;
142
- data.target = skeletonData.findBone(targetName);
143
- data.local = getValue(constraintMap, "local", false);
144
- data.relative = getValue(constraintMap, "relative", false);
145
- data.offsetRotation = getValue(constraintMap, "rotation", 0);
146
- data.offsetX = getValue(constraintMap, "x", 0) * scale;
147
- data.offsetY = getValue(constraintMap, "y", 0) * scale;
148
- data.offsetScaleX = getValue(constraintMap, "scaleX", 0);
149
- data.offsetScaleY = getValue(constraintMap, "scaleY", 0);
150
- data.offsetShearY = getValue(constraintMap, "shearY", 0);
151
- data.mixRotate = getValue(constraintMap, "mixRotate", 1);
152
- data.mixX = getValue(constraintMap, "mixX", 1);
153
- data.mixY = getValue(constraintMap, "mixY", data.mixX);
154
- data.mixScaleX = getValue(constraintMap, "mixScaleX", 1);
155
- data.mixScaleY = getValue(constraintMap, "mixScaleY", data.mixScaleX);
156
- data.mixShearY = getValue(constraintMap, "mixShearY", 1);
157
- skeletonData.transformConstraints.push(data);
158
- }
159
- }
160
- // Path constraints.
161
- if (root.path) {
162
- for (let i = 0; i < root.path.length; i++) {
163
- let constraintMap = root.path[i];
164
- let data = new PathConstraintData(constraintMap.name);
165
- data.order = getValue(constraintMap, "order", 0);
166
- data.skinRequired = getValue(constraintMap, "skin", false);
167
- for (let ii = 0; ii < constraintMap.bones.length; ii++)
168
- data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
169
- let targetName = constraintMap.target;
170
- data.target = skeletonData.findSlot(targetName);
171
- data.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, "positionMode", "Percent"));
172
- data.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, "spacingMode", "Length"));
173
- data.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, "rotateMode", "Tangent"));
174
- data.offsetRotation = getValue(constraintMap, "rotation", 0);
175
- data.position = getValue(constraintMap, "position", 0);
176
- if (data.positionMode == PositionMode.Fixed)
177
- data.position *= scale;
178
- data.spacing = getValue(constraintMap, "spacing", 0);
179
- if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed)
180
- data.spacing *= scale;
181
- data.mixRotate = getValue(constraintMap, "mixRotate", 1);
182
- data.mixX = getValue(constraintMap, "mixX", 1);
183
- data.mixY = getValue(constraintMap, "mixY", data.mixX);
184
- skeletonData.pathConstraints.push(data);
185
- }
186
- }
187
- // Skins.
188
- if (root.skins) {
189
- for (let i = 0; i < root.skins.length; i++) {
190
- let skinMap = root.skins[i];
191
- let skin = new Skin(skinMap.name);
192
- if (skinMap.bones) {
193
- for (let ii = 0; ii < skinMap.bones.length; ii++)
194
- skin.bones.push(skeletonData.findBone(skinMap.bones[ii]));
195
- }
196
- if (skinMap.ik) {
197
- for (let ii = 0; ii < skinMap.ik.length; ii++)
198
- skin.constraints.push(skeletonData.findIkConstraint(skinMap.ik[ii]));
199
- }
200
- if (skinMap.transform) {
201
- for (let ii = 0; ii < skinMap.transform.length; ii++)
202
- skin.constraints.push(skeletonData.findTransformConstraint(skinMap.transform[ii]));
203
- }
204
- if (skinMap.path) {
205
- for (let ii = 0; ii < skinMap.path.length; ii++)
206
- skin.constraints.push(skeletonData.findPathConstraint(skinMap.path[ii]));
207
- }
208
- for (let slotName in skinMap.attachments) {
209
- let slot = skeletonData.findSlot(slotName);
210
- let slotMap = skinMap.attachments[slotName];
211
- for (let entryName in slotMap) {
212
- let attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData);
213
- if (attachment)
214
- skin.setAttachment(slot.index, entryName, attachment);
215
- }
216
- }
217
- skeletonData.skins.push(skin);
218
- if (skin.name == "default")
219
- skeletonData.defaultSkin = skin;
220
- }
221
- }
222
- // Linked meshes.
223
- for (let i = 0, n = this.linkedMeshes.length; i < n; i++) {
224
- let linkedMesh = this.linkedMeshes[i];
225
- let skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
226
- let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);
227
- linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh;
228
- linkedMesh.mesh.setParentMesh(parent);
229
- linkedMesh.mesh.updateUVs();
230
- }
231
- this.linkedMeshes.length = 0;
232
- // Events.
233
- if (root.events) {
234
- for (let eventName in root.events) {
235
- let eventMap = root.events[eventName];
236
- let data = new EventData(eventName);
237
- data.intValue = getValue(eventMap, "int", 0);
238
- data.floatValue = getValue(eventMap, "float", 0);
239
- data.stringValue = getValue(eventMap, "string", "");
240
- data.audioPath = getValue(eventMap, "audio", null);
241
- if (data.audioPath) {
242
- data.volume = getValue(eventMap, "volume", 1);
243
- data.balance = getValue(eventMap, "balance", 0);
244
- }
245
- skeletonData.events.push(data);
246
- }
247
- }
248
- // Animations.
249
- if (root.animations) {
250
- for (let animationName in root.animations) {
251
- let animationMap = root.animations[animationName];
252
- this.readAnimation(animationMap, animationName, skeletonData);
253
- }
254
- }
255
- return skeletonData;
256
- }
257
- readAttachment(map, skin, slotIndex, name, skeletonData) {
258
- let scale = this.scale;
259
- name = getValue(map, "name", name);
260
- switch (getValue(map, "type", "region")) {
261
- case "region": {
262
- let path = getValue(map, "path", name);
263
- let region = this.attachmentLoader.newRegionAttachment(skin, name, path);
264
- if (!region)
265
- return null;
266
- region.path = path;
267
- region.x = getValue(map, "x", 0) * scale;
268
- region.y = getValue(map, "y", 0) * scale;
269
- region.scaleX = getValue(map, "scaleX", 1);
270
- region.scaleY = getValue(map, "scaleY", 1);
271
- region.rotation = getValue(map, "rotation", 0);
272
- region.width = map.width * scale;
273
- region.height = map.height * scale;
274
- let color = getValue(map, "color", null);
275
- if (color)
276
- region.color.setFromString(color);
277
- region.updateOffset();
278
- return region;
279
- }
280
- case "boundingbox": {
281
- let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);
282
- if (!box)
283
- return null;
284
- this.readVertices(map, box, map.vertexCount << 1);
285
- let color = getValue(map, "color", null);
286
- if (color)
287
- box.color.setFromString(color);
288
- return box;
289
- }
290
- case "mesh":
291
- case "linkedmesh": {
292
- let path = getValue(map, "path", name);
293
- let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
294
- if (!mesh)
295
- return null;
296
- mesh.path = path;
297
- let color = getValue(map, "color", null);
298
- if (color)
299
- mesh.color.setFromString(color);
300
- mesh.width = getValue(map, "width", 0) * scale;
301
- mesh.height = getValue(map, "height", 0) * scale;
302
- let parent = getValue(map, "parent", null);
303
- if (parent) {
304
- this.linkedMeshes.push(new LinkedMesh(mesh, getValue(map, "skin", null), slotIndex, parent, getValue(map, "deform", true)));
305
- return mesh;
306
- }
307
- let uvs = map.uvs;
308
- this.readVertices(map, mesh, uvs.length);
309
- mesh.triangles = map.triangles;
310
- mesh.regionUVs = uvs;
311
- mesh.updateUVs();
312
- mesh.edges = getValue(map, "edges", null);
313
- mesh.hullLength = getValue(map, "hull", 0) * 2;
314
- return mesh;
315
- }
316
- case "path": {
317
- let path = this.attachmentLoader.newPathAttachment(skin, name);
318
- if (!path)
319
- return null;
320
- path.closed = getValue(map, "closed", false);
321
- path.constantSpeed = getValue(map, "constantSpeed", true);
322
- let vertexCount = map.vertexCount;
323
- this.readVertices(map, path, vertexCount << 1);
324
- let lengths = Utils.newArray(vertexCount / 3, 0);
325
- for (let i = 0; i < map.lengths.length; i++)
326
- lengths[i] = map.lengths[i] * scale;
327
- path.lengths = lengths;
328
- let color = getValue(map, "color", null);
329
- if (color)
330
- path.color.setFromString(color);
331
- return path;
332
- }
333
- case "point": {
334
- let point = this.attachmentLoader.newPointAttachment(skin, name);
335
- if (!point)
336
- return null;
337
- point.x = getValue(map, "x", 0) * scale;
338
- point.y = getValue(map, "y", 0) * scale;
339
- point.rotation = getValue(map, "rotation", 0);
340
- let color = getValue(map, "color", null);
341
- if (color)
342
- point.color.setFromString(color);
343
- return point;
344
- }
345
- case "clipping": {
346
- let clip = this.attachmentLoader.newClippingAttachment(skin, name);
347
- if (!clip)
348
- return null;
349
- let end = getValue(map, "end", null);
350
- if (end)
351
- clip.endSlot = skeletonData.findSlot(end);
352
- let vertexCount = map.vertexCount;
353
- this.readVertices(map, clip, vertexCount << 1);
354
- let color = getValue(map, "color", null);
355
- if (color)
356
- clip.color.setFromString(color);
357
- return clip;
358
- }
359
- }
360
- return null;
361
- }
362
- readVertices(map, attachment, verticesLength) {
363
- let scale = this.scale;
364
- attachment.worldVerticesLength = verticesLength;
365
- let vertices = map.vertices;
366
- if (verticesLength == vertices.length) {
367
- let scaledVertices = Utils.toFloatArray(vertices);
368
- if (scale != 1) {
369
- for (let i = 0, n = vertices.length; i < n; i++)
370
- scaledVertices[i] *= scale;
371
- }
372
- attachment.vertices = scaledVertices;
373
- return;
374
- }
375
- let weights = new Array();
376
- let bones = new Array();
377
- for (let i = 0, n = vertices.length; i < n;) {
378
- let boneCount = vertices[i++];
379
- bones.push(boneCount);
380
- for (let nn = i + boneCount * 4; i < nn; i += 4) {
381
- bones.push(vertices[i]);
382
- weights.push(vertices[i + 1] * scale);
383
- weights.push(vertices[i + 2] * scale);
384
- weights.push(vertices[i + 3]);
385
- }
386
- }
387
- attachment.bones = bones;
388
- attachment.vertices = Utils.toFloatArray(weights);
389
- }
390
- readAnimation(map, name, skeletonData) {
391
- let scale = this.scale;
392
- let timelines = new Array();
393
- // Slot timelines.
394
- if (map.slots) {
395
- for (let slotName in map.slots) {
396
- let slotMap = map.slots[slotName];
397
- let slotIndex = skeletonData.findSlot(slotName).index;
398
- for (let timelineName in slotMap) {
399
- let timelineMap = slotMap[timelineName];
400
- if (!timelineMap)
401
- continue;
402
- let frames = timelineMap.length;
403
- if (timelineName == "attachment") {
404
- let timeline = new AttachmentTimeline(frames, slotIndex);
405
- for (let frame = 0; frame < frames; frame++) {
406
- let keyMap = timelineMap[frame];
407
- timeline.setFrame(frame, getValue(keyMap, "time", 0), keyMap.name);
408
- }
409
- timelines.push(timeline);
410
- }
411
- else if (timelineName == "rgba") {
412
- let timeline = new RGBATimeline(frames, frames << 2, slotIndex);
413
- let keyMap = timelineMap[0];
414
- let time = getValue(keyMap, "time", 0);
415
- let color = Color.fromString(keyMap.color);
416
- for (let frame = 0, bezier = 0;; frame++) {
417
- timeline.setFrame(frame, time, color.r, color.g, color.b, color.a);
418
- let nextMap = timelineMap[frame + 1];
419
- if (!nextMap) {
420
- timeline.shrink(bezier);
421
- break;
422
- }
423
- let time2 = getValue(nextMap, "time", 0);
424
- let newColor = Color.fromString(nextMap.color);
425
- let curve = keyMap.curve;
426
- if (curve) {
427
- bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
428
- bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
429
- bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
430
- bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
431
- }
432
- time = time2;
433
- color = newColor;
434
- keyMap = nextMap;
435
- }
436
- timelines.push(timeline);
437
- }
438
- else if (timelineName == "rgb") {
439
- let timeline = new RGBTimeline(frames, frames * 3, slotIndex);
440
- let keyMap = timelineMap[0];
441
- let time = getValue(keyMap, "time", 0);
442
- let color = Color.fromString(keyMap.color);
443
- for (let frame = 0, bezier = 0;; frame++) {
444
- timeline.setFrame(frame, time, color.r, color.g, color.b);
445
- let nextMap = timelineMap[frame + 1];
446
- if (!nextMap) {
447
- timeline.shrink(bezier);
448
- break;
449
- }
450
- let time2 = getValue(nextMap, "time", 0);
451
- let newColor = Color.fromString(nextMap.color);
452
- let curve = keyMap.curve;
453
- if (curve) {
454
- bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
455
- bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
456
- bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
457
- }
458
- time = time2;
459
- color = newColor;
460
- keyMap = nextMap;
461
- }
462
- timelines.push(timeline);
463
- }
464
- else if (timelineName == "alpha") {
465
- timelines.push(readTimeline1(timelineMap, new AlphaTimeline(frames, frames, slotIndex), 0, 1));
466
- }
467
- else if (timelineName == "rgba2") {
468
- let timeline = new RGBA2Timeline(frames, frames * 7, slotIndex);
469
- let keyMap = timelineMap[0];
470
- let time = getValue(keyMap, "time", 0);
471
- let color = Color.fromString(keyMap.light);
472
- let color2 = Color.fromString(keyMap.dark);
473
- for (let frame = 0, bezier = 0;; frame++) {
474
- timeline.setFrame(frame, time, color.r, color.g, color.b, color.a, color2.r, color2.g, color2.b);
475
- let nextMap = timelineMap[frame + 1];
476
- if (!nextMap) {
477
- timeline.shrink(bezier);
478
- break;
479
- }
480
- let time2 = getValue(nextMap, "time", 0);
481
- let newColor = Color.fromString(nextMap.light);
482
- let newColor2 = Color.fromString(nextMap.dark);
483
- let curve = keyMap.curve;
484
- if (curve) {
485
- bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
486
- bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
487
- bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
488
- bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
489
- bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1);
490
- bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1);
491
- bezier = readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1);
492
- }
493
- time = time2;
494
- color = newColor;
495
- color2 = newColor2;
496
- keyMap = nextMap;
497
- }
498
- timelines.push(timeline);
499
- }
500
- else if (timelineName == "rgb2") {
501
- let timeline = new RGB2Timeline(frames, frames * 6, slotIndex);
502
- let keyMap = timelineMap[0];
503
- let time = getValue(keyMap, "time", 0);
504
- let color = Color.fromString(keyMap.light);
505
- let color2 = Color.fromString(keyMap.dark);
506
- for (let frame = 0, bezier = 0;; frame++) {
507
- timeline.setFrame(frame, time, color.r, color.g, color.b, color2.r, color2.g, color2.b);
508
- let nextMap = timelineMap[frame + 1];
509
- if (!nextMap) {
510
- timeline.shrink(bezier);
511
- break;
512
- }
513
- let time2 = getValue(nextMap, "time", 0);
514
- let newColor = Color.fromString(nextMap.light);
515
- let newColor2 = Color.fromString(nextMap.dark);
516
- let curve = keyMap.curve;
517
- if (curve) {
518
- bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
519
- bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
520
- bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
521
- bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1);
522
- bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1);
523
- bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1);
524
- }
525
- time = time2;
526
- color = newColor;
527
- color2 = newColor2;
528
- keyMap = nextMap;
529
- }
530
- timelines.push(timeline);
531
- }
532
- }
533
- }
534
- }
535
- // Bone timelines.
536
- if (map.bones) {
537
- for (let boneName in map.bones) {
538
- let boneMap = map.bones[boneName];
539
- let boneIndex = skeletonData.findBone(boneName).index;
540
- for (let timelineName in boneMap) {
541
- let timelineMap = boneMap[timelineName];
542
- let frames = timelineMap.length;
543
- if (frames == 0)
544
- continue;
545
- if (timelineName === "rotate") {
546
- timelines.push(readTimeline1(timelineMap, new RotateTimeline(frames, frames, boneIndex), 0, 1));
547
- }
548
- else if (timelineName === "translate") {
549
- let timeline = new TranslateTimeline(frames, frames << 1, boneIndex);
550
- timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 0, scale));
551
- }
552
- else if (timelineName === "translatex") {
553
- let timeline = new TranslateXTimeline(frames, frames, boneIndex);
554
- timelines.push(readTimeline1(timelineMap, timeline, 0, scale));
555
- }
556
- else if (timelineName === "translatey") {
557
- let timeline = new TranslateYTimeline(frames, frames, boneIndex);
558
- timelines.push(readTimeline1(timelineMap, timeline, 0, scale));
559
- }
560
- else if (timelineName === "scale") {
561
- let timeline = new ScaleTimeline(frames, frames << 1, boneIndex);
562
- timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 1, 1));
563
- }
564
- else if (timelineName === "scalex") {
565
- let timeline = new ScaleXTimeline(frames, frames, boneIndex);
566
- timelines.push(readTimeline1(timelineMap, timeline, 1, 1));
567
- }
568
- else if (timelineName === "scaley") {
569
- let timeline = new ScaleYTimeline(frames, frames, boneIndex);
570
- timelines.push(readTimeline1(timelineMap, timeline, 1, 1));
571
- }
572
- else if (timelineName === "shear") {
573
- let timeline = new ShearTimeline(frames, frames << 1, boneIndex);
574
- timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 0, 1));
575
- }
576
- else if (timelineName === "shearx") {
577
- let timeline = new ShearXTimeline(frames, frames, boneIndex);
578
- timelines.push(readTimeline1(timelineMap, timeline, 0, 1));
579
- }
580
- else if (timelineName === "sheary") {
581
- let timeline = new ShearYTimeline(frames, frames, boneIndex);
582
- timelines.push(readTimeline1(timelineMap, timeline, 0, 1));
583
- }
584
- }
585
- }
586
- }
587
- // IK constraint timelines.
588
- if (map.ik) {
589
- for (let constraintName in map.ik) {
590
- let constraintMap = map.ik[constraintName];
591
- let keyMap = constraintMap[0];
592
- if (!keyMap)
593
- continue;
594
- let constraint = skeletonData.findIkConstraint(constraintName);
595
- let constraintIndex = skeletonData.ikConstraints.indexOf(constraint);
596
- let timeline = new IkConstraintTimeline(constraintMap.length, constraintMap.length << 1, constraintIndex);
597
- let time = getValue(keyMap, "time", 0);
598
- let mix = getValue(keyMap, "mix", 1);
599
- let softness = getValue(keyMap, "softness", 0) * scale;
600
- for (let frame = 0, bezier = 0;; frame++) {
601
- timeline.setFrame(frame, time, mix, softness, getValue(keyMap, "bendPositive", true) ? 1 : -1, getValue(keyMap, "compress", false), getValue(keyMap, "stretch", false));
602
- let nextMap = constraintMap[frame + 1];
603
- if (!nextMap) {
604
- timeline.shrink(bezier);
605
- break;
606
- }
607
- let time2 = getValue(nextMap, "time", 0);
608
- let mix2 = getValue(nextMap, "mix", 1);
609
- let softness2 = getValue(nextMap, "softness", 0) * scale;
610
- let curve = keyMap.curve;
611
- if (curve) {
612
- bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1);
613
- bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale);
614
- }
615
- time = time2;
616
- mix = mix2;
617
- softness = softness2;
618
- keyMap = nextMap;
619
- }
620
- timelines.push(timeline);
621
- }
622
- }
623
- // Transform constraint timelines.
624
- if (map.transform) {
625
- for (let constraintName in map.transform) {
626
- let timelineMap = map.transform[constraintName];
627
- let keyMap = timelineMap[0];
628
- if (!keyMap)
629
- continue;
630
- let constraint = skeletonData.findTransformConstraint(constraintName);
631
- let constraintIndex = skeletonData.transformConstraints.indexOf(constraint);
632
- let timeline = new TransformConstraintTimeline(timelineMap.length, timelineMap.length * 6, constraintIndex);
633
- let time = getValue(keyMap, "time", 0);
634
- let mixRotate = getValue(keyMap, "mixRotate", 1);
635
- let mixX = getValue(keyMap, "mixX", 1);
636
- let mixY = getValue(keyMap, "mixY", mixX);
637
- let mixScaleX = getValue(keyMap, "mixScaleX", 1);
638
- let mixScaleY = getValue(keyMap, "mixScaleY", mixScaleX);
639
- let mixShearY = getValue(keyMap, "mixShearY", 1);
640
- for (let frame = 0, bezier = 0;; frame++) {
641
- timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);
642
- let nextMap = timelineMap[frame + 1];
643
- if (!nextMap) {
644
- timeline.shrink(bezier);
645
- break;
646
- }
647
- let time2 = getValue(nextMap, "time", 0);
648
- let mixRotate2 = getValue(nextMap, "mixRotate", 1);
649
- let mixX2 = getValue(nextMap, "mixX", 1);
650
- let mixY2 = getValue(nextMap, "mixY", mixX2);
651
- let mixScaleX2 = getValue(nextMap, "mixScaleX", 1);
652
- let mixScaleY2 = getValue(nextMap, "mixScaleY", mixScaleX2);
653
- let mixShearY2 = getValue(nextMap, "mixShearY", 1);
654
- let curve = keyMap.curve;
655
- if (curve) {
656
- bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
657
- bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
658
- bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
659
- bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);
660
- bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);
661
- bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, mixShearY, mixShearY2, 1);
662
- }
663
- time = time2;
664
- mixRotate = mixRotate2;
665
- mixX = mixX2;
666
- mixY = mixY2;
667
- mixScaleX = mixScaleX2;
668
- mixScaleY = mixScaleY2;
669
- mixScaleX = mixScaleX2;
670
- keyMap = nextMap;
671
- }
672
- timelines.push(timeline);
673
- }
674
- }
675
- // Path constraint timelines.
676
- if (map.path) {
677
- for (let constraintName in map.path) {
678
- let constraintMap = map.path[constraintName];
679
- let constraint = skeletonData.findPathConstraint(constraintName);
680
- let constraintIndex = skeletonData.pathConstraints.indexOf(constraint);
681
- for (let timelineName in constraintMap) {
682
- let timelineMap = constraintMap[timelineName];
683
- let keyMap = timelineMap[0];
684
- if (!keyMap)
685
- continue;
686
- let frames = timelineMap.length;
687
- if (timelineName === "position") {
688
- let timeline = new PathConstraintPositionTimeline(frames, frames, constraintIndex);
689
- timelines.push(readTimeline1(timelineMap, timeline, 0, constraint.positionMode == PositionMode.Fixed ? scale : 1));
690
- }
691
- else if (timelineName === "spacing") {
692
- let timeline = new PathConstraintSpacingTimeline(frames, frames, constraintIndex);
693
- timelines.push(readTimeline1(timelineMap, timeline, 0, constraint.spacingMode == SpacingMode.Length || constraint.spacingMode == SpacingMode.Fixed ? scale : 1));
694
- }
695
- else if (timelineName === "mix") {
696
- let timeline = new PathConstraintMixTimeline(frames, frames * 3, constraintIndex);
697
- let time = getValue(keyMap, "time", 0);
698
- let mixRotate = getValue(keyMap, "mixRotate", 1);
699
- let mixX = getValue(keyMap, "mixX", 1);
700
- let mixY = getValue(keyMap, "mixY", mixX);
701
- for (let frame = 0, bezier = 0;; frame++) {
702
- timeline.setFrame(frame, time, mixRotate, mixX, mixY);
703
- let nextMap = timelineMap[frame + 1];
704
- if (!nextMap) {
705
- timeline.shrink(bezier);
706
- break;
707
- }
708
- let time2 = getValue(nextMap, "time", 0);
709
- let mixRotate2 = getValue(nextMap, "mixRotate", 1);
710
- let mixX2 = getValue(nextMap, "mixX", 1);
711
- let mixY2 = getValue(nextMap, "mixY", mixX2);
712
- let curve = keyMap.curve;
713
- if (curve) {
714
- bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
715
- bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
716
- bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
717
- }
718
- time = time2;
719
- mixRotate = mixRotate2;
720
- mixX = mixX2;
721
- mixY = mixY2;
722
- keyMap = nextMap;
723
- }
724
- timelines.push(timeline);
725
- }
726
- }
727
- }
728
- }
729
- // Deform timelines.
730
- if (map.deform) {
731
- for (let deformName in map.deform) {
732
- let deformMap = map.deform[deformName];
733
- let skin = skeletonData.findSkin(deformName);
734
- for (let slotName in deformMap) {
735
- let slotMap = deformMap[slotName];
736
- let slotIndex = skeletonData.findSlot(slotName).index;
737
- for (let timelineName in slotMap) {
738
- let timelineMap = slotMap[timelineName];
739
- let keyMap = timelineMap[0];
740
- if (!keyMap)
741
- continue;
742
- let attachment = skin.getAttachment(slotIndex, timelineName);
743
- let weighted = attachment.bones;
744
- let vertices = attachment.vertices;
745
- let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
746
- let timeline = new DeformTimeline(timelineMap.length, timelineMap.length, slotIndex, attachment);
747
- let time = getValue(keyMap, "time", 0);
748
- for (let frame = 0, bezier = 0;; frame++) {
749
- let deform;
750
- let verticesValue = getValue(keyMap, "vertices", null);
751
- if (!verticesValue)
752
- deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
753
- else {
754
- deform = Utils.newFloatArray(deformLength);
755
- let start = getValue(keyMap, "offset", 0);
756
- Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);
757
- if (scale != 1) {
758
- for (let i = start, n = i + verticesValue.length; i < n; i++)
759
- deform[i] *= scale;
760
- }
761
- if (!weighted) {
762
- for (let i = 0; i < deformLength; i++)
763
- deform[i] += vertices[i];
764
- }
765
- }
766
- timeline.setFrame(frame, time, deform);
767
- let nextMap = timelineMap[frame + 1];
768
- if (!nextMap) {
769
- timeline.shrink(bezier);
770
- break;
771
- }
772
- let time2 = getValue(nextMap, "time", 0);
773
- let curve = keyMap.curve;
774
- if (curve)
775
- bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1);
776
- time = time2;
777
- keyMap = nextMap;
778
- }
779
- timelines.push(timeline);
780
- }
781
- }
782
- }
783
- }
784
- // Draw order timelines.
785
- if (map.drawOrder) {
786
- let timeline = new DrawOrderTimeline(map.drawOrder.length);
787
- let slotCount = skeletonData.slots.length;
788
- let frame = 0;
789
- for (let i = 0; i < map.drawOrder.length; i++, frame++) {
790
- let drawOrderMap = map.drawOrder[i];
791
- let drawOrder = null;
792
- let offsets = getValue(drawOrderMap, "offsets", null);
793
- if (offsets) {
794
- drawOrder = Utils.newArray(slotCount, -1);
795
- let unchanged = Utils.newArray(slotCount - offsets.length, 0);
796
- let originalIndex = 0, unchangedIndex = 0;
797
- for (let ii = 0; ii < offsets.length; ii++) {
798
- let offsetMap = offsets[ii];
799
- let slotIndex = skeletonData.findSlot(offsetMap.slot).index;
800
- // Collect unchanged items.
801
- while (originalIndex != slotIndex)
802
- unchanged[unchangedIndex++] = originalIndex++;
803
- // Set changed items.
804
- drawOrder[originalIndex + offsetMap.offset] = originalIndex++;
805
- }
806
- // Collect remaining unchanged items.
807
- while (originalIndex < slotCount)
808
- unchanged[unchangedIndex++] = originalIndex++;
809
- // Fill in unchanged items.
810
- for (let ii = slotCount - 1; ii >= 0; ii--)
811
- if (drawOrder[ii] == -1)
812
- drawOrder[ii] = unchanged[--unchangedIndex];
813
- }
814
- timeline.setFrame(frame, getValue(drawOrderMap, "time", 0), drawOrder);
815
- }
816
- timelines.push(timeline);
817
- }
818
- // Event timelines.
819
- if (map.events) {
820
- let timeline = new EventTimeline(map.events.length);
821
- let frame = 0;
822
- for (let i = 0; i < map.events.length; i++, frame++) {
823
- let eventMap = map.events[i];
824
- let eventData = skeletonData.findEvent(eventMap.name);
825
- let event = new Event(Utils.toSinglePrecision(getValue(eventMap, "time", 0)), eventData);
826
- event.intValue = getValue(eventMap, "int", eventData.intValue);
827
- event.floatValue = getValue(eventMap, "float", eventData.floatValue);
828
- event.stringValue = getValue(eventMap, "string", eventData.stringValue);
829
- if (event.data.audioPath) {
830
- event.volume = getValue(eventMap, "volume", 1);
831
- event.balance = getValue(eventMap, "balance", 0);
832
- }
833
- timeline.setFrame(frame, event);
834
- }
835
- timelines.push(timeline);
836
- }
837
- let duration = 0;
838
- for (let i = 0, n = timelines.length; i < n; i++)
839
- duration = Math.max(duration, timelines[i].getDuration());
840
- skeletonData.animations.push(new Animation(name, timelines, duration));
841
- }
842
- }
843
- class LinkedMesh {
844
- constructor(mesh, skin, slotIndex, parent, inheritDeform) {
845
- this.mesh = mesh;
846
- this.skin = skin;
847
- this.slotIndex = slotIndex;
848
- this.parent = parent;
849
- this.inheritDeform = inheritDeform;
850
- }
851
- }
852
- function readTimeline1(keys, timeline, defaultValue, scale) {
853
- let keyMap = keys[0];
854
- let time = getValue(keyMap, "time", 0);
855
- let value = getValue(keyMap, "value", defaultValue) * scale;
856
- let bezier = 0;
857
- for (let frame = 0;; frame++) {
858
- timeline.setFrame(frame, time, value);
859
- let nextMap = keys[frame + 1];
860
- if (!nextMap) {
861
- timeline.shrink(bezier);
862
- return timeline;
863
- }
864
- let time2 = getValue(nextMap, "time", 0);
865
- let value2 = getValue(nextMap, "value", defaultValue) * scale;
866
- if (keyMap.curve)
867
- bezier = readCurve(keyMap.curve, timeline, bezier, frame, 0, time, time2, value, value2, scale);
868
- time = time2;
869
- value = value2;
870
- keyMap = nextMap;
871
- }
872
- }
873
- function readTimeline2(keys, timeline, name1, name2, defaultValue, scale) {
874
- let keyMap = keys[0];
875
- let time = getValue(keyMap, "time", 0);
876
- let value1 = getValue(keyMap, name1, defaultValue) * scale;
877
- let value2 = getValue(keyMap, name2, defaultValue) * scale;
878
- let bezier = 0;
879
- for (let frame = 0;; frame++) {
880
- timeline.setFrame(frame, time, value1, value2);
881
- let nextMap = keys[frame + 1];
882
- if (!nextMap) {
883
- timeline.shrink(bezier);
884
- return timeline;
885
- }
886
- let time2 = getValue(nextMap, "time", 0);
887
- let nvalue1 = getValue(nextMap, name1, defaultValue) * scale;
888
- let nvalue2 = getValue(nextMap, name2, defaultValue) * scale;
889
- let curve = keyMap.curve;
890
- if (curve) {
891
- bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale);
892
- bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale);
893
- }
894
- time = time2;
895
- value1 = nvalue1;
896
- value2 = nvalue2;
897
- keyMap = nextMap;
898
- }
899
- }
900
- function readCurve(curve, timeline, bezier, frame, value, time1, time2, value1, value2, scale) {
901
- if (curve == "stepped") {
902
- timeline.setStepped(frame);
903
- return bezier;
904
- }
905
- let i = value << 2;
906
- let cx1 = curve[i];
907
- let cy1 = curve[i + 1] * scale;
908
- let cx2 = curve[i + 2];
909
- let cy2 = curve[i + 3] * scale;
910
- timeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);
911
- return bezier + 1;
912
- }
913
- function getValue(map, property, defaultValue) {
914
- return map[property] !== undefined ? map[property] : defaultValue;
915
- }
1
+ /******************************************************************************
2
+ * Spine Runtimes License Agreement
3
+ * Last updated January 1, 2020. Replaces all prior versions.
4
+ *
5
+ * Copyright (c) 2013-2020, Esoteric Software LLC
6
+ *
7
+ * Integration of the Spine Runtimes into software or otherwise creating
8
+ * derivative works of the Spine Runtimes is permitted under the terms and
9
+ * conditions of Section 2 of the Spine Editor License Agreement:
10
+ * http://esotericsoftware.com/spine-editor-license
11
+ *
12
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software
13
+ * or otherwise create derivative works of the Spine Runtimes (collectively,
14
+ * "Products"), provided that each user of the Products must obtain their own
15
+ * Spine Editor license and redistribution of the Products in any form must
16
+ * include this license and copyright notice.
17
+ *
18
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
19
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
24
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ *****************************************************************************/
29
+ import { Animation, AttachmentTimeline, RGBATimeline, RGBTimeline, AlphaTimeline, RGBA2Timeline, RGB2Timeline, RotateTimeline, TranslateTimeline, TranslateXTimeline, TranslateYTimeline, ScaleTimeline, ScaleXTimeline, ScaleYTimeline, ShearTimeline, ShearXTimeline, ShearYTimeline, IkConstraintTimeline, TransformConstraintTimeline, PathConstraintPositionTimeline, PathConstraintSpacingTimeline, PathConstraintMixTimeline, DeformTimeline, DrawOrderTimeline, EventTimeline } from "./Animation";
30
+ import { BoneData, TransformMode } from "./BoneData";
31
+ import { EventData } from "./EventData";
32
+ import { Event } from "./Event";
33
+ import { IkConstraintData } from "./IkConstraintData";
34
+ import { PathConstraintData, PositionMode, SpacingMode, RotateMode } from "./PathConstraintData";
35
+ import { SkeletonData } from "./SkeletonData";
36
+ import { Skin } from "./Skin";
37
+ import { SlotData, BlendMode } from "./SlotData";
38
+ import { TransformConstraintData } from "./TransformConstraintData";
39
+ import { Utils, Color } from "./Utils";
40
+ /** Loads skeleton data in the Spine JSON format.
41
+ *
42
+ * See [Spine JSON format](http://esotericsoftware.com/spine-json-format) and
43
+ * [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine
44
+ * Runtimes Guide. */
45
+ export class SkeletonJson {
46
+ constructor(attachmentLoader) {
47
+ /** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at
48
+ * runtime than were used in Spine.
49
+ *
50
+ * See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */
51
+ this.scale = 1;
52
+ this.linkedMeshes = new Array();
53
+ this.attachmentLoader = attachmentLoader;
54
+ }
55
+ readSkeletonData(json) {
56
+ let scale = this.scale;
57
+ let skeletonData = new SkeletonData();
58
+ let root = typeof (json) === "string" ? JSON.parse(json) : json;
59
+ // Skeleton
60
+ let skeletonMap = root.skeleton;
61
+ if (skeletonMap) {
62
+ skeletonData.hash = skeletonMap.hash;
63
+ skeletonData.version = skeletonMap.spine;
64
+ skeletonData.x = skeletonMap.x;
65
+ skeletonData.y = skeletonMap.y;
66
+ skeletonData.width = skeletonMap.width;
67
+ skeletonData.height = skeletonMap.height;
68
+ skeletonData.fps = skeletonMap.fps;
69
+ skeletonData.imagesPath = skeletonMap.images;
70
+ }
71
+ // Bones
72
+ if (root.bones) {
73
+ for (let i = 0; i < root.bones.length; i++) {
74
+ let boneMap = root.bones[i];
75
+ let parent = null;
76
+ let parentName = getValue(boneMap, "parent", null);
77
+ if (parentName)
78
+ parent = skeletonData.findBone(parentName);
79
+ let data = new BoneData(skeletonData.bones.length, boneMap.name, parent);
80
+ data.length = getValue(boneMap, "length", 0) * scale;
81
+ data.x = getValue(boneMap, "x", 0) * scale;
82
+ data.y = getValue(boneMap, "y", 0) * scale;
83
+ data.rotation = getValue(boneMap, "rotation", 0);
84
+ data.scaleX = getValue(boneMap, "scaleX", 1);
85
+ data.scaleY = getValue(boneMap, "scaleY", 1);
86
+ data.shearX = getValue(boneMap, "shearX", 0);
87
+ data.shearY = getValue(boneMap, "shearY", 0);
88
+ data.transformMode = Utils.enumValue(TransformMode, getValue(boneMap, "transform", "Normal"));
89
+ data.skinRequired = getValue(boneMap, "skin", false);
90
+ let color = getValue(boneMap, "color", null);
91
+ if (color)
92
+ data.color.setFromString(color);
93
+ skeletonData.bones.push(data);
94
+ }
95
+ }
96
+ // Slots.
97
+ if (root.slots) {
98
+ for (let i = 0; i < root.slots.length; i++) {
99
+ let slotMap = root.slots[i];
100
+ let boneData = skeletonData.findBone(slotMap.bone);
101
+ let data = new SlotData(skeletonData.slots.length, slotMap.name, boneData);
102
+ let color = getValue(slotMap, "color", null);
103
+ if (color)
104
+ data.color.setFromString(color);
105
+ let dark = getValue(slotMap, "dark", null);
106
+ if (dark)
107
+ data.darkColor = Color.fromString(dark);
108
+ data.attachmentName = getValue(slotMap, "attachment", null);
109
+ data.blendMode = Utils.enumValue(BlendMode, getValue(slotMap, "blend", "normal"));
110
+ skeletonData.slots.push(data);
111
+ }
112
+ }
113
+ // IK constraints
114
+ if (root.ik) {
115
+ for (let i = 0; i < root.ik.length; i++) {
116
+ let constraintMap = root.ik[i];
117
+ let data = new IkConstraintData(constraintMap.name);
118
+ data.order = getValue(constraintMap, "order", 0);
119
+ data.skinRequired = getValue(constraintMap, "skin", false);
120
+ for (let ii = 0; ii < constraintMap.bones.length; ii++)
121
+ data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
122
+ data.target = skeletonData.findBone(constraintMap.target);
123
+ data.mix = getValue(constraintMap, "mix", 1);
124
+ data.softness = getValue(constraintMap, "softness", 0) * scale;
125
+ data.bendDirection = getValue(constraintMap, "bendPositive", true) ? 1 : -1;
126
+ data.compress = getValue(constraintMap, "compress", false);
127
+ data.stretch = getValue(constraintMap, "stretch", false);
128
+ data.uniform = getValue(constraintMap, "uniform", false);
129
+ skeletonData.ikConstraints.push(data);
130
+ }
131
+ }
132
+ // Transform constraints.
133
+ if (root.transform) {
134
+ for (let i = 0; i < root.transform.length; i++) {
135
+ let constraintMap = root.transform[i];
136
+ let data = new TransformConstraintData(constraintMap.name);
137
+ data.order = getValue(constraintMap, "order", 0);
138
+ data.skinRequired = getValue(constraintMap, "skin", false);
139
+ for (let ii = 0; ii < constraintMap.bones.length; ii++)
140
+ data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
141
+ let targetName = constraintMap.target;
142
+ data.target = skeletonData.findBone(targetName);
143
+ data.local = getValue(constraintMap, "local", false);
144
+ data.relative = getValue(constraintMap, "relative", false);
145
+ data.offsetRotation = getValue(constraintMap, "rotation", 0);
146
+ data.offsetX = getValue(constraintMap, "x", 0) * scale;
147
+ data.offsetY = getValue(constraintMap, "y", 0) * scale;
148
+ data.offsetScaleX = getValue(constraintMap, "scaleX", 0);
149
+ data.offsetScaleY = getValue(constraintMap, "scaleY", 0);
150
+ data.offsetShearY = getValue(constraintMap, "shearY", 0);
151
+ data.mixRotate = getValue(constraintMap, "mixRotate", 1);
152
+ data.mixX = getValue(constraintMap, "mixX", 1);
153
+ data.mixY = getValue(constraintMap, "mixY", data.mixX);
154
+ data.mixScaleX = getValue(constraintMap, "mixScaleX", 1);
155
+ data.mixScaleY = getValue(constraintMap, "mixScaleY", data.mixScaleX);
156
+ data.mixShearY = getValue(constraintMap, "mixShearY", 1);
157
+ skeletonData.transformConstraints.push(data);
158
+ }
159
+ }
160
+ // Path constraints.
161
+ if (root.path) {
162
+ for (let i = 0; i < root.path.length; i++) {
163
+ let constraintMap = root.path[i];
164
+ let data = new PathConstraintData(constraintMap.name);
165
+ data.order = getValue(constraintMap, "order", 0);
166
+ data.skinRequired = getValue(constraintMap, "skin", false);
167
+ for (let ii = 0; ii < constraintMap.bones.length; ii++)
168
+ data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
169
+ let targetName = constraintMap.target;
170
+ data.target = skeletonData.findSlot(targetName);
171
+ data.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, "positionMode", "Percent"));
172
+ data.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, "spacingMode", "Length"));
173
+ data.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, "rotateMode", "Tangent"));
174
+ data.offsetRotation = getValue(constraintMap, "rotation", 0);
175
+ data.position = getValue(constraintMap, "position", 0);
176
+ if (data.positionMode == PositionMode.Fixed)
177
+ data.position *= scale;
178
+ data.spacing = getValue(constraintMap, "spacing", 0);
179
+ if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed)
180
+ data.spacing *= scale;
181
+ data.mixRotate = getValue(constraintMap, "mixRotate", 1);
182
+ data.mixX = getValue(constraintMap, "mixX", 1);
183
+ data.mixY = getValue(constraintMap, "mixY", data.mixX);
184
+ skeletonData.pathConstraints.push(data);
185
+ }
186
+ }
187
+ // Skins.
188
+ if (root.skins) {
189
+ for (let i = 0; i < root.skins.length; i++) {
190
+ let skinMap = root.skins[i];
191
+ let skin = new Skin(skinMap.name);
192
+ if (skinMap.bones) {
193
+ for (let ii = 0; ii < skinMap.bones.length; ii++)
194
+ skin.bones.push(skeletonData.findBone(skinMap.bones[ii]));
195
+ }
196
+ if (skinMap.ik) {
197
+ for (let ii = 0; ii < skinMap.ik.length; ii++)
198
+ skin.constraints.push(skeletonData.findIkConstraint(skinMap.ik[ii]));
199
+ }
200
+ if (skinMap.transform) {
201
+ for (let ii = 0; ii < skinMap.transform.length; ii++)
202
+ skin.constraints.push(skeletonData.findTransformConstraint(skinMap.transform[ii]));
203
+ }
204
+ if (skinMap.path) {
205
+ for (let ii = 0; ii < skinMap.path.length; ii++)
206
+ skin.constraints.push(skeletonData.findPathConstraint(skinMap.path[ii]));
207
+ }
208
+ for (let slotName in skinMap.attachments) {
209
+ let slot = skeletonData.findSlot(slotName);
210
+ let slotMap = skinMap.attachments[slotName];
211
+ for (let entryName in slotMap) {
212
+ let attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData);
213
+ if (attachment)
214
+ skin.setAttachment(slot.index, entryName, attachment);
215
+ }
216
+ }
217
+ skeletonData.skins.push(skin);
218
+ if (skin.name == "default")
219
+ skeletonData.defaultSkin = skin;
220
+ }
221
+ }
222
+ // Linked meshes.
223
+ for (let i = 0, n = this.linkedMeshes.length; i < n; i++) {
224
+ let linkedMesh = this.linkedMeshes[i];
225
+ let skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
226
+ let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);
227
+ linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh;
228
+ linkedMesh.mesh.setParentMesh(parent);
229
+ linkedMesh.mesh.updateUVs();
230
+ }
231
+ this.linkedMeshes.length = 0;
232
+ // Events.
233
+ if (root.events) {
234
+ for (let eventName in root.events) {
235
+ let eventMap = root.events[eventName];
236
+ let data = new EventData(eventName);
237
+ data.intValue = getValue(eventMap, "int", 0);
238
+ data.floatValue = getValue(eventMap, "float", 0);
239
+ data.stringValue = getValue(eventMap, "string", "");
240
+ data.audioPath = getValue(eventMap, "audio", null);
241
+ if (data.audioPath) {
242
+ data.volume = getValue(eventMap, "volume", 1);
243
+ data.balance = getValue(eventMap, "balance", 0);
244
+ }
245
+ skeletonData.events.push(data);
246
+ }
247
+ }
248
+ // Animations.
249
+ if (root.animations) {
250
+ for (let animationName in root.animations) {
251
+ let animationMap = root.animations[animationName];
252
+ this.readAnimation(animationMap, animationName, skeletonData);
253
+ }
254
+ }
255
+ return skeletonData;
256
+ }
257
+ readAttachment(map, skin, slotIndex, name, skeletonData) {
258
+ let scale = this.scale;
259
+ name = getValue(map, "name", name);
260
+ switch (getValue(map, "type", "region")) {
261
+ case "region": {
262
+ let path = getValue(map, "path", name);
263
+ let region = this.attachmentLoader.newRegionAttachment(skin, name, path);
264
+ if (!region)
265
+ return null;
266
+ region.path = path;
267
+ region.x = getValue(map, "x", 0) * scale;
268
+ region.y = getValue(map, "y", 0) * scale;
269
+ region.scaleX = getValue(map, "scaleX", 1);
270
+ region.scaleY = getValue(map, "scaleY", 1);
271
+ region.rotation = getValue(map, "rotation", 0);
272
+ region.width = map.width * scale;
273
+ region.height = map.height * scale;
274
+ let color = getValue(map, "color", null);
275
+ if (color)
276
+ region.color.setFromString(color);
277
+ region.updateOffset();
278
+ return region;
279
+ }
280
+ case "boundingbox": {
281
+ let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);
282
+ if (!box)
283
+ return null;
284
+ this.readVertices(map, box, map.vertexCount << 1);
285
+ let color = getValue(map, "color", null);
286
+ if (color)
287
+ box.color.setFromString(color);
288
+ return box;
289
+ }
290
+ case "mesh":
291
+ case "linkedmesh": {
292
+ let path = getValue(map, "path", name);
293
+ let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
294
+ if (!mesh)
295
+ return null;
296
+ mesh.path = path;
297
+ let color = getValue(map, "color", null);
298
+ if (color)
299
+ mesh.color.setFromString(color);
300
+ mesh.width = getValue(map, "width", 0) * scale;
301
+ mesh.height = getValue(map, "height", 0) * scale;
302
+ let parent = getValue(map, "parent", null);
303
+ if (parent) {
304
+ this.linkedMeshes.push(new LinkedMesh(mesh, getValue(map, "skin", null), slotIndex, parent, getValue(map, "deform", true)));
305
+ return mesh;
306
+ }
307
+ let uvs = map.uvs;
308
+ this.readVertices(map, mesh, uvs.length);
309
+ mesh.triangles = map.triangles;
310
+ mesh.regionUVs = uvs;
311
+ mesh.updateUVs();
312
+ mesh.edges = getValue(map, "edges", null);
313
+ mesh.hullLength = getValue(map, "hull", 0) * 2;
314
+ return mesh;
315
+ }
316
+ case "path": {
317
+ let path = this.attachmentLoader.newPathAttachment(skin, name);
318
+ if (!path)
319
+ return null;
320
+ path.closed = getValue(map, "closed", false);
321
+ path.constantSpeed = getValue(map, "constantSpeed", true);
322
+ let vertexCount = map.vertexCount;
323
+ this.readVertices(map, path, vertexCount << 1);
324
+ let lengths = Utils.newArray(vertexCount / 3, 0);
325
+ for (let i = 0; i < map.lengths.length; i++)
326
+ lengths[i] = map.lengths[i] * scale;
327
+ path.lengths = lengths;
328
+ let color = getValue(map, "color", null);
329
+ if (color)
330
+ path.color.setFromString(color);
331
+ return path;
332
+ }
333
+ case "point": {
334
+ let point = this.attachmentLoader.newPointAttachment(skin, name);
335
+ if (!point)
336
+ return null;
337
+ point.x = getValue(map, "x", 0) * scale;
338
+ point.y = getValue(map, "y", 0) * scale;
339
+ point.rotation = getValue(map, "rotation", 0);
340
+ let color = getValue(map, "color", null);
341
+ if (color)
342
+ point.color.setFromString(color);
343
+ return point;
344
+ }
345
+ case "clipping": {
346
+ let clip = this.attachmentLoader.newClippingAttachment(skin, name);
347
+ if (!clip)
348
+ return null;
349
+ let end = getValue(map, "end", null);
350
+ if (end)
351
+ clip.endSlot = skeletonData.findSlot(end);
352
+ let vertexCount = map.vertexCount;
353
+ this.readVertices(map, clip, vertexCount << 1);
354
+ let color = getValue(map, "color", null);
355
+ if (color)
356
+ clip.color.setFromString(color);
357
+ return clip;
358
+ }
359
+ }
360
+ return null;
361
+ }
362
+ readVertices(map, attachment, verticesLength) {
363
+ let scale = this.scale;
364
+ attachment.worldVerticesLength = verticesLength;
365
+ let vertices = map.vertices;
366
+ if (verticesLength == vertices.length) {
367
+ let scaledVertices = Utils.toFloatArray(vertices);
368
+ if (scale != 1) {
369
+ for (let i = 0, n = vertices.length; i < n; i++)
370
+ scaledVertices[i] *= scale;
371
+ }
372
+ attachment.vertices = scaledVertices;
373
+ return;
374
+ }
375
+ let weights = new Array();
376
+ let bones = new Array();
377
+ for (let i = 0, n = vertices.length; i < n;) {
378
+ let boneCount = vertices[i++];
379
+ bones.push(boneCount);
380
+ for (let nn = i + boneCount * 4; i < nn; i += 4) {
381
+ bones.push(vertices[i]);
382
+ weights.push(vertices[i + 1] * scale);
383
+ weights.push(vertices[i + 2] * scale);
384
+ weights.push(vertices[i + 3]);
385
+ }
386
+ }
387
+ attachment.bones = bones;
388
+ attachment.vertices = Utils.toFloatArray(weights);
389
+ }
390
+ readAnimation(map, name, skeletonData) {
391
+ let scale = this.scale;
392
+ let timelines = new Array();
393
+ // Slot timelines.
394
+ if (map.slots) {
395
+ for (let slotName in map.slots) {
396
+ let slotMap = map.slots[slotName];
397
+ let slotIndex = skeletonData.findSlot(slotName).index;
398
+ for (let timelineName in slotMap) {
399
+ let timelineMap = slotMap[timelineName];
400
+ if (!timelineMap)
401
+ continue;
402
+ let frames = timelineMap.length;
403
+ if (timelineName == "attachment") {
404
+ let timeline = new AttachmentTimeline(frames, slotIndex);
405
+ for (let frame = 0; frame < frames; frame++) {
406
+ let keyMap = timelineMap[frame];
407
+ timeline.setFrame(frame, getValue(keyMap, "time", 0), keyMap.name);
408
+ }
409
+ timelines.push(timeline);
410
+ }
411
+ else if (timelineName == "rgba") {
412
+ let timeline = new RGBATimeline(frames, frames << 2, slotIndex);
413
+ let keyMap = timelineMap[0];
414
+ let time = getValue(keyMap, "time", 0);
415
+ let color = Color.fromString(keyMap.color);
416
+ for (let frame = 0, bezier = 0;; frame++) {
417
+ timeline.setFrame(frame, time, color.r, color.g, color.b, color.a);
418
+ let nextMap = timelineMap[frame + 1];
419
+ if (!nextMap) {
420
+ timeline.shrink(bezier);
421
+ break;
422
+ }
423
+ let time2 = getValue(nextMap, "time", 0);
424
+ let newColor = Color.fromString(nextMap.color);
425
+ let curve = keyMap.curve;
426
+ if (curve) {
427
+ bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
428
+ bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
429
+ bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
430
+ bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
431
+ }
432
+ time = time2;
433
+ color = newColor;
434
+ keyMap = nextMap;
435
+ }
436
+ timelines.push(timeline);
437
+ }
438
+ else if (timelineName == "rgb") {
439
+ let timeline = new RGBTimeline(frames, frames * 3, slotIndex);
440
+ let keyMap = timelineMap[0];
441
+ let time = getValue(keyMap, "time", 0);
442
+ let color = Color.fromString(keyMap.color);
443
+ for (let frame = 0, bezier = 0;; frame++) {
444
+ timeline.setFrame(frame, time, color.r, color.g, color.b);
445
+ let nextMap = timelineMap[frame + 1];
446
+ if (!nextMap) {
447
+ timeline.shrink(bezier);
448
+ break;
449
+ }
450
+ let time2 = getValue(nextMap, "time", 0);
451
+ let newColor = Color.fromString(nextMap.color);
452
+ let curve = keyMap.curve;
453
+ if (curve) {
454
+ bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
455
+ bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
456
+ bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
457
+ }
458
+ time = time2;
459
+ color = newColor;
460
+ keyMap = nextMap;
461
+ }
462
+ timelines.push(timeline);
463
+ }
464
+ else if (timelineName == "alpha") {
465
+ timelines.push(readTimeline1(timelineMap, new AlphaTimeline(frames, frames, slotIndex), 0, 1));
466
+ }
467
+ else if (timelineName == "rgba2") {
468
+ let timeline = new RGBA2Timeline(frames, frames * 7, slotIndex);
469
+ let keyMap = timelineMap[0];
470
+ let time = getValue(keyMap, "time", 0);
471
+ let color = Color.fromString(keyMap.light);
472
+ let color2 = Color.fromString(keyMap.dark);
473
+ for (let frame = 0, bezier = 0;; frame++) {
474
+ timeline.setFrame(frame, time, color.r, color.g, color.b, color.a, color2.r, color2.g, color2.b);
475
+ let nextMap = timelineMap[frame + 1];
476
+ if (!nextMap) {
477
+ timeline.shrink(bezier);
478
+ break;
479
+ }
480
+ let time2 = getValue(nextMap, "time", 0);
481
+ let newColor = Color.fromString(nextMap.light);
482
+ let newColor2 = Color.fromString(nextMap.dark);
483
+ let curve = keyMap.curve;
484
+ if (curve) {
485
+ bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
486
+ bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
487
+ bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
488
+ bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
489
+ bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1);
490
+ bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1);
491
+ bezier = readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1);
492
+ }
493
+ time = time2;
494
+ color = newColor;
495
+ color2 = newColor2;
496
+ keyMap = nextMap;
497
+ }
498
+ timelines.push(timeline);
499
+ }
500
+ else if (timelineName == "rgb2") {
501
+ let timeline = new RGB2Timeline(frames, frames * 6, slotIndex);
502
+ let keyMap = timelineMap[0];
503
+ let time = getValue(keyMap, "time", 0);
504
+ let color = Color.fromString(keyMap.light);
505
+ let color2 = Color.fromString(keyMap.dark);
506
+ for (let frame = 0, bezier = 0;; frame++) {
507
+ timeline.setFrame(frame, time, color.r, color.g, color.b, color2.r, color2.g, color2.b);
508
+ let nextMap = timelineMap[frame + 1];
509
+ if (!nextMap) {
510
+ timeline.shrink(bezier);
511
+ break;
512
+ }
513
+ let time2 = getValue(nextMap, "time", 0);
514
+ let newColor = Color.fromString(nextMap.light);
515
+ let newColor2 = Color.fromString(nextMap.dark);
516
+ let curve = keyMap.curve;
517
+ if (curve) {
518
+ bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
519
+ bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
520
+ bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
521
+ bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1);
522
+ bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1);
523
+ bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1);
524
+ }
525
+ time = time2;
526
+ color = newColor;
527
+ color2 = newColor2;
528
+ keyMap = nextMap;
529
+ }
530
+ timelines.push(timeline);
531
+ }
532
+ }
533
+ }
534
+ }
535
+ // Bone timelines.
536
+ if (map.bones) {
537
+ for (let boneName in map.bones) {
538
+ let boneMap = map.bones[boneName];
539
+ let boneIndex = skeletonData.findBone(boneName).index;
540
+ for (let timelineName in boneMap) {
541
+ let timelineMap = boneMap[timelineName];
542
+ let frames = timelineMap.length;
543
+ if (frames == 0)
544
+ continue;
545
+ if (timelineName === "rotate") {
546
+ timelines.push(readTimeline1(timelineMap, new RotateTimeline(frames, frames, boneIndex), 0, 1));
547
+ }
548
+ else if (timelineName === "translate") {
549
+ let timeline = new TranslateTimeline(frames, frames << 1, boneIndex);
550
+ timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 0, scale));
551
+ }
552
+ else if (timelineName === "translatex") {
553
+ let timeline = new TranslateXTimeline(frames, frames, boneIndex);
554
+ timelines.push(readTimeline1(timelineMap, timeline, 0, scale));
555
+ }
556
+ else if (timelineName === "translatey") {
557
+ let timeline = new TranslateYTimeline(frames, frames, boneIndex);
558
+ timelines.push(readTimeline1(timelineMap, timeline, 0, scale));
559
+ }
560
+ else if (timelineName === "scale") {
561
+ let timeline = new ScaleTimeline(frames, frames << 1, boneIndex);
562
+ timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 1, 1));
563
+ }
564
+ else if (timelineName === "scalex") {
565
+ let timeline = new ScaleXTimeline(frames, frames, boneIndex);
566
+ timelines.push(readTimeline1(timelineMap, timeline, 1, 1));
567
+ }
568
+ else if (timelineName === "scaley") {
569
+ let timeline = new ScaleYTimeline(frames, frames, boneIndex);
570
+ timelines.push(readTimeline1(timelineMap, timeline, 1, 1));
571
+ }
572
+ else if (timelineName === "shear") {
573
+ let timeline = new ShearTimeline(frames, frames << 1, boneIndex);
574
+ timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 0, 1));
575
+ }
576
+ else if (timelineName === "shearx") {
577
+ let timeline = new ShearXTimeline(frames, frames, boneIndex);
578
+ timelines.push(readTimeline1(timelineMap, timeline, 0, 1));
579
+ }
580
+ else if (timelineName === "sheary") {
581
+ let timeline = new ShearYTimeline(frames, frames, boneIndex);
582
+ timelines.push(readTimeline1(timelineMap, timeline, 0, 1));
583
+ }
584
+ }
585
+ }
586
+ }
587
+ // IK constraint timelines.
588
+ if (map.ik) {
589
+ for (let constraintName in map.ik) {
590
+ let constraintMap = map.ik[constraintName];
591
+ let keyMap = constraintMap[0];
592
+ if (!keyMap)
593
+ continue;
594
+ let constraint = skeletonData.findIkConstraint(constraintName);
595
+ let constraintIndex = skeletonData.ikConstraints.indexOf(constraint);
596
+ let timeline = new IkConstraintTimeline(constraintMap.length, constraintMap.length << 1, constraintIndex);
597
+ let time = getValue(keyMap, "time", 0);
598
+ let mix = getValue(keyMap, "mix", 1);
599
+ let softness = getValue(keyMap, "softness", 0) * scale;
600
+ for (let frame = 0, bezier = 0;; frame++) {
601
+ timeline.setFrame(frame, time, mix, softness, getValue(keyMap, "bendPositive", true) ? 1 : -1, getValue(keyMap, "compress", false), getValue(keyMap, "stretch", false));
602
+ let nextMap = constraintMap[frame + 1];
603
+ if (!nextMap) {
604
+ timeline.shrink(bezier);
605
+ break;
606
+ }
607
+ let time2 = getValue(nextMap, "time", 0);
608
+ let mix2 = getValue(nextMap, "mix", 1);
609
+ let softness2 = getValue(nextMap, "softness", 0) * scale;
610
+ let curve = keyMap.curve;
611
+ if (curve) {
612
+ bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1);
613
+ bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale);
614
+ }
615
+ time = time2;
616
+ mix = mix2;
617
+ softness = softness2;
618
+ keyMap = nextMap;
619
+ }
620
+ timelines.push(timeline);
621
+ }
622
+ }
623
+ // Transform constraint timelines.
624
+ if (map.transform) {
625
+ for (let constraintName in map.transform) {
626
+ let timelineMap = map.transform[constraintName];
627
+ let keyMap = timelineMap[0];
628
+ if (!keyMap)
629
+ continue;
630
+ let constraint = skeletonData.findTransformConstraint(constraintName);
631
+ let constraintIndex = skeletonData.transformConstraints.indexOf(constraint);
632
+ let timeline = new TransformConstraintTimeline(timelineMap.length, timelineMap.length * 6, constraintIndex);
633
+ let time = getValue(keyMap, "time", 0);
634
+ let mixRotate = getValue(keyMap, "mixRotate", 1);
635
+ let mixX = getValue(keyMap, "mixX", 1);
636
+ let mixY = getValue(keyMap, "mixY", mixX);
637
+ let mixScaleX = getValue(keyMap, "mixScaleX", 1);
638
+ let mixScaleY = getValue(keyMap, "mixScaleY", mixScaleX);
639
+ let mixShearY = getValue(keyMap, "mixShearY", 1);
640
+ for (let frame = 0, bezier = 0;; frame++) {
641
+ timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);
642
+ let nextMap = timelineMap[frame + 1];
643
+ if (!nextMap) {
644
+ timeline.shrink(bezier);
645
+ break;
646
+ }
647
+ let time2 = getValue(nextMap, "time", 0);
648
+ let mixRotate2 = getValue(nextMap, "mixRotate", 1);
649
+ let mixX2 = getValue(nextMap, "mixX", 1);
650
+ let mixY2 = getValue(nextMap, "mixY", mixX2);
651
+ let mixScaleX2 = getValue(nextMap, "mixScaleX", 1);
652
+ let mixScaleY2 = getValue(nextMap, "mixScaleY", mixScaleX2);
653
+ let mixShearY2 = getValue(nextMap, "mixShearY", 1);
654
+ let curve = keyMap.curve;
655
+ if (curve) {
656
+ bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
657
+ bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
658
+ bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
659
+ bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);
660
+ bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);
661
+ bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, mixShearY, mixShearY2, 1);
662
+ }
663
+ time = time2;
664
+ mixRotate = mixRotate2;
665
+ mixX = mixX2;
666
+ mixY = mixY2;
667
+ mixScaleX = mixScaleX2;
668
+ mixScaleY = mixScaleY2;
669
+ mixScaleX = mixScaleX2;
670
+ keyMap = nextMap;
671
+ }
672
+ timelines.push(timeline);
673
+ }
674
+ }
675
+ // Path constraint timelines.
676
+ if (map.path) {
677
+ for (let constraintName in map.path) {
678
+ let constraintMap = map.path[constraintName];
679
+ let constraint = skeletonData.findPathConstraint(constraintName);
680
+ let constraintIndex = skeletonData.pathConstraints.indexOf(constraint);
681
+ for (let timelineName in constraintMap) {
682
+ let timelineMap = constraintMap[timelineName];
683
+ let keyMap = timelineMap[0];
684
+ if (!keyMap)
685
+ continue;
686
+ let frames = timelineMap.length;
687
+ if (timelineName === "position") {
688
+ let timeline = new PathConstraintPositionTimeline(frames, frames, constraintIndex);
689
+ timelines.push(readTimeline1(timelineMap, timeline, 0, constraint.positionMode == PositionMode.Fixed ? scale : 1));
690
+ }
691
+ else if (timelineName === "spacing") {
692
+ let timeline = new PathConstraintSpacingTimeline(frames, frames, constraintIndex);
693
+ timelines.push(readTimeline1(timelineMap, timeline, 0, constraint.spacingMode == SpacingMode.Length || constraint.spacingMode == SpacingMode.Fixed ? scale : 1));
694
+ }
695
+ else if (timelineName === "mix") {
696
+ let timeline = new PathConstraintMixTimeline(frames, frames * 3, constraintIndex);
697
+ let time = getValue(keyMap, "time", 0);
698
+ let mixRotate = getValue(keyMap, "mixRotate", 1);
699
+ let mixX = getValue(keyMap, "mixX", 1);
700
+ let mixY = getValue(keyMap, "mixY", mixX);
701
+ for (let frame = 0, bezier = 0;; frame++) {
702
+ timeline.setFrame(frame, time, mixRotate, mixX, mixY);
703
+ let nextMap = timelineMap[frame + 1];
704
+ if (!nextMap) {
705
+ timeline.shrink(bezier);
706
+ break;
707
+ }
708
+ let time2 = getValue(nextMap, "time", 0);
709
+ let mixRotate2 = getValue(nextMap, "mixRotate", 1);
710
+ let mixX2 = getValue(nextMap, "mixX", 1);
711
+ let mixY2 = getValue(nextMap, "mixY", mixX2);
712
+ let curve = keyMap.curve;
713
+ if (curve) {
714
+ bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
715
+ bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
716
+ bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
717
+ }
718
+ time = time2;
719
+ mixRotate = mixRotate2;
720
+ mixX = mixX2;
721
+ mixY = mixY2;
722
+ keyMap = nextMap;
723
+ }
724
+ timelines.push(timeline);
725
+ }
726
+ }
727
+ }
728
+ }
729
+ // Deform timelines.
730
+ if (map.deform) {
731
+ for (let deformName in map.deform) {
732
+ let deformMap = map.deform[deformName];
733
+ let skin = skeletonData.findSkin(deformName);
734
+ for (let slotName in deformMap) {
735
+ let slotMap = deformMap[slotName];
736
+ let slotIndex = skeletonData.findSlot(slotName).index;
737
+ for (let timelineName in slotMap) {
738
+ let timelineMap = slotMap[timelineName];
739
+ let keyMap = timelineMap[0];
740
+ if (!keyMap)
741
+ continue;
742
+ let attachment = skin.getAttachment(slotIndex, timelineName);
743
+ let weighted = attachment.bones;
744
+ let vertices = attachment.vertices;
745
+ let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
746
+ let timeline = new DeformTimeline(timelineMap.length, timelineMap.length, slotIndex, attachment);
747
+ let time = getValue(keyMap, "time", 0);
748
+ for (let frame = 0, bezier = 0;; frame++) {
749
+ let deform;
750
+ let verticesValue = getValue(keyMap, "vertices", null);
751
+ if (!verticesValue)
752
+ deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
753
+ else {
754
+ deform = Utils.newFloatArray(deformLength);
755
+ let start = getValue(keyMap, "offset", 0);
756
+ Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);
757
+ if (scale != 1) {
758
+ for (let i = start, n = i + verticesValue.length; i < n; i++)
759
+ deform[i] *= scale;
760
+ }
761
+ if (!weighted) {
762
+ for (let i = 0; i < deformLength; i++)
763
+ deform[i] += vertices[i];
764
+ }
765
+ }
766
+ timeline.setFrame(frame, time, deform);
767
+ let nextMap = timelineMap[frame + 1];
768
+ if (!nextMap) {
769
+ timeline.shrink(bezier);
770
+ break;
771
+ }
772
+ let time2 = getValue(nextMap, "time", 0);
773
+ let curve = keyMap.curve;
774
+ if (curve)
775
+ bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1);
776
+ time = time2;
777
+ keyMap = nextMap;
778
+ }
779
+ timelines.push(timeline);
780
+ }
781
+ }
782
+ }
783
+ }
784
+ // Draw order timelines.
785
+ if (map.drawOrder) {
786
+ let timeline = new DrawOrderTimeline(map.drawOrder.length);
787
+ let slotCount = skeletonData.slots.length;
788
+ let frame = 0;
789
+ for (let i = 0; i < map.drawOrder.length; i++, frame++) {
790
+ let drawOrderMap = map.drawOrder[i];
791
+ let drawOrder = null;
792
+ let offsets = getValue(drawOrderMap, "offsets", null);
793
+ if (offsets) {
794
+ drawOrder = Utils.newArray(slotCount, -1);
795
+ let unchanged = Utils.newArray(slotCount - offsets.length, 0);
796
+ let originalIndex = 0, unchangedIndex = 0;
797
+ for (let ii = 0; ii < offsets.length; ii++) {
798
+ let offsetMap = offsets[ii];
799
+ let slotIndex = skeletonData.findSlot(offsetMap.slot).index;
800
+ // Collect unchanged items.
801
+ while (originalIndex != slotIndex)
802
+ unchanged[unchangedIndex++] = originalIndex++;
803
+ // Set changed items.
804
+ drawOrder[originalIndex + offsetMap.offset] = originalIndex++;
805
+ }
806
+ // Collect remaining unchanged items.
807
+ while (originalIndex < slotCount)
808
+ unchanged[unchangedIndex++] = originalIndex++;
809
+ // Fill in unchanged items.
810
+ for (let ii = slotCount - 1; ii >= 0; ii--)
811
+ if (drawOrder[ii] == -1)
812
+ drawOrder[ii] = unchanged[--unchangedIndex];
813
+ }
814
+ timeline.setFrame(frame, getValue(drawOrderMap, "time", 0), drawOrder);
815
+ }
816
+ timelines.push(timeline);
817
+ }
818
+ // Event timelines.
819
+ if (map.events) {
820
+ let timeline = new EventTimeline(map.events.length);
821
+ let frame = 0;
822
+ for (let i = 0; i < map.events.length; i++, frame++) {
823
+ let eventMap = map.events[i];
824
+ let eventData = skeletonData.findEvent(eventMap.name);
825
+ let event = new Event(Utils.toSinglePrecision(getValue(eventMap, "time", 0)), eventData);
826
+ event.intValue = getValue(eventMap, "int", eventData.intValue);
827
+ event.floatValue = getValue(eventMap, "float", eventData.floatValue);
828
+ event.stringValue = getValue(eventMap, "string", eventData.stringValue);
829
+ if (event.data.audioPath) {
830
+ event.volume = getValue(eventMap, "volume", 1);
831
+ event.balance = getValue(eventMap, "balance", 0);
832
+ }
833
+ timeline.setFrame(frame, event);
834
+ }
835
+ timelines.push(timeline);
836
+ }
837
+ let duration = 0;
838
+ for (let i = 0, n = timelines.length; i < n; i++)
839
+ duration = Math.max(duration, timelines[i].getDuration());
840
+ skeletonData.animations.push(new Animation(name, timelines, duration));
841
+ }
842
+ }
843
+ class LinkedMesh {
844
+ constructor(mesh, skin, slotIndex, parent, inheritDeform) {
845
+ this.mesh = mesh;
846
+ this.skin = skin;
847
+ this.slotIndex = slotIndex;
848
+ this.parent = parent;
849
+ this.inheritDeform = inheritDeform;
850
+ }
851
+ }
852
+ function readTimeline1(keys, timeline, defaultValue, scale) {
853
+ let keyMap = keys[0];
854
+ let time = getValue(keyMap, "time", 0);
855
+ let value = getValue(keyMap, "value", defaultValue) * scale;
856
+ let bezier = 0;
857
+ for (let frame = 0;; frame++) {
858
+ timeline.setFrame(frame, time, value);
859
+ let nextMap = keys[frame + 1];
860
+ if (!nextMap) {
861
+ timeline.shrink(bezier);
862
+ return timeline;
863
+ }
864
+ let time2 = getValue(nextMap, "time", 0);
865
+ let value2 = getValue(nextMap, "value", defaultValue) * scale;
866
+ if (keyMap.curve)
867
+ bezier = readCurve(keyMap.curve, timeline, bezier, frame, 0, time, time2, value, value2, scale);
868
+ time = time2;
869
+ value = value2;
870
+ keyMap = nextMap;
871
+ }
872
+ }
873
+ function readTimeline2(keys, timeline, name1, name2, defaultValue, scale) {
874
+ let keyMap = keys[0];
875
+ let time = getValue(keyMap, "time", 0);
876
+ let value1 = getValue(keyMap, name1, defaultValue) * scale;
877
+ let value2 = getValue(keyMap, name2, defaultValue) * scale;
878
+ let bezier = 0;
879
+ for (let frame = 0;; frame++) {
880
+ timeline.setFrame(frame, time, value1, value2);
881
+ let nextMap = keys[frame + 1];
882
+ if (!nextMap) {
883
+ timeline.shrink(bezier);
884
+ return timeline;
885
+ }
886
+ let time2 = getValue(nextMap, "time", 0);
887
+ let nvalue1 = getValue(nextMap, name1, defaultValue) * scale;
888
+ let nvalue2 = getValue(nextMap, name2, defaultValue) * scale;
889
+ let curve = keyMap.curve;
890
+ if (curve) {
891
+ bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale);
892
+ bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale);
893
+ }
894
+ time = time2;
895
+ value1 = nvalue1;
896
+ value2 = nvalue2;
897
+ keyMap = nextMap;
898
+ }
899
+ }
900
+ function readCurve(curve, timeline, bezier, frame, value, time1, time2, value1, value2, scale) {
901
+ if (curve == "stepped") {
902
+ timeline.setStepped(frame);
903
+ return bezier;
904
+ }
905
+ let i = value << 2;
906
+ let cx1 = curve[i];
907
+ let cy1 = curve[i + 1] * scale;
908
+ let cx2 = curve[i + 2];
909
+ let cy2 = curve[i + 3] * scale;
910
+ timeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);
911
+ return bezier + 1;
912
+ }
913
+ function getValue(map, property, defaultValue) {
914
+ return map[property] !== undefined ? map[property] : defaultValue;
915
+ }
916
916
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25Kc29uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NrZWxldG9uSnNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBWSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSwyQkFBMkIsRUFBRSw4QkFBOEIsRUFBRSw2QkFBNkIsRUFBRSx5QkFBeUIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFpRCxNQUFNLGFBQWEsQ0FBQztBQUlwaUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFtQixNQUFNLFNBQVMsQ0FBQztBQUV4RDs7OztxQkFJcUI7QUFDckIsTUFBTSxPQUFPLFlBQVk7SUFVeEIsWUFBYSxnQkFBa0M7UUFQL0M7Ozt5SEFHaUg7UUFDakgsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNGLGlCQUFZLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQztRQUc5QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7SUFDMUMsQ0FBQztJQUVELGdCQUFnQixDQUFFLElBQWtCO1FBQ25DLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN0QyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFaEUsV0FBVztRQUNYLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDaEMsSUFBSSxXQUFXLEVBQUU7WUFDaEIsWUFBWSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ3JDLFlBQVksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN6QyxZQUFZLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsWUFBWSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQy9CLFlBQVksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN2QyxZQUFZLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDekMsWUFBWSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDO1lBQ25DLFlBQVksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztTQUM3QztRQUVELFFBQVE7UUFDUixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzNDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTVCLElBQUksTUFBTSxHQUFhLElBQUksQ0FBQztnQkFDNUIsSUFBSSxVQUFVLEdBQVcsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNELElBQUksVUFBVTtvQkFBRSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM5RixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUVyRCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxLQUFLO29CQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUUzQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QjtTQUNEO1FBRUQsU0FBUztRQUNULElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25ELElBQUksSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBRTNFLElBQUksS0FBSyxHQUFXLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLEtBQUs7b0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTNDLElBQUksSUFBSSxHQUFXLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLElBQUk7b0JBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVsRCxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xGLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzlCO1NBQ0Q7UUFFRCxpQkFBaUI7UUFDakIsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN4QyxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLElBQUksR0FBRyxJQUFJLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFM0QsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRTtvQkFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFakUsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFMUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRXpELFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3RDO1NBQ0Q7UUFFRCx5QkFBeUI7UUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDL0MsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxJQUFJLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRTNELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUU7b0JBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWpFLElBQUksVUFBVSxHQUFXLGFBQWEsQ0FBQyxNQUFNLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUV6RCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRXpELFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0M7U0FDRDtRQUVELG9CQUFvQjtRQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksSUFBSSxHQUFHLElBQUksa0JBQWtCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUUzRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFO29CQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVqRSxJQUFJLFVBQVUsR0FBVyxhQUFhLENBQUMsTUFBTSxDQUFDO2dCQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRWhELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDdEcsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNsRyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hHLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsS0FBSztvQkFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztnQkFDcEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDckQsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsS0FBSztvQkFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztnQkFDM0csSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXZELFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hDO1NBQ0Q7UUFFRCxTQUFTO1FBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMzQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUMzQixJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRWxDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRTtvQkFDbEIsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRTt3QkFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0Q7Z0JBRUQsSUFBSSxPQUFPLENBQUMsRUFBRSxFQUFFO29CQUNmLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUU7d0JBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdEU7Z0JBRUQsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO29CQUN0QixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFO3dCQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BGO2dCQUVELElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtvQkFDakIsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRTt3QkFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxRTtnQkFFRCxLQUFLLElBQUksUUFBUSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7b0JBQ3pDLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzNDLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzVDLEtBQUssSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFO3dCQUM5QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQ3BHLElBQUksVUFBVTs0QkFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO3FCQUN0RTtpQkFDRDtnQkFDRCxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVM7b0JBQUUsWUFBWSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7YUFDNUQ7U0FDRDtRQUVELGlCQUFpQjtRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEcsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6RSxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFtQixNQUFNLENBQUMsQ0FBQyxDQUFtQixVQUFVLENBQUMsSUFBSSxDQUFDO1lBQzNILFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFpQixNQUFNLENBQUMsQ0FBQztZQUN0RCxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRTdCLFVBQVU7UUFDVixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNsQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNoRDtnQkFDRCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvQjtTQUNEO1FBRUQsY0FBYztRQUNkLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixLQUFLLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQzFDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQzthQUM5RDtTQUNEO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDckIsQ0FBQztJQUVELGNBQWMsQ0FBRSxHQUFRLEVBQUUsSUFBVSxFQUFFLFNBQWlCLEVBQUUsSUFBWSxFQUFFLFlBQTBCO1FBQ2hHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRW5DLFFBQVEsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDeEMsS0FBSyxRQUFRLENBQUMsQ0FBQztnQkFDZCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3pFLElBQUksQ0FBQyxNQUFNO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUN6QixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDbkIsTUFBTSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN6QyxNQUFNLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUNqQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUVuQyxJQUFJLEtBQUssR0FBVyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakQsSUFBSSxLQUFLO29CQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUU3QyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sTUFBTSxDQUFDO2FBQ2Q7WUFDRCxLQUFLLGFBQWEsQ0FBQyxDQUFDO2dCQUNuQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLENBQUMsR0FBRztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELElBQUksS0FBSyxHQUFXLFFBQVEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLEtBQUs7b0JBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFDLE9BQU8sR0FBRyxDQUFDO2FBQ1g7WUFDRCxLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssWUFBWSxDQUFDLENBQUM7Z0JBQ2xCLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLElBQUk7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUVqQixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDekMsSUFBSSxLQUFLO29CQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUUzQyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDL0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBRWpELElBQUksTUFBTSxHQUFXLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLE1BQU0sRUFBRTtvQkFDWCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQVUsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BJLE9BQU8sSUFBSSxDQUFDO2lCQUNaO2dCQUVELElBQUksR0FBRyxHQUFrQixHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO2dCQUNyQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBRWpCLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQyxPQUFPLElBQUksQ0FBQzthQUNaO1lBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQztnQkFDWixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFMUQsSUFBSSxXQUFXLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFL0MsSUFBSSxPQUFPLEdBQWtCLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDaEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDMUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFFdkIsSUFBSSxLQUFLLEdBQVcsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELElBQUksS0FBSztvQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0MsT0FBTyxJQUFJLENBQUM7YUFDWjtZQUNELEtBQUssT0FBTyxDQUFDLENBQUM7Z0JBQ2IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLEtBQUs7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ3hCLEtBQUssQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN4QyxLQUFLLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDeEMsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFOUMsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksS0FBSztvQkFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUMsT0FBTyxLQUFLLENBQUM7YUFDYjtZQUNELEtBQUssVUFBVSxDQUFDLENBQUM7Z0JBQ2hCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxJQUFJO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUV2QixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDckMsSUFBSSxHQUFHO29CQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFbkQsSUFBSSxXQUFXLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFL0MsSUFBSSxLQUFLLEdBQVcsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELElBQUksS0FBSztvQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0MsT0FBTyxJQUFJLENBQUM7YUFDWjtTQUNEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRUQsWUFBWSxDQUFFLEdBQVEsRUFBRSxVQUE0QixFQUFFLGNBQXNCO1FBQzNFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsVUFBVSxDQUFDLG1CQUFtQixHQUFHLGNBQWMsQ0FBQztRQUNoRCxJQUFJLFFBQVEsR0FBa0IsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMzQyxJQUFJLGNBQWMsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3RDLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO2dCQUNmLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUM5QyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO2FBQzVCO1lBQ0QsVUFBVSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7WUFDckMsT0FBTztTQUNQO1FBQ0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNsQyxJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUc7WUFDNUMsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0QixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDaEQsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO2dCQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzlCO1NBQ0Q7UUFDRCxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QixVQUFVLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELGFBQWEsQ0FBRSxHQUFRLEVBQUUsSUFBWSxFQUFFLFlBQTBCO1FBQ2hFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQVksQ0FBQztRQUV0QyxrQkFBa0I7UUFDbEIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQ2QsS0FBSyxJQUFJLFFBQVEsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO2dCQUMvQixJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDdEQsS0FBSyxJQUFJLFlBQVksSUFBSSxPQUFPLEVBQUU7b0JBQ2pDLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLFdBQVc7d0JBQUUsU0FBUztvQkFDM0IsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztvQkFDaEMsSUFBSSxZQUFZLElBQUksWUFBWSxFQUFFO3dCQUNqQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDekQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTs0QkFDNUMsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNoQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ25FO3dCQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBRXpCO3lCQUFNLElBQUksWUFBWSxJQUFJLE1BQU0sRUFBRTt3QkFDbEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7d0JBQ2hFLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDNUIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUUzQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxHQUFJLEtBQUssRUFBRSxFQUFFOzRCQUMxQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNuRSxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUNyQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dDQUNiLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0NBQ3hCLE1BQU07NkJBQ047NEJBQ0QsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ3pDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUMvQyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDOzRCQUN6QixJQUFJLEtBQUssRUFBRTtnQ0FDVixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQzNGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDM0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUMzRixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NkJBQzNGOzRCQUNELElBQUksR0FBRyxLQUFLLENBQUM7NEJBQ2IsS0FBSyxHQUFHLFFBQVEsQ0FBQzs0QkFDakIsTUFBTSxHQUFHLE9BQU8sQ0FBQzt5QkFDakI7d0JBRUQsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFFekI7eUJBQU0sSUFBSSxZQUFZLElBQUksS0FBSyxFQUFFO3dCQUNqQyxJQUFJLFFBQVEsR0FBRyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDOUQsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM1QixJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBRTNDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLEdBQUksS0FBSyxFQUFFLEVBQUU7NEJBQzFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMxRCxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUNyQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dDQUNiLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0NBQ3hCLE1BQU07NkJBQ047NEJBQ0QsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ3pDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUMvQyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDOzRCQUN6QixJQUFJLEtBQUssRUFBRTtnQ0FDVixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQzNGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDM0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzZCQUMzRjs0QkFDRCxJQUFJLEdBQUcsS0FBSyxDQUFDOzRCQUNiLEtBQUssR0FBRyxRQUFRLENBQUM7NEJBQ2pCLE1BQU0sR0FBRyxPQUFPLENBQUM7eUJBQ2pCO3dCQUVELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBRXpCO3lCQUFNLElBQUksWUFBWSxJQUFJLE9BQU8sRUFBRTt3QkFDbkMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQy9GO3lCQUFNLElBQUksWUFBWSxJQUFJLE9BQU8sRUFBRTt3QkFDbkMsSUFBSSxRQUFRLEdBQUcsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7d0JBRWhFLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDNUIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUMzQyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFFM0MsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsR0FBSSxLQUFLLEVBQUUsRUFBRTs0QkFDMUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDakcsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDckMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQ0FDYixRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dDQUN4QixNQUFNOzZCQUNOOzRCQUNELElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUN6QyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDL0MsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQy9DLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7NEJBQ3pCLElBQUksS0FBSyxFQUFFO2dDQUNWLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDM0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUMzRixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQzNGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDM0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUM3RixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQzdGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFF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