ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
453 lines • 44.9 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 { MathUtils } from "./Utils";
var IkConstraint = /** @class */ (function () {
function IkConstraint(data, skeleton) {
this.bendDirection = 0;
this.compress = false;
this.stretch = false;
this.mix = 1;
this.softness = 0;
this.active = false;
if (data == null)
throw new Error("data cannot be null.");
if (skeleton == null)
throw new Error("skeleton cannot be null.");
this.data = data;
this.mix = data.mix;
this.softness = data.softness;
this.bendDirection = data.bendDirection;
this.compress = data.compress;
this.stretch = data.stretch;
this.bones = new Array();
for (var i = 0; i < data.bones.length; i++)
this.bones.push(skeleton.findBone(data.bones[i].name));
this.target = skeleton.findBone(data.target.name);
}
/**
* @return {?}
*/
IkConstraint.prototype.isActive = /**
* @return {?}
*/
function () {
return this.active;
};
/**
* @return {?}
*/
IkConstraint.prototype.apply = /**
* @return {?}
*/
function () {
this.update();
};
/**
* @return {?}
*/
IkConstraint.prototype.update = /**
* @return {?}
*/
function () {
/** @type {?} */
var target = this.target;
/** @type {?} */
var bones = this.bones;
switch (bones.length) {
case 1:
this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix);
break;
case 2:
this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.softness, this.mix);
break;
}
};
/** Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world
* coordinate system. */
/**
* Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world
* coordinate system.
* @param {?} bone
* @param {?} targetX
* @param {?} targetY
* @param {?} compress
* @param {?} stretch
* @param {?} uniform
* @param {?} alpha
* @return {?}
*/
IkConstraint.prototype.apply1 = /**
* Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world
* coordinate system.
* @param {?} bone
* @param {?} targetX
* @param {?} targetY
* @param {?} compress
* @param {?} stretch
* @param {?} uniform
* @param {?} alpha
* @return {?}
*/
function (bone, targetX, targetY, compress, stretch, uniform, alpha) {
if (!bone.appliedValid)
bone.updateAppliedTransform();
/** @type {?} */
var p = bone.parent;
/** @type {?} */
var id = 1 / (p.a * p.d - p.b * p.c);
/** @type {?} */
var x = targetX - p.worldX;
/** @type {?} */
var y = targetY - p.worldY;
/** @type {?} */
var tx = (x * p.d - y * p.b) * id - bone.ax;
/** @type {?} */
var ty = (y * p.a - x * p.c) * id - bone.ay;
/** @type {?} */
var rotationIK = Math.atan2(ty, tx) * MathUtils.radDeg - bone.ashearX - bone.arotation;
if (bone.ascaleX < 0)
rotationIK += 180;
if (rotationIK > 180)
rotationIK -= 360;
else if (rotationIK < -180)
rotationIK += 360;
/** @type {?} */
var sx = bone.ascaleX;
/** @type {?} */
var sy = bone.ascaleY;
if (compress || stretch) {
/** @type {?} */
var b = bone.data.length * sx;
/** @type {?} */
var dd = Math.sqrt(tx * tx + ty * ty);
if ((compress && dd < b) || (stretch && dd > b && b > 0.0001)) {
/** @type {?} */
var s = (dd / b - 1) * alpha + 1;
sx *= s;
if (uniform)
sy *= s;
}
}
bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY);
};
/** Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The
* target is specified in the world coordinate system.
* @param child A direct descendant of the parent bone. */
/**
* Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The
* target is specified in the world coordinate system.
* @param {?} parent
* @param {?} child A direct descendant of the parent bone.
* @param {?} targetX
* @param {?} targetY
* @param {?} bendDir
* @param {?} stretch
* @param {?} softness
* @param {?} alpha
* @return {?}
*/
IkConstraint.prototype.apply2 = /**
* Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The
* target is specified in the world coordinate system.
* @param {?} parent
* @param {?} child A direct descendant of the parent bone.
* @param {?} targetX
* @param {?} targetY
* @param {?} bendDir
* @param {?} stretch
* @param {?} softness
* @param {?} alpha
* @return {?}
*/
function (parent, child, targetX, targetY, bendDir, stretch, softness, alpha) {
if (alpha == 0) {
child.updateWorldTransform();
return;
}
if (!parent.appliedValid)
parent.updateAppliedTransform();
if (!child.appliedValid)
child.updateAppliedTransform();
/** @type {?} */
var px = parent.ax;
/** @type {?} */
var py = parent.ay;
/** @type {?} */
var psx = parent.ascaleX;
/** @type {?} */
var sx = psx;
/** @type {?} */
var psy = parent.ascaleY;
/** @type {?} */
var csx = child.ascaleX;
/** @type {?} */
var os1 = 0;
/** @type {?} */
var os2 = 0;
/** @type {?} */
var s2 = 0;
if (psx < 0) {
psx = -psx;
os1 = 180;
s2 = -1;
}
else {
os1 = 0;
s2 = 1;
}
if (psy < 0) {
psy = -psy;
s2 = -s2;
}
if (csx < 0) {
csx = -csx;
os2 = 180;
}
else
os2 = 0;
/** @type {?} */
var cx = child.ax;
/** @type {?} */
var cy = 0;
/** @type {?} */
var cwx = 0;
/** @type {?} */
var cwy = 0;
/** @type {?} */
var a = parent.a;
/** @type {?} */
var b = parent.b;
/** @type {?} */
var c = parent.c;
/** @type {?} */
var d = parent.d;
/** @type {?} */
var u = Math.abs(psx - psy) <= 0.0001;
if (!u) {
cy = 0;
cwx = a * cx + parent.worldX;
cwy = c * cx + parent.worldY;
}
else {
cy = child.ay;
cwx = a * cx + b * cy + parent.worldX;
cwy = c * cx + d * cy + parent.worldY;
}
/** @type {?} */
var pp = parent.parent;
a = pp.a;
b = pp.b;
c = pp.c;
d = pp.d;
/** @type {?} */
var id = 1 / (a * d - b * c);
/** @type {?} */
var x = cwx - pp.worldX;
/** @type {?} */
var y = cwy - pp.worldY;
/** @type {?} */
var dx = (x * d - y * b) * id - px;
/** @type {?} */
var dy = (y * a - x * c) * id - py;
/** @type {?} */
var l1 = Math.sqrt(dx * dx + dy * dy);
/** @type {?} */
var l2 = child.data.length * csx;
/** @type {?} */
var a1;
/** @type {?} */
var a2;
if (l1 < 0.0001) {
this.apply1(parent, targetX, targetY, false, stretch, false, alpha);
child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
return;
}
x = targetX - pp.worldX;
y = targetY - pp.worldY;
/** @type {?} */
var tx = (x * d - y * b) * id - px;
/** @type {?} */
var ty = (y * a - x * c) * id - py;
/** @type {?} */
var dd = tx * tx + ty * ty;
if (softness != 0) {
softness *= (psx * (csx + 1)) / 2;
/** @type {?} */
var td = Math.sqrt(dd);
/** @type {?} */
var sd = td - l1 - l2 * psx + softness;
if (sd > 0) {
/** @type {?} */
var p = Math.min(1, sd / (softness * 2)) - 1;
p = (sd - softness * (1 - p * p)) / td;
tx -= p * tx;
ty -= p * ty;
dd = tx * tx + ty * ty;
}
}
outer: if (u) {
l2 *= psx;
/** @type {?} */
var cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);
if (cos < -1)
cos = -1;
else if (cos > 1) {
cos = 1;
if (stretch)
sx *= (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;
}
a2 = Math.acos(cos) * bendDir;
a = l1 + l2 * cos;
b = l2 * Math.sin(a2);
a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);
}
else {
a = psx * l2;
b = psy * l2;
/** @type {?} */
var aa = a * a;
/** @type {?} */
var bb = b * b;
/** @type {?} */
var ta = Math.atan2(ty, tx);
c = bb * l1 * l1 + aa * dd - aa * bb;
/** @type {?} */
var c1 = -2 * bb * l1;
/** @type {?} */
var c2 = bb - aa;
d = c1 * c1 - 4 * c2 * c;
if (d >= 0) {
/** @type {?} */
var q = Math.sqrt(d);
if (c1 < 0)
q = -q;
q = -(c1 + q) / 2;
/** @type {?} */
var r0 = q / c2;
/** @type {?} */
var r1 = c / q;
/** @type {?} */
var r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;
if (r * r <= dd) {
y = Math.sqrt(dd - r * r) * bendDir;
a1 = ta - Math.atan2(y, r);
a2 = Math.atan2(y / psy, (r - l1) / psx);
break outer;
}
}
/** @type {?} */
var minAngle = MathUtils.PI;
/** @type {?} */
var minX = l1 - a;
/** @type {?} */
var minDist = minX * minX;
/** @type {?} */
var minY = 0;
/** @type {?} */
var maxAngle = 0;
/** @type {?} */
var maxX = l1 + a;
/** @type {?} */
var maxDist = maxX * maxX;
/** @type {?} */
var maxY = 0;
c = (-a * l1) / (aa - bb);
if (c >= -1 && c <= 1) {
c = Math.acos(c);
x = a * Math.cos(c) + l1;
y = b * Math.sin(c);
d = x * x + y * y;
if (d < minDist) {
minAngle = c;
minDist = d;
minX = x;
minY = y;
}
if (d > maxDist) {
maxAngle = c;
maxDist = d;
maxX = x;
maxY = y;
}
}
if (dd <= (minDist + maxDist) / 2) {
a1 = ta - Math.atan2(minY * bendDir, minX);
a2 = minAngle * bendDir;
}
else {
a1 = ta - Math.atan2(maxY * bendDir, maxX);
a2 = maxAngle * bendDir;
}
}
/** @type {?} */
var os = Math.atan2(cy, cx) * s2;
/** @type {?} */
var rotation = parent.arotation;
a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation;
if (a1 > 180)
a1 -= 360;
else if (a1 < -180)
a1 += 360;
parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, parent.ascaleY, 0, 0);
rotation = child.arotation;
a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation;
if (a2 > 180)
a2 -= 360;
else if (a2 < -180)
a2 += 360;
child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
};
return IkConstraint;
}());
export { IkConstraint };
if (false) {
/** @type {?} */
IkConstraint.prototype.data;
/** @type {?} */
IkConstraint.prototype.bones;
/** @type {?} */
IkConstraint.prototype.target;
/** @type {?} */
IkConstraint.prototype.bendDirection;
/** @type {?} */
IkConstraint.prototype.compress;
/** @type {?} */
IkConstraint.prototype.stretch;
/** @type {?} */
IkConstraint.prototype.mix;
/** @type {?} */
IkConstraint.prototype.softness;
/** @type {?} */
IkConstraint.prototype.active;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWtDb25zdHJhaW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvSWtDb25zdHJhaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFNcEM7SUFVRSxzQkFBWSxJQUFzQixFQUFFLFFBQWtCO1FBTnRELGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixRQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFYixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFELElBQUksUUFBUSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFRLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUks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QUFLLENBQUMsT0FBTyxDQUNkLENBQUM7SUFDSixDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBcFRELElBb1RDOzs7O0lBblRDLDRCQUF1Qjs7SUFDdkIsNkJBQW1COztJQUNuQiw4QkFBYTs7SUFDYixxQ0FBa0I7O0lBQ2xCLGdDQUFpQjs7SUFDakIsK0JBQWdCOztJQUNoQiwyQkFBUTs7SUFDUixnQ0FBYTs7SUFDYiw4QkFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgTWF0aFV0aWxzIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgSWtDb25zdHJhaW50RGF0YSB9IGZyb20gXCIuL0lrQ29uc3RyYWludERhdGFcIjtcclxuaW1wb3J0IHsgQm9uZSB9IGZyb20gXCIuL0JvbmVcIjtcclxuaW1wb3J0IHsgVXBkYXRhYmxlIH0gZnJvbSBcIi4vVXBkYXRhYmxlXCI7XHJcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSBcIi4vU2tlbGV0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJa0NvbnN0cmFpbnQgaW1wbGVtZW50cyBVcGRhdGFibGUge1xyXG4gIGRhdGE6IElrQ29uc3RyYWludERhdGE7XHJcbiAgYm9uZXM6IEFycmF5PEJvbmU+O1xyXG4gIHRhcmdldDogQm9uZTtcclxuICBiZW5kRGlyZWN0aW9uID0gMDtcclxuICBjb21wcmVzcyA9IGZhbHNlO1xyXG4gIHN0cmV0Y2ggPSBmYWxzZTtcclxuICBtaXggPSAxO1xyXG4gIHNvZnRuZXNzID0gMDtcclxuICBhY3RpdmUgPSBmYWxzZTtcclxuICBjb25zdHJ1Y3RvcihkYXRhOiBJa0NvbnN0cmFpbnREYXRhLCBza2VsZXRvbjogU2tlbGV0b24pIHtcclxuICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcImRhdGEgY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgaWYgKHNrZWxldG9uID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLm1peCA9IGRhdGEubWl4O1xyXG4gICAgdGhpcy5zb2Z0bmVzcyA9IGRhdGEuc29mdG5lc3M7XHJcbiAgICB0aGlzLmJlbmREaXJlY3Rpb24gPSBkYXRhLmJlbmREaXJlY3Rpb247XHJcbiAgICB0aGlzLmNvbXByZXNzID0gZGF0YS5jb21wcmVzcztcclxuICAgIHRoaXMuc3RyZXRjaCA9IGRhdGEuc3RyZXRjaDtcclxuICAgIHRoaXMuYm9uZXMgPSBuZXcgQXJyYXk8Qm9uZT4oKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5ib25lcy5sZW5ndGg7IGkrKylcclxuICAgICAgdGhpcy5ib25lcy5wdXNoKHNrZWxldG9uLmZpbmRCb25lKGRhdGEuYm9uZXNbaV0ubmFtZSkpO1xyXG4gICAgdGhpcy50YXJnZXQgPSBza2VsZXRvbi5maW5kQm9uZShkYXRhLnRhcmdldC5uYW1lKTtcclxuICB9XHJcbiAgaXNBY3RpdmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmU7XHJcbiAgfVxyXG4gIGFwcGx5KCkge1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcbiAgdXBkYXRlKCkge1xyXG4gICAgbGV0IHRhcmdldCA9IHRoaXMudGFyZ2V0O1xyXG4gICAgbGV0IGJvbmVzID0gdGhpcy5ib25lcztcclxuICAgIHN3aXRjaCAoYm9uZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICB0aGlzLmFwcGx5MShcclxuICAgICAgICAgIGJvbmVzWzBdLFxyXG4gICAgICAgICAgdGFyZ2V0LndvcmxkWCxcclxuICAgICAgICAgIHRhcmdldC53b3JsZFksXHJcbiAgICAgICAgICB0aGlzLmNvbXByZXNzLFxyXG4gICAgICAgICAgdGhpcy5zdHJldGNoLFxyXG4gICAgICAgICAgdGhpcy5kYXRhLnVuaWZvcm0sXHJcbiAgICAgICAgICB0aGlzLm1peFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICB0aGlzLmFwcGx5MihcclxuICAgICAgICAgIGJvbmVzWzBdLFxyXG4gICAgICAgICAgYm9uZXNbMV0sXHJcbiAgICAgICAgICB0YXJnZXQud29ybGRYLFxyXG4gICAgICAgICAgdGFyZ2V0LndvcmxkWSxcclxuICAgICAgICAgIHRoaXMuYmVuZERpcmVjdGlvbixcclxuICAgICAgICAgIHRoaXMuc3RyZXRjaCxcclxuICAgICAgICAgIHRoaXMuc29mdG5lc3MsXHJcbiAgICAgICAgICB0aGlzLm1peFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKiBBZGp1c3RzIHRoZSBib25lIHJvdGF0aW9uIHNvIHRoZSB0aXAgaXMgYXMgY2xvc2UgdG8gdGhlIHRhcmdldCBwb3NpdGlvbiBhcyBwb3NzaWJsZS4gVGhlIHRhcmdldCBpcyBzcGVjaWZpZWQgaW4gdGhlIHdvcmxkXHJcbiAgICogY29vcmRpbmF0ZSBzeXN0ZW0uICovXHJcbiAgYXBwbHkxKFxyXG4gICAgYm9uZTogQm9uZSxcclxuICAgIHRhcmdldFg6IG51bWJlcixcclxuICAgIHRhcmdldFk6IG51bWJlcixcclxuICAgIGNvbXByZXNzOiBib29sZWFuLFxyXG4gICAgc3RyZXRjaDogYm9vbGVhbixcclxuICAgIHVuaWZvcm06IGJvb2xlYW4sXHJcbiAgICBhbHBoYTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBpZiAoIWJvbmUuYXBwbGllZFZhbGlkKSBib25lLnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgIGxldCBwID0gYm9uZS5wYXJlbnQ7XHJcbiAgICBsZXQgaWQgPSAxIC8gKHAuYSAqIHAuZCAtIHAuYiAqIHAuYyk7XHJcbiAgICBsZXQgeCA9IHRhcmdldFggLSBwLndvcmxkWCxcclxuICAgICAgeSA9IHRhcmdldFkgLSBwLndvcmxkWTtcclxuICAgIGxldCB0eCA9ICh4ICogcC5kIC0geSAqIHAuYikgKiBpZCAtIGJvbmUuYXgsXHJcbiAgICAgIHR5ID0gKHkgKiBwLmEgLSB4ICogcC5jKSAqIGlkIC0gYm9uZS5heTtcclxuICAgIGxldCByb3RhdGlvbklLID1cclxuICAgICAgTWF0aC5hdGFuMih0eSwgdHgpICogTWF0aFV0aWxzLnJhZERlZyAtIGJvbmUuYXNoZWFyWCAtIGJvbmUuYXJvdGF0aW9uO1xyXG4gICAgaWYgKGJvbmUuYXNjYWxlWCA8IDApIHJvdGF0aW9uSUsgKz0gMTgwO1xyXG4gICAgaWYgKHJvdGF0aW9uSUsgPiAxODApIHJvdGF0aW9uSUsgLT0gMzYwO1xyXG4gICAgZWxzZSBpZiAocm90YXRpb25JSyA8IC0xODApIHJvdGF0aW9uSUsgKz0gMzYwO1xyXG4gICAgbGV0IHN4ID0gYm9uZS5hc2NhbGVYLFxyXG4gICAgICBzeSA9IGJvbmUuYXNjYWxlWTtcclxuICAgIGlmIChjb21wcmVzcyB8fCBzdHJldGNoKSB7XHJcbiAgICAgIGxldCBiID0gYm9uZS5kYXRhLmxlbmd0aCAqIHN4LFxyXG4gICAgICAgIGRkID0gTWF0aC5zcXJ0KHR4ICogdHggKyB0eSAqIHR5KTtcclxuICAgICAgaWYgKChjb21wcmVzcyAmJiBkZCA8IGIpIHx8IChzdHJldGNoICYmIGRkID4gYiAmJiBiID4gMC4wMDAxKSkge1xyXG4gICAgICAgIGxldCBzID0gKGRkIC8gYiAtIDEpICogYWxwaGEgKyAxO1xyXG4gICAgICAgIHN4ICo9IHM7XHJcbiAgICAgICAgaWYgKHVuaWZvcm0pIHN5ICo9IHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGJvbmUudXBkYXRlV29ybGRUcmFuc2Zvcm1XaXRoKFxyXG4gICAgICBib25lLmF4LFxyXG4gICAgICBib25lLmF5LFxyXG4gICAgICBib25lLmFyb3RhdGlvbiArIHJvdGF0aW9uSUsgKiBhbHBoYSxcclxuICAgICAgc3gsXHJcbiAgICAgIHN5LFxyXG4gICAgICBib25lLmFzaGVhclgsXHJcbiAgICAgIGJvbmUuYXNoZWFyWVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqIEFkanVzdHMgdGhlIHBhcmVudCBhbmQgY2hpbGQgYm9uZSByb3RhdGlvbnMgc28gdGhlIHRpcCBvZiB0aGUgY2hpbGQgaXMgYXMgY2xvc2UgdG8gdGhlIHRhcmdldCBwb3NpdGlvbiBhcyBwb3NzaWJsZS4gVGhlXHJcbiAgICogdGFyZ2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgd29ybGQgY29vcmRpbmF0ZSBzeXN0ZW0uXHJcbiAgICogQHBhcmFtIGNoaWxkIEEgZGlyZWN0IGRlc2NlbmRhbnQgb2YgdGhlIHBhcmVudCBib25lLiAqL1xyXG4gIGFwcGx5MihcclxuICAgIHBhcmVudDogQm9uZSxcclxuICAgIGNoaWxkOiBCb25lLFxyXG4gICAgdGFyZ2V0WDogbnVtYmVyLFxyXG4gICAgdGFyZ2V0WTogbnVtYmVyLFxyXG4gICAgYmVuZERpcjogbnVtYmVyLFxyXG4gICAgc3RyZXRjaDogYm9vbGVhbixcclxuICAgIHNvZnRuZXNzOiBudW1iZXIsXHJcbiAgICBhbHBoYTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBpZiAoYWxwaGEgPT0gMCkge1xyXG4gICAgICBjaGlsZC51cGRhdGVXb3JsZFRyYW5zZm9ybSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXBhcmVudC5hcHBsaWVkVmFsaWQpIHBhcmVudC51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICBpZiAoIWNoaWxkLmFwcGxpZWRWYWxpZCkgY2hpbGQudXBkYXRlQXBwbGllZFRyYW5zZm9ybSgpO1xyXG4gICAgbGV0IHB4ID0gcGFyZW50LmF4LFxyXG4gICAgICBweSA9IHBhcmVudC5heSxcclxuICAgICAgcHN4ID0gcGFyZW50LmFzY2FsZVgsXHJcbiAgICAgIHN4ID0gcHN4LFxyXG4gICAgICBwc3kgPSBwYXJlbnQuYXNjYWxlWSxcclxuICAgICAgY3N4ID0gY2hpbGQuYXNjYWxlWDtcclxuICAgIGxldCBvczEgPSAwLFxyXG4gICAgICBvczIgPSAwLFxyXG4gICAgICBzMiA9IDA7XHJcbiAgICBpZiAocHN4IDwgMCkge1xyXG4gICAgICBwc3ggPSAtcHN4O1xyXG4gICAgICBvczEgPSAxODA7XHJcbiAgICAgIHMyID0gLTE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvczEgPSAwO1xyXG4gICAgICBzMiA9IDE7XHJcbiAgICB9XHJcbiAgICBpZiAocHN5IDwgMCkge1xyXG4gICAgICBwc3kgPSAtcHN5O1xyXG4gICAgICBzMiA9IC1zMjtcclxuICAgIH1cclxuICAgIGlmIChjc3ggPCAwKSB7XHJcbiAgICAgIGNzeCA9IC1jc3g7XHJcbiAgICAgIG9zMiA9IDE4MDtcclxuICAgIH0gZWxzZSBvczIgPSAwO1xyXG4gICAgbGV0IGN4ID0gY2hpbGQuYXgsXHJcbiAgICAgIGN5ID0gMCxcclxuICAgICAgY3d4ID0gMCxcclxuICAgICAgY3d5ID0gMCxcclxuICAgICAgYSA9IHBhcmVudC5hLFxyXG4gICAgICBiID0gcGFyZW50LmIsXHJcbiAgICAgIGMgPSBwYXJlbnQuYyxcclxuICAgICAgZCA9IHBhcmVudC5kO1xyXG4gICAgbGV0IHUgPSBNYXRoLmFicyhwc3ggLSBwc3kpIDw9IDAuMDAwMTtcclxuICAgIGlmICghdSkge1xyXG4gICAgICBjeSA9IDA7XHJcbiAgICAgIGN3eCA9IGEgKiBjeCArIHBhcmVudC53b3JsZFg7XHJcbiAgICAgIGN3eSA9IGMgKiBjeCArIHBhcmVudC53b3JsZFk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjeSA9IGNoaWxkLmF5O1xyXG4gICAgICBjd3ggPSBhICogY3ggKyBiICogY3kgKyBwYXJlbnQud29ybGRYO1xyXG4gICAgICBjd3kgPSBjICogY3ggKyBkICogY3kgKyBwYXJlbnQud29ybGRZO1xyXG4gICAgfVxyXG4gICAgbGV0IHBwID0gcGFyZW50LnBhcmVudDtcclxuICAgIGEgPSBwcC5hO1xyXG4gICAgYiA9IHBwLmI7XHJcbiAgICBjID0gcHAuYztcclxuICAgIGQgPSBwcC5kO1xyXG4gICAgbGV0IGlkID0gMSAvIChhICogZCAtIGIgKiBjKSxcclxuICAgICAgeCA9IGN3eCAtIHBwLndvcmxkWCxcclxuICAgICAgeSA9IGN3eSAtIHBwLndvcmxkWTtcclxuICAgIGxldCBkeCA9ICh4ICogZCAtIHkgKiBiKSAqIGlkIC0gcHgsXHJcbiAgICAgIGR5ID0gKHkgKiBhIC0geCAqIGMpICogaWQgLSBweTtcclxuICAgIGxldCBsMSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSksXHJcbiAgICAgIGwyID0gY2hpbGQuZGF0YS5sZW5ndGggKiBjc3gsXHJcbiAgICAgIGExLFxyXG4gICAgICBhMjtcclxuICAgIGlmIChsMSA8IDAuMDAwMSkge1xyXG4gICAgICB0aGlzLmFwcGx5MShwYXJlbnQsIHRhcmdldFgsIHRhcmdldFksIGZhbHNlLCBzdHJldGNoLCBmYWxzZSwgYWxwaGEpO1xyXG4gICAgICBjaGlsZC51cGRhdGVXb3JsZFRyYW5zZm9ybVdpdGgoXHJcbiAgICAgICAgY3gsXHJcbiAgICAgICAgY3ksXHJcbiAgICAgICAgMCxcclxuICAgICAgICBjaGlsZC5hc2NhbGVYLFxyXG4gICAgICAgIGNoaWxkLmFzY2FsZVksXHJcbiAgICAgICAgY2hpbGQuYXNoZWFyWCxcclxuICAgICAgICBjaGlsZC5hc2hlYXJZXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHggPSB0YXJnZXRYIC0gcHAud29ybGRYO1xyXG4gICAgeSA9IHRhcmdldFkgLSBwcC53b3JsZFk7XHJcbiAgICBsZXQgdHggPSAoeCAqIGQgLSB5ICogYikgKiBpZCAtIHB4LFxyXG4gICAgICB0eSA9ICh5ICogYSAtIHggKiBjKSAqIGlkIC0gcHk7XHJcbiAgICBsZXQgZGQgPSB0eCAqIHR4ICsgdHkgKiB0eTtcclxuICAgIGlmIChzb2Z0bmVzcyAhPSAwKSB7XHJcbiAgICAgIHNvZnRuZXNzICo9IChwc3ggKiAoY3N4ICsgMSkpIC8gMjtcclxuICAgICAgbGV0IHRkID0gTWF0aC5zcXJ0KGRkKSxcclxuICAgICAgICBzZCA9IHRkIC0gbDEgLSBsMiAqIHBzeCArIHNvZnRuZXNzO1xyXG4gICAgICBpZiAoc2QgPiAwKSB7XHJcbiAgICAgICAgbGV0IHAgPSBNYXRoLm1pbigxLCBzZCAvIChzb2Z0bmVzcyAqIDIpKSAtIDE7XHJcbiAgICAgICAgcCA9IChzZCAtIHNvZnRuZXNzICogKDEgLSBwICogcCkpIC8gdGQ7XHJcbiAgICAgICAgdHggLT0gcCAqIHR4O1xyXG4gICAgICAgIHR5IC09IHAgKiB0eTtcclxuICAgICAgICBkZCA9IHR4ICogdHggKyB0eSAqIHR5O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBvdXRlcjogaWYgKHUpIHtcclxuICAgICAgbDIgKj0gcHN4O1xyXG4gICAgICBsZXQgY29zID0gKGRkIC0gbDEgKiBsMSAtIGwyICogbDIpIC8gKDIgKiBsMSAqIGwyKTtcclxuICAgICAgaWYgKGNvcyA8IC0xKSBjb3MgPSAtMTtcclxuICAgICAgZWxzZSBpZiAoY29zID4gMSkge1xyXG4gICAgICAgIGNvcyA9IDE7XHJcbiAgICAgICAgaWYgKHN0cmV0Y2gpIHN4ICo9IChNYXRoLnNxcnQoZGQpIC8gKGwxICsgbDIpIC0gMSkgKiBhbHBoYSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgYTIgPSBNYXRoLmFjb3MoY29zKSAqIGJlbmREaXI7XHJcbiAgICAgIGEgPSBsMSArIGwyICogY29zO1xyXG4gICAgICBiID0gbDIgKiBNYXRoLnNpbihhMik7XHJcbiAgICAgIGExID0gTWF0aC5hdGFuMih0eSAqIGEgLSB0eCAqIGIsIHR4ICogYSArIHR5ICogYik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhID0gcHN4ICogbDI7XHJcbiAgICAgIGIgPSBwc3kgKiBsMjtcclxuICAgICAgbGV0IGFhID0gYSAqIGEsXHJcbiAgICAgICAgYmIgPSBiICogYixcclxuICAgICAgICB0YSA9IE1hdGguYXRhbjIodHksIHR4KTtcclxuICAgICAgYyA9IGJiICogbDEgKiBsMSArIGFhICogZGQgLSBhYSAqIGJiO1xyXG4gICAgICBsZXQgYzEgPSAtMiAqIGJiICogbDEsXHJcbiAgICAgICAgYzIgPSBiYiAtIGFhO1xyXG4gICAgICBkID0gYzEgKiBjMSAtIDQgKiBjMiAqIGM7XHJcbiAgICAgIGlmIChkID49IDApIHtcclxuICAgICAgICBsZXQgcSA9IE1hdGguc3FydChkKTtcclxuICAgICAgICBpZiAoYzEgPCAwKSBxID0gLXE7XHJcbiAgICAgICAgcSA9IC0oYzEgKyBxKSAvIDI7XHJcbiAgICAgICAgbGV0IHIwID0gcSAvIGMyLFxyXG4gICAgICAgICAgcjEgPSBjIC8gcTtcclxuICAgICAgICBsZXQgciA9IE1hdGguYWJzKHIwKSA8IE1hdGguYWJzKHIxKSA/IHIwIDogcjE7XHJcbiAgICAgICAgaWYgKHIgKiByIDw9IGRkKSB7XHJcbiAgICAgICAgICB5ID0gTWF0aC5zcXJ0KGRkIC0gciAqIHIpICogYmVuZERpcjtcclxuICAgICAgICAgIGExID0gdGEgLSBNYXRoLmF0YW4yKHksIHIpO1xyXG4gICAgICAgICAgYTIgPSBNYXRoLmF0YW4yKHkgLyBwc3ksIChyIC0gbDEpIC8gcHN4KTtcclxuICAgICAgICAgIGJyZWFrIG91dGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgbWluQW5nbGUgPSBNYXRoVXRpbHMuUEksXHJcbiAgICAgICAgbWluWCA9IGwxIC0gYSxcclxuICAgICAgICBtaW5EaXN0ID0gbWluWCAqIG1pblgsXHJcbiAgICAgICAgbWluWSA9IDA7XHJcbiAgICAgIGxldCBtYXhBbmdsZSA9IDAsXHJcbiAgICAgICAgbWF4WCA9IGwxICsgYSxcclxuICAgICAgICBtYXhEaXN0ID0gbWF4WCAqIG1heFgsXHJcbiAgICAgICAgbWF4WSA9IDA7XHJcbiAgICAgIGMgPSAoLWEgKiBsMSkgLyAoYWEgLSBiYik7XHJcbiAgICAgIGlmIChjID49IC0xICYmIGMgPD0gMSkge1xyXG4gICAgICAgIGMgPSBNYXRoLmFjb3MoYyk7XHJcbiAgICAgICAgeCA9IGEgKiBNYXRoLmNvcyhjKSArIGwxO1xyXG4gICAgICAgIHkgPSBiICogTWF0aC5zaW4oYyk7XHJcbiAgICAgICAgZCA9IHggKiB4ICsgeSAqIHk7XHJcbiAgICAgICAgaWYgKGQgPCBtaW5EaXN0KSB7XHJcbiAgICAgICAgICBtaW5BbmdsZSA9IGM7XHJcbiAgICAgICAgICBtaW5EaXN0ID0gZDtcclxuICAgICAgICAgIG1pblggPSB4O1xyXG4gICAgICAgICAgbWluWSA9IHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkID4gbWF4RGlzdCkge1xyXG4gICAgICAgICAgbWF4QW5nbGUgPSBjO1xyXG4gICAgICAgICAgbWF4RGlzdCA9IGQ7XHJcbiAgICAgICAgICBtYXhYID0geDtcclxuICAgICAgICAgIG1heFkgPSB5O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoZGQgPD0gKG1pbkRpc3QgKyBtYXhEaXN0KSAvIDIpIHtcclxuICAgICAgICBhMSA9IHRhIC0gTWF0aC5hdGFuMihtaW5ZICogYmVuZERpciwgbWluWCk7XHJcbiAgICAgICAgYTIgPSBtaW5BbmdsZSAqIGJlbmREaXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYTEgPSB0YSAtIE1hdGguYXRhbjIobWF4WSAqIGJlbmREaXIsIG1heFgpO1xyXG4gICAgICAgIGEyID0gbWF4QW5nbGUgKiBiZW5kRGlyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgb3MgPSBNYXRoLmF0YW4yKGN5LCBjeCkgKiBzMjtcclxuICAgIGxldCByb3RhdGlvbiA9IHBhcmVudC5hcm90YXRpb247XHJcbiAgICBhMSA9IChhMSAtIG9zKSAqIE1hdGhVdGlscy5yYWREZWcgKyBvczEgLSByb3RhdGlvbjtcclxuICAgIGlmIChhMSA+IDE4MCkgYTEgLT0gMzYwO1xyXG4gICAgZWxzZSBpZiAoYTEgPCAtMTgwKSBhMSArPSAzNjA7XHJcbiAgICBwYXJlbnQudXBkYXRlV29ybGRUcmFuc2Zvcm1XaXRoKFxyXG4gICAgICBweCxcclxuICAgICAgcHksXHJcbiAgICAgIHJvdGF0aW9uICsgYTEgKiBhbHBoYSxcclxuICAgICAgc3gsXHJcbiAgICAgIHBhcmVudC5hc2NhbGVZLFxyXG4gICAgICAwLFxyXG4gICAgICAwXHJcbiAgICApO1xyXG4gICAgcm90YXRpb24gPSBjaGlsZC5hcm90YXRpb247XHJcbiAgICBhMiA9ICgoYTIgKyBvcykgKiBNYXRoVXRpbHMucmFkRGVnIC0gY2hpbGQuYXNoZWFyWCkgKiBzMiArIG9zMiAtIHJvdGF0aW9uO1xyXG4gICAgaWYgKGEyID4gMTgwKSBhMiAtPSAzNjA7XHJcbiAgICBlbHNlIGlmIChhMiA8IC0xODApIGEyICs9IDM2MDtcclxuICAgIGNoaWxkLnVwZGF0ZVdvcmxkVHJhbnNmb3JtV2l0aChcclxuICAgICAgY3gsXHJcbiAgICAgIGN5LFxyXG4gICAgICByb3RhdGlvbiArIGEyICogYWxwaGEsXHJcbiAgICAgIGNoaWxkLmFzY2FsZVgsXHJcbiAgICAgIGNoaWxkLmFzY2FsZVksXHJcbiAgICAgIGNoaWxkLmFzaGVhclgsXHJcbiAgICAgIGNoaWxkLmFzaGVhcllcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==