UNPKG

ngx-spine

Version:

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

791 lines 55.3 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. *****************************************************************************/ /** * @record * @template T */ export function Map() { } export class IntSet { constructor() { this.array = new Array(); } /** * @param {?} value * @return {?} */ add(value) { /** @type {?} */ let contains = this.contains(value); this.array[value | 0] = value | 0; return !contains; } /** * @param {?} value * @return {?} */ contains(value) { return this.array[value | 0] != undefined; } /** * @param {?} value * @return {?} */ remove(value) { this.array[value | 0] = undefined; } /** * @return {?} */ clear() { this.array.length = 0; } } if (false) { /** @type {?} */ IntSet.prototype.array; } /** * @record */ export function Disposable() { } if (false) { /** * @return {?} */ Disposable.prototype.dispose = function () { }; } /** * @record */ export function Restorable() { } if (false) { /** * @return {?} */ Restorable.prototype.restore = function () { }; } export class Color { /** * @param {?=} r * @param {?=} g * @param {?=} b * @param {?=} a */ constructor(r = 0, g = 0, b = 0, a = 0) { this.r = r; this.g = g; this.b = b; this.a = a; } /** * @template THIS * @this {THIS} * @param {?} r * @param {?} g * @param {?} b * @param {?} a * @return {THIS} */ set(r, g, b, a) { (/** @type {?} */ (this)).r = r; (/** @type {?} */ (this)).g = g; (/** @type {?} */ (this)).b = b; (/** @type {?} */ (this)).a = a; (/** @type {?} */ (this)).clamp(); return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} c * @return {THIS} */ setFromColor(c) { (/** @type {?} */ (this)).r = c.r; (/** @type {?} */ (this)).g = c.g; (/** @type {?} */ (this)).b = c.b; (/** @type {?} */ (this)).a = c.a; return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} hex * @return {THIS} */ setFromString(hex) { hex = hex.charAt(0) == "#" ? hex.substr(1) : hex; (/** @type {?} */ (this)).r = parseInt(hex.substr(0, 2), 16) / 255.0; (/** @type {?} */ (this)).g = parseInt(hex.substr(2, 2), 16) / 255.0; (/** @type {?} */ (this)).b = parseInt(hex.substr(4, 2), 16) / 255.0; (/** @type {?} */ (this)).a = (hex.length != 8 ? 255 : parseInt(hex.substr(6, 2), 16)) / 255.0; return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @param {?} r * @param {?} g * @param {?} b * @param {?} a * @return {THIS} */ add(r, g, b, a) { (/** @type {?} */ (this)).r += r; (/** @type {?} */ (this)).g += g; (/** @type {?} */ (this)).b += b; (/** @type {?} */ (this)).a += a; (/** @type {?} */ (this)).clamp(); return (/** @type {?} */ (this)); } /** * @template THIS * @this {THIS} * @return {THIS} */ clamp() { if ((/** @type {?} */ (this)).r < 0) (/** @type {?} */ (this)).r = 0; else if ((/** @type {?} */ (this)).r > 1) (/** @type {?} */ (this)).r = 1; if ((/** @type {?} */ (this)).g < 0) (/** @type {?} */ (this)).g = 0; else if ((/** @type {?} */ (this)).g > 1) (/** @type {?} */ (this)).g = 1; if ((/** @type {?} */ (this)).b < 0) (/** @type {?} */ (this)).b = 0; else if ((/** @type {?} */ (this)).b > 1) (/** @type {?} */ (this)).b = 1; if ((/** @type {?} */ (this)).a < 0) (/** @type {?} */ (this)).a = 0; else if ((/** @type {?} */ (this)).a > 1) (/** @type {?} */ (this)).a = 1; return (/** @type {?} */ (this)); } /** * @param {?} color * @param {?} value * @return {?} */ static rgba8888ToColor(color, value) { color.r = ((value & 0xff000000) >>> 24) / 255; color.g = ((value & 0x00ff0000) >>> 16) / 255; color.b = ((value & 0x0000ff00) >>> 8) / 255; color.a = (value & 0x000000ff) / 255; } /** * @param {?} color * @param {?} value * @return {?} */ static rgb888ToColor(color, value) { color.r = ((value & 0x00ff0000) >>> 16) / 255; color.g = ((value & 0x0000ff00) >>> 8) / 255; color.b = (value & 0x000000ff) / 255; } } Color.WHITE = new Color(1, 1, 1, 1); Color.RED = new Color(1, 0, 0, 1); Color.GREEN = new Color(0, 1, 0, 1); Color.BLUE = new Color(0, 0, 1, 1); Color.MAGENTA = new Color(1, 0, 1, 1); if (false) { /** @type {?} */ Color.WHITE; /** @type {?} */ Color.RED; /** @type {?} */ Color.GREEN; /** @type {?} */ Color.BLUE; /** @type {?} */ Color.MAGENTA; /** @type {?} */ Color.prototype.r; /** @type {?} */ Color.prototype.g; /** @type {?} */ Color.prototype.b; /** @type {?} */ Color.prototype.a; } export class MathUtils { /** * @param {?} value * @param {?} min * @param {?} max * @return {?} */ static clamp(value, min, max) { if (value < min) return min; if (value > max) return max; return value; } /** * @param {?} degrees * @return {?} */ static cosDeg(degrees) { return Math.cos(degrees * MathUtils.degRad); } /** * @param {?} degrees * @return {?} */ static sinDeg(degrees) { return Math.sin(degrees * MathUtils.degRad); } /** * @param {?} value * @return {?} */ static signum(value) { return value > 0 ? 1 : value < 0 ? -1 : 0; } /** * @param {?} x * @return {?} */ static toInt(x) { return x > 0 ? Math.floor(x) : Math.ceil(x); } /** * @param {?} x * @return {?} */ static cbrt(x) { /** @type {?} */ let y = Math.pow(Math.abs(x), 1 / 3); return x < 0 ? -y : y; } /** * @param {?} min * @param {?} max * @return {?} */ static randomTriangular(min, max) { return MathUtils.randomTriangularWith(min, max, (min + max) * 0.5); } /** * @param {?} min * @param {?} max * @param {?} mode * @return {?} */ static randomTriangularWith(min, max, mode) { /** @type {?} */ let u = Math.random(); /** @type {?} */ let d = max - min; if (u <= (mode - min) / d) return min + Math.sqrt(u * d * (mode - min)); return max - Math.sqrt((1 - u) * d * (max - mode)); } } MathUtils.PI = 3.1415927; MathUtils.PI2 = MathUtils.PI * 2; MathUtils.radiansToDegrees = 180 / MathUtils.PI; MathUtils.radDeg = MathUtils.radiansToDegrees; MathUtils.degreesToRadians = MathUtils.PI / 180; MathUtils.degRad = MathUtils.degreesToRadians; if (false) { /** @type {?} */ MathUtils.PI; /** @type {?} */ MathUtils.PI2; /** @type {?} */ MathUtils.radiansToDegrees; /** @type {?} */ MathUtils.radDeg; /** @type {?} */ MathUtils.degreesToRadians; /** @type {?} */ MathUtils.degRad; } /** * @abstract */ export class Interpolation { /** * @param {?} start * @param {?} end * @param {?} a * @return {?} */ apply(start, end, a) { return start + (end - start) * this.applyInternal(a); } } if (false) { /** * @abstract * @protected * @param {?} a * @return {?} */ Interpolation.prototype.applyInternal = function (a) { }; } export class Pow extends Interpolation { /** * @param {?} power */ constructor(power) { super(); this.power = 2; this.power = power; } /** * @param {?} a * @return {?} */ applyInternal(a) { if (a <= 0.5) return Math.pow(a * 2, this.power) / 2; return (Math.pow((a - 1) * 2, this.power) / (this.power % 2 == 0 ? -2 : 2) + 1); } } if (false) { /** * @type {?} * @protected */ Pow.prototype.power; } export class PowOut extends Pow { /** * @param {?} power */ constructor(power) { super(power); } /** * @param {?} a * @return {?} */ applyInternal(a) { return Math.pow(a - 1, this.power) * (this.power % 2 == 0 ? -1 : 1) + 1; } } export class Utils { /** * @template T * @param {?} source * @param {?} sourceStart * @param {?} dest * @param {?} destStart * @param {?} numElements * @return {?} */ static arrayCopy(source, sourceStart, dest, destStart, numElements) { for (let i = sourceStart, j = destStart; i < sourceStart + numElements; i++, j++) { dest[j] = source[i]; } } /** * @template T * @param {?} array * @param {?} size * @param {?=} value * @return {?} */ static setArraySize(array, size, value = 0) { /** @type {?} */ let oldSize = array.length; if (oldSize == size) return array; array.length = size; if (oldSize < size) { for (let i = oldSize; i < size; i++) array[i] = value; } return array; } /** * @template T * @param {?} array * @param {?} size * @param {?=} value * @return {?} */ static ensureArrayCapacity(array, size, value = 0) { if (array.length >= size) return array; return Utils.setArraySize(array, size, value); } /** * @template T * @param {?} size * @param {?} defaultValue * @return {?} */ static newArray(size, defaultValue) { /** @type {?} */ let array = new Array(size); for (let i = 0; i < size; i++) array[i] = defaultValue; return array; } /** * @param {?} size * @return {?} */ static newFloatArray(size) { if (Utils.SUPPORTS_TYPED_ARRAYS) { return new Float32Array(size); } else { /** @type {?} */ let array = new Array(size); for (let i = 0; i < array.length; i++) array[i] = 0; return array; } } /** * @param {?} size * @return {?} */ static newShortArray(size) { if (Utils.SUPPORTS_TYPED_ARRAYS) { return new Int16Array(size); } else { /** @type {?} */ let array = new Array(size); for (let i = 0; i < array.length; i++) array[i] = 0; return array; } } /** * @param {?} array * @return {?} */ static toFloatArray(array) { return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array; } /** * @param {?} value * @return {?} */ static toSinglePrecision(value) { return Utils.SUPPORTS_TYPED_ARRAYS ? Math.fround(value) : value; } // This function is used to fix WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109 /** * @param {?} alpha * @param {?} blend * @return {?} */ static webkit602BugfixHelper(alpha, blend) { } /** * @template T * @param {?} array * @param {?} element * @param {?=} identity * @return {?} */ static contains(array, element, identity = true) { for (var i = 0; i < array.length; i++) { if (array[i] == element) return true; } return false; } } Utils.SUPPORTS_TYPED_ARRAYS = typeof Float32Array !== "undefined"; if (false) { /** @type {?} */ Utils.SUPPORTS_TYPED_ARRAYS; } export class DebugUtils { /** * @param {?} skeleton * @return {?} */ static logBones(skeleton) { for (let i = 0; i < skeleton.bones.length; i++) { /** @type {?} */ let bone = skeleton.bones[i]; console.log(bone.data.name + ", " + bone.a + ", " + bone.b + ", " + bone.c + ", " + bone.d + ", " + bone.worldX + ", " + bone.worldY); } } } /** * @template T */ export class Pool { /** * @param {?} instantiator */ constructor(instantiator) { this.items = new Array(); this.instantiator = instantiator; } /** * @return {?} */ obtain() { return this.items.length > 0 ? this.items.pop() : this.instantiator(); } /** * @param {?} item * @return {?} */ free(item) { if (((/** @type {?} */ (item))).reset) ((/** @type {?} */ (item))).reset(); this.items.push(item); } /** * @param {?} items * @return {?} */ freeAll(items) { for (let i = 0; i < items.length; i++) { if (((/** @type {?} */ (items[i]))).reset) ((/** @type {?} */ (items[i]))).reset(); this.items[i] = items[i]; } } /** * @return {?} */ clear() { this.items.length = 0; } } if (false) { /** * @type {?} * @private */ Pool.prototype.items; /** * @type {?} * @private */ Pool.prototype.instantiator; } export class Vector2 { /** * @param {?=} x * @param {?=} y */ constructor(x = 0, y = 0) { this.x = x; this.y = y; } /** * @param {?} x * @param {?} y * @return {?} */ set(x, y) { this.x = x; this.y = y; return this; } /** * @return {?} */ length() { /** @type {?} */ let x = this.x; /** @type {?} */ let y = this.y; return Math.sqrt(x * x + y * y); } /** * @template THIS * @this {THIS} * @return {THIS} */ normalize() { /** @type {?} */ let len = (/** @type {?} */ (this)).length(); if (len != 0) { (/** @type {?} */ (this)).x /= len; (/** @type {?} */ (this)).y /= len; } return (/** @type {?} */ (this)); } } if (false) { /** @type {?} */ Vector2.prototype.x; /** @type {?} */ Vector2.prototype.y; } export class TimeKeeper { constructor() { this.maxDelta = 0.064; this.framesPerSecond = 0; this.delta = 0; this.totalTime = 0; this.lastTime = Date.now() / 1000; this.frameCount = 0; this.frameTime = 0; } /** * @return {?} */ update() { /** @type {?} */ let now = Date.now() / 1000; this.delta = now - this.lastTime; this.frameTime += this.delta; this.totalTime += this.delta; if (this.delta > this.maxDelta) this.delta = this.maxDelta; this.lastTime = now; this.frameCount++; if (this.frameTime > 1) { this.framesPerSecond = this.frameCount / this.frameTime; this.frameTime = 0; this.frameCount = 0; } } } if (false) { /** @type {?} */ TimeKeeper.prototype.maxDelta; /** @type {?} */ TimeKeeper.prototype.framesPerSecond; /** @type {?} */ TimeKeeper.prototype.delta; /** @type {?} */ TimeKeeper.prototype.totalTime; /** * @type {?} * @private */ TimeKeeper.prototype.lastTime; /** * @type {?} * @private */ TimeKeeper.prototype.frameCount; /** * @type {?} * @private */ TimeKeeper.prototype.frameTime; } /** * @record * @template T */ export function ArrayLike() { } if (false) { /** @type {?} */ ArrayLike.prototype.length; /* Skipping unhandled member: [n: number]: T;*/ } export class WindowedMean { /** * @param {?=} windowSize */ constructor(windowSize = 32) { this.addedValues = 0; this.lastValue = 0; this.mean = 0; this.dirty = true; this.values = new Array(windowSize); } /** * @return {?} */ hasEnoughData() { return this.addedValues >= this.values.length; } /** * @param {?} value * @return {?} */ addValue(value) { if (this.addedValues < this.values.length) this.addedValues++; this.values[this.lastValue++] = value; if (this.lastValue > this.values.length - 1) this.lastValue = 0; this.dirty = true; } /** * @return {?} */ getMean() { if (this.hasEnoughData()) { if (this.dirty) { /** @type {?} */ let mean = 0; for (let i = 0; i < this.values.length; i++) { mean += this.values[i]; } this.mean = mean / this.values.length; this.dirty = false; } return this.mean; } else { return 0; } } } if (false) { /** @type {?} */ WindowedMean.prototype.values; /** @type {?} */ WindowedMean.prototype.addedValues; /** @type {?} */ WindowedMean.prototype.lastValue; /** @type {?} */ WindowedMean.prototype.mean; /** @type {?} */ WindowedMean.prototype.dirty; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BpbmUvIiwic291cmNlcyI6WyJsaWIvc3BpbmUtdHMvY29yZS9VdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ0EseUJBRUM7QUFDRCxNQUFNLE9BQU8sTUFBTTtJQUFuQjtRQUNFLFVBQUssR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBZTlCLENBQUM7Ozs7O0lBZEMsR0FBRyxDQUFDLEtBQWE7O1lBQ1gsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNuQixDQUFDOzs7OztJQUNELFFBQVEsQ0FBQyxLQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO0lBQzVDLENBQUM7Ozs7O0lBQ0QsTUFBTSxDQUFDLEtBQWE7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLENBQUM7Ozs7SUFDRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDRjs7O0lBZkMsdUJBQTRCOzs7OztBQWdCOUIsZ0NBRUM7Ozs7O0lBREMsK0NBQWdCOzs7OztBQUVsQixnQ0FFQzs7Ozs7SUFEQywrQ0FBZ0I7O0FBRWxCLE1BQU0sT0FBTyxLQUFLOzs7Ozs7O0lBTWhCLFlBQ1MsSUFBWSxDQUFDLEVBQ2IsSUFBWSxDQUFDLEVBQ2IsSUFBWSxDQUFDLEVBQ2IsSUFBWSxDQUFDO1FBSGIsTUFBQyxHQUFELENBQUMsQ0FBWTtRQUNiLE1B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LENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QixJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QixJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QixJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QixJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7O0lBQ0QsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFZLEVBQUUsS0FBYTtRQUNoRCxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUN2QyxDQUFDOzs7Ozs7SUFDRCxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQVksRUFBRSxLQUFhO1FBQzlDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUN2QyxDQUFDOztBQS9EYSxXQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUIsU0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVCLFdBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QixVQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0IsYUFBTyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMs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QUNMLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3hCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTs7b0JBQ1YsSUFBSSxHQUFHLENBQUM7Z0JBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMzQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDeEI7Z0JBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2FBQ3BCO1lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ2xCO2FBQU07WUFDTCxPQUFPLENBQUMsQ0FBQztTQUNWO0lBQ0gsQ0FBQztDQUNGOzs7SUFoQ0MsOEJBQXNCOztJQUN0QixtQ0FBZ0I7O0lBQ2hCLGlDQUFjOztJQUNkLDRCQUFTOztJQUNULDZCQUFhIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxyXG4gKiBMYXN0IHVwZGF0ZWQgTWF5IDEsIDIwMTkuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTksIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xyXG4gKlxyXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcclxuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcclxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcclxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXHJcbiAqXHJcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxyXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXHJcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cclxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XHJcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTXHJcbiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcclxuICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU5cclxuICogTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXHJcbiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsXHJcbiAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgQlVTSU5FU1NcclxuICogSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxyXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcclxuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLFxyXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uXCI7XHJcbmltcG9ydCB7IE1peEJsZW5kIH0gZnJvbSBcIi4vQW5pbWF0aW9uXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1hcDxUPiB7XHJcbiAgW2tleTogc3RyaW5nXTogVDtcclxufVxyXG5leHBvcnQgY2xhc3MgSW50U2V0IHtcclxuICBhcnJheSA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgYWRkKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBjb250YWlucyA9IHRoaXMuY29udGFpbnModmFsdWUpO1xyXG4gICAgdGhpcy5hcnJheVt2YWx1ZSB8IDBdID0gdmFsdWUgfCAwO1xyXG4gICAgcmV0dXJuICFjb250YWlucztcclxuICB9XHJcbiAgY29udGFpbnModmFsdWU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuYXJyYXlbdmFsdWUgfCAwXSAhPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIHJlbW92ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFycmF5W3ZhbHVlIHwgMF0gPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIGNsZWFyKCkge1xyXG4gICAgdGhpcy5hcnJheS5sZW5ndGggPSAwO1xyXG4gIH1cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIERpc3Bvc2FibGUge1xyXG4gIGRpc3Bvc2UoKTogdm9pZDtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RvcmFibGUge1xyXG4gIHJlc3RvcmUoKTogdm9pZDtcclxufVxyXG5leHBvcnQgY2xhc3MgQ29sb3Ige1xyXG4gIHB1YmxpYyBzdGF0aWMgV0hJVEUgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSk7XHJcbiAgcHVibGljIHN0YXRpYyBSRUQgPSBuZXcgQ29sb3IoMSwgMCwgMCwgMSk7XHJcbiAgcHVibGljIHN0YXRpYyBHUkVFTiA9IG5ldyBDb2xvcigwLCAxLCAwLCAxKTtcclxuICBwdWJsaWMgc3RhdGljIEJMVUUgPSBuZXcgQ29sb3IoMCwgMCwgMSwgMSk7XHJcbiAgcHVibGljIHN0YXRpYyBNQUdFTlRBID0gbmV3IENvbG9yKDEsIDAsIDEsIDEpO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHI6IG51bWJlciA9IDAsXHJcbiAgICBwdWJsaWMgZzogbnVtYmVyID0gMCxcclxuICAgIHB1YmxpYyBiOiBudW1iZXIgPSAwLFxyXG4gICAgcHVibGljIGE6IG51bWJlciA9IDBcclxuICApIHt9XHJcbiAgc2V0KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcikge1xyXG4gICAgdGhpcy5yID0gcjtcclxuICAgIHRoaXMuZyA9IGc7XHJcbiAgICB0aGlzLmIgPSBiO1xyXG4gICAgdGhpcy5hID0gYTtcclxuICAgIHRoaXMuY2xhbXAoKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICBzZXRGcm9tQ29sb3IoYzogQ29sb3IpIHtcclxuICAgIHRoaXMuciA9IGMucjtcclxuICAgIHRoaXMuZyA9IGMuZztcclxuICAgIHRoaXMuYiA9IGMuYjtcclxuICAgIHRoaXMuYSA9IGMuYTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICBzZXRGcm9tU3RyaW5nKGhleDogc3RyaW5nKSB7XHJcbiAgICBoZXggPSBoZXguY2hhckF0KDApID09IFwiI1wiID8gaGV4LnN1YnN0cigxKSA6IGhleDtcclxuICAgIHRoaXMuciA9IHBhcnNlSW50KGhleC5zdWJzdHIoMCwgMiksIDE2KSAvIDI1NS4wO1xyXG4gICAgdGhpcy5nID0gcGFyc2VJbnQoaGV4LnN1YnN0cigyLCAyKSwgMTYpIC8gMjU1LjA7XHJcbiAgICB0aGlzLmIgPSBwYXJzZUludChoZXguc3Vic3RyKDQsIDIpLCAxNikgLyAyNTUuMDtcclxuICAgIHRoaXMuYSA9IChoZXgubGVuZ3RoICE9IDggPyAyNTUgOiBwYXJzZUludChoZXguc3Vic3RyKDYsIDIpLCAxNikpIC8gMjU1LjA7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgYWRkKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlcikge1xyXG4gICAgdGhpcy5yICs9IHI7XHJcbiAgICB0aGlzLmcgKz0gZztcclxuICAgIHRoaXMuYiArPSBiO1xyXG4gICAgdGhpcy5hICs9IGE7XHJcbiAgICB0aGlzLmNsYW1wKCk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgY2xhbXAoKSB7XHJcbiAgICBpZiAodGhpcy5yIDwgMCkgdGhpcy5yID0gMDtcclxuICAgIGVsc2UgaWYgKHRoaXMuciA+IDEpIHRoaXMuciA9IDE7XHJcbiAgICBpZiAodGhpcy5nIDwgMCkgdGhpcy5nID0gMDtcclxuICAgIGVsc2UgaWYgKHRoaXMuZyA+IDEpIHRoaXMuZyA9IDE7XHJcbiAgICBpZiAodGhpcy5iIDwgMCkgdGhpcy5iID0gMDtcclxuICAgIGVsc2UgaWYgKHRoaXMuYiA+IDEpIHRoaXMuYiA9IDE7XHJcbiAgICBpZiAodGhpcy5hIDwgMCkgdGhpcy5hID0gMDtcclxuICAgIGVsc2UgaWYgKHRoaXMuYSA+IDEpIHRoaXMuYSA9IDE7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgc3RhdGljIHJnYmE4ODg4VG9Db2xvcihjb2xvcjogQ29sb3IsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGNvbG9yLnIgPSAoKHZhbHVlICYgMHhmZjAwMDAwMCkgPj4+IDI0KSAvIDI1NTtcclxuICAgIGNvbG9yLmcgPSAoKHZhbHVlICYgMHgwMGZmMDAwMCkgPj4+IDE2KSAvIDI1NTtcclxuICAgIGNvbG9yLmIgPSAoKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4+IDgpIC8gMjU1O1xyXG4gICAgY29sb3IuYSA9ICh2YWx1ZSAmIDB4MDAwMDAwZmYpIC8gMjU1O1xyXG4gIH1cclxuICBzdGF0aWMgcmdiODg4VG9Db2xvcihjb2xvcjogQ29sb3IsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGNvbG9yLnIgPSAoKHZhbHVlICYgMHgwMGZmMDAwMCkgPj4+IDE2KSAvIDI1NTtcclxuICAgIGNvbG9yLmcgPSAoKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4+IDgpIC8gMjU1O1xyXG4gICAgY29sb3IuYiA9ICh2YWx1ZSAmIDB4MDAwMDAwZmYpIC8gMjU1O1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgTWF0aFV0aWxzIHtcclxuICBzdGF0aWMgUEkgPSAzLjE0MTU5Mjc7XHJcbiAgc3RhdGljIFBJMiA9IE1hdGhVdGlscy5QSSAqIDI7XHJcbiAgc3RhdGljIHJhZGlhbnNUb0RlZ3JlZXMgPSAxODAgLyBNYXRoVXRpbHMuUEk7XHJcbiAgc3RhdGljIHJhZERlZyA9IE1hdGhVdGlscy5yYWRpYW5zVG9EZWdyZWVzO1xyXG4gIHN0YXRpYyBkZWdyZWVzVG9SYWRpYW5zID0gTWF0aFV0aWxzLlBJIC8gMTgwO1xyXG4gIHN0YXRpYyBkZWdSYWQgPSBNYXRoVXRpbHMuZGVncmVlc1RvUmFkaWFucztcclxuICBzdGF0aWMgY2xhbXAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgICBpZiAodmFsdWUgPCBtaW4pIHJldHVybiBtaW47XHJcbiAgICBpZiAodmFsdWUgPiBtYXgpIHJldHVybiBtYXg7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG4gIHN0YXRpYyBjb3NEZWcoZGVncmVlczogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gTWF0aC5jb3MoZGVncmVlcyAqIE1hdGhVdGlscy5kZWdSYWQpO1xyXG4gIH1cclxuICBzdGF0aWMgc2luRGVnKGRlZ3JlZXM6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIE1hdGguc2luKGRlZ3JlZXMgKiBNYXRoVXRpbHMuZGVnUmFkKTtcclxuICB9XHJcbiAgc3RhdGljIHNpZ251bSh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB2YWx1ZSA+IDAgPyAxIDogdmFsdWUgPCAwID8gLTEgOiAwO1xyXG4gIH1cclxuICBzdGF0aWMgdG9JbnQoeDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4geCA+IDAgPyBNYXRoLmZsb29yKHgpIDogTWF0aC5jZWlsKHgpO1xyXG4gIH1cclxuICBzdGF0aWMgY2JydCh4OiBudW1iZXIpIHtcclxuICAgIGxldCB5ID0gTWF0aC5wb3coTWF0aC5hYnMoeCksIDEgLyAzKTtcclxuICAgIHJldHVybiB4IDwgMCA/IC15IDogeTtcclxuICB9XHJcbiAgc3RhdGljIHJhbmRvbVRyaWFuZ3VsYXIobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoVXRpbHMucmFuZG9tVHJpYW5ndWxhcldpdGgobWluLCBtYXgsIChtaW4gKyBtYXgpICogMC41KTtcclxuICB9XHJcbiAgc3RhdGljIHJhbmRvbVRyaWFuZ3VsYXJXaXRoKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgbW9kZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCB1ID0gTWF0aC5yYW5kb20oKTtcclxuICAgIGxldCBkID0gbWF4IC0gbWluO1xyXG4gICAgaWYgKHUgPD0gKG1vZGUgLSBtaW4pIC8gZCkgcmV0dXJuIG1pbiArIE1hdGguc3FydCh1ICogZCAqIChtb2RlIC0gbWluKSk7XHJcbiAgICByZXR1cm4gbWF4IC0gTWF0aC5zcXJ0KCgxIC0gdSkgKiBkICogKG1heCAtIG1vZGUpKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVycG9sYXRpb24ge1xyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhcHBseUludGVybmFsKGE6IG51bWJlcik6IG51bWJlcjtcclxuICBhcHBseShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgYTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBzdGFydCArIChlbmQgLSBzdGFydCkgKiB0aGlzLmFwcGx5SW50ZXJuYWwoYSk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBQb3cgZXh0ZW5kcyBJbnRlcnBvbGF0aW9uIHtcclxuICBwcm90ZWN0ZWQgcG93ZXIgPSAyO1xyXG4gIGNvbnN0cnVjdG9yKHBvd2VyOiBudW1iZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLnBvd2VyID0gcG93ZXI7XHJcbiAgfVxyXG4gIGFwcGx5SW50ZXJuYWwoYTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChhIDw9IDAuNSkgcmV0dXJuIE1hdGgucG93KGEgKiAyLCB0aGlzLnBvd2VyKSAvIDI7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBNYXRoLnBvdygoYSAtIDEpICogMiwgdGhpcy5wb3dlcikgLyAodGhpcy5wb3dlciAlIDIgPT0gMCA/IC0yIDogMikgKyAxXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgUG93T3V0IGV4dGVuZHMgUG93IHtcclxuICBjb25zdHJ1Y3Rvcihwb3dlcjogbnVtYmVyKSB7XHJcbiAgICBzdXBlcihwb3dlcik7XHJcbiAgfVxyXG4gIGFwcGx5SW50ZXJuYWwoYTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLnBvdyhhIC0gMSwgdGhpcy5wb3dlcikgKiAodGhpcy5wb3dlciAlIDIgPT0gMCA/IC0xIDogMSkgKyAxO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgVXRpbHMge1xyXG4gIHN0YXRpYyBTVVBQT1JUU19UWVBFRF9BUlJBWVMgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSBcInVuZGVmaW5lZFwiO1xyXG4gIHN0YXRpYyBhcnJheUNvcHk8VD4oXHJcbiAgICBzb3VyY2U6IEFycmF5TGlrZTxUPixcclxuICAgIHNvdXJjZVN0YXJ0OiBudW1iZXIsXHJcbiAgICBkZXN0OiBBcnJheUxpa2U8VD4sXHJcbiAgICBkZXN0U3RhcnQ6IG51bWJlcixcclxuICAgIG51bUVsZW1lbnRzOiBudW1iZXJcclxuICApIHtcclxuICAgIGZvciAoXHJcbiAgICAgIGxldCBpID0gc291cmNlU3RhcnQsIGogPSBkZXN0U3RhcnQ7XHJcbiAgICAgIGkgPCBzb3VyY2VTdGFydCArIG51bUVsZW1lbnRzO1xyXG4gICAgICBpKyssIGorK1xyXG4gICAgKSB7XHJcbiAgICAgIGRlc3Rbal0gPSBzb3VyY2VbaV07XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBzZXRBcnJheVNpemU8VD4oXHJcbiAgICBhcnJheTogQXJyYXk8VD4sXHJcbiAgICBzaXplOiBudW1iZXIsXHJcbiAgICB2YWx1ZTogYW55ID0gMFxyXG4gICk6IEFycmF5PFQ+IHtcclxuICAgIGxldCBvbGRTaXplID0gYXJyYXkubGVuZ3RoO1xyXG4gICAgaWYgKG9sZFNpemUgPT0gc2l6ZSkgcmV0dXJuIGFycmF5O1xyXG4gICAgYXJyYXkubGVuZ3RoID0gc2l6ZTtcclxuICAgIGlmIChvbGRTaXplIDwgc2l6ZSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gb2xkU2l6ZTsgaSA8IHNpemU7IGkrKykgYXJyYXlbaV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcnJheTtcclxuICB9XHJcbiAgc3RhdGljIGVuc3VyZUFycmF5Q2FwYWNpdHk8VD4oXHJcbiAgICBhcnJheTogQXJyYXk8VD4sXHJcbiAgICBzaXplOiBudW1iZXIsXHJcbiAgICB2YWx1ZTogYW55ID0gMFxyXG4gICk6IEFycmF5PFQ+IHtcclxuICAgIGlmIChhcnJheS5sZW5ndGggPj0gc2l6ZSkgcmV0dXJuIGFycmF5O1xyXG4gICAgcmV0dXJuIFV0aWxzLnNldEFycmF5U2l6ZShhcnJheSwgc2l6ZSwgdmFsdWUpO1xyXG4gIH1cclxuICBzdGF0aWMgbmV3QXJyYXk8VD4oc2l6ZTogbnVtYmVyLCBkZWZhdWx0VmFsdWU6IFQpOiBBcnJheTxUPiB7XHJcbiAgICBsZXQgYXJyYXkgPSBuZXcgQXJyYXk8VD4oc2l6ZSk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykgYXJyYXlbaV0gPSBkZWZhdWx0VmFsdWU7XHJcbiAgICByZXR1cm4gYXJyYXk7XHJcbiAgfVxyXG4gIHN0YXRpYyBuZXdGbG9hdEFycmF5KHNpemU6IG51bWJlcik6IEFycmF5TGlrZTxudW1iZXI+IHtcclxuICAgIGlmIChVdGlscy5TVVBQT1JUU19UWVBFRF9BUlJBWVMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYXJyYXkgPSBuZXcgQXJyYXk8bnVtYmVyPihzaXplKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgYXJyYXlbaV0gPSAwO1xyXG4gICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBuZXdTaG9ydEFycmF5KHNpemU6IG51bWJlcik6IEFycmF5TGlrZTxudW1iZXI+IHtcclxuICAgIGlmIChVdGlscy5TVVBQT1JUU19UWVBFRF9BUlJBWVMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBJbnQxNkFycmF5KHNpemUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFycmF5ID0gbmV3IEFycmF5PG51bWJlcj4oc2l6ZSk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIGFycmF5W2ldID0gMDtcclxuICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgdG9GbG9hdEFycmF5KGFycmF5OiBBcnJheTxudW1iZXI+KSB7XHJcbiAgICByZXR1