ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
564 lines • 62.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS
* INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import { Utils } from "./Utils";
import { Triangulator } from "./Triangulator";
var SkeletonClipping = /** @class */ (function () {
function SkeletonClipping() {
this.triangulator = new Triangulator();
this.clippingPolygon = new Array();
this.clipOutput = new Array();
this.clippedVertices = new Array();
this.clippedTriangles = new Array();
this.scratch = new Array();
}
/**
* @param {?} slot
* @param {?} clip
* @return {?}
*/
SkeletonClipping.prototype.clipStart = /**
* @param {?} slot
* @param {?} clip
* @return {?}
*/
function (slot, clip) {
if (this.clipAttachment != null)
return 0;
this.clipAttachment = clip;
/** @type {?} */
var n = clip.worldVerticesLength;
/** @type {?} */
var vertices = Utils.setArraySize(this.clippingPolygon, n);
clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);
/** @type {?} */
var clippingPolygon = this.clippingPolygon;
SkeletonClipping.makeClockwise(clippingPolygon);
/** @type {?} */
var clippingPolygons = (this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon)));
for (var i = 0, n_1 = clippingPolygons.length; i < n_1; i++) {
/** @type {?} */
var polygon = clippingPolygons[i];
SkeletonClipping.makeClockwise(polygon);
polygon.push(polygon[0]);
polygon.push(polygon[1]);
}
return clippingPolygons.length;
};
/**
* @param {?} slot
* @return {?}
*/
SkeletonClipping.prototype.clipEndWithSlot = /**
* @param {?} slot
* @return {?}
*/
function (slot) {
if (this.clipAttachment != null && this.clipAttachment.endSlot == slot.data)
this.clipEnd();
};
/**
* @return {?}
*/
SkeletonClipping.prototype.clipEnd = /**
* @return {?}
*/
function () {
if (this.clipAttachment == null)
return;
this.clipAttachment = null;
this.clippingPolygons = null;
this.clippedVertices.length = 0;
this.clippedTriangles.length = 0;
this.clippingPolygon.length = 0;
};
/**
* @return {?}
*/
SkeletonClipping.prototype.isClipping = /**
* @return {?}
*/
function () {
return this.clipAttachment != null;
};
/**
* @param {?} vertices
* @param {?} verticesLength
* @param {?} triangles
* @param {?} trianglesLength
* @param {?} uvs
* @param {?} light
* @param {?} dark
* @param {?} twoColor
* @return {?}
*/
SkeletonClipping.prototype.clipTriangles = /**
* @param {?} vertices
* @param {?} verticesLength
* @param {?} triangles
* @param {?} trianglesLength
* @param {?} uvs
* @param {?} light
* @param {?} dark
* @param {?} twoColor
* @return {?}
*/
function (vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) {
/** @type {?} */
var clipOutput = this.clipOutput;
/** @type {?} */
var clippedVertices = this.clippedVertices;
/** @type {?} */
var clippedTriangles = this.clippedTriangles;
/** @type {?} */
var polygons = this.clippingPolygons;
/** @type {?} */
var polygonsCount = this.clippingPolygons.length;
/** @type {?} */
var vertexSize = twoColor ? 12 : 8;
/** @type {?} */
var index = 0;
clippedVertices.length = 0;
clippedTriangles.length = 0;
outer: for (var i = 0; i < trianglesLength; i += 3) {
/** @type {?} */
var vertexOffset = triangles[i] << 1;
/** @type {?} */
var x1 = vertices[vertexOffset];
/** @type {?} */
var y1 = vertices[vertexOffset + 1];
/** @type {?} */
var u1 = uvs[vertexOffset];
/** @type {?} */
var v1 = uvs[vertexOffset + 1];
vertexOffset = triangles[i + 1] << 1;
/** @type {?} */
var x2 = vertices[vertexOffset];
/** @type {?} */
var y2 = vertices[vertexOffset + 1];
/** @type {?} */
var u2 = uvs[vertexOffset];
/** @type {?} */
var v2 = uvs[vertexOffset + 1];
vertexOffset = triangles[i + 2] << 1;
/** @type {?} */
var x3 = vertices[vertexOffset];
/** @type {?} */
var y3 = vertices[vertexOffset + 1];
/** @type {?} */
var u3 = uvs[vertexOffset];
/** @type {?} */
var v3 = uvs[vertexOffset + 1];
for (var p = 0; p < polygonsCount; p++) {
/** @type {?} */
var s = clippedVertices.length;
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
/** @type {?} */
var clipOutputLength = clipOutput.length;
if (clipOutputLength == 0)
continue;
/** @type {?} */
var d0 = y2 - y3;
/** @type {?} */
var d1 = x3 - x2;
/** @type {?} */
var d2 = x1 - x3;
/** @type {?} */
var d4 = y3 - y1;
/** @type {?} */
var d = 1 / (d0 * d2 + d1 * (y1 - y3));
/** @type {?} */
var clipOutputCount = clipOutputLength >> 1;
/** @type {?} */
var clipOutputItems = this.clipOutput;
/** @type {?} */
var clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
for (var ii = 0; ii < clipOutputLength; ii += 2) {
/** @type {?} */
var x = clipOutputItems[ii];
/** @type {?} */
var y = clipOutputItems[ii + 1];
clippedVerticesItems[s] = x;
clippedVerticesItems[s + 1] = y;
clippedVerticesItems[s + 2] = light.r;
clippedVerticesItems[s + 3] = light.g;
clippedVerticesItems[s + 4] = light.b;
clippedVerticesItems[s + 5] = light.a;
/** @type {?} */
var c0 = x - x3;
/** @type {?} */
var c1 = y - y3;
/** @type {?} */
var a = (d0 * c0 + d1 * c1) * d;
/** @type {?} */
var b = (d4 * c0 + d2 * c1) * d;
/** @type {?} */
var c = 1 - a - b;
clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;
clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;
if (twoColor) {
clippedVerticesItems[s + 8] = dark.r;
clippedVerticesItems[s + 9] = dark.g;
clippedVerticesItems[s + 10] = dark.b;
clippedVerticesItems[s + 11] = dark.a;
}
s += vertexSize;
}
s = clippedTriangles.length;
/** @type {?} */
var clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
clipOutputCount--;
for (var ii = 1; ii < clipOutputCount; ii++) {
clippedTrianglesItems[s] = index;
clippedTrianglesItems[s + 1] = index + ii;
clippedTrianglesItems[s + 2] = index + ii + 1;
s += 3;
}
index += clipOutputCount + 1;
}
else {
/** @type {?} */
var clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * vertexSize);
clippedVerticesItems[s] = x1;
clippedVerticesItems[s + 1] = y1;
clippedVerticesItems[s + 2] = light.r;
clippedVerticesItems[s + 3] = light.g;
clippedVerticesItems[s + 4] = light.b;
clippedVerticesItems[s + 5] = light.a;
if (!twoColor) {
clippedVerticesItems[s + 6] = u1;
clippedVerticesItems[s + 7] = v1;
clippedVerticesItems[s + 8] = x2;
clippedVerticesItems[s + 9] = y2;
clippedVerticesItems[s + 10] = light.r;
clippedVerticesItems[s + 11] = light.g;
clippedVerticesItems[s + 12] = light.b;
clippedVerticesItems[s + 13] = light.a;
clippedVerticesItems[s + 14] = u2;
clippedVerticesItems[s + 15] = v2;
clippedVerticesItems[s + 16] = x3;
clippedVerticesItems[s + 17] = y3;
clippedVerticesItems[s + 18] = light.r;
clippedVerticesItems[s + 19] = light.g;
clippedVerticesItems[s + 20] = light.b;
clippedVerticesItems[s + 21] = light.a;
clippedVerticesItems[s + 22] = u3;
clippedVerticesItems[s + 23] = v3;
}
else {
clippedVerticesItems[s + 6] = u1;
clippedVerticesItems[s + 7] = v1;
clippedVerticesItems[s + 8] = dark.r;
clippedVerticesItems[s + 9] = dark.g;
clippedVerticesItems[s + 10] = dark.b;
clippedVerticesItems[s + 11] = dark.a;
clippedVerticesItems[s + 12] = x2;
clippedVerticesItems[s + 13] = y2;
clippedVerticesItems[s + 14] = light.r;
clippedVerticesItems[s + 15] = light.g;
clippedVerticesItems[s + 16] = light.b;
clippedVerticesItems[s + 17] = light.a;
clippedVerticesItems[s + 18] = u2;
clippedVerticesItems[s + 19] = v2;
clippedVerticesItems[s + 20] = dark.r;
clippedVerticesItems[s + 21] = dark.g;
clippedVerticesItems[s + 22] = dark.b;
clippedVerticesItems[s + 23] = dark.a;
clippedVerticesItems[s + 24] = x3;
clippedVerticesItems[s + 25] = y3;
clippedVerticesItems[s + 26] = light.r;
clippedVerticesItems[s + 27] = light.g;
clippedVerticesItems[s + 28] = light.b;
clippedVerticesItems[s + 29] = light.a;
clippedVerticesItems[s + 30] = u3;
clippedVerticesItems[s + 31] = v3;
clippedVerticesItems[s + 32] = dark.r;
clippedVerticesItems[s + 33] = dark.g;
clippedVerticesItems[s + 34] = dark.b;
clippedVerticesItems[s + 35] = dark.a;
}
s = clippedTriangles.length;
/** @type {?} */
var clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3);
clippedTrianglesItems[s] = index;
clippedTrianglesItems[s + 1] = index + 1;
clippedTrianglesItems[s + 2] = index + 2;
index += 3;
continue outer;
}
}
}
};
/** Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping
* area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list. */
/**
* Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping
* area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list.
* @param {?} x1
* @param {?} y1
* @param {?} x2
* @param {?} y2
* @param {?} x3
* @param {?} y3
* @param {?} clippingArea
* @param {?} output
* @return {?}
*/
SkeletonClipping.prototype.clip = /**
* Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping
* area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list.
* @param {?} x1
* @param {?} y1
* @param {?} x2
* @param {?} y2
* @param {?} x3
* @param {?} y3
* @param {?} clippingArea
* @param {?} output
* @return {?}
*/
function (x1, y1, x2, y2, x3, y3, clippingArea, output) {
/** @type {?} */
var originalOutput = output;
/** @type {?} */
var clipped = false;
// Avoid copy at the end.
/** @type {?} */
var input = null;
if (clippingArea.length % 4 >= 2) {
input = output;
output = this.scratch;
}
else
input = this.scratch;
input.length = 0;
input.push(x1);
input.push(y1);
input.push(x2);
input.push(y2);
input.push(x3);
input.push(y3);
input.push(x1);
input.push(y1);
output.length = 0;
/** @type {?} */
var clippingVertices = clippingArea;
/** @type {?} */
var clippingVerticesLast = clippingArea.length - 4;
for (var i = 0;; i += 2) {
/** @type {?} */
var edgeX = clippingVertices[i];
/** @type {?} */
var edgeY = clippingVertices[i + 1];
/** @type {?} */
var edgeX2 = clippingVertices[i + 2];
/** @type {?} */
var edgeY2 = clippingVertices[i + 3];
/** @type {?} */
var deltaX = edgeX - edgeX2;
/** @type {?} */
var deltaY = edgeY - edgeY2;
/** @type {?} */
var inputVertices = input;
/** @type {?} */
var inputVerticesLength = input.length - 2;
/** @type {?} */
var outputStart = output.length;
for (var ii = 0; ii < inputVerticesLength; ii += 2) {
/** @type {?} */
var inputX = inputVertices[ii];
/** @type {?} */
var inputY = inputVertices[ii + 1];
/** @type {?} */
var inputX2 = inputVertices[ii + 2];
/** @type {?} */
var inputY2 = inputVertices[ii + 3];
/** @type {?} */
var side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0;
if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) {
if (side2) {
// v1 inside, v2 inside
output.push(inputX2);
output.push(inputY2);
continue;
}
// v1 inside, v2 outside
/** @type {?} */
var c0 = inputY2 - inputY;
/** @type {?} */
var c2 = inputX2 - inputX;
/** @type {?} */
var s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY);
if (Math.abs(s) > 0.000001) {
/** @type {?} */
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s;
output.push(edgeX + (edgeX2 - edgeX) * ua);
output.push(edgeY + (edgeY2 - edgeY) * ua);
}
else {
output.push(edgeX);
output.push(edgeY);
}
}
else if (side2) {
// v1 outside, v2 inside
/** @type {?} */
var c0 = inputY2 - inputY;
/** @type {?} */
var c2 = inputX2 - inputX;
/** @type {?} */
var s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY);
if (Math.abs(s) > 0.000001) {
/** @type {?} */
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s;
output.push(edgeX + (edgeX2 - edgeX) * ua);
output.push(edgeY + (edgeY2 - edgeY) * ua);
}
else {
output.push(edgeX);
output.push(edgeY);
}
output.push(inputX2);
output.push(inputY2);
}
clipped = true;
}
if (outputStart == output.length) {
// All edges outside.
originalOutput.length = 0;
return true;
}
output.push(output[0]);
output.push(output[1]);
if (i == clippingVerticesLast)
break;
/** @type {?} */
var temp = output;
output = input;
output.length = 0;
input = temp;
}
if (originalOutput != output) {
originalOutput.length = 0;
for (var i = 0, n = output.length - 2; i < n; i++)
originalOutput[i] = output[i];
}
else
originalOutput.length = originalOutput.length - 2;
return clipped;
};
/**
* @param {?} polygon
* @return {?}
*/
SkeletonClipping.makeClockwise = /**
* @param {?} polygon
* @return {?}
*/
function (polygon) {
/** @type {?} */
var vertices = polygon;
/** @type {?} */
var verticeslength = polygon.length;
/** @type {?} */
var area = vertices[verticeslength - 2] * vertices[1] -
vertices[0] * vertices[verticeslength - 1];
/** @type {?} */
var p1x = 0;
/** @type {?} */
var p1y = 0;
/** @type {?} */
var p2x = 0;
/** @type {?} */
var p2y = 0;
for (var i = 0, n = verticeslength - 3; i < n; i += 2) {
p1x = vertices[i];
p1y = vertices[i + 1];
p2x = vertices[i + 2];
p2y = vertices[i + 3];
area += p1x * p2y - p2x * p1y;
}
if (area < 0)
return;
for (var i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) {
/** @type {?} */
var x = vertices[i];
/** @type {?} */
var y = vertices[i + 1];
/** @type {?} */
var other = lastX - i;
vertices[i] = vertices[other];
vertices[i + 1] = vertices[other + 1];
vertices[other] = x;
vertices[other + 1] = y;
}
};
return SkeletonClipping;
}());
export { SkeletonClipping };
if (false) {
/**
* @type {?}
* @private
*/
SkeletonClipping.prototype.triangulator;
/**
* @type {?}
* @private
*/
SkeletonClipping.prototype.clippingPolygon;
/**
* @type {?}
* @private
*/
SkeletonClipping.prototype.clipOutput;
/** @type {?} */
SkeletonClipping.prototype.clippedVertices;
/** @type {?} */
SkeletonClipping.prototype.clippedTriangles;
/**
* @type {?}
* @private
*/
SkeletonClipping.prototype.scratch;
/**
* @type {?}
* @private
*/
SkeletonClipping.prototype.clipAttachment;
/**
* @type {?}
* @private
*/
SkeletonClipping.prototype.clippingPolygons;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25DbGlwcGluZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL1NrZWxldG9uQ2xpcHBpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QkEsT0FBTyxFQUFhLEtBQUssRUFBUyxNQUFNLFNBQVMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJOUM7SUFBQTtRQUNVLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQyxvQkFBZSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDdEMsZUFBVSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDekMsb0JBQWUsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ3RDLHFCQUFnQixHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDL0IsWUFBTyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFvWHhDLENBQUM7Ozs7OztJQS9XQyxvQ0FBUzs7Ozs7SUFBVCxVQUFVLElBQVUsRUFBRSxJQUF3QjtRQUM1QyxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDOztZQUV2QixDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQjs7WUFDNUIsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1lBQ2xELGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZTtRQUMxQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMs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RyxFQUFFLENBQUM7d0JBQ2pDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUVsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQkFDbkM7eUJBQU07d0JBQ0wsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3JDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNyQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBRXRDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFFdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3FCQUN2QztvQkFFRCxDQUFDLEdB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LEdBQUcsQ0FBQzs7WUFDUCxHQUFHLEdBQUcsQ0FBQztRQUNULEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyRCxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7U0FDL0I7UUFDRCxJQUFJLElBQUksR0FBRyxDQUFDO1lBQUUsT0FBTztRQUVyQixLQUNFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxJQUFJLENBQUMsRUFDOUQsQ0FBQyxHQUFHLENBQUMsRUFDTCxDQUFDLElBQUksQ0FBQyxFQUNOOztnQkFDSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQzs7Z0JBQ2pCLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Z0JBQ2pCLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQztZQUNyQixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0QyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUNILHVCQUFDO0FBQUQsQ0FBQyxBQTFYRCxJQTBYQzs7Ozs7OztJQXpYQyx3Q0FBMEM7Ozs7O0lBQzFDLDJDQUE4Qzs7Ozs7SUFDOUMsc0NBQXlDOztJQUN6QywyQ0FBc0M7O0lBQ3RDLDRDQUF1Qzs7Ozs7SUFDdkMsbUNBQXNDOzs7OztJQUV0QywwQ0FBMkM7Ozs7O0lBQzNDLDRDQUErQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgTWF5IDEsIDIwMTkuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxuICogTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xuICogSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcnJheUxpa2UsIFV0aWxzLCBDb2xvciB9IGZyb20gXCIuL1V0aWxzXCI7XG5pbXBvcnQgeyBUcmlhbmd1bGF0b3IgfSBmcm9tIFwiLi9Ucmlhbmd1bGF0b3JcIjtcbmltcG9ydCB7IENsaXBwaW5nQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0NsaXBwaW5nQXR0YWNobWVudFwiO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCIuL1Nsb3RcIjtcblxuZXhwb3J0IGNsYXNzIFNrZWxldG9uQ2xpcHBpbmcge1xuICBwcml2YXRlIHRyaWFuZ3VsYXRvciA9IG5ldyBUcmlhbmd1bGF0b3IoKTtcbiAgcHJpdmF0ZSBjbGlwcGluZ1BvbHlnb24gPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICBwcml2YXRlIGNsaXBPdXRwdXQgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICBjbGlwcGVkVmVydGljZXMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICBjbGlwcGVkVHJpYW5nbGVzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBzY3JhdGNoID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblxuICBwcml2YXRlIGNsaXBBdHRhY2htZW50OiBDbGlwcGluZ0F0dGFjaG1lbnQ7XG4gIHByaXZhdGUgY2xpcHBpbmdQb2x5Z29uczogQXJyYXk8QXJyYXk8bnVtYmVyPj47XG5cbiAgY2xpcFN0YXJ0KHNsb3Q6IFNsb3QsIGNsaXA6IENsaXBwaW5nQXR0YWNobWVudCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY2xpcEF0dGFjaG1lbnQgIT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgdGhpcy5jbGlwQXR0YWNobWVudCA9IGNsaXA7XG5cbiAgICBsZXQgbiA9IGNsaXAud29ybGRWZXJ0aWNlc0xlbmd0aDtcbiAgICBsZXQgdmVydGljZXMgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy5jbGlwcGluZ1BvbHlnb24sIG4pO1xuICAgIGNsaXAuY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgMCwgbiwgdmVydGljZXMsIDAsIDIpO1xuICAgIGxldCBjbGlwcGluZ1BvbHlnb24gPSB0aGlzLmNsaXBwaW5nUG9seWdvbjtcbiAgICBTa2VsZXRvbkNsaXBwaW5nLm1ha2VDbG9ja3dpc2UoY2xpcHBpbmdQb2x5Z29uKTtcbiAgICBsZXQgY2xpcHBpbmdQb2x5Z29ucyA9ICh0aGlzLmNsaXBwaW5nUG9seWdvbnMgPSB0aGlzLnRyaWFuZ3VsYXRvci5kZWNvbXBvc2UoXG4gICAgICBjbGlwcGluZ1BvbHlnb24sXG4gICAgICB0aGlzLnRyaWFuZ3VsYXRvci50cmlhbmd1bGF0ZShjbGlwcGluZ1BvbHlnb24pXG4gICAgKSk7XG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBjbGlwcGluZ1BvbHlnb25zLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgbGV0IHBvbHlnb24gPSBjbGlwcGluZ1BvbHlnb25zW2ldO1xuICAgICAgU2tlbGV0b25DbGlwcGluZy5tYWtlQ2xvY2t3aXNlKHBvbHlnb24pO1xuICAgICAgcG9seWdvbi5wdXNoKHBvbHlnb25bMF0pO1xuICAgICAgcG9seWdvbi5wdXNoKHBvbHlnb25bMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGluZ1BvbHlnb25zLmxlbmd0aDtcbiAgfVxuXG4gIGNsaXBFbmRXaXRoU2xvdChzbG90OiBTbG90KSB7XG4gICAgaWYgKHRoaXMuY2xpcEF0dGFjaG1lbnQgIT0gbnVsbCAmJiB0aGlzLmNsaXBBdHRhY2htZW50LmVuZFNsb3QgPT0gc2xvdC5kYXRhKVxuICAgICAgdGhpcy5jbGlwRW5kKCk7XG4gIH1cblxuICBjbGlwRW5kKCkge1xuICAgIGlmICh0aGlzLmNsaXBBdHRhY2htZW50ID09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmNsaXBBdHRhY2htZW50ID0gbnVsbDtcbiAgICB0aGlzLmNsaXBwaW5nUG9seWdvbnMgPSBudWxsO1xuICAgIHRoaXMuY2xpcHBlZFZlcnRpY2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5jbGlwcGVkVHJpYW5nbGVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5jbGlwcGluZ1BvbHlnb24ubGVuZ3RoID0gMDtcbiAgfVxuXG4gIGlzQ2xpcHBpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpcEF0dGFjaG1lbnQgIT0gbnVsbDtcbiAgfVxuXG4gIGNsaXBUcmlhbmdsZXMoXG4gICAgdmVydGljZXM6IEFycmF5TGlrZTxudW1iZXI+LFxuICAgIHZlcnRpY2VzTGVuZ3RoOiBudW1iZXIsXG4gICAgdHJpYW5nbGVzOiBBcnJheUxpa2U8bnVtYmVyPixcbiAgICB0cmlhbmdsZXNMZW5ndGg6IG51bWJlcixcbiAgICB1dnM6IEFycmF5TGlrZTxudW1iZXI+LFxuICAgIGxpZ2h0OiBDb2xvcixcbiAgICBkYXJrOiBDb2xvcixcbiAgICB0d29Db2xvcjogYm9vbGVhblxuICApIHtcbiAgICBsZXQgY2xpcE91dHB1dCA9IHRoaXMuY2xpcE91dHB1dCxcbiAgICAgIGNsaXBwZWRWZXJ0aWNlcyA9IHRoaXMuY2xpcHBlZFZlcnRpY2VzO1xuICAgIGxldCBjbGlwcGVkVHJpYW5nbGVzID0gdGhpcy5jbGlwcGVkVHJpYW5nbGVzO1xuICAgIGxldCBwb2x5Z29ucyA9IHRoaXMuY2xpcHBpbmdQb2x5Z29ucztcbiAgICBsZXQgcG9seWdvbnNDb3VudCA9IHRoaXMuY2xpcHBpbmdQb2x5Z29ucy5sZW5ndGg7XG4gICAgbGV0IHZlcnRleFNpemUgPSB0d29Db2xvciA/IDEyIDogODtcblxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY2xpcHBlZFZlcnRpY2VzLmxlbmd0aCA9IDA7XG4gICAgY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGggPSAwO1xuICAgIG91dGVyOiBmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlc0xlbmd0aDsgaSArPSAzKSB7XG4gICAgICBsZXQgdmVydGV4T2Zmc2V0ID0gdHJpYW5nbGVzW2ldIDw8IDE7XG4gICAgICBsZXQgeDEgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXRdLFxuICAgICAgICB5MSA9IHZlcnRpY2VzW3ZlcnRleE9mZnNldCArIDFdO1xuICAgICAgbGV0IHUxID0gdXZzW3ZlcnRleE9mZnNldF0sXG4gICAgICAgIHYxID0gdXZzW3ZlcnRleE9mZnNldCArIDFdO1xuXG4gICAgICB2ZXJ0ZXhPZmZzZXQgPSB0cmlhbmdsZXNbaSArIDFdIDw8IDE7XG4gICAgICBsZXQgeDIgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXRdLFxuICAgICAgICB5MiA9IHZlcnRpY2VzW3ZlcnRleE9mZnNldCArIDFdO1xuICAgICAgbGV0IHUyID0gdXZzW3ZlcnRleE9mZnNldF0sXG4gICAgICAgIHYyID0gdXZzW3ZlcnRleE9mZnNldCArIDFdO1xuXG4gICAgICB2ZXJ0ZXhPZmZzZXQgPSB0cmlhbmdsZXNbaSArIDJdIDw8IDE7XG4gICAgICBsZXQgeDMgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXRdLFxuICAgICAgICB5MyA9IHZlcnRpY2VzW3ZlcnRleE9mZnNldCArIDFdO1xuICAgICAgbGV0IHUzID0gdXZzW3ZlcnRleE9mZnNldF0sXG4gICAgICAgIHYzID0gdXZzW3ZlcnRleE9mZnNldCArIDFdO1xuXG4gICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHBvbHlnb25zQ291bnQ7IHArKykge1xuICAgICAgICBsZXQgcyA9IGNsaXBwZWRWZXJ0aWNlcy5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLmNsaXAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgcG9seWdvbnNbcF0sIGNsaXBPdXRwdXQpKSB7XG4gICAgICAgICAgbGV0IGNsaXBPdXRwdXRMZW5ndGggPSBjbGlwT3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgICBpZiAoY2xpcE91dHB1dExlbmd0aCA9PSAwKSBjb250aW51ZTtcbiAgICAgICAgICBsZXQgZDAgPSB5MiAtIHkzLFxuICAgICAgICAgICAgZDEgPSB4MyAtIHgyLFxuICAgICAgICAgICAgZDIgPSB4MSAtIHgzLFxuICAgICAgICAgICAgZDQgPSB5MyAtIHkxO1xuICAgICAgICAgIGxldCBkID0gMSAvIChkMCAqIGQyICsgZDEgKiAoeTEgLSB5MykpO1xuXG4gICAgICAgICAgbGV0IGNsaXBPdXRwdXRDb3VudCA9IGNsaXBPdXRwdXRMZW5ndGggPj4gMTtcbiAgICAgICAgICBsZXQgY2xpcE91dHB1dEl0ZW1zID0gdGhpcy5jbGlwT3V0cHV0O1xuICAgICAgICAgIGxldCBjbGlwcGVkVmVydGljZXNJdGVtcyA9IFV0aWxzLnNldEFycmF5U2l6ZShcbiAgICAgICAgICAgIGNsaXBwZWRWZXJ0aWNlcyxcbiAgICAgICAgICAgIHMgKyBjbGlwT3V0cHV0Q291bnQgKiB2ZXJ0ZXhTaXplXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgY2xpcE91dHB1dExlbmd0aDsgaWkgKz0gMikge1xuICAgICAgICAgICAgbGV0IHggPSBjbGlwT3V0cHV0SXRlbXNbaWldLFxuICAgICAgICAgICAgICB5ID0gY2xpcE91dHB1dEl0ZW1zW2lpICsgMV07XG4gICAgICAgICAgICBjbGlwcGVkVmVydGljZXNJdGVtc1tzXSA9IHg7XG4gICAgICAgICAgICBjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMV0gPSB5O1xuICAgICAgICAgICAgY2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDJdID0gbGlnaHQucjtcbiAgICAgICAgICAgIGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAzXSA9IGxpZ2h0Lmc7XG4gICAgICAgICAgICBjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgNF0gPSBsaWdodC5iO1xuICAg