@esotericsoftware/spine-pixi-v8 4.2.100 → 4.2.102

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.
@@ -0,0 +1,45 @@
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
+ import { Skeleton } from "@esotericsoftware/spine-core";
30
+ export declare class CanvasSkeletonRenderer {
31
+ static QUAD_TRIANGLES: number[];
32
+ static VERTEX_SIZE: number;
33
+ private ctx;
34
+ triangleRendering: boolean;
35
+ debugRendering: boolean;
36
+ private vertices;
37
+ private tempColor;
38
+ constructor(context: CanvasRenderingContext2D);
39
+ draw(skeleton: Skeleton): void;
40
+ private drawImages;
41
+ private drawTriangles;
42
+ private drawTriangle;
43
+ private computeRegionVertices;
44
+ private computeMeshVertices;
45
+ }
@@ -0,0 +1,252 @@
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
+ import { Utils, Color, RegionAttachment, MeshAttachment } from "@esotericsoftware/spine-core";
30
+ const worldVertices = Utils.newFloatArray(8);
31
+ export class CanvasSkeletonRenderer {
32
+ static QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
33
+ static VERTEX_SIZE = 2 + 2 + 4;
34
+ ctx;
35
+ triangleRendering = false;
36
+ debugRendering = false;
37
+ vertices = Utils.newFloatArray(8 * 1024);
38
+ tempColor = new Color();
39
+ constructor(context) {
40
+ this.ctx = context;
41
+ }
42
+ draw(skeleton) {
43
+ if (this.triangleRendering)
44
+ this.drawTriangles(skeleton);
45
+ else
46
+ this.drawImages(skeleton);
47
+ }
48
+ drawImages(skeleton) {
49
+ let ctx = this.ctx;
50
+ let color = this.tempColor;
51
+ let skeletonColor = skeleton.color;
52
+ let drawOrder = skeleton.drawOrder;
53
+ if (this.debugRendering)
54
+ ctx.strokeStyle = "green";
55
+ for (let i = 0, n = drawOrder.length; i < n; i++) {
56
+ let slot = drawOrder[i];
57
+ let bone = slot.bone;
58
+ if (!bone.active)
59
+ continue;
60
+ let attachment = slot.getAttachment();
61
+ if (!(attachment instanceof RegionAttachment))
62
+ continue;
63
+ attachment.computeWorldVertices(slot, worldVertices, 0, 2);
64
+ let region = attachment.region;
65
+ let image = (region.texture).getImage();
66
+ let slotColor = slot.color;
67
+ let regionColor = attachment.color;
68
+ color.set(skeletonColor.r * slotColor.r * regionColor.r, skeletonColor.g * slotColor.g * regionColor.g, skeletonColor.b * slotColor.b * regionColor.b, skeletonColor.a * slotColor.a * regionColor.a);
69
+ ctx.save();
70
+ ctx.transform(bone.a, bone.c, bone.b, bone.d, bone.worldX, bone.worldY);
71
+ ctx.translate(attachment.offset[0], attachment.offset[1]);
72
+ ctx.rotate(attachment.rotation * Math.PI / 180);
73
+ let atlasScale = attachment.width / region.originalWidth;
74
+ ctx.scale(atlasScale * attachment.scaleX, atlasScale * attachment.scaleY);
75
+ let w = region.width, h = region.height;
76
+ ctx.translate(w / 2, h / 2);
77
+ if (attachment.region.degrees == 90) {
78
+ let t = w;
79
+ w = h;
80
+ h = t;
81
+ ctx.rotate(-Math.PI / 2);
82
+ }
83
+ ctx.scale(1, -1);
84
+ ctx.translate(-w / 2, -h / 2);
85
+ ctx.globalAlpha = color.a;
86
+ ctx.drawImage(image, image.width * region.u, image.height * region.v, w, h, 0, 0, w, h);
87
+ if (this.debugRendering)
88
+ ctx.strokeRect(0, 0, w, h);
89
+ ctx.restore();
90
+ }
91
+ }
92
+ drawTriangles(skeleton) {
93
+ let ctx = this.ctx;
94
+ let color = this.tempColor;
95
+ let skeletonColor = skeleton.color;
96
+ let drawOrder = skeleton.drawOrder;
97
+ let blendMode = null;
98
+ let vertices = this.vertices;
99
+ let triangles = null;
100
+ for (let i = 0, n = drawOrder.length; i < n; i++) {
101
+ let slot = drawOrder[i];
102
+ let attachment = slot.getAttachment();
103
+ let texture;
104
+ let region;
105
+ if (attachment instanceof RegionAttachment) {
106
+ let regionAttachment = attachment;
107
+ vertices = this.computeRegionVertices(slot, regionAttachment, false);
108
+ triangles = CanvasSkeletonRenderer.QUAD_TRIANGLES;
109
+ texture = (regionAttachment.region.texture).getImage();
110
+ }
111
+ else if (attachment instanceof MeshAttachment) {
112
+ let mesh = attachment;
113
+ vertices = this.computeMeshVertices(slot, mesh, false);
114
+ triangles = mesh.triangles;
115
+ texture = (mesh.region.texture).getImage();
116
+ }
117
+ else
118
+ continue;
119
+ if (texture) {
120
+ if (slot.data.blendMode != blendMode)
121
+ blendMode = slot.data.blendMode;
122
+ let slotColor = slot.color;
123
+ let attachmentColor = attachment.color;
124
+ color.set(skeletonColor.r * slotColor.r * attachmentColor.r, skeletonColor.g * slotColor.g * attachmentColor.g, skeletonColor.b * slotColor.b * attachmentColor.b, skeletonColor.a * slotColor.a * attachmentColor.a);
125
+ ctx.globalAlpha = color.a;
126
+ for (var j = 0; j < triangles.length; j += 3) {
127
+ let t1 = triangles[j] * 8, t2 = triangles[j + 1] * 8, t3 = triangles[j + 2] * 8;
128
+ let x0 = vertices[t1], y0 = vertices[t1 + 1], u0 = vertices[t1 + 6], v0 = vertices[t1 + 7];
129
+ let x1 = vertices[t2], y1 = vertices[t2 + 1], u1 = vertices[t2 + 6], v1 = vertices[t2 + 7];
130
+ let x2 = vertices[t3], y2 = vertices[t3 + 1], u2 = vertices[t3 + 6], v2 = vertices[t3 + 7];
131
+ this.drawTriangle(texture, x0, y0, u0, v0, x1, y1, u1, v1, x2, y2, u2, v2);
132
+ if (this.debugRendering) {
133
+ ctx.strokeStyle = "green";
134
+ ctx.beginPath();
135
+ ctx.moveTo(x0, y0);
136
+ ctx.lineTo(x1, y1);
137
+ ctx.lineTo(x2, y2);
138
+ ctx.lineTo(x0, y0);
139
+ ctx.stroke();
140
+ }
141
+ }
142
+ }
143
+ }
144
+ this.ctx.globalAlpha = 1;
145
+ }
146
+ // Adapted from http://extremelysatisfactorytotalitarianism.com/blog/?p=2120
147
+ // Apache 2 licensed
148
+ drawTriangle(img, x0, y0, u0, v0, x1, y1, u1, v1, x2, y2, u2, v2) {
149
+ let ctx = this.ctx;
150
+ const width = img.width - 1;
151
+ const height = img.height - 1;
152
+ u0 *= width;
153
+ v0 *= height;
154
+ u1 *= width;
155
+ v1 *= height;
156
+ u2 *= width;
157
+ v2 *= height;
158
+ ctx.beginPath();
159
+ ctx.moveTo(x0, y0);
160
+ ctx.lineTo(x1, y1);
161
+ ctx.lineTo(x2, y2);
162
+ ctx.closePath();
163
+ x1 -= x0;
164
+ y1 -= y0;
165
+ x2 -= x0;
166
+ y2 -= y0;
167
+ u1 -= u0;
168
+ v1 -= v0;
169
+ u2 -= u0;
170
+ v2 -= v0;
171
+ let det = u1 * v2 - u2 * v1;
172
+ if (det == 0)
173
+ return;
174
+ det = 1 / det;
175
+ // linear transformation
176
+ const a = (v2 * x1 - v1 * x2) * det;
177
+ const b = (v2 * y1 - v1 * y2) * det;
178
+ const c = (u1 * x2 - u2 * x1) * det;
179
+ const d = (u1 * y2 - u2 * y1) * det;
180
+ // translation
181
+ const e = x0 - a * u0 - c * v0;
182
+ const f = y0 - b * u0 - d * v0;
183
+ ctx.save();
184
+ ctx.transform(a, b, c, d, e, f);
185
+ ctx.clip();
186
+ ctx.drawImage(img, 0, 0);
187
+ ctx.restore();
188
+ }
189
+ computeRegionVertices(slot, region, pma) {
190
+ let skeletonColor = slot.bone.skeleton.color;
191
+ let slotColor = slot.color;
192
+ let regionColor = region.color;
193
+ let alpha = skeletonColor.a * slotColor.a * regionColor.a;
194
+ let multiplier = pma ? alpha : 1;
195
+ let color = this.tempColor;
196
+ color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier, skeletonColor.g * slotColor.g * regionColor.g * multiplier, skeletonColor.b * slotColor.b * regionColor.b * multiplier, alpha);
197
+ region.computeWorldVertices(slot, this.vertices, 0, CanvasSkeletonRenderer.VERTEX_SIZE);
198
+ let vertices = this.vertices;
199
+ let uvs = region.uvs;
200
+ vertices[RegionAttachment.C1R] = color.r;
201
+ vertices[RegionAttachment.C1G] = color.g;
202
+ vertices[RegionAttachment.C1B] = color.b;
203
+ vertices[RegionAttachment.C1A] = color.a;
204
+ vertices[RegionAttachment.U1] = uvs[0];
205
+ vertices[RegionAttachment.V1] = uvs[1];
206
+ vertices[RegionAttachment.C2R] = color.r;
207
+ vertices[RegionAttachment.C2G] = color.g;
208
+ vertices[RegionAttachment.C2B] = color.b;
209
+ vertices[RegionAttachment.C2A] = color.a;
210
+ vertices[RegionAttachment.U2] = uvs[2];
211
+ vertices[RegionAttachment.V2] = uvs[3];
212
+ vertices[RegionAttachment.C3R] = color.r;
213
+ vertices[RegionAttachment.C3G] = color.g;
214
+ vertices[RegionAttachment.C3B] = color.b;
215
+ vertices[RegionAttachment.C3A] = color.a;
216
+ vertices[RegionAttachment.U3] = uvs[4];
217
+ vertices[RegionAttachment.V3] = uvs[5];
218
+ vertices[RegionAttachment.C4R] = color.r;
219
+ vertices[RegionAttachment.C4G] = color.g;
220
+ vertices[RegionAttachment.C4B] = color.b;
221
+ vertices[RegionAttachment.C4A] = color.a;
222
+ vertices[RegionAttachment.U4] = uvs[6];
223
+ vertices[RegionAttachment.V4] = uvs[7];
224
+ return vertices;
225
+ }
226
+ computeMeshVertices(slot, mesh, pma) {
227
+ let skeletonColor = slot.bone.skeleton.color;
228
+ let slotColor = slot.color;
229
+ let regionColor = mesh.color;
230
+ let alpha = skeletonColor.a * slotColor.a * regionColor.a;
231
+ let multiplier = pma ? alpha : 1;
232
+ let color = this.tempColor;
233
+ color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier, skeletonColor.g * slotColor.g * regionColor.g * multiplier, skeletonColor.b * slotColor.b * regionColor.b * multiplier, alpha);
234
+ let vertexCount = mesh.worldVerticesLength / 2;
235
+ let vertices = this.vertices;
236
+ if (vertices.length < mesh.worldVerticesLength)
237
+ this.vertices = vertices = Utils.newFloatArray(mesh.worldVerticesLength);
238
+ mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, CanvasSkeletonRenderer.VERTEX_SIZE);
239
+ let uvs = mesh.uvs;
240
+ for (let i = 0, u = 0, v = 2; i < vertexCount; i++) {
241
+ vertices[v++] = color.r;
242
+ vertices[v++] = color.g;
243
+ vertices[v++] = color.b;
244
+ vertices[v++] = color.a;
245
+ vertices[v++] = uvs[u++];
246
+ vertices[v++] = uvs[u++];
247
+ v += 2;
248
+ }
249
+ return vertices;
250
+ }
251
+ }
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FudmFzU2tlbGV0b25SZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DYW52YXNTa2VsZXRvblJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBWSxnQkFBZ0IsRUFBYSxjQUFjLEVBQTJDLE1BQU0sOEJBQThCLENBQUM7QUFFNUosTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUU3QyxNQUFNLE9BQU8sc0JBQXNCO0lBQ2xDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdkIsR0FBRyxDQUEyQjtJQUUvQixpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDMUIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN0QixRQUFRLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDekMsU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFFaEMsWUFBYSxPQUFpQztRQUM3QyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxDQUFFLFFBQWtCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGlCQUFpQjtZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7O1lBQ3BELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLFVBQVUsQ0FBRSxRQUFrQjtRQUNyQyxJQUFJLEdBQUcsR0FBRyxJQUFJ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Q3pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7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Q0FBQztZQUN4QixRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDeEIsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN4QixRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1IsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFV0aWxzLCBDb2xvciwgU2tlbGV0b24sIFJlZ2lvbkF0dGFjaG1lbnQsIEJsZW5kTW9kZSwgTWVzaEF0dGFjaG1lbnQsIFNsb3QsIFRleHR1cmVSZWdpb24sIFRleHR1cmVBdGxhc1JlZ2lvbiB9IGZyb20gXCJAZXNvdGVyaWNzb2Z0d2FyZS9zcGluZS1jb3JlXCI7XG5cbmNvbnN0IHdvcmxkVmVydGljZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KDgpO1xuXG5leHBvcnQgY2xhc3MgQ2FudmFzU2tlbGV0b25SZW5kZXJlciB7XG5cdHN0YXRpYyBRVUFEX1RSSUFOR0xFUyA9IFswLCAxLCAyLCAyLCAzLCAwXTtcblx0c3RhdGljIFZFUlRFWF9TSVpFID0gMiArIDIgKyA0O1xuXG5cdHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cblx0cHVibGljIHRyaWFuZ2xlUmVuZGVyaW5nID0gZmFsc2U7XG5cdHB1YmxpYyBkZWJ1Z1JlbmRlcmluZyA9IGZhbHNlO1xuXHRwcml2YXRlIHZlcnRpY2VzID0gVXRpbHMubmV3RmxvYXRBcnJheSg4ICogMTAyNCk7XG5cdHByaXZhdGUgdGVtcENvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0Y29uc3RydWN0b3IgKGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCkge1xuXHRcdHRoaXMuY3R4ID0gY29udGV4dDtcblx0fVxuXG5cdGRyYXcgKHNrZWxldG9uOiBTa2VsZXRvbikge1xuXHRcdGlmICh0aGlzLnRyaWFuZ2xlUmVuZGVyaW5nKSB0aGlzLmRyYXdUcmlhbmdsZXMoc2tlbGV0b24pO1xuXHRcdGVsc2UgdGhpcy5kcmF3SW1hZ2VzKHNrZWxldG9uKTtcblx0fVxuXG5cdHByaXZhdGUgZHJhd0ltYWdlcyAoc2tlbGV0b246IFNrZWxldG9uKSB7XG5cdFx0bGV0IGN0eCA9IHRoaXMuY3R4O1xuXHRcdGxldCBjb2xvciA9IHRoaXMudGVtcENvbG9yO1xuXHRcdGxldCBza2VsZXRvbkNvbG9yID0gc2tlbGV0b24uY29sb3I7XG5cdFx0bGV0IGRyYXdPcmRlciA9IHNrZWxldG9uLmRyYXdPcmRlcjtcblxuXHRcdGlmICh0aGlzLmRlYnVnUmVuZGVyaW5nKSBjdHguc3Ryb2tlU3R5bGUgPSBcImdyZWVuXCI7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGRyYXdPcmRlci5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGxldCBzbG90ID0gZHJhd09yZGVyW2ldO1xuXHRcdFx0bGV0IGJvbmUgPSBzbG90LmJvbmU7XG5cdFx0XHRpZiAoIWJvbmUuYWN0aXZlKSBjb250aW51ZTtcblxuXHRcdFx0bGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblx0XHRcdGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBSZWdpb25BdHRhY2htZW50KSkgY29udGludWU7XG5cdFx0XHRhdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QsIHdvcmxkVmVydGljZXMsIDAsIDIpO1xuXHRcdFx0bGV0IHJlZ2lvbjogVGV4dHVyZVJlZ2lvbiA9IDxUZXh0dXJlUmVnaW9uPmF0dGFjaG1lbnQucmVnaW9uO1xuXG5cdFx0XHRsZXQgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgPSAocmVnaW9uLnRleHR1cmUpLmdldEltYWdlKCkgYXMgSFRNTEltYWdlRWxlbWVudDtcblxuXHRcdFx0bGV0IHNsb3RDb2xvciA9IHNsb3QuY29sb3I7XG5cdFx0XHRsZXQgcmVnaW9uQ29sb3IgPSBhdHRhY2htZW50LmNvbG9yO1xuXHRcdFx0Y29sb3Iuc2V0KHNrZWxldG9uQ29sb3IuciAqIHNsb3RDb2xvci5yICogcmVnaW9uQ29sb3Iucixcblx0XHRcdFx0c2tlbGV0b25Db2xvci5nICogc2xvdENvbG9yLmcgKiByZWdpb25Db2xvci5nLFxuXHRcdFx0XHRza2VsZXRvbkNvbG9yLmIgKiBzbG90Q29sb3IuYiAqIHJlZ2lvbkNvbG9yLmIsXG5cdFx0XHRcdHNrZWxldG9uQ29sb3IuYSAqIHNsb3RDb2xvci5hICogcmVnaW9uQ29sb3IuYSk7XG5cblx0XHRcdGN0eC5zYXZlKCk7XG5cdFx0XHRjdHgudHJhbnNmb3JtKGJvbmUuYSwgYm9uZS5jLCBib25lLmIsIGJvbmUuZCwgYm9uZS53b3JsZFgsIGJvbmUud29ybGRZKTtcblx0XHRcdGN0eC50cmFuc2xhdGUoYXR0YWNobWVudC5vZmZzZXRbMF0sIGF0dGFjaG1lbnQub2Zmc2V0WzFdKTtcblx0XHRcdGN0eC5yb3RhdGUoYXR0YWNobWVudC5yb3RhdGlvbiAqIE1hdGguUEkgLyAxODApO1xuXG5cdFx0XHRsZXQgYXRsYXNTY2FsZSA9IGF0dGFjaG1lbnQud2lkdGggLyByZWdpb24ub3JpZ2luYWxXaWR0aDtcblx0XHRcdGN0eC5zY2FsZShhdGxhc1NjYWxlICogYXR0YWNobWVudC5zY2FsZVgsIGF0bGFzU2NhbGUgKiBhdHRhY2htZW50LnNjYWxlWSk7XG5cblx0XHRcdGxldCB3ID0gcmVnaW9uLndpZHRoLCBoID0gcmVnaW9uLmhlaWdodDtcblx0XHRcdGN0eC50cmFuc2xhdGUodyAvIDIsIGggLyAyKTtcblx0XHRcdGlmIChhdHRhY2htZW50LnJlZ2lvbiEuZGVncmVlcyA9PSA5MCkge1xuXHRcdFx0XHRsZXQgdCA9IHc7XG5cdFx0XHRcdHcgPSBoO1xuXHRcdFx0XHRoID0gdDtcblx0XHRcdFx0Y3R4LnJvdGF0ZSgtTWF0aC5QSSAvIDIpO1xuXHRcdFx0fVxuXHRcdFx0Y3R4LnNjYWxlKDEsIC0xKTtcblx0XHRcdGN0eC50cmFuc2xhdGUoLXcgLyAyLCAtaCAvIDIpO1xuXG5cdFx0XHRjdHguZ2xvYmFsQWxwaGEgPSBjb2xvci5hO1xuXHRcdFx0Y3R4LmRyYXdJbWFnZShpbWFnZSwgaW1hZ2Uud2lkdGggKiByZWdpb24udSwgaW1hZ2UuaGVpZ2h0ICogcmVnaW9uLnYsIHcsIGgsIDAsIDAsIHcsIGgpO1xuXHRcdFx0aWYgKHRoaXMuZGVidWdSZW5kZXJpbmcpIGN0eC5zdHJva2VSZWN0KDAsIDAsIHcsIGgpO1xuXHRcdFx0Y3R4LnJlc3RvcmUoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGRyYXdUcmlhbmdsZXMgKHNrZWxldG9uOiBTa2VsZXRvbikge1xuXHRcdGxldCBjdHggPSB0aGlzLmN0eDtcblx0XHRsZXQgY29sb3IgPSB0aGlzLnRlbXBDb2xvcjtcblx0XHRsZXQgc2tlbGV0b25Db2xvciA9IHNrZWxldG9uLmNvbG9yO1xuXHRcdGxldCBkcmF3T3JkZXIgPSBza2VsZXRvbi5kcmF3T3JkZXI7XG5cblx0XHRsZXQgYmxlbmRNb2RlOiBCbGVuZE1vZGUgfCBudWxsID0gbnVsbDtcblx0XHRsZXQgdmVydGljZXM6IEFycmF5TGlrZTxudW1iZXI+ID0gdGhpcy52ZXJ0aWNlcztcblx0XHRsZXQgdHJpYW5nbGVzOiBBcnJheTxudW1iZXI+IHwgbnVsbCA9IG51bGw7XG5cblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGRyYXdPcmRlci5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGxldCBzbG90ID0gZHJhd09yZGVyW2ldO1xuXHRcdFx0bGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblxuXHRcdFx0bGV0IHRleHR1cmU6IEhUTUxJbWFnZUVsZW1lbnQ7XG5cdFx0XHRsZXQgcmVnaW9uOiBUZXh0dXJlQXRsYXNSZWdpb247XG5cdFx0XHRpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQpIHtcblx0XHRcdFx0bGV0IHJlZ2lvbkF0dGFjaG1lbnQgPSA8UmVnaW9uQXR0YWNobWVudD5hdHRhY2htZW50O1xuXHRcdFx0XHR2ZXJ0aWNlcyA9IHRoaXMuY29tcHV0ZVJlZ2lvblZlcnRpY2VzKHNsb3QsIHJlZ2lvbkF0dGFjaG1lbnQsIGZhbHNlKTtcblx0XHRcdFx0dHJpYW5nbGVzID0gQ2FudmFzU2tlbGV0b25SZW5kZXJlci5RVUFEX1RSSUFOR0xFUztcblx0XHRcdFx0dGV4dHVyZSA9IChyZWdpb25BdHRhY2htZW50LnJlZ2lvbiEudGV4dHVyZSkuZ2V0SW1hZ2UoKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuXHRcdFx0fSBlbHNlIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcblx0XHRcdFx0bGV0IG1lc2ggPSA8TWVzaEF0dGFjaG1lbnQ+YXR0YWNobWVudDtcblx0XHRcdFx0dmVydGljZXMgPSB0aGlzLmNvbXB1dGVNZXNoVmVydGljZXMoc2xvdCwgbWVzaCwgZmFsc2UpO1xuXHRcdFx0XHR0cmlhbmdsZXMgPSBtZXNoLnRyaWFuZ2xlcztcblx0XHRcdFx0dGV4dHVyZSA9IChtZXNoLnJlZ2lvbiEudGV4dHVyZSkuZ2V0SW1hZ2UoKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRpZiAodGV4dHVyZSkge1xuXHRcdFx0XHRpZiAoc2xvdC5kYXRhLmJsZW5kTW9kZSAhPSBibGVuZE1vZGUpIGJsZW5kTW9kZSA9IHNsb3QuZGF0YS5ibGVuZE1vZGU7XG5cblx0XHRcdFx0bGV0IHNsb3RDb2xvciA9IHNsb3QuY29sb3I7XG5cdFx0XHRcdGxldCBhdHRhY2htZW50Q29sb3IgPSBhdHRhY2htZW50LmNvbG9yO1xuXHRcdFx0XHRjb2xvci5zZXQoc2tlbGV0b25Db2xvci5yICogc2xvdENvbG9yLnIgKiBhdHRhY2htZW50Q29sb3Iucixcblx0XHRcdFx0XHRza2VsZXRvbkNvbG9yLmcgKiBzbG90Q29sb3IuZyAqIGF0dGFjaG1lbnRDb2xvci5nLFxuXHRcdFx0XHRcdHNrZWxldG9uQ29sb3IuYiAqIHNsb3RDb2xvci5iICogYXR0YWNobWVudENvbG9yLmIsXG5cdFx0XHRcdFx0c2tlbGV0b25Db2xvci5hICogc2xvdENvbG9yLmEgKiBhdHRhY2htZW50Q29sb3IuYSk7XG5cblx0XHRcdFx0Y3R4Lmdsb2JhbEFscGhhID0gY29sb3IuYTtcblxuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHRyaWFuZ2xlcy5sZW5ndGg7IGogKz0gMykge1xuXHRcdFx0XHRcdGxldCB0MSA9IHRyaWFuZ2xlc1tqXSAqIDgsIHQyID0gdHJpYW5nbGVzW2ogKyAxXSAqIDgsIHQzID0gdHJpYW5nbGVzW2ogKyAyXSAqIDg7XG5cblx0XHRcdFx0XHRsZXQgeDAgPSB2ZXJ0aWNlc1t0MV0sIHkwID0gdmVydGljZXNbdDEgKyAxXSwgdTAgPSB2ZXJ0aWNlc1t0MSArIDZdLCB2MCA9IHZlcnRpY2VzW3QxICsgN107XG5cdFx0XHRcdFx0bGV0IHgxID0gdmVydGljZXNbdDJdLCB5MSA9IHZlcnRpY2VzW3QyICsgMV0sIHUxID0gdmVydGljZXNbdDIgKyA2XSwgdjEgPSB2ZXJ0aWNlc1t0MiArIDddO1xuXHRcdFx0XHRcdGxldCB4MiA9IHZlcnRpY2VzW3QzXSwgeTIgPSB2ZXJ0aWNlc1t0MyArIDFdLCB1MiA9IHZlcnRpY2VzW3QzICsgNl0sIHYyID0gdmVydGljZXNbdDMgKyA3XTtcblxuXHRcdFx0XHRcdHRoaXMuZHJhd1RyaWFuZ2xlKHRleHR1cmUsIHgwLCB5MCwgdTAsIHYwLCB4MSwgeTEsIHUxLCB2MSwgeDIsIHkyLCB1MiwgdjIpO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuZGVidWdSZW5kZXJpbmcpIHtcblx0XHRcdFx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IFwiZ3JlZW5cIjtcblx0XHRcdFx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdFx0XHRcdGN0eC5tb3ZlVG8oeDAsIHkwKTtcblx0XHRcdFx0XHRcdGN0eC5saW5lVG8oeDEsIHkxKTtcblx0XHRcdFx0XHRcdGN0eC5saW5lVG8oeDIsIHkyKTtcblx0XHRcdFx0XHRcdGN0eC5saW5lVG8oeDAsIHkwKTtcblx0XHRcdFx0XHRcdGN0eC5zdHJva2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cdH1cblxuXHQvLyBBZGFwdGVkIGZyb20gaHR0cDovL2V4dHJlbWVseXNhdGlzZmFjdG9yeXRvdGFsaXRhcmlhbmlzbS5jb20vYmxvZy8/cD0yMTIwXG5cdC8vIEFwYWNoZSAyIGxpY2Vuc2VkXG5cdHByaXZhdGUgZHJhd1RyaWFuZ2xlIChpbWc6IEhUTUxJbWFnZUVsZW1lbnQsIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHUwOiBudW1iZXIsIHYwOiBudW1iZXIsXG5cdFx0eDE6IG51bWJlciwgeTE6IG51bWJlciwgdTE6IG51bWJlciwgdjE6IG51bWJlcixcblx0XHR4MjogbnVtYmVyLCB5MjogbnVtYmVyLCB1MjogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG5cdFx0bGV0IGN0eCA9IHRoaXMuY3R4O1xuXG5cdFx0Y29uc3Qgd2lkdGggPSBpbWcud2lkdGggLSAxO1xuXHRcdGNvbnN0IGhlaWdodCA9IGltZy5oZWlnaHQgLSAxO1xuXHRcdHUwICo9IHdpZHRoO1xuXHRcdHYwICo9IGhlaWdodDtcblx0XHR1MSAqPSB3aWR0aDtcblx0XHR2MSAqPSBoZWlnaHQ7XG5cdFx0dTIgKj0gd2lkdGg7XG5cdFx0djIgKj0gaGVpZ2h0O1xuXG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5tb3ZlVG8oeDAsIHkwKTtcblx0XHRjdHgubGluZVRvKHgxLCB5MSk7XG5cdFx0Y3R4LmxpbmVUbyh4MiwgeTIpO1xuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblxuXHRcdHgxIC09IHgwO1xuXHRcdHkxIC09IHkwO1xuXHRcdHgyIC09IHgwO1xuXHRcdHkyIC09IHkwO1xuXG5cdFx0dTEgLT0gdTA7XG5cdFx0djEgLT0gdjA7XG5cdFx0dTIgLT0gdTA7XG5cdFx0djIgLT0gdjA7XG5cblx0XHRsZXQgZGV0ID0gdTEgKiB2MiAtIHUyICogdjE7XG5cdFx0aWYgKGRldCA9PSAwKSByZXR1cm47XG5cdFx0ZGV0ID0gMSAvIGRldDtcblxuXHRcdC8vIGxpbmVhciB0cmFuc2Zvcm1hdGlvblxuXHRcdGNvbnN0IGEgPSAodjIgKiB4MSAtIHYxICogeDIpICogZGV0O1xuXHRcdGNvbnN0IGIgPSAodjIgKiB5MSAtIHYxICogeTIpICogZGV0O1xuXHRcdGNvbnN0IGMgPSAodTEgKiB4MiAtIHUyICogeDEpICogZGV0O1xuXHRcdGNvbnN0IGQgPSAodTEgKiB5MiAtIHUyICogeTEpICogZGV0O1xuXG5cdFx0Ly8gdHJhbnNsYXRpb25cblx0XHRjb25zdCBlID0geDAgLSBhICogdTAgLSBjICogdjA7XG5cdFx0Y29uc3QgZiA9IHkwIC0gYiAqIHUwIC0gZCAqIHYwO1xuXG5cdFx0Y3R4LnNhdmUoKTtcblx0XHRjdHgudHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuXHRcdGN0eC5jbGlwKCk7XG5cdFx0Y3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuXHRcdGN0eC5yZXN0b3JlKCk7XG5cdH1cblxuXHRwcml2YXRlIGNvbXB1dGVSZWdpb25WZXJ0aWNlcyAoc2xvdDogU2xvdCwgcmVnaW9uOiBSZWdpb25BdHRhY2htZW50LCBwbWE6IGJvb2xlYW4pIHtcblx0XHRsZXQgc2tlbGV0b25Db2xvciA9IHNsb3QuYm9uZS5za2VsZXRvbi5jb2xvcjtcblx0XHRsZXQgc2xvdENvbG9yID0gc2xvdC5jb2xvcjtcblx0XHRsZXQgcmVnaW9uQ29sb3IgPSByZWdpb24uY29sb3I7XG5cdFx0bGV0IGFscGhhID0gc2tlbGV0b25Db2xvci5hICogc2xvdENvbG9yLmEgKiByZWdpb25Db2xvci5hO1xuXHRcdGxldCBtdWx0aXBsaWVyID0gcG1hID8gYWxwaGEgOiAxO1xuXHRcdGxldCBjb2xvciA9IHRoaXMudGVtcENvbG9yO1xuXHRcdGNvbG9yLnNldChza2VsZXRvbkNvbG9yLnIgKiBzbG90Q29sb3IuciAqIHJlZ2lvbkNvbG9yLnIgKiBtdWx0aXBsaWVyLFxuXHRcdFx0c2tlbGV0b25Db2xvci5nICogc2xvdENvbG9yLmcgKiByZWdpb25Db2xvci5nICogbXVsdGlwbGllcixcblx0XHRcdHNrZWxldG9uQ29sb3IuYiAqIHNsb3RDb2xvci5iICogcmVnaW9uQ29sb3IuYiAqIG11bHRpcGxpZXIsXG5cdFx0XHRhbHBoYSk7XG5cblx0XHRyZWdpb24uY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgdGhpcy52ZXJ0aWNlcywgMCwgQ2FudmFzU2tlbGV0b25SZW5kZXJlci5WRVJURVhfU0laRSk7XG5cblx0XHRsZXQgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzO1xuXHRcdGxldCB1dnMgPSByZWdpb24udXZzO1xuXG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DMVJdID0gY29sb3Iucjtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LkMxR10gPSBjb2xvci5nO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuQzFCXSA9IGNvbG9yLmI7XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DMUFdID0gY29sb3IuYTtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LlUxXSA9IHV2c1swXTtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LlYxXSA9IHV2c1sxXTtcblxuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuQzJSXSA9IGNvbG9yLnI7XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DMkddID0gY29sb3IuZztcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LkMyQl0gPSBjb2xvci5iO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuQzJBXSA9IGNvbG9yLmE7XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5VMl0gPSB1dnNbMl07XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5WMl0gPSB1dnNbM107XG5cblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LkMzUl0gPSBjb2xvci5yO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuQzNHXSA9IGNvbG9yLmc7XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DM0JdID0gY29sb3IuYjtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LkMzQV0gPSBjb2xvci5hO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuVTNdID0gdXZzWzRdO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuVjNdID0gdXZzWzVdO1xuXG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DNFJdID0gY29sb3Iucjtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LkM0R10gPSBjb2xvci5nO1xuXHRcdHZlcnRpY2VzW1JlZ2lvbkF0dGFjaG1lbnQuQzRCXSA9IGNvbG9yLmI7XG5cdFx0dmVydGljZXNbUmVnaW9uQXR0YWNobWVudC5DNEFdID0gY29sb3IuYTtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LlU0XSA9IHV2c1s2XTtcblx0XHR2ZXJ0aWNlc1tSZWdpb25BdHRhY2htZW50LlY0XSA9IHV2c1s3XTtcblxuXHRcdHJldHVybiB2ZXJ0aWNlcztcblx0fVxuXG5cdHByaXZhdGUgY29tcHV0ZU1lc2hWZXJ0aWNlcyAoc2xvdDogU2xvdCwgbWVzaDogTWVzaEF0dGFjaG1lbnQsIHBtYTogYm9vbGVhbikge1xuXHRcdGxldCBza2VsZXRvbkNvbG9yID0gc2xvdC5ib25lLnNrZWxldG9uLmNvbG9yO1xuXHRcdGxldCBzbG90Q29sb3IgPSBzbG90LmNvbG9yO1xuXHRcdGxldCByZWdpb25Db2xvciA9IG1lc2guY29sb3I7XG5cdFx0bGV0IGFscGhhID0gc2tlbGV0b25Db2xvci5hICogc2xvdENvbG9yLmEgKiByZWdpb25Db2xvci5hO1xuXHRcdGxldCBtdWx0aXBsaWVyID0gcG1hID8gYWxwaGEgOiAxO1xuXHRcdGxldCBjb2xvciA9IHRoaXMudGVtcENvbG9yO1xuXHRcdGNvbG9yLnNldChza2VsZXRvbkNvbG9yLnIgKiBzbG90Q29sb3IuciAqIHJlZ2lvbkNvbG9yLnIgKiBtdWx0aXBsaWVyLFxuXHRcdFx0c2tlbGV0b25Db2xvci5nICogc2xvdENvbG9yLmcgKiByZWdpb25Db2xvci5nICogbXVsdGlwbGllcixcblx0XHRcdHNrZWxldG9uQ29sb3IuYiAqIHNsb3RDb2xvci5iICogcmVnaW9uQ29sb3IuYiAqIG11bHRpcGxpZXIsXG5cdFx0XHRhbHBoYSk7XG5cblx0XHRsZXQgdmVydGV4Q291bnQgPSBtZXNoLndvcmxkVmVydGljZXNMZW5ndGggLyAyO1xuXHRcdGxldCB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG5cdFx0aWYgKHZlcnRpY2VzLmxlbmd0aCA8IG1lc2gud29ybGRWZXJ0aWNlc0xlbmd0aCkgdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzID0gVXRpbHMubmV3RmxvYXRBcnJheShtZXNoLndvcmxkVmVydGljZXNMZW5ndGgpO1xuXHRcdG1lc2guY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgMCwgbWVzaC53b3JsZFZlcnRpY2VzTGVuZ3RoLCB2ZXJ0aWNlcywgMCwgQ2FudmFzU2tlbGV0b25SZW5kZXJlci5WRVJURVhfU0laRSk7XG5cblx0XHRsZXQgdXZzID0gbWVzaC51dnM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIHUgPSAwLCB2ID0gMjsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdHZlcnRpY2VzW3YrK10gPSBjb2xvci5yO1xuXHRcdFx0dmVydGljZXNbdisrXSA9IGNvbG9yLmc7XG5cdFx0XHR2ZXJ0aWNlc1t2KytdID0gY29sb3IuYjtcblx0XHRcdHZlcnRpY2VzW3YrK10gPSBjb2xvci5hO1xuXHRcdFx0dmVydGljZXNbdisrXSA9IHV2c1t1KytdO1xuXHRcdFx0dmVydGljZXNbdisrXSA9IHV2c1t1KytdO1xuXHRcdFx0diArPSAyO1xuXHRcdH1cblxuXHRcdHJldHVybiB2ZXJ0aWNlcztcblx0fVxufVxuIl19