ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
224 lines • 26.6 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, Color } from "../Utils";
import { VertexAttachment } from "./Attachment";
import { TextureAtlasRegion } from "../TextureAtlas";
export class MeshAttachment extends VertexAttachment {
/**
* @param {?} name
*/
constructor(name) {
super(name);
this.color = new Color(1, 1, 1, 1);
this.tempColor = new Color(0, 0, 0, 0);
}
/**
* @return {?}
*/
updateUVs() {
/** @type {?} */
let regionUVs = this.regionUVs;
if (this.uvs == null || this.uvs.length != regionUVs.length)
this.uvs = Utils.newFloatArray(regionUVs.length);
/** @type {?} */
let uvs = this.uvs;
/** @type {?} */
let n = this.uvs.length;
/** @type {?} */
let u = this.region.u;
/** @type {?} */
let v = this.region.v;
/** @type {?} */
let width = 0;
/** @type {?} */
let height = 0;
if (this.region instanceof TextureAtlasRegion) {
/** @type {?} */
let region = this.region;
/** @type {?} */
let textureWidth = region.texture.getImage().width;
/** @type {?} */
let textureHeight = region.texture.getImage().height;
switch (region.degrees) {
case 90:
u -=
(region.originalHeight - region.offsetY - region.height) /
textureWidth;
v -=
(region.originalWidth - region.offsetX - region.width) /
textureHeight;
width = region.originalHeight / textureWidth;
height = region.originalWidth / textureHeight;
for (let i = 0; i < n; i += 2) {
uvs[i] = u + regionUVs[i + 1] * width;
uvs[i + 1] = v + (1 - regionUVs[i]) * height;
}
return;
case 180:
u -=
(region.originalWidth - region.offsetX - region.width) /
textureWidth;
v -= region.offsetY / textureHeight;
width = region.originalWidth / textureWidth;
height = region.originalHeight / textureHeight;
for (let i = 0; i < n; i += 2) {
uvs[i] = u + (1 - regionUVs[i]) * width;
uvs[i + 1] = v + (1 - regionUVs[i + 1]) * height;
}
return;
case 270:
u -= region.offsetY / textureWidth;
v -= region.offsetX / textureHeight;
width = region.originalHeight / textureWidth;
height = region.originalWidth / textureHeight;
for (let i = 0; i < n; i += 2) {
uvs[i] = u + (1 - regionUVs[i + 1]) * width;
uvs[i + 1] = v + regionUVs[i] * height;
}
return;
}
u -= region.offsetX / textureWidth;
v -=
(region.originalHeight - region.offsetY - region.height) /
textureHeight;
width = region.originalWidth / textureWidth;
height = region.originalHeight / textureHeight;
}
else if (this.region == null) {
u = v = 0;
width = height = 1;
}
else {
width = this.region.u2 - u;
height = this.region.v2 - v;
}
for (let i = 0; i < n; i += 2) {
uvs[i] = u + regionUVs[i] * width;
uvs[i + 1] = v + regionUVs[i + 1] * height;
}
}
/**
* @return {?}
*/
getParentMesh() {
return this.parentMesh;
}
/**
* @param {?} parentMesh May be null.
* @return {?}
*/
setParentMesh(parentMesh) {
this.parentMesh = parentMesh;
if (parentMesh != null) {
this.bones = parentMesh.bones;
this.vertices = parentMesh.vertices;
this.worldVerticesLength = parentMesh.worldVerticesLength;
this.regionUVs = parentMesh.regionUVs;
this.triangles = parentMesh.triangles;
this.hullLength = parentMesh.hullLength;
this.worldVerticesLength = parentMesh.worldVerticesLength;
}
}
/**
* @return {?}
*/
copy() {
if (this.parentMesh != null)
return this.newLinkedMesh();
/** @type {?} */
let copy = new MeshAttachment(this.name);
copy.region = this.region;
copy.path = this.path;
copy.color.setFromColor(this.color);
this.copyTo(copy);
copy.regionUVs = new Array(this.regionUVs.length);
Utils.arrayCopy(this.regionUVs, 0, copy.regionUVs, 0, this.regionUVs.length);
copy.uvs = new Array(this.uvs.length);
Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, this.uvs.length);
copy.triangles = new Array(this.triangles.length);
Utils.arrayCopy(this.triangles, 0, copy.triangles, 0, this.triangles.length);
copy.hullLength = this.hullLength;
// Nonessential.
if (this.edges != null) {
copy.edges = new Array(this.edges.length);
Utils.arrayCopy(this.edges, 0, copy.edges, 0, this.edges.length);
}
copy.width = this.width;
copy.height = this.height;
return copy;
}
/**
* @return {?}
*/
newLinkedMesh() {
/** @type {?} */
let copy = new MeshAttachment(this.name);
copy.region = this.region;
copy.path = this.path;
copy.color.setFromColor(this.color);
copy.deformAttachment = this.deformAttachment;
copy.setParentMesh(this.parentMesh != null ? this.parentMesh : this);
copy.updateUVs();
return copy;
}
}
if (false) {
/** @type {?} */
MeshAttachment.prototype.region;
/** @type {?} */
MeshAttachment.prototype.path;
/** @type {?} */
MeshAttachment.prototype.regionUVs;
/** @type {?} */
MeshAttachment.prototype.uvs;
/** @type {?} */
MeshAttachment.prototype.triangles;
/** @type {?} */
MeshAttachment.prototype.color;
/** @type {?} */
MeshAttachment.prototype.width;
/** @type {?} */
MeshAttachment.prototype.height;
/** @type {?} */
MeshAttachment.prototype.hullLength;
/** @type {?} */
MeshAttachment.prototype.edges;
/**
* @type {?}
* @private
*/
MeshAttachment.prototype.parentMesh;
/** @type {?} */
MeshAttachment.prototype.tempColor;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzaEF0dGFjaG1lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BpbmUvIiwic291cmNlcyI6WyJsaWIvc3BpbmUtdHMvY29yZS9hdHRhY2htZW50cy9NZXNoQXR0YWNobWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxPQUFPLEVBQWEsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQWMsTUFBTSxjQUFjLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckQsTUFBTSxPQUFPLGNBQWUsU0FBUSxnQkFBZ0I7Ozs7SUFjbEQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVRkLFVBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQU05QixjQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFJbEMsQ0FBQzs7OztJQUVELFNBQVM7O1lBQ0gsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTO1FBQzlCLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU07WUFDekQsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7WUFDL0MsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHOztZQUNkLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU07O1lBQ25CLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7O1lBQ25CLENBQUMs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QUFDO1FBRTFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7OztJQUVELGFBQWE7O1lBQ1AsSUFBSSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7OztJQTdKQyxnQ0FBc0I7O0lBQ3RCLDhCQUFhOztJQUNiLG1DQUE2Qjs7SUFDN0IsNkJBQXVCOztJQUN2QixtQ0FBeUI7O0lBQ3pCLCtCQUE4Qjs7SUFDOUIsK0JBQWM7O0lBQ2QsZ0NBQWU7O0lBQ2Ysb0NBQW1COztJQUNuQiwrQkFBcUI7Ozs7O0lBQ3JCLG9DQUFtQzs7SUFDbkMsbUNBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxyXG4gKiBMYXN0IHVwZGF0ZWQgTWF5IDEsIDIwMTkuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTksIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xyXG4gKlxyXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcclxuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcclxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcclxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXHJcbiAqXHJcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxyXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXHJcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cclxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XHJcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTXHJcbiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcclxuICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU5cclxuICogTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXHJcbiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsXHJcbiAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgQlVTSU5FU1NcclxuICogSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxyXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcclxuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLFxyXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5pbXBvcnQgeyBBcnJheUxpa2UsIFV0aWxzLCBDb2xvciB9IGZyb20gXCIuLi9VdGlsc1wiO1xyXG5pbXBvcnQgeyBUZXh0dXJlUmVnaW9uIH0gZnJvbSBcIi4uL1RleHR1cmVcIjtcclxuaW1wb3J0IHsgVmVydGV4QXR0YWNobWVudCwgQXR0YWNobWVudCB9IGZyb20gXCIuL0F0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgVGV4dHVyZUF0bGFzUmVnaW9uIH0gZnJvbSBcIi4uL1RleHR1cmVBdGxhc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1lc2hBdHRhY2htZW50IGV4dGVuZHMgVmVydGV4QXR0YWNobWVudCB7XHJcbiAgcmVnaW9uOiBUZXh0dXJlUmVnaW9uO1xyXG4gIHBhdGg6IHN0cmluZztcclxuICByZWdpb25VVnM6IEFycmF5TGlrZTxudW1iZXI+O1xyXG4gIHV2czogQXJyYXlMaWtlPG51bWJlcj47XHJcbiAgdHJpYW5nbGVzOiBBcnJheTxudW1iZXI+O1xyXG4gIGNvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbiAgaHVsbExlbmd0aDogbnVtYmVyO1xyXG4gIGVkZ2VzOiBBcnJheTxudW1iZXI+O1xyXG4gIHByaXZhdGUgcGFyZW50TWVzaDogTWVzaEF0dGFjaG1lbnQ7XHJcbiAgdGVtcENvbG9yID0gbmV3IENvbG9yKDAsIDAsIDAsIDApO1xyXG5cclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVVZzKCkge1xyXG4gICAgbGV0IHJlZ2lvblVWcyA9IHRoaXMucmVnaW9uVVZzO1xyXG4gICAgaWYgKHRoaXMudXZzID09IG51bGwgfHwgdGhpcy51dnMubGVuZ3RoICE9IHJlZ2lvblVWcy5sZW5ndGgpXHJcbiAgICAgIHRoaXMudXZzID0gVXRpbHMubmV3RmxvYXRBcnJheShyZWdpb25VVnMubGVuZ3RoKTtcclxuICAgIGxldCB1dnMgPSB0aGlzLnV2cztcclxuICAgIGxldCBuID0gdGhpcy51dnMubGVuZ3RoO1xyXG4gICAgbGV0IHUgPSB0aGlzLnJlZ2lvbi51LFxyXG4gICAgICB2ID0gdGhpcy5yZWdpb24udixcclxuICAgICAgd2lkdGggPSAwLFxyXG4gICAgICBoZWlnaHQgPSAwO1xyXG4gICAgaWYgKHRoaXMucmVnaW9uIGluc3RhbmNlb2YgVGV4dHVyZUF0bGFzUmVnaW9uKSB7XHJcbiAgICAgIGxldCByZWdpb24gPSB0aGlzLnJlZ2lvbjtcclxuICAgICAgbGV0IHRleHR1cmVXaWR0aCA9IHJlZ2lvbi50ZXh0dXJlLmdldEltYWdlKCkud2lkdGgsXHJcbiAgICAgICAgdGV4dHVyZUhlaWdodCA9IHJlZ2lvbi50ZXh0dXJlLmdldEltYWdlKCkuaGVpZ2h0O1xyXG4gICAgICBzd2l0Y2ggKHJlZ2lvbi5kZWdyZWVzKSB7XHJcbiAgICAgICAgY2FzZSA5MDpcclxuICAgICAgICAgIHUgLT1cclxuICAgICAgICAgICAgKHJlZ2lvbi5vcmlnaW5hbEhlaWdodCAtIHJlZ2lvbi5vZmZzZXRZIC0gcmVnaW9uLmhlaWdodCkgL1xyXG4gICAgICAgICAgICB0ZXh0dXJlV2lkdGg7XHJcbiAgICAgICAgICB2IC09XHJcbiAgICAgICAgICAgIChyZWdpb24ub3JpZ2luYWxXaWR0aCAtIHJlZ2lvbi5vZmZzZXRYIC0gcmVnaW9uLndpZHRoKSAvXHJcbiAgICAgICAgICAgIHRleHR1cmVIZWlnaHQ7XHJcbiAgICAgICAgICB3aWR0aCA9IHJlZ2lvbi5vcmlnaW5hbEhlaWdodCAvIHRleHR1cmVXaWR0aDtcclxuICAgICAgICAgIGhlaWdodCA9IHJlZ2lvbi5vcmlnaW5hbFdpZHRoIC8gdGV4dHVyZUhlaWdodDtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSArPSAyKSB7XHJcbiAgICAgICAgICAgIHV2c1tpXSA9IHUgKyByZWdpb25VVnNbaSArIDFdICogd2lkdGg7XHJcbiAgICAgICAgICAgIHV2c1tpICsgMV0gPSB2ICsgKDEgLSByZWdpb25VVnNbaV0pICogaGVpZ2h0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNhc2UgMTgwOlxyXG4gICAgICAgICAgdSAtPVxyXG4gICAgICAgICAgICAocmVnaW9uLm9yaWdpbmFsV2lkdGggLSByZWdpb24ub2Zmc2V0WCAtIHJlZ2lvbi53aWR0aCkgL1xyXG4gICAgICAgICAgICB0ZXh0dXJlV2lkdGg7XHJcbiAgICAgICAgICB2IC09IHJlZ2lvbi5vZmZzZXRZIC8gdGV4dHVyZUhlaWdodDtcclxuICAgICAgICAgIHdpZHRoID0gcmVnaW9uLm9yaWdpbmFsV2lkdGggLyB0ZXh0dXJlV2lkdGg7XHJcbiAgICAgICAgICBoZWlnaHQgPSByZWdpb24ub3JpZ2luYWxIZWlnaHQgLyB0ZXh0dXJlSGVpZ2h0O1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpICs9IDIpIHtcclxuICAgICAgICAgICAgdXZzW2ldID0gdSArICgxIC0gcmVnaW9uVVZzW2ldKSAqIHdpZHRoO1xyXG4gICAgICAgICAgICB1dnNbaSArIDFdID0gdiArICgxIC0gcmVnaW9uVVZzW2kgKyAxXSkgKiBoZWlnaHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY2FzZSAyNzA6XHJcbiAgICAgICAgICB1IC09IHJlZ2lvbi5vZmZzZXRZIC8gdGV4dHVyZVdpZHRoO1xyXG4gICAgICAgICAgdiAtPSByZWdpb24ub2Zmc2V0WCAvIHRleHR1cmVIZWlnaHQ7XHJcbiAgICAgICAgICB3aWR0aCA9IHJlZ2lvbi5vcmlnaW5hbEhlaWdodCAvIHRleHR1cmVXaWR0aDtcclxuICAgICAgICAgIGhlaWdodCA9IHJlZ2lvbi5vcmlnaW5hbFdpZHRoIC8gdGV4dHVyZUhlaWdodDtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSArPSAyKSB7XHJcbiAgICAgICAgICAgIHV2c1tpXSA9IHUgKyAoMSAtIHJlZ2lvblVWc1tpICsgMV0pICogd2lkdGg7XHJcbiAgICAgICAgICAgIHV2c1tpICsgMV0gPSB2ICsgcmVnaW9uVVZzW2ldICogaGVpZ2h0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHUgLT0gcmVnaW9uLm9mZnNldFggLyB0ZXh0dXJlV2lkdGg7XHJcbiAgICAgIHYgLT1cclxuICAgICAgICAocmVnaW9uLm9yaWdpbmFsSGVpZ2h0IC0gcmVnaW9uLm9mZnNldFkgLSByZWdpb24uaGVpZ2h0KSAvXHJcbiAgICAgICAgdGV4dHVyZUhlaWdodDtcclxuICAgICAgd2lkdGggPSByZWdpb24ub3JpZ2luYWxXaWR0aCAvIHRleHR1cmVXaWR0aDtcclxuICAgICAgaGVpZ2h0ID0gcmVnaW9uLm9yaWdpbmFsSGVpZ2h0IC8gdGV4dHVyZUhlaWdodDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5yZWdpb24gPT0gbnVsbCkge1xyXG4gICAgICB1ID0gdiA9IDA7XHJcbiAgICAgIHdpZHRoID0gaGVpZ2h0ID0gMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdpZHRoID0gdGhpcy5yZWdpb24udTIgLSB1O1xyXG4gICAgICBoZWlnaHQgPSB0aGlzLnJlZ2lvbi52MiAtIHY7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpICs9IDIpIHtcclxuICAgICAgdXZzW2ldID0gdSArIHJlZ2lvblVWc1tpXSAqIHdpZHRoO1xyXG4gICAgICB1dnNbaSArIDFdID0gdiArIHJlZ2lvblVWc1tpICsgMV0gKiBoZWlnaHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQYXJlbnRNZXNoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucGFyZW50TWVzaDtcclxuICB9XHJcblxyXG4gIC8qKiBAcGFyYW0gcGFyZW50TWVzaCBNYXkgYmUgbnVsbC4gKi9cclxuICBzZXRQYXJlbnRNZXNoKHBhcmVudE1lc2g6IE1lc2hBdHRhY2htZW50KSB7XHJcbiAgICB0aGlzLnBhcmVudE1lc2ggPSBwYXJlbnRNZXNoO1xyXG4gICAgaWYgKHBhcmVudE1lc2ggIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmJvbmVzID0gcGFyZW50TWVzaC5ib25lcztcclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IHBhcmVudE1lc2gudmVydGljZXM7XHJcbiAgICAgIHRoaXMud29ybGRWZXJ0aWNlc0xlbmd0aCA9IHBhcmVudE1lc2gud29ybGRWZXJ0aWNlc0xlbmd0aDtcclxuICAgICAgdGhpcy5yZWdpb25VVnMgPSBwYXJlbnRNZXNoLnJlZ2lvblVWcztcclxuICAgICAgdGhpcy50cmlhbmdsZXMgPSBwYXJlbnRNZXNoLnRyaWFuZ2xlcztcclxuICAgICAgdGhpcy5odWxsTGVuZ3RoID0gcGFyZW50TWVzaC5odWxsTGVuZ3RoO1xyXG4gICAgICB0aGlzLndvcmxkVmVydGljZXNMZW5ndGggPSBwYXJlbnRNZXNoLndvcmxkVmVydGljZXNMZW5ndGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5KCk6IEF0dGFjaG1lbnQge1xyXG4gICAgaWYgKHRoaXMucGFyZW50TWVzaCAhPSBudWxsKSByZXR1cm4gdGhpcy5uZXdMaW5rZWRNZXNoKCk7XHJcblxyXG4gICAgbGV0IGNvcHkgPSBuZXcgTWVzaEF0dGFjaG1lbnQodGhpcy5uYW1lKTtcclxuICAgIGNvcHkucmVnaW9uID0gdGhpcy5yZWdpb247XHJcbiAgICBjb3B5LnBhdGggPSB0aGlzLnBhdGg7XHJcbiAgICBjb3B5LmNvbG9yLnNldEZyb21Db2xvcih0aGlzLmNvbG9yKTtcclxuXHJcbiAgICB0aGlzLmNvcHlUbyhjb3B5KTtcclxuICAgIGNvcHkucmVnaW9uVVZzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5yZWdpb25VVnMubGVuZ3RoKTtcclxuICAgIFV0aWxzLmFycmF5Q29weShcclxuICAgICAgdGhpcy5yZWdpb25VVnMsXHJcbiAgICAgIDAsXHJcbiAgICAgIGNvcHkucmVnaW9uVVZzLFxyXG4gICAgICAwLFxyXG4gICAgICB0aGlzLnJlZ2lvblVWcy5sZW5ndGhcclxuICAgICk7XHJcbiAgICBjb3B5LnV2cyA9IG5ldyBBcnJheTxudW1iZXI+KHRoaXMudXZzLmxlbmd0aCk7XHJcbiAgICBVdGlscy5hcnJheUNvcHkodGhpcy51dnMsIDAsIGNvcHkudXZzLCAwLCB0aGlzLnV2cy5sZW5ndGgpO1xyXG4gICAgY29weS50cmlhbmdsZXMgPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLnRyaWFuZ2xlcy5sZW5ndGgpO1xyXG4gICAgVXRpbHMuYXJyYXlDb3B5KFxyXG4gICAgICB0aGlzLnRyaWFuZ2xlcyxcclxuICAgICAgMCxcclxuICAgICAgY29weS50cmlhbmdsZXMsXHJcbiAgICAgIDAsXHJcbiAgICAgIHRoaXMudHJpYW5nbGVzLmxlbmd0aFxyXG4gICAgKTtcclxuICAgIGNvcHkuaHVsbExlbmd0aCA9IHRoaXMuaHVsbExlbmd0aDtcclxuXHJcbiAgICAvLyBOb25lc3NlbnRpYWwuXHJcbiAgICBpZiAodGhpcy5lZGdlcyAhPSBudWxsKSB7XHJcbiAgICAgIGNvcHkuZWRnZXMgPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLmVkZ2VzLmxlbmd0aCk7XHJcbiAgICAgIFV0aWxzLmFycmF5Q29weSh0aGlzLmVkZ2VzLCAwLCBjb3B5LmVkZ2VzLCAwLCB0aGlzLmVkZ2VzLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBjb3B5LndpZHRoID0gdGhpcy53aWR0aDtcclxuICAgIGNvcHkuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XHJcblxyXG4gICAgcmV0dXJuIGNvcHk7XHJcbiAgfVxyXG5cclxuICBuZXdMaW5rZWRNZXNoKCk6IE1lc2hBdHRhY2htZW50IHtcclxuICAgIGxldCBjb3B5ID0gbmV3IE1lc2hBdHRhY2htZW50KHRoaXMubmFtZSk7XHJcbiAgICBjb3B5LnJlZ2lvbiA9IHRoaXMucmVnaW9uO1xyXG4gICAgY29weS5wYXRoID0gdGhpcy5wYXRoO1xyXG4gICAgY29weS5jb2xvci5zZXRGcm9tQ29sb3IodGhpcy5jb2xvcik7XHJcbiAgICBjb3B5LmRlZm9ybUF0dGFjaG1lbnQgPSB0aGlzLmRlZm9ybUF0dGFjaG1lbnQ7XHJcbiAgICBjb3B5LnNldFBhcmVudE1lc2godGhpcy5wYXJlbnRNZXNoICE9IG51bGwgPyB0aGlzLnBhcmVudE1lc2ggOiB0aGlzKTtcclxuICAgIGNvcHkudXBkYXRlVVZzKCk7XHJcbiAgICByZXR1cm4gY29weTtcclxuICB9XHJcbn1cclxuIl19