@esotericsoftware/spine-core 4.2.117 → 4.3.1
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.
- package/dist/Animation.d.ts +426 -274
- package/dist/Animation.js +1174 -1210
- package/dist/AnimationState.d.ts +246 -201
- package/dist/AnimationState.js +508 -471
- package/dist/AnimationStateData.d.ts +12 -10
- package/dist/AnimationStateData.js +19 -20
- package/dist/AssetManagerBase.d.ts +27 -21
- package/dist/AssetManagerBase.js +67 -43
- package/dist/AtlasAttachmentLoader.d.ts +18 -12
- package/dist/AtlasAttachmentLoader.js +28 -39
- package/dist/Bone.d.ts +15 -109
- package/dist/Bone.js +22 -362
- package/dist/BoneData.d.ts +13 -28
- package/dist/BoneData.js +20 -29
- package/dist/BonePose.d.ts +132 -0
- package/dist/BonePose.js +456 -0
- package/dist/Constraint.d.ts +41 -0
- package/dist/Constraint.js +38 -0
- package/dist/ConstraintData.d.ts +16 -5
- package/dist/ConstraintData.js +15 -9
- package/dist/DrawOrder.d.ts +48 -0
- package/dist/DrawOrder.js +64 -0
- package/dist/Event.d.ts +11 -6
- package/dist/Event.js +10 -5
- package/dist/EventData.d.ts +10 -6
- package/dist/EventData.js +18 -7
- package/dist/IkConstraint.d.ts +23 -28
- package/dist/IkConstraint.js +122 -124
- package/dist/IkConstraintData.d.ts +14 -19
- package/dist/IkConstraintData.js +22 -23
- package/dist/IkConstraintPose.d.ts +49 -0
- package/dist/IkConstraintPose.js +55 -0
- package/dist/PathConstraint.d.ts +18 -23
- package/dist/PathConstraint.js +162 -139
- package/dist/PathConstraintData.d.ts +11 -14
- package/dist/PathConstraintData.js +14 -16
- package/dist/PathConstraintPose.d.ts +43 -0
- package/dist/PathConstraintPose.js +49 -0
- package/dist/Physics.d.ts +39 -0
- package/dist/Physics.js +41 -0
- package/dist/PhysicsConstraint.d.ts +26 -30
- package/dist/PhysicsConstraint.js +114 -94
- package/dist/PhysicsConstraintData.d.ts +28 -13
- package/dist/PhysicsConstraintData.js +35 -13
- package/dist/PhysicsConstraintPose.d.ts +47 -0
- package/dist/PhysicsConstraintPose.js +55 -0
- package/dist/Pose.d.ts +33 -0
- package/dist/Pose.js +30 -0
- package/dist/Posed.d.ts +58 -0
- package/dist/Posed.js +78 -0
- package/dist/PosedActive.d.ts +41 -0
- package/dist/{attachments/HasTextureRegion.js → PosedActive.js} +17 -2
- package/dist/PosedData.d.ts +40 -0
- package/dist/PosedData.js +45 -0
- package/dist/Skeleton.d.ts +110 -99
- package/dist/Skeleton.js +271 -449
- package/dist/SkeletonBinary.d.ts +1 -1
- package/dist/SkeletonBinary.js +655 -466
- package/dist/SkeletonBounds.d.ts +4 -4
- package/dist/SkeletonBounds.js +45 -46
- package/dist/SkeletonClipping.d.ts +26 -22
- package/dist/SkeletonClipping.js +654 -340
- package/dist/SkeletonData.d.ts +18 -35
- package/dist/SkeletonData.js +57 -97
- package/dist/SkeletonJson.d.ts +8 -6
- package/dist/SkeletonJson.js +895 -640
- package/dist/SkeletonRendererCore.d.ts +58 -0
- package/dist/SkeletonRendererCore.js +310 -0
- package/dist/Skin.d.ts +20 -16
- package/dist/Skin.js +58 -53
- package/dist/Slider.d.ts +46 -0
- package/dist/Slider.js +115 -0
- package/dist/SliderData.d.ts +58 -0
- package/dist/SliderData.js +59 -0
- package/dist/SliderPose.d.ts +37 -0
- package/dist/SliderPose.js +40 -0
- package/dist/Slot.d.ts +16 -38
- package/dist/Slot.js +37 -60
- package/dist/SlotData.d.ts +5 -12
- package/dist/SlotData.js +7 -15
- package/dist/SlotPose.d.ts +59 -0
- package/dist/SlotPose.js +81 -0
- package/dist/Texture.d.ts +1 -0
- package/dist/Texture.js +2 -1
- package/dist/TextureAtlas.d.ts +3 -3
- package/dist/TextureAtlas.js +49 -49
- package/dist/TransformConstraint.d.ts +16 -28
- package/dist/TransformConstraint.js +72 -209
- package/dist/TransformConstraintData.d.ts +108 -20
- package/dist/TransformConstraintData.js +274 -24
- package/dist/TransformConstraintPose.d.ts +45 -0
- package/dist/TransformConstraintPose.js +52 -0
- package/dist/Triangulator.d.ts +1 -1
- package/dist/Triangulator.js +91 -107
- package/dist/{Updatable.d.ts → Update.d.ts} +5 -12
- package/dist/Update.js +30 -0
- package/dist/Utils.d.ts +14 -3
- package/dist/Utils.js +80 -37
- package/dist/attachments/Attachment.d.ts +27 -19
- package/dist/attachments/Attachment.js +59 -35
- package/dist/attachments/AttachmentLoader.d.ts +14 -14
- package/dist/attachments/AttachmentLoader.js +1 -1
- package/dist/attachments/BoundingBoxAttachment.d.ts +1 -1
- package/dist/attachments/BoundingBoxAttachment.js +2 -2
- package/dist/attachments/ClippingAttachment.d.ts +10 -3
- package/dist/attachments/ClippingAttachment.js +12 -3
- package/dist/attachments/{HasTextureRegion.d.ts → HasSequence.d.ts} +11 -14
- package/dist/attachments/HasSequence.js +30 -0
- package/dist/attachments/MeshAttachment.d.ts +28 -35
- package/dist/attachments/MeshAttachment.js +85 -97
- package/dist/attachments/PathAttachment.d.ts +3 -3
- package/dist/attachments/PathAttachment.js +6 -6
- package/dist/attachments/PointAttachment.d.ts +11 -6
- package/dist/attachments/PointAttachment.js +8 -3
- package/dist/attachments/RegionAttachment.d.ts +25 -27
- package/dist/attachments/RegionAttachment.js +101 -113
- package/dist/attachments/Sequence.d.ts +31 -6
- package/dist/attachments/Sequence.js +79 -13
- package/dist/esm/spine-core.min.mjs +2 -2
- package/dist/esm/spine-core.mjs +7747 -6116
- package/dist/esm/spine-core.mjs.map +4 -4
- package/dist/iife/spine-core.js +7747 -6116
- package/dist/iife/spine-core.js.map +4 -4
- package/dist/iife/spine-core.min.js +2 -2
- package/dist/index.d.ts +32 -11
- package/dist/index.js +33 -12
- package/dist/polyfills.js +4 -5
- package/package.json +1 -1
- package/dist/Updatable.js +0 -30
package/dist/Triangulator.js
CHANGED
|
@@ -28,90 +28,89 @@
|
|
|
28
28
|
*****************************************************************************/
|
|
29
29
|
import { Pool } from "./Utils.js";
|
|
30
30
|
export class Triangulator {
|
|
31
|
-
convexPolygons =
|
|
32
|
-
convexPolygonsIndices =
|
|
33
|
-
indicesArray =
|
|
34
|
-
isConcaveArray =
|
|
35
|
-
triangles =
|
|
31
|
+
convexPolygons = [];
|
|
32
|
+
convexPolygonsIndices = [];
|
|
33
|
+
indicesArray = [];
|
|
34
|
+
isConcaveArray = [];
|
|
35
|
+
triangles = [];
|
|
36
36
|
polygonPool = new Pool(() => {
|
|
37
|
-
return
|
|
37
|
+
return [];
|
|
38
38
|
});
|
|
39
39
|
polygonIndicesPool = new Pool(() => {
|
|
40
|
-
return
|
|
40
|
+
return [];
|
|
41
41
|
});
|
|
42
42
|
triangulate(verticesArray) {
|
|
43
|
-
|
|
43
|
+
const vertices = verticesArray;
|
|
44
44
|
let vertexCount = verticesArray.length >> 1;
|
|
45
|
-
|
|
45
|
+
const indices = this.indicesArray;
|
|
46
46
|
indices.length = 0;
|
|
47
47
|
for (let i = 0; i < vertexCount; i++)
|
|
48
48
|
indices[i] = i;
|
|
49
|
-
|
|
49
|
+
const isConcave = this.isConcaveArray;
|
|
50
50
|
isConcave.length = 0;
|
|
51
|
-
for (let i = 0
|
|
51
|
+
for (let i = 0; i < vertexCount; i++)
|
|
52
52
|
isConcave[i] = Triangulator.isConcave(i, vertexCount, vertices, indices);
|
|
53
|
-
|
|
53
|
+
const triangles = this.triangles;
|
|
54
54
|
triangles.length = 0;
|
|
55
55
|
while (vertexCount > 3) {
|
|
56
56
|
// Find ear tip.
|
|
57
57
|
let previous = vertexCount - 1, i = 0, next = 1;
|
|
58
58
|
while (true) {
|
|
59
|
+
// biome-ignore lint/suspicious/noConfusingLabels: reference runtime
|
|
59
60
|
outer: if (!isConcave[i]) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
for (let ii =
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
break outer;
|
|
73
|
-
}
|
|
61
|
+
const p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1;
|
|
62
|
+
const p1x = vertices[p1], p1y = vertices[p1 + 1];
|
|
63
|
+
const p2x = vertices[p2], p2y = vertices[p2 + 1];
|
|
64
|
+
const p3x = vertices[p3], p3y = vertices[p3 + 1];
|
|
65
|
+
for (let ii = next + 1 < vertexCount ? next + 1 : 0; ii !== previous;) {
|
|
66
|
+
if (isConcave[ii]) {
|
|
67
|
+
const v = indices[ii] << 1;
|
|
68
|
+
const vx = vertices[v], vy = vertices[v + 1];
|
|
69
|
+
if (Triangulator.positiveArea(p3x, p3y, p1x, p1y, vx, vy) //
|
|
70
|
+
&& Triangulator.positiveArea(p1x, p1y, p2x, p2y, vx, vy) //
|
|
71
|
+
&& Triangulator.positiveArea(p2x, p2y, p3x, p3y, vx, vy))
|
|
72
|
+
break outer;
|
|
74
73
|
}
|
|
74
|
+
if (++ii === vertexCount)
|
|
75
|
+
ii = 0;
|
|
75
76
|
}
|
|
76
77
|
break;
|
|
77
78
|
}
|
|
78
|
-
if (next
|
|
79
|
+
if (next === 0) {
|
|
79
80
|
do {
|
|
80
81
|
if (!isConcave[i])
|
|
81
82
|
break;
|
|
82
83
|
i--;
|
|
83
84
|
} while (i > 0);
|
|
85
|
+
previous = i > 0 ? i - 1 : vertexCount - 1;
|
|
86
|
+
next = i + 1 < vertexCount ? i + 1 : 0;
|
|
84
87
|
break;
|
|
85
88
|
}
|
|
86
89
|
previous = i;
|
|
87
90
|
i = next;
|
|
88
|
-
|
|
91
|
+
if (++next === vertexCount)
|
|
92
|
+
next = 0;
|
|
89
93
|
}
|
|
90
94
|
// Cut ear tip.
|
|
91
|
-
triangles.push(indices[
|
|
92
|
-
triangles.push(indices[i]);
|
|
93
|
-
triangles.push(indices[(i + 1) % vertexCount]);
|
|
95
|
+
triangles.push(indices[previous], indices[i], indices[next]);
|
|
94
96
|
indices.splice(i, 1);
|
|
95
97
|
isConcave.splice(i, 1);
|
|
96
98
|
vertexCount--;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
const previousIndex = i > 0 ? i - 1 : vertexCount - 1;
|
|
100
|
+
const nextIndex = i < vertexCount ? i : 0;
|
|
99
101
|
isConcave[previousIndex] = Triangulator.isConcave(previousIndex, vertexCount, vertices, indices);
|
|
100
102
|
isConcave[nextIndex] = Triangulator.isConcave(nextIndex, vertexCount, vertices, indices);
|
|
101
103
|
}
|
|
102
|
-
if (vertexCount
|
|
103
|
-
triangles.push(indices[2]);
|
|
104
|
-
triangles.push(indices[0]);
|
|
105
|
-
triangles.push(indices[1]);
|
|
106
|
-
}
|
|
104
|
+
if (vertexCount === 3)
|
|
105
|
+
triangles.push(indices[2], indices[0], indices[1]);
|
|
107
106
|
return triangles;
|
|
108
107
|
}
|
|
109
108
|
decompose(verticesArray, triangles) {
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
const vertices = verticesArray;
|
|
110
|
+
const convexPolygons = this.convexPolygons;
|
|
112
111
|
this.polygonPool.freeAll(convexPolygons);
|
|
113
112
|
convexPolygons.length = 0;
|
|
114
|
-
|
|
113
|
+
const convexPolygonsIndices = this.convexPolygonsIndices;
|
|
115
114
|
this.polygonIndicesPool.freeAll(convexPolygonsIndices);
|
|
116
115
|
convexPolygonsIndices.length = 0;
|
|
117
116
|
let polygonIndices = this.polygonIndicesPool.obtain();
|
|
@@ -121,122 +120,107 @@ export class Triangulator {
|
|
|
121
120
|
// Merge subsequent triangles if they form a triangle fan.
|
|
122
121
|
let fanBaseIndex = -1, lastWinding = 0;
|
|
123
122
|
for (let i = 0, n = triangles.length; i < n; i += 3) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
123
|
+
const t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1;
|
|
124
|
+
const x1 = vertices[t1], y1 = vertices[t1 + 1];
|
|
125
|
+
const x2 = vertices[t2], y2 = vertices[t2 + 1];
|
|
126
|
+
const x3 = vertices[t3], y3 = vertices[t3 + 1];
|
|
128
127
|
// If the base of the last triangle is the same as this triangle, check if they form a convex polygon (triangle fan).
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if (winding1 == lastWinding && winding2 == lastWinding) {
|
|
135
|
-
polygon.push(x3);
|
|
136
|
-
polygon.push(y3);
|
|
128
|
+
if (fanBaseIndex === t1) {
|
|
129
|
+
const o = polygon.length - 4;
|
|
130
|
+
if (Triangulator.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3) === lastWinding
|
|
131
|
+
&& Triangulator.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]) === lastWinding) {
|
|
132
|
+
polygon.push(x3, y3);
|
|
137
133
|
polygonIndices.push(t3);
|
|
138
|
-
|
|
134
|
+
continue;
|
|
139
135
|
}
|
|
140
136
|
}
|
|
141
137
|
// Otherwise make this triangle the new base.
|
|
142
|
-
if (
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
convexPolygonsIndices.push(polygonIndices);
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
this.polygonPool.free(polygon);
|
|
149
|
-
this.polygonIndicesPool.free(polygonIndices);
|
|
150
|
-
}
|
|
138
|
+
if (polygon.length > 0) {
|
|
139
|
+
convexPolygons.push(polygon);
|
|
140
|
+
convexPolygonsIndices.push(polygonIndices);
|
|
151
141
|
polygon = this.polygonPool.obtain();
|
|
152
|
-
polygon.length = 0;
|
|
153
|
-
polygon.push(x1);
|
|
154
|
-
polygon.push(y1);
|
|
155
|
-
polygon.push(x2);
|
|
156
|
-
polygon.push(y2);
|
|
157
|
-
polygon.push(x3);
|
|
158
|
-
polygon.push(y3);
|
|
159
142
|
polygonIndices = this.polygonIndicesPool.obtain();
|
|
160
|
-
polygonIndices.length = 0;
|
|
161
|
-
polygonIndices.push(t1);
|
|
162
|
-
polygonIndices.push(t2);
|
|
163
|
-
polygonIndices.push(t3);
|
|
164
|
-
lastWinding = Triangulator.winding(x1, y1, x2, y2, x3, y3);
|
|
165
|
-
fanBaseIndex = t1;
|
|
166
143
|
}
|
|
144
|
+
polygon.length = 0;
|
|
145
|
+
polygon.push(x1, y1, x2, y2);
|
|
146
|
+
polygon.push(x3, y3);
|
|
147
|
+
polygonIndices.length = 0;
|
|
148
|
+
polygonIndices.push(t1, t2, t3);
|
|
149
|
+
lastWinding = Triangulator.winding(x1, y1, x2, y2, x3, y3);
|
|
150
|
+
fanBaseIndex = t1;
|
|
167
151
|
}
|
|
168
152
|
if (polygon.length > 0) {
|
|
169
153
|
convexPolygons.push(polygon);
|
|
170
154
|
convexPolygonsIndices.push(polygonIndices);
|
|
171
155
|
}
|
|
172
|
-
//
|
|
156
|
+
// Merge remaining triangles with the found triangle fans.
|
|
173
157
|
for (let i = 0, n = convexPolygons.length; i < n; i++) {
|
|
174
158
|
polygonIndices = convexPolygonsIndices[i];
|
|
175
|
-
if (polygonIndices.length
|
|
159
|
+
if (polygonIndices.length === 0)
|
|
176
160
|
continue;
|
|
177
|
-
|
|
161
|
+
const firstIndex = polygonIndices[0];
|
|
178
162
|
let lastIndex = polygonIndices[polygonIndices.length - 1];
|
|
179
163
|
polygon = convexPolygons[i];
|
|
180
|
-
|
|
164
|
+
const o = polygon.length - 4;
|
|
181
165
|
let prevPrevX = polygon[o], prevPrevY = polygon[o + 1];
|
|
182
166
|
let prevX = polygon[o + 2], prevY = polygon[o + 3];
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
167
|
+
const firstX = polygon[0], firstY = polygon[1];
|
|
168
|
+
const secondX = polygon[2], secondY = polygon[3];
|
|
169
|
+
const winding = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY);
|
|
186
170
|
for (let ii = 0; ii < n; ii++) {
|
|
187
|
-
if (ii
|
|
171
|
+
if (ii === i)
|
|
188
172
|
continue;
|
|
189
|
-
|
|
190
|
-
if (otherIndices.length
|
|
173
|
+
const otherIndices = convexPolygonsIndices[ii];
|
|
174
|
+
if (otherIndices.length !== 3)
|
|
191
175
|
continue;
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
if (otherFirstIndex
|
|
176
|
+
const otherFirstIndex = otherIndices[0];
|
|
177
|
+
const otherSecondIndex = otherIndices[1];
|
|
178
|
+
const otherLastIndex = otherIndices[2];
|
|
179
|
+
const otherPoly = convexPolygons[ii];
|
|
180
|
+
const x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1];
|
|
181
|
+
if (otherFirstIndex !== firstIndex || otherSecondIndex !== lastIndex)
|
|
198
182
|
continue;
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
if (winding1 == winding && winding2 == winding) {
|
|
183
|
+
if (Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3) === winding
|
|
184
|
+
&& Triangulator.winding(x3, y3, firstX, firstY, secondX, secondY) === winding) {
|
|
202
185
|
otherPoly.length = 0;
|
|
203
186
|
otherIndices.length = 0;
|
|
204
|
-
polygon.push(x3);
|
|
205
|
-
polygon.push(y3);
|
|
187
|
+
polygon.push(x3, y3);
|
|
206
188
|
polygonIndices.push(otherLastIndex);
|
|
189
|
+
lastIndex = otherLastIndex;
|
|
207
190
|
prevPrevX = prevX;
|
|
208
191
|
prevPrevY = prevY;
|
|
209
192
|
prevX = x3;
|
|
210
193
|
prevY = y3;
|
|
211
|
-
ii =
|
|
194
|
+
ii = -1;
|
|
212
195
|
}
|
|
213
196
|
}
|
|
214
197
|
}
|
|
215
|
-
// Remove empty polygons
|
|
198
|
+
// Remove empty polygons from the merge step above.
|
|
216
199
|
for (let i = convexPolygons.length - 1; i >= 0; i--) {
|
|
217
200
|
polygon = convexPolygons[i];
|
|
218
|
-
if (polygon.length
|
|
201
|
+
if (polygon.length === 0) {
|
|
219
202
|
convexPolygons.splice(i, 1);
|
|
220
203
|
this.polygonPool.free(polygon);
|
|
221
204
|
polygonIndices = convexPolygonsIndices[i];
|
|
222
205
|
convexPolygonsIndices.splice(i, 1);
|
|
223
206
|
this.polygonIndicesPool.free(polygonIndices);
|
|
224
207
|
}
|
|
208
|
+
else
|
|
209
|
+
polygon.push(polygon[0], polygon[1]);
|
|
225
210
|
}
|
|
226
211
|
return convexPolygons;
|
|
227
212
|
}
|
|
228
213
|
static isConcave(index, vertexCount, vertices, indices) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
return !
|
|
214
|
+
const previous = indices[index > 0 ? index - 1 : vertexCount - 1] << 1;
|
|
215
|
+
const current = indices[index] << 1;
|
|
216
|
+
const next = indices[index + 1 < vertexCount ? index + 1 : 0] << 1;
|
|
217
|
+
return !Triangulator.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]);
|
|
233
218
|
}
|
|
234
219
|
static positiveArea(p1x, p1y, p2x, p2y, p3x, p3y) {
|
|
235
220
|
return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0;
|
|
236
221
|
}
|
|
237
222
|
static winding(p1x, p1y, p2x, p2y, p3x, p3y) {
|
|
238
|
-
|
|
239
|
-
return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1;
|
|
223
|
+
return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0 ? 1 : -1;
|
|
240
224
|
}
|
|
241
225
|
}
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJpYW5ndWxhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1RyaWFuZ3VsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFtQixJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbkQsTUFBTSxPQUFPLFlBQVk7SUFDaEIsY0FBYyxHQUFHLElBQUksS0FBSyxFQUFpQixDQUFDO0lBQzVDLHFCQUFxQixHQUFHLElBQUksS0FBSyxFQUFpQixDQUFDO0lBRW5ELFlBQVksR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBQ25DLGNBQWMsR0FBRyxJQUFJLEtBQUssRUFBVyxDQUFDO0lBQ3RDLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBRWhDLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBZ0IsR0FBRyxFQUFFO1FBQ2xELE9BQU8sSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztJQUVLLGtCQUFrQixHQUFHLElBQUksSUFBSSxDQUFnQixHQUFHLEVBQUU7UUFDekQsT0FBTyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBRUksV0FBVyxDQUFFLGFBQThCO1FBQ2pELElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQztRQUM3QixJQUFJLFdBQVcsR0FBRyxhQUFhLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUU1QyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFO1lBQ25DLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEIsSUFBSSxTQUFTLEdBQUcsSUFB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UUFBUSxDQUFDLElBQUksQ0FBQyxFQUM3SCxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxZQUFZLENBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXO1FBQ3hHLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTyxNQUFNLENBQUMsT0FBTyxDQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVztRQUNuRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ25DLE9BQU8sR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBOdW1iZXJBcnJheUxpa2UsIFBvb2wgfSBmcm9tIFwiLi9VdGlscy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVHJpYW5ndWxhdG9yIHtcblx0cHJpdmF0ZSBjb252ZXhQb2x5Z29ucyA9IG5ldyBBcnJheTxBcnJheTxudW1iZXI+PigpO1xuXHRwcml2YXRlIGNvbnZleFBvbHlnb25zSW5kaWNlcyA9IG5ldyBBcnJheTxBcnJheTxudW1iZXI+PigpO1xuXG5cdHByaXZhdGUgaW5kaWNlc0FycmF5ID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblx0cHJpdmF0ZSBpc0NvbmNhdmVBcnJheSA9IG5ldyBBcnJheTxib29sZWFuPigpO1xuXHRwcml2YXRlIHRyaWFuZ2xlcyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cblx0cHJpdmF0ZSBwb2x5Z29uUG9vbCA9IG5ldyBQb29sPEFycmF5PG51bWJlcj4+KCgpID0+IHtcblx0XHRyZXR1cm4gbmV3IEFycmF5PG51bWJlcj4oKTtcblx0fSk7XG5cblx0cHJpdmF0ZSBwb2x5Z29uSW5kaWNlc1Bvb2wgPSBuZXcgUG9vbDxBcnJheTxudW1iZXI+PigoKSA9PiB7XG5cdFx0cmV0dXJuIG5ldyBBcnJheTxudW1iZXI+KCk7XG5cdH0pO1xuXG5cdHB1YmxpYyB0cmlhbmd1bGF0ZSAodmVydGljZXNBcnJheTogTnVtYmVyQXJyYXlMaWtlKTogQXJyYXk8bnVtYmVyPiB7XG5cdFx0bGV0IHZlcnRpY2VzID0gdmVydGljZXNBcnJheTtcblx0XHRsZXQgdmVydGV4Q291bnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCA+PiAxO1xuXG5cdFx0bGV0IGluZGljZXMgPSB0aGlzLmluZGljZXNBcnJheTtcblx0XHRpbmRpY2VzLmxlbmd0aCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0aW5kaWNlc1tpXSA9IGk7XG5cblx0XHRsZXQgaXNDb25jYXZlID0gdGhpcy5pc0NvbmNhdmVBcnJheTtcblx0XHRpc0NvbmNhdmUubGVuZ3RoID0gMDtcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHZlcnRleENvdW50OyBpIDwgbjsgKytpKVxuXHRcdFx0aXNDb25jYXZlW2ldID0gVHJpYW5ndWxhdG9yLmlzQ29uY2F2ZShpLCB2ZXJ0ZXhDb3VudCwgdmVydGljZXMsIGluZGljZXMpO1xuXG5cdFx0bGV0IHRyaWFuZ2xlcyA9IHRoaXMudHJpYW5nbGVzO1xuXHRcdHRyaWFuZ2xlcy5sZW5ndGggPSAwO1xuXG5cdFx0d2hpbGUgKHZlcnRleENvdW50ID4gMykge1xuXHRcdFx0Ly8gRmluZCBlYXIgdGlwLlxuXHRcdFx0bGV0IHByZXZpb3VzID0gdmVydGV4Q291bnQgLSAxLCBpID0gMCwgbmV4dCA9IDE7XG5cdFx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0XHRvdXRlcjpcblx0XHRcdFx0aWYgKCFpc0NvbmNhdmVbaV0pIHtcblx0XHRcdFx0XHRsZXQgcDEgPSBpbmRpY2VzW3ByZXZpb3VzXSA8PCAxLCBwMiA9IGluZGljZXNbaV0gPDwgMSwgcDMgPSBpbmRpY2VzW25leHRdIDw8IDE7XG5cdFx0XHRcdFx0bGV0IHAxeCA9IHZlcnRpY2VzW3AxXSwgcDF5ID0gdmVydGljZXNbcDEgKyAxXTtcblx0XHRcdFx0XHRsZXQgcDJ4ID0gdmVydGljZXNbcDJdLCBwMnkgPSB2ZXJ0aWNlc1twMiArIDFdO1xuXHRcdFx0XHRcdGxldCBwM3ggPSB2ZXJ0aWNlc1twM10sIHAzeSA9IHZlcnRpY2VzW3AzICsgMV07XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAobmV4dCArIDEpICUgdmVydGV4Q291bnQ7IGlpICE9IHByZXZpb3VzOyBpaSA9IChpaSArIDEpICUgdmVydGV4Q291bnQpIHtcblx0XHRcdFx0XHRcdGlmICghaXNDb25jYXZlW2lpXSkgY29udGludWU7XG5cdFx0XHRcdFx0XHRsZXQgdiA9IGluZGljZXNbaWldIDw8IDE7XG5cdFx0XHRcdFx0XHRsZXQgdnggPSB2ZXJ0aWNlc1t2XSwgdnkgPSB2ZXJ0aWNlc1t2ICsgMV07XG5cdFx0XHRcdFx0XHRpZiAoVHJpYW5ndWxhdG9yLnBvc2l0aXZlQXJlYShwM3gsIHAzeSwgcDF4LCBwMXksIHZ4LCB2eSkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKFRyaWFuZ3VsYXRvci5wb3NpdGl2ZUFyZWEocDF4LCBwMXksIHAyeCwgcDJ5LCB2eCwgdnkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFRyaWFuZ3VsYXRvci5wb3NpdGl2ZUFyZWEocDJ4LCBwMnksIHAzeCwgcDN5LCB2eCwgdnkpKSBicmVhayBvdXRlcjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChuZXh0ID09IDApIHtcblx0XHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0XHRpZiAoIWlzQ29uY2F2ZVtpXSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRpLS07XG5cdFx0XHRcdFx0fSB3aGlsZSAoaSA+IDApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cHJldmlvdXMgPSBpO1xuXHRcdFx0XHRpID0gbmV4dDtcblx0XHRcdFx0bmV4dCA9IChuZXh0ICsgMSkgJSB2ZXJ0ZXhDb3VudDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ3V0IGVhciB0aXAuXG5cdFx0XHR0cmlhbmdsZXMucHVzaChpbmRpY2VzWyh2ZXJ0ZXhDb3VudCArIGkgLSAxKSAlIHZlcnRleENvdW50XSk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaChpbmRpY2VzW2ldKTtcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKGluZGljZXNbKGkgKyAxKSAlIHZlcnRleENvdW50XSk7XG5cdFx0XHRpbmRpY2VzLnNwbGljZShpLCAxKTtcblx0XHRcdGlzQ29uY2F2ZS5zcGxpY2UoaSwgMSk7XG5cdFx0XHR2ZXJ0ZXhDb3VudC0tO1xuXG5cdFx0XHRsZXQgcHJldmlvdXNJbmRleCA9ICh2ZXJ0ZXhDb3VudCArIGkgLSAxKSAlIHZlcnRleENvdW50O1xuXHRcdFx0bGV0IG5leHRJbmRleCA9IGkgPT0gdmVydGV4Q291bnQgPyAwIDogaTtcblx0XHRcdGlzQ29uY2F2ZVtwcmV2aW91c0luZGV4XSA9IFRyaWFuZ3VsYXRvci5pc0NvbmNhdmUocHJldmlvdXNJbmRleCwgdmVydGV4Q291bnQsIHZlcnRpY2VzLCBpbmRpY2VzKTtcblx0XHRcdGlzQ29uY2F2ZVtuZXh0SW5kZXhdID0gVHJpYW5ndWxhdG9yLmlzQ29uY2F2ZShuZXh0SW5kZXgsIHZlcnRleENvdW50LCB2ZXJ0aWNlcywgaW5kaWNlcyk7XG5cdFx0fVxuXG5cdFx0aWYgKHZlcnRleENvdW50ID09IDMpIHtcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKGluZGljZXNbMl0pO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goaW5kaWNlc1swXSk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaChpbmRpY2VzWzFdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXHR9XG5cblx0ZGVjb21wb3NlICh2ZXJ0aWNlc0FycmF5OiBBcnJheTxudW1iZXI+LCB0cmlhbmdsZXM6IEFycmF5PG51bWJlcj4pOiBBcnJheTxBcnJheTxudW1iZXI+PiB7XG5cdFx0bGV0IHZlcnRpY2VzID0gdmVydGljZXNBcnJheTtcblx0XHRsZXQgY29udmV4UG9seWdvbnMgPSB0aGlzLmNvbnZleFBvbHlnb25zO1xuXHRcdHRoaXMucG9seWdvblBvb2wuZnJlZUFsbChjb252ZXhQb2x5Z29ucyk7XG5cdFx0Y29udmV4UG9seWdvbnMubGVuZ3RoID0gMDtcblxuXHRcdGxldCBjb252ZXhQb2x5Z29uc0luZGljZXMgPSB0aGlzLmNvbnZleFBvbHlnb25zSW5kaWNlcztcblx0XHR0aGlzLnBvbHlnb25JbmRpY2VzUG9vbC5mcmVlQWxsKGNvbnZleFBvbHlnb25zSW5kaWNlcyk7XG5cdFx0Y29udmV4UG9seWdvbnNJbmRpY2VzLmxlbmd0aCA9IDA7XG5cblx0XHRsZXQgcG9seWdvbkluZGljZXMgPSB0aGlzLnBvbHlnb25JbmRpY2VzUG9vbC5vYnRhaW4oKTtcblx0XHRwb2x5Z29uSW5kaWNlcy5sZW5ndGggPSAwO1xuXG5cdFx0bGV0IHBvbHlnb24gPSB0aGlzLnBvbHlnb25Qb29sLm9idGFpbigpO1xuXHRcdHBvbHlnb24ubGVuZ3RoID0gMDtcblxuXHRcdC8vIE1lcmdlIHN1YnNlcXVlbnQgdHJpYW5nbGVzIGlmIHRoZXkgZm9ybSBhIHRyaWFuZ2xlIGZhbi5cblx0XHRsZXQgZmFuQmFzZUluZGV4ID0gLTEsIGxhc3RXaW5kaW5nID0gMDtcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHRyaWFuZ2xlcy5sZW5ndGg7IGkgPCBuOyBpICs9IDMpIHtcblx0XHRcdGxldCB0MSA9IHRyaWFuZ2xlc1tpXSA8PCAxLCB0MiA9IHRyaWFuZ2xlc1tpICsgMV0gPDwgMSwgdDMgPSB0cmlhbmdsZXNbaSArIDJdIDw8IDE7XG5cdFx0XHRsZXQgeDEgPSB2ZXJ0aWNlc1t0MV0sIHkxID0gdmVydGljZXNbdDEgKyAxXTtcblx0XHRcdGxldCB4MiA9IHZlcnRpY2VzW3QyXSwgeTIgPSB2ZXJ0aWNlc1t0MiArIDFdO1xuXHRcdFx0bGV0IHgzID0gdmVydGljZXNbdDNdLCB5MyA9IHZlcnRpY2VzW3QzICsgMV07XG5cblx0XHRcdC8vIElmIHRoZSBiYXNlIG9mIHRoZSBsYXN0IHRyaWFuZ2xlIGlzIHRoZSBzYW1lIGFzIHRoaXMgdHJpYW5nbGUsIGNoZWNrIGlmIHRoZXkgZm9ybSBhIGNvbnZleCBwb2x5Z29uICh0cmlhbmdsZSBmYW4pLlxuXHRcdFx0bGV0IG1lcmdlZCA9IGZhbHNlO1xuXHRcdFx0aWYgKGZhbkJhc2VJbmRleCA9PSB0MSkge1xuXHRcdFx0XHRsZXQgbyA9IHBvbHlnb24ubGVuZ3RoIC0gNDtcblx0XHRcdFx0bGV0IHdpbmRpbmcxID0gVHJpYW5ndWxhdG9yLndpbmRpbmcocG9seWdvbltvXSwgcG9seWdvbltvICsgMV0sIHBvbHlnb25bbyArIDJdLCBwb2x5Z29uW28gKyAzXSwgeDMsIHkzKTtcblx0XHRcdFx0bGV0IHdpbmRpbmcyID0gVHJpYW5ndWxhdG9yLndpbmRpbmcoeDMsIHkzLCBwb2x5Z29uWzBdLCBwb2x5Z29uWzFdLCBwb2x5Z29uWzJdLCBwb2x5Z29uWzNdKTtcblx0XHRcdFx0aWYgKHdpbmRpbmcxID09IGxhc3RXaW5kaW5nICYmIHdpbmRpbmcyID09IGxhc3RXaW5kaW5nKSB7XG5cdFx0XHRcdFx0cG9seWdvbi5wdXNoKHgzKTtcblx0XHRcdFx0XHRwb2x5Z29uLnB1c2goeTMpO1xuXHRcdFx0XHRcdHBvbHlnb25JbmRpY2VzLnB1c2godDMpO1xuXHRcdFx0XHRcdG1lcmdlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG1ha2UgdGhpcyB0cmlhbmdsZSB0aGUgbmV3IGJhc2UuXG5cdFx0XHRpZiAoIW1lcmdlZCkge1xuXHRcdFx0XHRpZiAocG9seWdvbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Y29udmV4UG9seWdvbnMucHVzaChwb2x5Z29uKTtcblx0XHRcdFx0XHRjb252ZXhQb2x5Z29uc0luZGljZXMucHVzaChwb2x5Z29uSW5kaWNlcyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5wb2x5Z29uUG9vbC5mcmVlKHBvbHlnb24pXG5cdFx0XHRcdFx0dGhpcy5wb2x5Z29uSW5kaWNlc1Bvb2wuZnJlZShwb2x5Z29uSW5kaWNlcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cG9seWdvbiA9IHRoaXMucG9seWdvblBvb2wub2J0YWluKCk7XG5cdFx0XHRcdHBvbHlnb24ubGVuZ3RoID0gMDtcblx0XHRcdFx0cG9seWdvbi5wdXNoKHgxKTtcblx0XHRcdFx0cG9seWdvbi5wdXNoKHkxKTtcblx0XHRcdFx0cG9seWdvbi5wdXNoKHgyKTtcblx0XHRcdFx0cG9seWdvbi5wdXNoKHkyKTtcblx0XHRcdFx0cG9seWdvbi5wdXNoKHgzKTtcblx0XHRcdFx0cG9seWdvbi5wdXNoKHkzKTtcblx0XHRcdFx0cG9seWdvbkluZGljZXMgPSB0aGlzLnBvbHlnb25JbmRpY2VzUG9vbC5vYnRhaW4oKTtcblx0XHRcdFx0cG9seWdvbkluZGljZXMubGVuZ3RoID0gMDtcblx0XHRcdFx0cG9seWdvbkluZGljZXMucHVzaCh0MSk7XG5cdFx0XHRcdHBvbHlnb25JbmRpY2VzLnB1c2godDIpO1xuXHRcdFx0XHRwb2x5Z29uSW5kaWNlcy5wdXNoKHQzKTtcblx0XHRcdFx0bGFzdFdpbmRpbmcgPSBUcmlhbmd1bGF0b3Iud2luZGluZyh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKTtcblx0XHRcdFx0ZmFuQmFzZUluZGV4ID0gdDE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHBvbHlnb24ubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29udmV4UG9seWdvbnMucHVzaChwb2x5Z29uKTtcblx0XHRcdGNvbnZleFBvbHlnb25zSW5kaWNlcy5wdXNoKHBvbHlnb25JbmRpY2VzKTtcblx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIHBvbHlnb25zIGFuZCB0cnkgdG8gbWVyZ2UgdGhlIHJlbWFpbmluZyB0cmlhbmdsZXMgd2l0aCB0aGUgZm91bmQgdHJpYW5nbGUgZmFucy5cblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGNvbnZleFBvbHlnb25zLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0cG9seWdvbkluZGljZXMgPSBjb252ZXhQb2x5Z29uc0luZGljZXNbaV07XG5cdFx0XHRpZiAocG9seWdvbkluZGljZXMubGVuZ3RoID09IDApIGNvbnRpbnVlO1xuXHRcdFx0bGV0IGZpcnN0SW5kZXggPSBwb2x5Z29uSW5kaWNlc1swXTtcblx0XHRcdGxldCBsYXN0SW5kZXggPSBwb2x5Z29uSW5kaWNlc1twb2x5Z29uSW5kaWNlcy5sZW5ndGggLSAxXTtcblxuXHRcdFx0cG9seWdvbiA9IGNvbnZleFBvbHlnb25zW2ldO1xuXHRcdFx0bGV0IG8gPSBwb2x5Z29uLmxlbmd0aCAtIDQ7XG5cdFx0XHRsZXQgcHJldlByZXZYID0gcG9seWdvbltvXSwgcHJldlByZXZZID0gcG9seWdvbltvICsgMV07XG5cdFx0XHRsZXQgcHJldlggPSBwb2x5Z29uW28gKyAyXSwgcHJldlkgPSBwb2x5Z29uW28gKyAzXTtcblx0XHRcdGxldCBmaXJzdFggPSBwb2x5Z29uWzBdLCBmaXJzdFkgPSBwb2x5Z29uWzFdO1xuXHRcdFx0bGV0IHNlY29uZFggPSBwb2x5Z29uWzJdLCBzZWNvbmRZID0gcG9seWdvblszXTtcblx0XHRcdGxldCB3aW5kaW5nID0gVHJpYW5ndWxhdG9yLndpbmRpbmcocHJldlByZXZYLCBwcmV2UHJldlksIHByZXZYLCBwcmV2WSwgZmlyc3RYLCBmaXJzdFkpO1xuXG5cdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgbjsgaWkrKykge1xuXHRcdFx0XHRpZiAoaWkgPT0gaSkgY29udGludWU7XG5cdFx0XHRcdGxldCBvdGhlckluZGljZXMgPSBjb252ZXhQb2x5Z29uc0luZGljZXNbaWldO1xuXHRcdFx0XHRpZiAob3RoZXJJbmRpY2VzLmxlbmd0aCAhPSAzKSBjb250aW51ZTtcblx0XHRcdFx0bGV0IG90aGVyRmlyc3RJbmRleCA9IG90aGVySW5kaWNlc1swXTtcblx0XHRcdFx0bGV0IG90aGVyU2Vjb25kSW5kZXggPSBvdGhlckluZGljZXNbMV07XG5cdFx0XHRcdGxldCBvdGhlckxhc3RJbmRleCA9IG90aGVySW5kaWNlc1syXTtcblxuXHRcdFx0XHRsZXQgb3RoZXJQb2x5ID0gY29udmV4UG9seWdvbnNbaWldO1xuXHRcdFx0XHRsZXQgeDMgPSBvdGhlclBvbHlbb3RoZXJQb2x5Lmxlbmd0aCAtIDJdLCB5MyA9IG90aGVyUG9seVtvdGhlclBvbHkubGVuZ3RoIC0gMV07XG5cblx0XHRcdFx0aWYgKG90aGVyRmlyc3RJbmRleCAhPSBmaXJzdEluZGV4IHx8IG90aGVyU2Vjb25kSW5kZXggIT0gbGFzdEluZGV4KSBjb250aW51ZTtcblx0XHRcdFx0bGV0IHdpbmRpbmcxID0gVHJpYW5ndWxhdG9yLndpbmRpbmcocHJldlByZXZYLCBwcmV2UHJldlksIHByZXZYLCBwcmV2WSwgeDMsIHkzKTtcblx0XHRcdFx0bGV0IHdpbmRpbmcyID0gVHJpYW5ndWxhdG9yLndpbmRpbmcoeDMsIHkzLCBmaXJzdFgsIGZpcnN0WSwgc2Vjb25kWCwgc2Vjb25kWSk7XG5cdFx0XHRcdGlmICh3aW5kaW5nMSA9PSB3aW5kaW5nICYmIHdpbmRpbmcyID09IHdpbmRpbmcpIHtcblx0XHRcdFx0XHRvdGhlclBvbHkubGVuZ3RoID0gMDtcblx0XHRcdFx0XHRvdGhlckluZGljZXMubGVuZ3RoID0gMDtcblx0XHRcdFx0XHRwb2x5Z29uLnB1c2goeDMpO1xuXHRcdFx0XHRcdHBvbHlnb24ucHVzaCh5Myk7XG5cdFx0XHRcdFx0cG9seWdvbkluZGljZXMucHVzaChvdGhlckxhc3RJbmRleCk7XG5cdFx0XHRcdFx0cHJldlByZXZYID0gcHJldlg7XG5cdFx0XHRcdFx0cHJldlByZXZZID0gcHJldlk7XG5cdFx0XHRcdFx0cHJldlggPSB4Mztcblx0XHRcdFx0XHRwcmV2WSA9IHkzO1xuXHRcdFx0XHRcdGlpID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSBlbXB0eSBwb2x5Z29ucyB0aGF0IHJlc3VsdGVkIGZyb20gdGhlIG1lcmdlIHN0ZXAgYWJvdmUuXG5cdFx0Zm9yIChsZXQgaSA9IGNvbnZleFBvbHlnb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHRwb2x5Z29uID0gY29udmV4UG9seWdvbnNbaV07XG5cdFx0XHRpZiAocG9seWdvbi5sZW5ndGggPT0gMCkge1xuXHRcdFx0XHRjb252ZXhQb2x5Z29ucy5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdHRoaXMucG9seWdvblBvb2wuZnJlZShwb2x5Z29uKTtcblx0XHRcdFx0cG9seWdvbkluZGljZXMgPSBjb252ZXhQb2x5Z29uc0luZGljZXNbaV1cblx0XHRcdFx0Y29udmV4UG9seWdvbnNJbmRpY2VzLnNwbGljZShpLCAxKVxuXHRcdFx0XHR0aGlzLnBvbHlnb25JbmRpY2VzUG9vbC5mcmVlKHBvbHlnb25JbmRpY2VzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmV4UG9seWdvbnM7XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBpc0NvbmNhdmUgKGluZGV4OiBudW1iZXIsIHZlcnRleENvdW50OiBudW1iZXIsIHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIGluZGljZXM6IE51bWJlckFycmF5TGlrZSk6IGJvb2xlYW4ge1xuXHRcdGxldCBwcmV2aW91cyA9IGluZGljZXNbKHZlcnRleENvdW50ICsgaW5kZXggLSAxKSAlIHZlcnRleENvdW50XSA8PCAxO1xuXHRcdGxldCBjdXJyZW50ID0gaW5kaWNlc1tpbmRleF0gPDwgMTtcblx0XHRsZXQgbmV4dCA9IGluZGljZXNbKGluZGV4ICsgMSkgJSB2ZXJ0ZXhDb3VudF0gPDwgMTtcblx0XHRyZXR1cm4gIXRoaXMucG9zaXRpdmVBcmVhKHZlcnRpY2VzW3ByZXZpb3VzXSwgdmVydGljZXNbcHJldmlvdXMgKyAxXSwgdmVydGljZXNbY3VycmVudF0sIHZlcnRpY2VzW2N1cnJlbnQgKyAxXSwgdmVydGljZXNbbmV4dF0sXG5cdFx0XHR2ZXJ0aWNlc1tuZXh0ICsgMV0pO1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgcG9zaXRpdmVBcmVhIChwMXg6IG51bWJlciwgcDF5OiBudW1iZXIsIHAyeDogbnVtYmVyLCBwMnk6IG51bWJlciwgcDN4OiBudW1iZXIsIHAzeTogbnVtYmVyKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHAxeCAqIChwM3kgLSBwMnkpICsgcDJ4ICogKHAxeSAtIHAzeSkgKyBwM3ggKiAocDJ5IC0gcDF5KSA+PSAwO1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgd2luZGluZyAocDF4OiBudW1iZXIsIHAxeTogbnVtYmVyLCBwMng6IG51bWJlciwgcDJ5OiBudW1iZXIsIHAzeDogbnVtYmVyLCBwM3k6IG51bWJlcik6IG51bWJlciB7XG5cdFx0bGV0IHB4ID0gcDJ4IC0gcDF4LCBweSA9IHAyeSAtIHAxeTtcblx0XHRyZXR1cm4gcDN4ICogcHkgLSBwM3kgKiBweCArIHB4ICogcDF5IC0gcDF4ICogcHkgPj0gMCA/IDEgOiAtMTtcblx0fVxufVxuIl19
|
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJpYW5ndWxhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1RyaWFuZ3VsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUF3QixJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEQsTUFBTSxPQUFPLFlBQVk7SUFDaEIsY0FBYyxHQUFHLEVBQXFCLENBQUM7SUFDdkMscUJBQXFCLEdBQUcsRUFBcUIsQ0FBQztJQUU5QyxZQUFZLEdBQUcsRUFBYyxDQUFDO0lBQzlCLGNBQWMsR0FBRyxFQUFlLENBQUM7SUFDakMsU0FBUyxHQUFHLEVBQWMsQ0FBQztJQUUzQixXQUFXLEdBQUcsSUFBSSxJQUFJLENBQWdCLEdBQUcsRUFBRTtRQUNsRCxPQUFPLEVBQWMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVLLGtCQUFrQixHQUFHLElBQUksSUFBSSxDQUFnQixHQUFHLEVBQUU7UUFDekQsT0FBTyxFQUFjLENBQUM7SUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFFSSxXQUFXLENBQUUsYUFBOEI7UUFDakQsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDO1FBQy9CLElBQUksV0FBVyxHQUFHLGFBQWEsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBRTVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDbEMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUU7WUFDbkMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVoQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3RDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFO1lBQ25DLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTFFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFckIsT0FBTyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsZ0JBQWdCO1lBQ2hCLElBQUksUUFBUSxHQUFHLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBQ2Isb0VBQW9FO2dCQUNwRSxLQUFLLEVBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNuQixNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqRixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ2pELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDakQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNqRCxLQUFLLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLFFBQVEsR0FBRyxDQUFDO3dCQUN2RSxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOzRCQUNuQixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUMzQixNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQzdDLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7bUNBQ3hELFlBQVksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO21DQUN4RCxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO2dDQUFFLE1BQU0sS0FBSyxDQUFDO3dCQUN4RSxDQUFDO3dCQUNELElBQUksRUFBRSxFQUFFLEtBQUssV0FBVzs0QkFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUVsQyxDQUFDO29CQUNELE1BQU07Z0JBQ1AsQ0FBQztnQkFFRCxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDaEIsR0FBRyxDQUFDO3dCQUNILElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDOzRCQUFFLE1BQU07d0JBQ3pCLENBQUMsRUFBRSxDQUFDO29CQUNMLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNoQixRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZDLE1BQU07Z0JBQ1AsQ0FBQztnQkFFRCxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLElBQUksS0FBSyxXQUFXO29CQUFFLElBQUksR0FBRyxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUVELGVBQWU7WUFDZixTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsV0FBVyxFQUFFLENBQUM7WUFFZCxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pHLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxJQUFJLFdBQVcsS0FBSyxDQUFDO1lBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxTQUFTLENBQUUsYUFBNEIsRUFBRSxTQUF3QjtRQUNoRSxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUM7UUFDL0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6QyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUUxQixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUN6RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkQscUJBQXFCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVqQyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEQsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFMUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN4QyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVuQiwwREFBMEQ7UUFDMUQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyRCxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckYsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFL0MscUhBQXFIO1lBQ3JILElBQUksWUFBWSxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUN6QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssV0FBVzt1QkFDeEcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsRUFBRSxDQUFDO29CQUNsRyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDckIsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDeEIsU0FBUztnQkFDVixDQUFDO1lBQ0YsQ0FBQztZQUVELDZDQUE2QztZQUM3QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdCLHFCQUFxQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDM0MsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BDLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkQsQ0FBQztZQUNELE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckIsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDMUIsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0QsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IscUJBQXFCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCwwREFBMEQ7UUFDMUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxTQUFTO1lBQzFDLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLFNBQVMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUUxRCxPQUFPLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2RCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6RixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQy9CLElBQUksRUFBRSxLQUFLLENBQUM7b0JBQUUsU0FBUztnQkFDdkIsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQy9DLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUFFLFNBQVM7Z0JBQ3hDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFdkMsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBRWpGLElBQUksZUFBZSxLQUFLLFVBQVUsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTO29CQUFFLFNBQVM7Z0JBQy9FLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLE9BQU87dUJBQzVFLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDaEYsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ3JCLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDckIsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDcEMsU0FBUyxHQUFHLGNBQWMsQ0FBQztvQkFDM0IsU0FBUyxHQUFHLEtBQUssQ0FBQztvQkFDbEIsU0FBUyxHQUFHLEtBQUssQ0FBQztvQkFDbEIsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDWCxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNYLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDVCxDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7UUFFRCxtREFBbUQ7UUFDbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckQsT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsY0FBYyxHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN6QyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO2dCQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7O2dCQUNBLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN2QixDQUFDO0lBRU8sTUFBTSxDQUFDLFNBQVMsQ0FBRSxLQUFhLEVBQUUsV0FBbUIsRUFBRSxRQUF5QixFQUFFLE9BQXdCO1FBQ2hILE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUNySSxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxZQUFZLENBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXO1FBQ3hHLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTyxNQUFNLENBQUMsT0FBTyxDQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVztRQUNuRyxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IHR5cGUgTnVtYmVyQXJyYXlMaWtlLCBQb29sIH0gZnJvbSBcIi4vVXRpbHMuanNcIjtcblxuZXhwb3J0IGNsYXNzIFRyaWFuZ3VsYXRvciB7XG5cdHByaXZhdGUgY29udmV4UG9seWdvbnMgPSBbXSBhcyBBcnJheTxudW1iZXI+W107XG5cdHByaXZhdGUgY29udmV4UG9seWdvbnNJbmRpY2VzID0gW10gYXMgQXJyYXk8bnVtYmVyPltdO1xuXG5cdHByaXZhdGUgaW5kaWNlc0FycmF5ID0gW10gYXMgbnVtYmVyW107XG5cdHByaXZhdGUgaXNDb25jYXZlQXJyYXkgPSBbXSBhcyBib29sZWFuW107XG5cdHByaXZhdGUgdHJpYW5nbGVzID0gW10gYXMgbnVtYmVyW107XG5cblx0cHJpdmF0ZSBwb2x5Z29uUG9vbCA9IG5ldyBQb29sPEFycmF5PG51bWJlcj4+KCgpID0+IHtcblx0XHRyZXR1cm4gW10gYXMgbnVtYmVyW107XG5cdH0pO1xuXG5cdHByaXZhdGUgcG9seWdvbkluZGljZXNQb29sID0gbmV3IFBvb2w8QXJyYXk8bnVtYmVyPj4oKCkgPT4ge1xuXHRcdHJldHVybiBbXSBhcyBudW1iZXJbXTtcblx0fSk7XG5cblx0cHVibGljIHRyaWFuZ3VsYXRlICh2ZXJ0aWNlc0FycmF5OiBOdW1iZXJBcnJheUxpa2UpOiBBcnJheTxudW1iZXI+IHtcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IHZlcnRpY2VzQXJyYXk7XG5cdFx0bGV0IHZlcnRleENvdW50ID0gdmVydGljZXNBcnJheS5sZW5ndGggPj4gMTtcblxuXHRcdGNvbnN0IGluZGljZXMgPSB0aGlzLmluZGljZXNBcnJheTtcblx0XHRpbmRpY2VzLmxlbmd0aCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0aW5kaWNlc1tpXSA9IGk7XG5cblx0XHRjb25zdCBpc0NvbmNhdmUgPSB0aGlzLmlzQ29uY2F2ZUFycmF5O1xuXHRcdGlzQ29uY2F2ZS5sZW5ndGggPSAwO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKylcblx0XHRcdGlzQ29uY2F2ZVtpXSA9IFRyaWFuZ3VsYXRvci5pc0NvbmNhdmUoaSwgdmVydGV4Q291bnQsIHZlcnRpY2VzLCBpbmRpY2VzKTtcblxuXHRcdGNvbnN0IHRyaWFuZ2xlcyA9IHRoaXMudHJpYW5nbGVzO1xuXHRcdHRyaWFuZ2xlcy5sZW5ndGggPSAwO1xuXG5cdFx0d2hpbGUgKHZlcnRleENvdW50ID4gMykge1xuXHRcdFx0Ly8gRmluZCBlYXIgdGlwLlxuXHRcdFx0bGV0IHByZXZpb3VzID0gdmVydGV4Q291bnQgLSAxLCBpID0gMCwgbmV4dCA9IDE7XG5cdFx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQ29uZnVzaW5nTGFiZWxzOiByZWZlcmVuY2UgcnVudGltZVxuXHRcdFx0XHRvdXRlcjpcblx0XHRcdFx0aWYgKCFpc0NvbmNhdmVbaV0pIHtcblx0XHRcdFx0XHRjb25zdCBwMSA9IGluZGljZXNbcHJldmlvdXNdIDw8IDEsIHAyID0gaW5kaWNlc1tpXSA8PCAxLCBwMyA9IGluZGljZXNbbmV4dF0gPDwgMTtcblx0XHRcdFx0XHRjb25zdCBwMXggPSB2ZXJ0aWNlc1twMV0sIHAxeSA9IHZlcnRpY2VzW3AxICsgMV07XG5cdFx0XHRcdFx0Y29uc3QgcDJ4ID0gdmVydGljZXNbcDJdLCBwMnkgPSB2ZXJ0aWNlc1twMiArIDFdO1xuXHRcdFx0XHRcdGNvbnN0IHAzeCA9IHZlcnRpY2VzW3AzXSwgcDN5ID0gdmVydGljZXNbcDMgKyAxXTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IG5leHQgKyAxIDwgdmVydGV4Q291bnQgPyBuZXh0ICsgMSA6IDA7IGlpICE9PSBwcmV2aW91czspIHtcblx0XHRcdFx0XHRcdGlmIChpc0NvbmNhdmVbaWldKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHYgPSBpbmRpY2VzW2lpXSA8PCAxO1xuXHRcdFx0XHRcdFx0XHRjb25zdCB2eCA9IHZlcnRpY2VzW3ZdLCB2eSA9IHZlcnRpY2VzW3YgKyAxXTtcblx0XHRcdFx0XHRcdFx0aWYgKFRyaWFuZ3VsYXRvci5wb3NpdGl2ZUFyZWEocDN4LCBwM3ksIHAxeCwgcDF5LCB2eCwgdnkpIC8vXG5cdFx0XHRcdFx0XHRcdFx0JiYgVHJpYW5ndWxhdG9yLnBvc2l0aXZlQXJlYShwMXgsIHAxeSwgcDJ4LCBwMnksIHZ4LCB2eSkgLy9cblx0XHRcdFx0XHRcdFx0XHQmJiBUcmlhbmd1bGF0b3IucG9zaXRpdmVBcmVhKHAyeCwgcDJ5LCBwM3gsIHAzeSwgdngsIHZ5KSkgYnJlYWsgb3V0ZXI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoKytpaSA9PT0gdmVydGV4Q291bnQpIGlpID0gMDtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChuZXh0ID09PSAwKSB7XG5cdFx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdFx0aWYgKCFpc0NvbmNhdmVbaV0pIGJyZWFrO1xuXHRcdFx0XHRcdFx0aS0tO1xuXHRcdFx0XHRcdH0gd2hpbGUgKGkgPiAwKTtcblx0XHRcdFx0XHRwcmV2aW91cyA9IGkgPiAwID8gaSAtIDEgOiB2ZXJ0ZXhDb3VudCAtIDE7XG5cdFx0XHRcdFx0bmV4dCA9IGkgKyAxIDwgdmVydGV4Q291bnQgPyBpICsgMSA6IDA7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwcmV2aW91cyA9IGk7XG5cdFx0XHRcdGkgPSBuZXh0O1xuXHRcdFx0XHRpZiAoKytuZXh0ID09PSB2ZXJ0ZXhDb3VudCkgbmV4dCA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEN1dCBlYXIgdGlwLlxuXHRcdFx0dHJpYW5nbGVzLnB1c2goaW5kaWNlc1twcmV2aW91c10sIGluZGljZXNbaV0sIGluZGljZXNbbmV4dF0pO1xuXHRcdFx0aW5kaWNlcy5zcGxpY2UoaSwgMSk7XG5cdFx0XHRpc0NvbmNhdmUuc3BsaWNlKGksIDEpO1xuXHRcdFx0dmVydGV4Q291bnQtLTtcblxuXHRcdFx0Y29uc3QgcHJldmlvdXNJbmRleCA9IGkgPiAwID8gaSAtIDEgOiB2ZXJ0ZXhDb3VudCAtIDE7XG5cdFx0XHRjb25zdCBuZXh0SW5kZXggPSBpIDwgdmVydGV4Q291bnQgPyBpIDogMDtcblx0XHRcdGlzQ29uY2F2ZVtwcmV2aW91c0luZGV4XSA9IFRyaWFuZ3VsYXRvci5pc0NvbmNhdmUocHJldmlvdXNJbmRleCwgdmVydGV4Q291bnQsIHZlcnRpY2VzLCBpbmRpY2VzKTtcblx0XHRcdGlzQ29uY2F2ZVtuZXh0SW5kZXhdID0gVHJpYW5ndWxhdG9yLmlzQ29uY2F2ZShuZXh0SW5kZXgsIHZlcnRleENvdW50LCB2ZXJ0aWNlcywgaW5kaWNlcyk7XG5cdFx0fVxuXHRcdGlmICh2ZXJ0ZXhDb3VudCA9PT0gMykgdHJpYW5nbGVzLnB1c2goaW5kaWNlc1syXSwgaW5kaWNlc1swXSwgaW5kaWNlc1sxXSk7XG5cdFx0cmV0dXJuIHRyaWFuZ2xlcztcblx0fVxuXG5cdGRlY29tcG9zZSAodmVydGljZXNBcnJheTogQXJyYXk8bnVtYmVyPiwgdHJpYW5nbGVzOiBBcnJheTxudW1iZXI+KTogQXJyYXk8QXJyYXk8bnVtYmVyPj4ge1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gdmVydGljZXNBcnJheTtcblx0XHRjb25zdCBjb252ZXhQb2x5Z29ucyA9IHRoaXMuY29udmV4UG9seWdvbnM7XG5cdFx0dGhpcy5wb2x5Z29uUG9vbC5mcmVlQWxsKGNvbnZleFBvbHlnb25zKTtcblx0XHRjb252ZXhQb2x5Z29ucy5sZW5ndGggPSAwO1xuXG5cdFx0Y29uc3QgY29udmV4UG9seWdvbnNJbmRpY2VzID0gdGhpcy5jb252ZXhQb2x5Z29uc0luZGljZXM7XG5cdFx0dGhpcy5wb2x5Z29uSW5kaWNlc1Bvb2wuZnJlZUFsbChjb252ZXhQb2x5Z29uc0luZGljZXMpO1xuXHRcdGNvbnZleFBvbHlnb25zSW5kaWNlcy5sZW5ndGggPSAwO1xuXG5cdFx0bGV0IHBvbHlnb25JbmRpY2VzID0gdGhpcy5wb2x5Z29uSW5kaWNlc1Bvb2wub2J0YWluKCk7XG5cdFx0cG9seWdvbkluZGljZXMubGVuZ3RoID0gMDtcblxuXHRcdGxldCBwb2x5Z29uID0gdGhpcy5wb2x5Z29uUG9vbC5vYnRhaW4oKTtcblx0XHRwb2x5Z29uLmxlbmd0aCA9IDA7XG5cblx0XHQvLyBNZXJnZSBzdWJzZXF1ZW50IHRyaWFuZ2xlcyBpZiB0aGV5IGZvcm0gYSB0cmlhbmdsZSBmYW4uXG5cdFx0bGV0IGZhbkJhc2VJbmRleCA9IC0xLCBsYXN0V2luZGluZyA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0cmlhbmdsZXMubGVuZ3RoOyBpIDwgbjsgaSArPSAzKSB7XG5cdFx0XHRjb25zdCB0MSA9IHRyaWFuZ2xlc1tpXSA8PCAxLCB0MiA9IHRyaWFuZ2xlc1tpICsgMV0gPDwgMSwgdDMgPSB0cmlhbmdsZXNbaSArIDJdIDw8IDE7XG5cdFx0XHRjb25zdCB4MSA9IHZlcnRpY2VzW3QxXSwgeTEgPSB2ZXJ0aWNlc1t0MSArIDFdO1xuXHRcdFx0Y29uc3QgeDIgPSB2ZXJ0aWNlc1t0Ml0sIHkyID0gdmVydGljZXNbdDIgKyAxXTtcblx0XHRcdGNvbnN0IHgzID0gdmVydGljZXNbdDNdLCB5MyA9IHZlcnRpY2VzW3QzICsgMV07XG5cblx0XHRcdC8vIElmIHRoZSBiYXNlIG9mIHRoZSBsYXN0IHRyaWFuZ2xlIGlzIHRoZSBzYW1lIGFzIHRoaXMgdHJpYW5nbGUsIGNoZWNrIGlmIHRoZXkgZm9ybSBhIGNvbnZleCBwb2x5Z29uICh0cmlhbmdsZSBmYW4pLlxuXHRcdFx0aWYgKGZhbkJhc2VJbmRleCA9PT0gdDEpIHtcblx0XHRcdFx0Y29uc3QgbyA9IHBvbHlnb24ubGVuZ3RoIC0gNDtcblx0XHRcdFx0aWYgKFRyaWFuZ3VsYXRvci53aW5kaW5nKHBvbHlnb25bb10sIHBvbHlnb25bbyArIDFdLCBwb2x5Z29uW28gKyAyXSwgcG9seWdvbltvICsgM10sIHgzLCB5MykgPT09IGxhc3RXaW5kaW5nXG5cdFx0XHRcdFx0JiYgVHJpYW5ndWxhdG9yLndpbmRpbmcoeDMsIHkzLCBwb2x5Z29uWzBdLCBwb2x5Z29uWzFdLCBwb2x5Z29uWzJdLCBwb2x5Z29uWzNdKSA9PT0gbGFzdFdpbmRpbmcpIHtcblx0XHRcdFx0XHRwb2x5Z29uLnB1c2goeDMsIHkzKTtcblx0XHRcdFx0XHRwb2x5Z29uSW5kaWNlcy5wdXNoKHQzKTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UgbWFrZSB0aGlzIHRyaWFuZ2xlIHRoZSBuZXcgYmFzZS5cblx0XHRcdGlmIChwb2x5Z29uLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29udmV4UG9seWdvbnMucHVzaChwb2x5Z29uKTtcblx0XHRcdFx0Y29udmV4UG9seWdvbnNJbmRpY2VzLnB1c2gocG9seWdvbkluZGljZXMpO1xuXHRcdFx0XHRwb2x5Z29uID0gdGhpcy5wb2x5Z29uUG9vbC5vYnRhaW4oKTtcblx0XHRcdFx0cG9seWdvbkluZGljZXMgPSB0aGlzLnBvbHlnb25JbmRpY2VzUG9vbC5vYnRhaW4oKTtcblx0XHRcdH1cblx0XHRcdHBvbHlnb24ubGVuZ3RoID0gMDtcblx0XHRcdHBvbHlnb24ucHVzaCh4MSwgeTEsIHgyLCB5Mik7XG5cdFx0XHRwb2x5Z29uLnB1c2goeDMsIHkzKTtcblx0XHRcdHBvbHlnb25JbmRpY2VzLmxlbmd0aCA9IDA7XG5cdFx0XHRwb2x5Z29uSW5kaWNlcy5wdXNoKHQxLCB0MiwgdDMpO1xuXHRcdFx0bGFzdFdpbmRpbmcgPSBUcmlhbmd1bGF0b3Iud2luZGluZyh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKTtcblx0XHRcdGZhbkJhc2VJbmRleCA9IHQxO1xuXHRcdH1cblxuXHRcdGlmIChwb2x5Z29uLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnZleFBvbHlnb25zLnB1c2gocG9seWdvbik7XG5cdFx0XHRjb252ZXhQb2x5Z29uc0luZGljZXMucHVzaChwb2x5Z29uSW5kaWNlcyk7XG5cdFx0fVxuXG5cdFx0Ly8gTWVyZ2UgcmVtYWluaW5nIHRyaWFuZ2xlcyB3aXRoIHRoZSBmb3VuZCB0cmlhbmdsZSBmYW5zLlxuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gY29udmV4UG9seWdvbnMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRwb2x5Z29uSW5kaWNlcyA9IGNvbnZleFBvbHlnb25zSW5kaWNlc1tpXTtcblx0XHRcdGlmIChwb2x5Z29uSW5kaWNlcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3QgZmlyc3RJbmRleCA9IHBvbHlnb25JbmRpY2VzWzBdO1xuXHRcdFx0bGV0IGxhc3RJbmRleCA9IHBvbHlnb25JbmRpY2VzW3BvbHlnb25JbmRpY2VzLmxlbmd0aCAtIDFdO1xuXG5cdFx0XHRwb2x5Z29uID0gY29udmV4UG9seWdvbnNbaV07XG5cdFx0XHRjb25zdCBvID0gcG9seWdvbi5sZW5ndGggLSA0O1xuXHRcdFx0bGV0IHByZXZQcmV2WCA9IHBvbHlnb25bb10sIHByZXZQcmV2WSA9IHBvbHlnb25bbyArIDFdO1xuXHRcdFx0bGV0IHByZXZYID0gcG9seWdvbltvICsgMl0sIHByZXZZID0gcG9seWdvbltvICsgM107XG5cdFx0XHRjb25zdCBmaXJzdFggPSBwb2x5Z29uWzBdLCBmaXJzdFkgPSBwb2x5Z29uWzFdO1xuXHRcdFx0Y29uc3Qgc2Vjb25kWCA9IHBvbHlnb25bMl0sIHNlY29uZFkgPSBwb2x5Z29uWzNdO1xuXHRcdFx0Y29uc3Qgd2luZGluZyA9IFRyaWFuZ3VsYXRvci53aW5kaW5nKHByZXZQcmV2WCwgcHJldlByZXZZLCBwcmV2WCwgcHJldlksIGZpcnN0WCwgZmlyc3RZKTtcblxuXHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IG47IGlpKyspIHtcblx0XHRcdFx0aWYgKGlpID09PSBpKSBjb250aW51ZTtcblx0XHRcdFx0Y29uc3Qgb3RoZXJJbmRpY2VzID0gY29udmV4UG9seWdvbnNJbmRpY2VzW2lpXTtcblx0XHRcdFx0aWYgKG90aGVySW5kaWNlcy5sZW5ndGggIT09IDMpIGNvbnRpbnVlO1xuXHRcdFx0XHRjb25zdCBvdGhlckZpcnN0SW5kZXggPSBvdGhlckluZGljZXNbMF07XG5cdFx0XHRcdGNvbnN0IG90aGVyU2Vjb25kSW5kZXggPSBvdGhlckluZGljZXNbMV07XG5cdFx0XHRcdGNvbnN0IG90aGVyTGFzdEluZGV4ID0gb3RoZXJJbmRpY2VzWzJdO1xuXG5cdFx0XHRcdGNvbnN0IG90aGVyUG9seSA9IGNvbnZleFBvbHlnb25zW2lpXTtcblx0XHRcdFx0Y29uc3QgeDMgPSBvdGhlclBvbHlbb3RoZXJQb2x5Lmxlbmd0aCAtIDJdLCB5MyA9IG90aGVyUG9seVtvdGhlclBvbHkubGVuZ3RoIC0gMV07XG5cblx0XHRcdFx0aWYgKG90aGVyRmlyc3RJbmRleCAhPT0gZmlyc3RJbmRleCB8fCBvdGhlclNlY29uZEluZGV4ICE9PSBsYXN0SW5kZXgpIGNvbnRpbnVlO1xuXHRcdFx0XHRpZiAoVHJpYW5ndWxhdG9yLndpbmRpbmcocHJldlByZXZYLCBwcmV2UHJldlksIHByZXZYLCBwcmV2WSwgeDMsIHkzKSA9PT0gd2luZGluZ1xuXHRcdFx0XHRcdCYmIFRyaWFuZ3VsYXRvci53aW5kaW5nKHgzLCB5MywgZmlyc3RYLCBmaXJzdFksIHNlY29uZFgsIHNlY29uZFkpID09PSB3aW5kaW5nKSB7XG5cdFx0XHRcdFx0b3RoZXJQb2x5Lmxlbmd0aCA9IDA7XG5cdFx0XHRcdFx0b3RoZXJJbmRpY2VzLmxlbmd0aCA9IDA7XG5cdFx0XHRcdFx0cG9seWdvbi5wdXNoKHgzLCB5Myk7XG5cdFx0XHRcdFx0cG9seWdvbkluZGljZXMucHVzaChvdGhlckxhc3RJbmRleCk7XG5cdFx0XHRcdFx0bGFzdEluZGV4ID0gb3RoZXJMYXN0SW5kZXg7XG5cdFx0XHRcdFx0cHJldlByZXZYID0gcHJldlg7XG5cdFx0XHRcdFx0cHJldlByZXZZID0gcHJldlk7XG5cdFx0XHRcdFx0cHJldlggPSB4Mztcblx0XHRcdFx0XHRwcmV2WSA9IHkzO1xuXHRcdFx0XHRcdGlpID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZW1wdHkgcG9seWdvbnMgZnJvbSB0aGUgbWVyZ2Ugc3RlcCBhYm92ZS5cblx0XHRmb3IgKGxldCBpID0gY29udmV4UG9seWdvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdHBvbHlnb24gPSBjb252ZXhQb2x5Z29uc1tpXTtcblx0XHRcdGlmIChwb2x5Z29uLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb252ZXhQb2x5Z29ucy5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdHRoaXMucG9seWdvblBvb2wuZnJlZShwb2x5Z29uKTtcblx0XHRcdFx0cG9seWdvbkluZGljZXMgPSBjb252ZXhQb2x5Z29uc0luZGljZXNbaV1cblx0XHRcdFx0Y29udmV4UG9seWdvbnNJbmRpY2VzLnNwbGljZShpLCAxKVxuXHRcdFx0XHR0aGlzLnBvbHlnb25JbmRpY2VzUG9vbC5mcmVlKHBvbHlnb25JbmRpY2VzKTtcblx0XHRcdH0gZWxzZVxuXHRcdFx0XHRwb2x5Z29uLnB1c2gocG9seWdvblswXSwgcG9seWdvblsxXSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnZleFBvbHlnb25zO1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgaXNDb25jYXZlIChpbmRleDogbnVtYmVyLCB2ZXJ0ZXhDb3VudDogbnVtYmVyLCB2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlLCBpbmRpY2VzOiBOdW1iZXJBcnJheUxpa2UpOiBib29sZWFuIHtcblx0XHRjb25zdCBwcmV2aW91cyA9IGluZGljZXNbaW5kZXggPiAwID8gaW5kZXggLSAxIDogdmVydGV4Q291bnQgLSAxXSA8PCAxO1xuXHRcdGNvbnN0IGN1cnJlbnQgPSBpbmRpY2VzW2luZGV4XSA8PCAxO1xuXHRcdGNvbnN0IG5leHQgPSBpbmRpY2VzW2luZGV4ICsgMSA8IHZlcnRleENvdW50ID8gaW5kZXggKyAxIDogMF0gPDwgMTtcblx0XHRyZXR1cm4gIVRyaWFuZ3VsYXRvci5wb3NpdGl2ZUFyZWEodmVydGljZXNbcHJldmlvdXNdLCB2ZXJ0aWNlc1twcmV2aW91cyArIDFdLCB2ZXJ0aWNlc1tjdXJyZW50XSwgdmVydGljZXNbY3VycmVudCArIDFdLCB2ZXJ0aWNlc1tuZXh0XSxcblx0XHRcdHZlcnRpY2VzW25leHQgKyAxXSk7XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBwb3NpdGl2ZUFyZWEgKHAxeDogbnVtYmVyLCBwMXk6IG51bWJlciwgcDJ4OiBudW1iZXIsIHAyeTogbnVtYmVyLCBwM3g6IG51bWJlciwgcDN5OiBudW1iZXIpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gcDF4ICogKHAzeSAtIHAyeSkgKyBwMnggKiAocDF5IC0gcDN5KSArIHAzeCAqIChwMnkgLSBwMXkpID49IDA7XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyB3aW5kaW5nIChwMXg6IG51bWJlciwgcDF5OiBudW1iZXIsIHAyeDogbnVtYmVyLCBwMnk6IG51bWJlciwgcDN4OiBudW1iZXIsIHAzeTogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gcDF4ICogKHAzeSAtIHAyeSkgKyBwMnggKiAocDF5IC0gcDN5KSArIHAzeCAqIChwMnkgLSBwMXkpID49IDAgPyAxIDogLTE7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -26,17 +26,10 @@
|
|
|
26
26
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
27
|
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
28
|
*****************************************************************************/
|
|
29
|
-
import { Physics } from "./
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
import type { Physics } from "./Physics.js";
|
|
30
|
+
import type { Skeleton } from "./Skeleton.js";
|
|
31
|
+
/** The interface for items updated by {@link Skeleton.updateWorldTransform}. */
|
|
32
|
+
export interface Update {
|
|
32
33
|
/** @param physics Determines how physics and other non-deterministic updates are applied. */
|
|
33
|
-
update(physics: Physics): void;
|
|
34
|
-
/** Returns false when this item won't be updated by
|
|
35
|
-
* {@link Skeleton#updateWorldTransform()} because a skin is required and the
|
|
36
|
-
* {@link Skeleton#getSkin() active skin} does not contain this item.
|
|
37
|
-
* @see Skin#getBones()
|
|
38
|
-
* @see Skin#getConstraints()
|
|
39
|
-
* @see BoneData#getSkinRequired()
|
|
40
|
-
* @see ConstraintData#getSkinRequired() */
|
|
41
|
-
isActive(): boolean;
|
|
34
|
+
update(skeleton: Skeleton, physics: Physics): void;
|
|
42
35
|
}
|
package/dist/Update.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated April 5, 2025. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2025, 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
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1VwZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0UiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB0eXBlIHsgUGh5c2ljcyB9IGZyb20gXCIuL1BoeXNpY3MuanNcIjtcbmltcG9ydCB0eXBlIHsgU2tlbGV0b24gfSBmcm9tIFwiLi9Ta2VsZXRvbi5qc1wiO1xuXG4vKiogVGhlIGludGVyZmFjZSBmb3IgaXRlbXMgdXBkYXRlZCBieSB7QGxpbmsgU2tlbGV0b24udXBkYXRlV29ybGRUcmFuc2Zvcm19LiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGUge1xuXHQvKiogQHBhcmFtIHBoeXNpY3MgRGV0ZXJtaW5lcyBob3cgcGh5c2ljcyBhbmQgb3RoZXIgbm9uLWRldGVybWluaXN0aWMgdXBkYXRlcyBhcmUgYXBwbGllZC4gKi9cblx0dXBkYXRlIChza2VsZXRvbjogU2tlbGV0b24sIHBoeXNpY3M6IFBoeXNpY3MpOiB2b2lkO1xufVxuIl19
|
package/dist/Utils.d.ts
CHANGED
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
27
|
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
28
|
*****************************************************************************/
|
|
29
|
-
|
|
30
|
-
import {
|
|
29
|
+
/** biome-ignore-all lint/complexity/noStaticOnlyClass: too much things to update */
|
|
30
|
+
import type { Skeleton } from "./Skeleton.js";
|
|
31
31
|
export interface StringMap<T> {
|
|
32
32
|
[key: string]: T;
|
|
33
33
|
}
|
|
@@ -76,6 +76,8 @@ export declare class Color {
|
|
|
76
76
|
static fromString(hex: string, color?: Color): Color;
|
|
77
77
|
}
|
|
78
78
|
export declare class MathUtils {
|
|
79
|
+
static epsilon: number;
|
|
80
|
+
static epsilon2: number;
|
|
79
81
|
static PI: number;
|
|
80
82
|
static PI2: number;
|
|
81
83
|
static invPI2: number;
|
|
@@ -95,7 +97,16 @@ export declare class MathUtils {
|
|
|
95
97
|
static isPowerOfTwo(value: number): boolean | 0;
|
|
96
98
|
}
|
|
97
99
|
export declare abstract class Interpolation {
|
|
100
|
+
static readonly linear: Interpolation;
|
|
101
|
+
/** Aka "smoothstep". */
|
|
102
|
+
static readonly smooth: Interpolation;
|
|
103
|
+
/** Slow, then fast. */
|
|
104
|
+
static readonly slowFast: Interpolation;
|
|
105
|
+
/** Fast, then slow. */
|
|
106
|
+
static readonly fastSlow: Interpolation;
|
|
107
|
+
static readonly circle: Interpolation;
|
|
98
108
|
protected abstract applyInternal(a: number): number;
|
|
109
|
+
apply(a: number): number;
|
|
99
110
|
apply(start: number, end: number, a: number): number;
|
|
100
111
|
}
|
|
101
112
|
export declare class Pow extends Interpolation {
|
|
@@ -118,7 +129,7 @@ export declare class Utils {
|
|
|
118
129
|
static newShortArray(size: number): IntArrayLike;
|
|
119
130
|
static toFloatArray(array: Array<number>): number[] | Float32Array;
|
|
120
131
|
static toSinglePrecision(value: number): number;
|
|
121
|
-
static webkit602BugfixHelper(alpha: number
|
|
132
|
+
static webkit602BugfixHelper(alpha: number): void;
|
|
122
133
|
static contains<T>(array: Array<T>, element: T, identity?: boolean): boolean;
|
|
123
134
|
static enumValue(type: any, name: string): any;
|
|
124
135
|
}
|