UNPKG

ngx-spine

Version:

[![Build Status](https://travis-ci.org/PoiScript/ngx-spine.svg?branch=master)](https://travis-ci.org/PoiScript/ngx-spine)

220 lines 22.4 kB
/** * @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"; /** * @abstract */ export class Attachment { /** * @param {?} name */ constructor(name) { if (name == null) throw new Error("name cannot be null."); this.name = name; } } if (false) { /** @type {?} */ Attachment.prototype.name; /** * @abstract * @return {?} */ Attachment.prototype.copy = function () { }; } /** * @abstract */ export class VertexAttachment extends Attachment { /** * @param {?} name */ constructor(name) { super(name); this.id = (VertexAttachment.nextID++ & 65535) << 11; this.worldVerticesLength = 0; this.deformAttachment = this; } /** * Transforms local vertices to world coordinates. * @param {?} slot * @param {?} start The index of the first local vertex value to transform. Each vertex has 2 values, x and y. * @param {?} count The number of world vertex values to output. Must be <= {\@link #getWorldVerticesLength()} - start. * @param {?} worldVertices The output world vertices. Must have a length >= offset + count. * @param {?} offset The worldVertices index to begin writing values. * @param {?} stride * @return {?} */ computeWorldVertices(slot, start, count, worldVertices, offset, stride) { count = offset + (count >> 1) * stride; /** @type {?} */ let skeleton = slot.bone.skeleton; /** @type {?} */ let deformArray = slot.deform; /** @type {?} */ let vertices = this.vertices; /** @type {?} */ let bones = this.bones; if (bones == null) { if (deformArray.length > 0) vertices = deformArray; /** @type {?} */ let bone = slot.bone; /** @type {?} */ let x = bone.worldX; /** @type {?} */ let y = bone.worldY; /** @type {?} */ let a = bone.a; /** @type {?} */ let b = bone.b; /** @type {?} */ let c = bone.c; /** @type {?} */ let d = bone.d; for (let v = start, w = offset; w < count; v += 2, w += stride) { /** @type {?} */ let vx = vertices[v]; /** @type {?} */ let vy = vertices[v + 1]; worldVertices[w] = vx * a + vy * b + x; worldVertices[w + 1] = vx * c + vy * d + y; } return; } /** @type {?} */ let v = 0; /** @type {?} */ let skip = 0; for (let i = 0; i < start; i += 2) { /** @type {?} */ let n = bones[v]; v += n + 1; skip += n; } /** @type {?} */ let skeletonBones = skeleton.bones; if (deformArray.length == 0) { for (let w = offset, b = skip * 3; w < count; w += stride) { /** @type {?} */ let wx = 0; /** @type {?} */ let wy = 0; /** @type {?} */ let n = bones[v++]; n += v; for (; v < n; v++, b += 3) { /** @type {?} */ let bone = skeletonBones[bones[v]]; /** @type {?} */ let vx = vertices[b]; /** @type {?} */ let vy = vertices[b + 1]; /** @type {?} */ let weight = vertices[b + 2]; wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; } worldVertices[w] = wx; worldVertices[w + 1] = wy; } } else { /** @type {?} */ let deform = deformArray; for (let w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) { /** @type {?} */ let wx = 0; /** @type {?} */ let wy = 0; /** @type {?} */ let n = bones[v++]; n += v; for (; v < n; v++, b += 3, f += 2) { /** @type {?} */ let bone = skeletonBones[bones[v]]; /** @type {?} */ let vx = vertices[b] + deform[f]; /** @type {?} */ let vy = vertices[b + 1] + deform[f + 1]; /** @type {?} */ let weight = vertices[b + 2]; wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; } worldVertices[w] = wx; worldVertices[w + 1] = wy; } } } /** * @param {?} attachment * @return {?} */ copyTo(attachment) { if (this.bones != null) { attachment.bones = new Array(this.bones.length); Utils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length); } else attachment.bones = null; if (this.vertices != null) { attachment.vertices = Utils.newFloatArray(this.vertices.length); Utils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length); } else attachment.vertices = null; attachment.worldVerticesLength = this.worldVerticesLength; attachment.deformAttachment = this.deformAttachment; } } VertexAttachment.nextID = 0; if (false) { /** * @type {?} * @private */ VertexAttachment.nextID; /** @type {?} */ VertexAttachment.prototype.id; /** @type {?} */ VertexAttachment.prototype.bones; /** @type {?} */ VertexAttachment.prototype.vertices; /** @type {?} */ VertexAttachment.prototype.worldVerticesLength; /** @type {?} */ VertexAttachment.prototype.deformAttachment; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QkEsT0FBTyxFQUFhLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQzs7OztBQUc1QyxNQUFNLE9BQWdCLFVBQVU7Ozs7SUFHOUIsWUFBWSxJQUFZO1FBQ3RCLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUdGOzs7SUFSQywwQkFBYTs7Ozs7SUFPYiw0Q0FBNEI7Ozs7O0FBRzlCLE1BQU0sT0FBZ0IsZ0JBQWlCLFNBQVEsVUFBVTs7OztJQVN2RCxZQUFZLElBQVk7UUFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBUGQsT0FBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRy9DLHdCQUFtQixHQUFHLENBQUMsQ0FBQztRQUN4QixxQkFBZ0IsR0FBcUIsSUFBSSxDQUFDO0lBSTFDLENBQUM7Ozs7Ozs7Ozs7O0lBT0Qsb0JBQW9CLENBQ2xCLElBQVUsRUFDVixLQUFhLEVBQ2IsS0FBYSxFQUNiLGFBQWdDLEVBQ2hDLE1BQWMsRUFDZCxNQUFjO1FBRWQsS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7O1lBQ25DLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7O1lBQzdCLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTTs7WUFDekIsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFROztZ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Q3JCLG9DQUE0Qjs7SUFDNUIsK0NBQXdCOztJQUN4Qiw0Q0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbmltcG9ydCB7IEFycmF5TGlrZSwgVXRpbHMgfSBmcm9tIFwiLi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCIuLi9TbG90XCI7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXR0YWNobWVudCB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmIChuYW1lID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIm5hbWUgY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICB9XHJcblxyXG4gIGFic3RyYWN0IGNvcHkoKTogQXR0YWNobWVudDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZlcnRleEF0dGFjaG1lbnQgZXh0ZW5kcyBBdHRhY2htZW50IHtcclxuICBwcml2YXRlIHN0YXRpYyBuZXh0SUQgPSAwO1xyXG5cclxuICBpZCA9IChWZXJ0ZXhBdHRhY2htZW50Lm5leHRJRCsrICYgNjU1MzUpIDw8IDExO1xyXG4gIGJvbmVzOiBBcnJheTxudW1iZXI+O1xyXG4gIHZlcnRpY2VzOiBBcnJheUxpa2U8bnVtYmVyPjtcclxuICB3b3JsZFZlcnRpY2VzTGVuZ3RoID0gMDtcclxuICBkZWZvcm1BdHRhY2htZW50OiBWZXJ0ZXhBdHRhY2htZW50ID0gdGhpcztcclxuXHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihuYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKiBUcmFuc2Zvcm1zIGxvY2FsIHZlcnRpY2VzIHRvIHdvcmxkIGNvb3JkaW5hdGVzLlxyXG4gICAqIEBwYXJhbSBzdGFydCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGxvY2FsIHZlcnRleCB2YWx1ZSB0byB0cmFuc2Zvcm0uIEVhY2ggdmVydGV4IGhhcyAyIHZhbHVlcywgeCBhbmQgeS5cclxuICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiB3b3JsZCB2ZXJ0ZXggdmFsdWVzIHRvIG91dHB1dC4gTXVzdCBiZSA8PSB7QGxpbmsgI2dldFdvcmxkVmVydGljZXNMZW5ndGgoKX0gLSBzdGFydC5cclxuICAgKiBAcGFyYW0gd29ybGRWZXJ0aWNlcyBUaGUgb3V0cHV0IHdvcmxkIHZlcnRpY2VzLiBNdXN0IGhhdmUgYSBsZW5ndGggPj0gb2Zmc2V0ICsgY291bnQuXHJcbiAgICogQHBhcmFtIG9mZnNldCBUaGUgd29ybGRWZXJ0aWNlcyBpbmRleCB0byBiZWdpbiB3cml0aW5nIHZhbHVlcy4gKi9cclxuICBjb21wdXRlV29ybGRWZXJ0aWNlcyhcclxuICAgIHNsb3Q6IFNsb3QsXHJcbiAgICBzdGFydDogbnVtYmVyLFxyXG4gICAgY291bnQ6IG51bWJlcixcclxuICAgIHdvcmxkVmVydGljZXM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICBzdHJpZGU6IG51bWJlclxyXG4gICkge1xyXG4gICAgY291bnQgPSBvZmZzZXQgKyAoY291bnQgPj4gMSkgKiBzdHJpZGU7XHJcbiAgICBsZXQgc2tlbGV0b24gPSBzbG90LmJvbmUuc2tlbGV0b247XHJcbiAgICBsZXQgZGVmb3JtQXJyYXkgPSBzbG90LmRlZm9ybTtcclxuICAgIGxldCB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgaWYgKGJvbmVzID09IG51bGwpIHtcclxuICAgICAgaWYgKGRlZm9ybUFycmF5Lmxlbmd0aCA+IDApIHZlcnRpY2VzID0gZGVmb3JtQXJyYXk7XHJcbiAgICAgIGxldCBib25lID0gc2xvdC5ib25lO1xyXG4gICAgICBsZXQgeCA9IGJvbmUud29ybGRYO1xyXG4gICAgICBsZXQgeSA9IGJvbmUud29ybGRZO1xyXG4gICAgICBsZXQgYSA9IGJvbmUuYSxcclxuICAgICAgICBiID0gYm9uZS5iLFxyXG4gICAgICAgIGMgPSBib25lLmMsXHJcbiAgICAgICAgZCA9IGJvbmUuZDtcclxuICAgICAgZm9yIChsZXQgdiA9IHN0YXJ0LCB3ID0gb2Zmc2V0OyB3IDwgY291bnQ7IHYgKz0gMiwgdyArPSBzdHJpZGUpIHtcclxuICAgICAgICBsZXQgdnggPSB2ZXJ0aWNlc1t2XSxcclxuICAgICAgICAgIHZ5ID0gdmVydGljZXNbdiArIDFdO1xyXG4gICAgICAgIHdvcmxkVmVydGljZXNbd10gPSB2eCAqIGEgKyB2eSAqIGIgKyB4O1xyXG4gICAgICAgIHdvcmxkVmVydGljZXNbdyArIDFdID0gdnggKiBjICsgdnkgKiBkICsgeTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgdiA9IDAsXHJcbiAgICAgIHNraXAgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydDsgaSArPSAyKSB7XHJcbiAgICAgIGxldCBuID0gYm9uZXNbdl07XHJcbiAgICAgIHYgKz0gbiArIDE7XHJcbiAgICAgIHNraXAgKz0gbjtcclxuICAgIH1cclxuICAgIGxldCBza2VsZXRvbkJvbmVzID0gc2tlbGV0b24uYm9uZXM7XHJcbiAgICBpZiAoZGVmb3JtQXJyYXkubGVuZ3RoID09IDApIHtcclxuICAgICAgZm9yIChsZXQgdyA9IG9mZnNldCwgYiA9IHNraXAgKiAzOyB3IDwgY291bnQ7IHcgKz0gc3RyaWRlKSB7XHJcbiAgICAgICAgbGV0IHd4ID0gMCxcclxuICAgICAgICAgIHd5ID0gMDtcclxuICAgICAgICBsZXQgbiA9IGJvbmVzW3YrK107XHJcbiAgICAgICAgbiArPSB2O1xyXG4gICAgICAgIGZvciAoOyB2IDwgbjsgdisrLCBiICs9IDMpIHtcclxuICAgICAgICAgIGxldCBib25lID0gc2tlbGV0b25Cb25lc1tib25lc1t2XV07XHJcbiAgICAgICAgICBsZXQgdnggPSB2ZXJ0aWNlc1tiXSxcclxuICAgICAgICAgICAgdnkgPSB2ZXJ0aWNlc1tiICsgMV0sXHJcbiAgICAgICAgICAgIHdlaWdodCA9IHZlcnRpY2VzW2IgKyAyXTtcclxuICAgICAgICAgIHd4ICs9ICh2eCAqIGJvbmUuYSArIHZ5ICogYm9uZS5iICsgYm9uZS53b3JsZFgpICogd2VpZ2h0O1xyXG4gICAgICAgICAgd3kgKz0gKHZ4ICogYm9uZS5jICsgdnkgKiBib25lLmQgKyBib25lLndvcmxkWSkgKiB3ZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdvcmxkVmVydGljZXNbd10gPSB3eDtcclxuICAgICAgICB3b3JsZFZlcnRpY2VzW3cgKyAxXSA9IHd5O1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZGVmb3JtID0gZGVmb3JtQXJyYXk7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IHcgPSBvZmZzZXQsIGIgPSBza2lwICogMywgZiA9IHNraXAgPDwgMTtcclxuICAgICAgICB3IDwgY291bnQ7XHJcbiAgICAgICAgdyArPSBzdHJpZGVcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHd4ID0gMCxcclxuICAgICAgICAgIHd5ID0gMDtcclxuICAgICAgICBsZXQgbiA9IGJvbmVzW3YrK107XHJcbiAgICAgICAgbiArPSB2O1xyXG4gICAgICAgIGZvciAoOyB2IDwgbjsgdisrLCBiICs9IDMsIGYgKz0gMikge1xyXG4gICAgICAgICAgbGV0IGJvbmUgPSBza2VsZXRvbkJvbmVzW2JvbmVzW3ZdXTtcclxuICAgICAgICAgIGxldCB2eCA9IHZlcnRpY2VzW2JdICsgZGVmb3JtW2ZdLFxyXG4gICAgICAgICAgICB2eSA9IHZlcnRpY2VzW2IgKyAxXSArIGRlZm9ybVtmICsgMV0sXHJcbiAgICAgICAgICAgIHdlaWdodCA9IHZlcnRpY2VzW2IgKyAyXTtcclxuICAgICAgICAgIHd4ICs9ICh2eCAqIGJvbmUuYSArIHZ5ICogYm9uZS5iICsgYm9uZS53b3JsZFgpICogd2VpZ2h0O1xyXG4gICAgICAgICAgd3kgKz0gKHZ4ICogYm9uZS5jICsgdnkgKiBib25lLmQgKyBib25lLndvcmxkWSkgKiB3ZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdvcmxkVmVydGljZXNbd10gPSB3eDtcclxuICAgICAgICB3b3JsZFZlcnRpY2VzW3cgKyAxXSA9IHd5O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5VG8oYXR0YWNobWVudDogVmVydGV4QXR0YWNobWVudCkge1xyXG4gICAgaWYgKHRoaXMuYm9uZXMgIT0gbnVsbCkge1xyXG4gICAgICBhdHRhY2htZW50LmJvbmVzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5ib25lcy5sZW5ndGgpO1xyXG4gICAgICBVdGlscy5hcnJheUNvcHkodGhpcy5ib25lcywgMCwgYXR0YWNobWVudC5ib25lcywgMCwgdGhpcy5ib25lcy5sZW5ndGgpO1xyXG4gICAgfSBlbHNlIGF0dGFjaG1lbnQuYm9uZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLnZlcnRpY2VzICE9IG51bGwpIHtcclxuICAgICAgYXR0YWNobWVudC52ZXJ0aWNlcyA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkodGhpcy52ZXJ0aWNlcy5sZW5ndGgpO1xyXG4gICAgICBVdGlscy5hcnJheUNvcHkoXHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlcyxcclxuICAgICAgICAwLFxyXG4gICAgICAgIGF0dGFjaG1lbnQudmVydGljZXMsXHJcbiAgICAgICAgMCxcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLmxlbmd0aFxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGF0dGFjaG1lbnQudmVydGljZXMgPSBudWxsO1xyXG5cclxuICAgIGF0dGFjaG1lbnQud29ybGRWZXJ0aWNlc0xlbmd0aCA9IHRoaXMud29ybGRWZXJ0aWNlc0xlbmd0aDtcclxuICAgIGF0dGFjaG1lbnQuZGVmb3JtQXR0YWNobWVudCA9IHRoaXMuZGVmb3JtQXR0YWNobWVudDtcclxuICB9XHJcbn1cclxuIl19