/****************************************************************************** * Spine Runtimes License Agreement * Last updated April 5, 2025. Replaces all prior versions. * * Copyright (c) 2013-2025, 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. * * THE SPINE RUNTIMES ARE 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 * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { PathAttachment } from "./attachments/PathAttachment.js"; import { Constraint } from "./Constraint.js"; import { PositionMode, RotateMode, SpacingMode } from "./PathConstraintData.js"; import { PathConstraintPose } from "./PathConstraintPose.js"; import { MathUtils, Utils } from "./Utils.js"; /** Adjusts the rotation, translation, and scale of the constrained bones so they follow a {@link PathAttachment}. * * See [Path constraints](http://esotericsoftware.com/spine-path-constraints) in the Spine User Guide. */ export class PathConstraint extends Constraint { static NONE = -1; static BEFORE = -2; static AFTER = -3; /** The path constraint's setup pose data. */ data; /** The bones that will be modified by this path constraint. */ bones; /** The slot whose path attachment will be used to constrained the bones. */ slot; spaces = []; positions = []; world = []; curves = []; lengths = []; segments = []; constructor(data, skeleton) { super(data, new PathConstraintPose(), new PathConstraintPose()); if (!skeleton) throw new Error("skeleton cannot be null."); this.data = data; this.bones = []; for (const boneData of this.data.bones) this.bones.push(skeleton.bones[boneData.index].constrainedPose); this.slot = skeleton.slots[data.slot.index]; } copy(skeleton) { var copy = new PathConstraint(this.data, skeleton); copy.pose.set(this.pose); return copy; } update(skeleton, physics) { const attachment = this.slot.appliedPose.attachment; if (!(attachment instanceof PathAttachment)) return; const p = this.appliedPose; const mixRotate = p.mixRotate, mixX = p.mixX, mixY = p.mixY; if (mixRotate === 0 && mixX === 0 && mixY === 0) return; const data = this.data; const tangents = data.rotateMode === RotateMode.Tangent, scale = data.rotateMode === RotateMode.ChainScale; const bones = this.bones; const boneCount = bones.length, spacesCount = tangents ? boneCount : boneCount + 1; const spaces = Utils.setArraySize(this.spaces, spacesCount), lengths = scale ? this.lengths = Utils.setArraySize(this.lengths, boneCount) : []; const spacing = p.spacing; switch (data.spacingMode) { case SpacingMode.Percent: if (scale) { for (let i = 0, n = spacesCount - 1; i < n; i++) { const bone = bones[i]; const setupLength = bone.bone.data.length; const x = setupLength * bone.a, y = setupLength * bone.c; lengths[i] = Math.sqrt(x * x + y * y); } } Utils.arrayFill(spaces, 1, spacesCount, spacing); break; case SpacingMode.Proportional: { let sum = 0; for (let i = 0, n = spacesCount - 1; i < n;) { const bone = bones[i]; const setupLength = bone.bone.data.length; if (setupLength < MathUtils.epsilon) { if (scale) lengths[i] = 0; spaces[++i] = spacing; } else { const x = setupLength * bone.a, y = setupLength * bone.c; const length = Math.sqrt(x * x + y * y); if (scale) lengths[i] = length; spaces[++i] = length; sum += length; } } if (sum > 0) { sum = spacesCount / sum * spacing; for (let i = 1; i < spacesCount; i++) spaces[i] *= sum; } break; } default: { const lengthSpacing = data.spacingMode === SpacingMode.Length; for (let i = 0, n = spacesCount - 1; i < n;) { const bone = bones[i]; const setupLength = bone.bone.data.length; if (setupLength < MathUtils.epsilon) { if (scale) lengths[i] = 0; spaces[++i] = spacing; } else { const x = setupLength * bone.a, y = setupLength * bone.c; const length = Math.sqrt(x * x + y * y); if (scale) lengths[i] = length; spaces[++i] = (lengthSpacing ? Math.max(0, setupLength + spacing) : spacing) * length / setupLength; } } } } const positions = this.computeWorldPositions(skeleton, attachment, spacesCount, tangents); let boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation; let tip = false; if (offsetRotation === 0) tip = data.rotateMode === RotateMode.Chain; else { tip = false; const bone = this.slot.bone.appliedPose; offsetRotation *= bone.a * bone.d - bone.b * bone.c > 0 ? MathUtils.degRad : -MathUtils.degRad; } for (let i = 0, ip = 3; i < boneCount; i++, ip += 3) { const bone = bones[i]; bone.modifyWorld(skeleton); bone.worldX += (boneX - bone.worldX) * mixX; bone.worldY += (boneY - bone.worldY) * mixY; const x = positions[ip], y = positions[ip + 1], dx = x - boneX, dy = y - boneY; if (scale) { const length = lengths[i]; if (length !== 0) { const s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * mixRotate + 1; bone.a *= s; bone.c *= s; } } boneX = x; boneY = y; if (mixRotate > 0) { let a = bone.a, b = bone.b, c = bone.c, d = bone.d, r = 0, cos = 0, sin = 0; if (tangents) r = positions[ip - 1]; else if (spaces[i + 1] === 0) r = positions[ip + 2]; else r = Math.atan2(dy, dx); r -= Math.atan2(c, a); if (tip) { cos = Math.cos(r); sin = Math.sin(r); const length = bone.bone.data.length; boneX += (length * (cos * a - sin * c) - dx) * mixRotate; boneY += (length * (sin * a + cos * c) - dy) * mixRotate; } else { r += offsetRotation; } if (r > MathUtils.PI) r -= MathUtils.PI2; else if (r < -MathUtils.PI) // r += MathUtils.PI2; r *= mixRotate; cos = Math.cos(r); sin = Math.sin(r); bone.a = cos * a - sin * c; bone.b = cos * b - sin * d; bone.c = sin * a + cos * c; bone.d = sin * b + cos * d; } } } computeWorldPositions(skeleton, path, spacesCount, tangents) { const slot = this.slot; let position = this.appliedPose.position; let spaces = this.spaces, out = Utils.setArraySize(this.positions, spacesCount * 3 + 2), world = this.world; const closed = path.closed; let verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = PathConstraint.NONE; if (!path.constantSpeed) { const lengths = path.lengths; curveCount -= closed ? 1 : 2; const pathLength = lengths[curveCount]; if (this.data.positionMode === PositionMode.Percent) position *= pathLength; let multiplier; switch (this.data.spacingMode) { case SpacingMode.Percent: multiplier = pathLength; break; case SpacingMode.Proportional: multiplier = pathLength / spacesCount; break; default: multiplier = 1; } world = Utils.setArraySize(this.world, 8); for (let i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) { const space = spaces[i] * multiplier; position += space; let p = position; if (closed) { p %= pathLength; if (p < 0) p += pathLength; curve = 0; } else if (p < 0) { if (prevCurve !== PathConstraint.BEFORE) { prevCurve = PathConstraint.BEFORE; path.computeWorldVertices(skeleton, slot, 2, 4, world, 0, 2); } this.addBeforePosition(p, world, 0, out, o); continue; } else if (p > pathLength) { if (prevCurve !== PathConstraint.AFTER) { prevCurve = PathConstraint.AFTER; path.computeWorldVertices(skeleton, slot, verticesLength - 6, 4, world, 0, 2); } this.addAfterPosition(p - pathLength, world, 0, out, o); continue; } // Determine curve containing position. for (;; curve++) { const length = lengths[curve]; if (p > length) continue; if (curve === 0) p /= length; else { const prev = lengths[curve - 1]; p = (p - prev) / (length - prev); } break; } if (curve !== prevCurve) { prevCurve = curve; if (closed && curve === curveCount) { path.computeWorldVertices(skeleton, slot, verticesLength - 4, 4, world, 0, 2); path.computeWorldVertices(skeleton, slot, 0, 4, world, 4, 2); } else path.computeWorldVertices(skeleton, slot, curve * 6 + 2, 8, world, 0, 2); } this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o, tangents || (i > 0 && space === 0)); } return out; } // World vertices. if (closed) { verticesLength += 2; world = Utils.setArraySize(this.world, verticesLength); path.computeWorldVertices(skeleton, slot, 2, verticesLength - 4, world, 0, 2); path.computeWorldVertices(skeleton, slot, 0, 2, world, verticesLength - 4, 2); world[verticesLength - 2] = world[0]; world[verticesLength - 1] = world[1]; } else { curveCount--; verticesLength -= 4; world = Utils.setArraySize(this.world, verticesLength); path.computeWorldVertices(skeleton, slot, 2, verticesLength, world, 0, 2); } // Curve lengths. const curves = Utils.setArraySize(this.curves, curveCount); let pathLength = 0; let x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0; let tmpx = 0, tmpy = 0, dddfx = 0, dddfy = 0, ddfx = 0, ddfy = 0, dfx = 0, dfy = 0; for (let i = 0, w = 2; i < curveCount; i++, w += 6) { cx1 = world[w]; cy1 = world[w + 1]; cx2 = world[w + 2]; cy2 = world[w + 3]; x2 = world[w + 4]; y2 = world[w + 5]; tmpx = (x1 - cx1 * 2 + cx2) * 0.1875; tmpy = (y1 - cy1 * 2 + cy2) * 0.1875; dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375; dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375; ddfx = tmpx * 2 + dddfx; ddfy = tmpy * 2 + dddfy; dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667; dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667; pathLength += Math.sqrt(dfx * dfx + dfy * dfy); dfx += ddfx; dfy += ddfy; ddfx += dddfx; ddfy += dddfy; pathLength += Math.sqrt(dfx * dfx + dfy * dfy); dfx += ddfx; dfy += ddfy; pathLength += Math.sqrt(dfx * dfx + dfy * dfy); dfx += ddfx + dddfx; dfy += ddfy + dddfy; pathLength += Math.sqrt(dfx * dfx + dfy * dfy); curves[i] = pathLength; x1 = x2; y1 = y2; } if (this.data.positionMode === PositionMode.Percent) position *= pathLength; let multiplier; switch (this.data.spacingMode) { case SpacingMode.Percent: multiplier = pathLength; break; case SpacingMode.Proportional: multiplier = pathLength / spacesCount; break; default: multiplier = 1; } const segments = this.segments; let curveLength = 0; for (let i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) { const space = spaces[i] * multiplier; position += space; let p = position; if (closed) { p %= pathLength; if (p < 0) p += pathLength; curve = 0; segment = 0; } else if (p < 0) { this.addBeforePosition(p, world, 0, out, o); continue; } else if (p > pathLength) { this.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o); continue; } // Determine curve containing position. for (;; curve++) { const length = curves[curve]; if (p > length) continue; if (curve === 0) p /= length; else { const prev = curves[curve - 1]; p = (p - prev) / (length - prev); } break; } // Curve segment lengths. if (curve !== prevCurve) { prevCurve = curve; let ii = curve * 6; x1 = world[ii]; y1 = world[ii + 1]; cx1 = world[ii + 2]; cy1 = world[ii + 3]; cx2 = world[ii + 4]; cy2 = world[ii + 5]; x2 = world[ii + 6]; y2 = world[ii + 7]; tmpx = (x1 - cx1 * 2 + cx2) * 0.03; tmpy = (y1 - cy1 * 2 + cy2) * 0.03; dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006; dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006; ddfx = tmpx * 2 + dddfx; ddfy = tmpy * 2 + dddfy; dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667; dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667; curveLength = Math.sqrt(dfx * dfx + dfy * dfy); segments[0] = curveLength; for (ii = 1; ii < 8; ii++) { dfx += ddfx; dfy += ddfy; ddfx += dddfx; ddfy += dddfy; curveLength += Math.sqrt(dfx * dfx + dfy * dfy); segments[ii] = curveLength; } dfx += ddfx; dfy += ddfy; curveLength += Math.sqrt(dfx * dfx + dfy * dfy); segments[8] = curveLength; dfx += ddfx + dddfx; dfy += ddfy + dddfy; curveLength += Math.sqrt(dfx * dfx + dfy * dfy); segments[9] = curveLength; segment = 0; } // Weight by segment length. p *= curveLength; for (;; segment++) { const length = segments[segment]; if (p > length) continue; if (segment === 0) p /= length; else { const prev = segments[segment - 1]; p = segment + (p - prev) / (length - prev); } break; } this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space === 0)); } return out; } addBeforePosition(p, temp, i, out, o) { const x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = Math.atan2(dy, dx); out[o] = x1 + p * Math.cos(r); out[o + 1] = y1 + p * Math.sin(r); out[o + 2] = r; } addAfterPosition(p, temp, i, out, o) { const x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = Math.atan2(dy, dx); out[o] = x1 + p * Math.cos(r); out[o + 1] = y1 + p * Math.sin(r); out[o + 2] = r; } addCurvePosition(p, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents) { if (p === 0 || Number.isNaN(p)) { out[o] = x1; out[o + 1] = y1; out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1); return; } const tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u; const ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p; const x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt; out[o] = x; out[o + 1] = y; if (tangents) { if (p < 0.001) out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1); else out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt)); } } sort(skeleton) { const slotIndex = this.slot.data.index; const slotBone = this.slot.bone; if (skeleton.skin != null) this.sortPathSlot(skeleton, skeleton.skin, slotIndex, slotBone); if (skeleton.data.defaultSkin != null && skeleton.data.defaultSkin !== skeleton.skin) this.sortPathSlot(skeleton, skeleton.data.defaultSkin, slotIndex, slotBone); this.sortPath(skeleton, this.slot.pose.attachment, slotBone); const bones = this.bones; const boneCount = this.bones.length; for (let i = 0; i < boneCount; i++) { const bone = bones[i].bone; skeleton.sortBone(bone); skeleton.constrained(bone); } skeleton._updateCache.push(this); for (let i = 0; i < boneCount; i++) skeleton.sortReset(bones[i].bone.children); for (let i = 0; i < boneCount; i++) bones[i].bone.sorted = true; } sortPathSlot(skeleton, skin, slotIndex, slotBone) { const entries = skin.getAttachments(); for (let i = 0, n = entries.length; i < n; i++) { const entry = entries[i]; if (entry.slotIndex === slotIndex) this.sortPath(skeleton, entry.attachment, slotBone); } } sortPath(skeleton, attachment, slotBone) { if (!(attachment instanceof PathAttachment)) return; const pathBones = attachment.bones; if (pathBones == null) skeleton.sortBone(slotBone); else { const bones = skeleton.bones; for (let i = 0, n = pathBones.length; i < n;) { let nn = pathBones[i++]; nn += i; while (i < nn) skeleton.sortBone(bones[pathBones[i++]]); } } } isSourceActive() { return this.slot.bone.active; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0aENvbnN0cmFpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUGF0aENvbnN0cmFpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUdqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUEyQixZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRzlDOzt5R0FFeUc7QUFDekcsTUFBTSxPQUFPLGNBQWUsU0FBUSxVQUFrRTtJQUNyRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFeEQsNkNBQTZDO0lBQzdDLElBQUksQ0FBcUI7SUFFekIsK0RBQStEO0lBQy9ELEtBQUssQ0FBa0I7SUFFdkIsNEVBQTRFO0lBQzVFLElBQUksQ0FBTztJQUVYLE1BQU0sR0FBRyxFQUFjLENBQUM7SUFBQyxTQUFTLEdBQUcsRUFBYyxDQUFDO0lBQ3BELEtBQUssR0FBRyxFQUFjLENBQUM7SUFBQyxNQUFNLEdBQUcsRUFBYyxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQWMsQ0FBQztJQUMxRSxRQUFRLEdBQUcsRUFBYyxDQUFDO0lBRTFCLFlBQWEsSUFBd0IsRUFBRSxRQUFrQjtRQUN4RCxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksa0JBQWtCLEVBQUUsRUFBRSxJQUFJLGtCQUFrQixF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QUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BELEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQixHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQixHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDckMsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQ3JDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQzlDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQzlDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLFVBQVUsQ0FBQztZQUNwRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsVUFBVSxDQUFDO1lBQ3BELFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLEdBQUcsSUFBSSxJQUFJLENBQUM7WUFDWixHQUFHLElBQUksSUFBSSxDQUFDO1lBQ1osSUFBSSxJQUFJLEtBQUssQ0FBQztZQUNkLElBQUksSUFBSSxLQUFLLENBQUM7WUFDZCxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUMvQyxHQUFHLElBQUksSUFBSSxDQUFDO1lBQ1osR0FBRyxJQUFJLElBQUksQ0FBQztZQUNaLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLEdBQUcsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLEdBQUcsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDdkIsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNSLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDVCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxZQUFZLENBQUMsT0FBTztZQUFFLFFBQVEsSUFBSSxVQUFVLENBQUM7UUFFNUUsSUFBSSxVQUFrQixDQUFDO1FBQ3ZCLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQixLQUFLLFdBQVcsQ0FBQyxPQUFPO2dCQUFFLFVBQVUsR0FBRyxVQUFVLENBQUM7Z0JBQUMsTUFBTTtZQUN6RCxLQUFLLFdBQVcsQ0FBQyxZQUFZO2dCQUFFLFVBQVUsR0FBRyxVQUFVLEdBQUcsV0FBVyxDQUFDO2dCQUFDLE1BQU07WUFDNUUsT0FBTyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUNyQyxRQUFRLElBQUksS0FBSyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUVqQixJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNaLENBQUMsSUFBSSxVQUFVLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQztnQkFDM0IsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDVixPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsQ0FBQztpQkFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUMsU0FBUztZQUNWLENBQUM7aUJBQU0sSUFBSSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLEtBQUssRUFBRSxjQUFjLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDekUsU0FBUztZQUNWLENBQUM7WUFFRCx1Q0FBdUM7WUFDdkMsUUFBUyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNsQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxHQUFHLE1BQU07b0JBQUUsU0FBUztnQkFDekIsSUFBSSxLQUFLLEtBQUssQ0FBQztvQkFDZCxDQUFDLElBQUksTUFBTSxDQUFDO3FCQUNSLENBQUM7b0JBQ0wsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDL0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO2dCQUNELE1BQU07WUFDUCxDQUFDO1lBRUQseUJBQXlCO1lBQ3pCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUNsQixJQUFJLEVBQUUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNmLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ25DLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDbkMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzVDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUM1QyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLFVBQVUsQ0FBQztnQkFDbkQsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLFVBQVUsQ0FBQztnQkFDbkQsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQy9DLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7Z0JBQzFCLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7b0JBQzNCLEdBQUcsSUFBSSxJQUFJLENBQUM7b0JBQ1osR0FBRyxJQUFJLElBQUksQ0FBQztvQkFDWixJQUFJLElBQUksS0FBSyxDQUFDO29CQUNkLElBQUksSUFBSSxLQUFLLENBQUM7b0JBQ2QsV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ2hELFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUM7Z0JBQzVCLENBQUM7Z0JBQ0QsR0FBRyxJQUFJLElBQUksQ0FBQztnQkFDWixHQUFHLElBQUksSUFBSSxDQUFDO2dCQUNaLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRCxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO2dCQUMxQixHQUFHLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsR0FBRyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRCxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO2dCQUMxQixPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsQ0FBQztZQUVELDRCQUE0QjtZQUM1QixDQUFDLElBQUksV0FBVyxDQUFDO1lBQ2pCLFFBQVMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsR0FBRyxNQUFNO29CQUFFLFNBQVM7Z0JBQ3pCLElBQUksT0FBTyxLQUFLLENBQUM7b0JBQ2hCLENBQUMsSUFBSSxNQUFNLENBQUM7cUJBQ1IsQ0FBQztvQkFDTCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNuQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO2dCQUNELE1BQU07WUFDUCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEgsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELGlCQUFpQixDQUFFLENBQVMsRUFBRSxJQUFtQixFQUFFLENBQVMsRUFBRSxHQUFrQixFQUFFLENBQVM7UUFDMUYsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELGdCQUFnQixDQUFFLENBQVMsRUFBRSxJQUFtQixFQUFFLENBQVMsRUFBRSxHQUFrQixFQUFFLENBQVM7UUFDekYsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELGdCQUFnQixDQUFFLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUM5SCxHQUFrQixFQUFFLENBQVMsRUFBRSxRQUFpQjtRQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNoQixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDNUMsT0FBTztRQUNSLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEdBQUcsS0FBSztnQkFDWixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7O2dCQUU1QyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFH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SSxDQUFDLENBQUMsVUFBVSxZQUFZLGNBQWMsQ0FBQztZQUFFLE9BQU87UUFDcEQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNuQyxJQUFJLFNBQVMsSUFBSSxJQUFJO1lBQ3BCLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDeEIsQ0FBQztZQUNMLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUM5QyxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEIsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDUixPQUFPLENBQUMsR0FBRyxFQUFFO29CQUNaLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUM7SUFFRCxjQUFjO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRhY2htZW50IH0gZnJvbSBcIi4vYXR0YWNobWVudHMvQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgUGF0aEF0dGFjaG1lbnQgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9QYXRoQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCb25lIH0gZnJvbSBcIi4vQm9uZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCb25lUG9zZSB9IGZyb20gXCIuL0JvbmVQb3NlLmpzXCI7XG5pbXBvcnQgeyBDb25zdHJhaW50IH0gZnJvbSBcIi4vQ29uc3RyYWludC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBQYXRoQ29uc3RyYWludERhdGEsIFBvc2l0aW9uTW9kZSwgUm90YXRlTW9kZSwgU3BhY2luZ01vZGUgfSBmcm9tIFwiLi9QYXRoQ29uc3RyYWludERhdGEuanNcIjtcbmltcG9ydCB7IFBhdGhDb25zdHJhaW50UG9zZSB9IGZyb20gXCIuL1BhdGhDb25zdHJhaW50UG9zZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQaHlzaWNzIH0gZnJvbSBcIi4vUGh5c2ljcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNraW4gfSBmcm9tIFwiLi9Ta2luLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsb3QgfSBmcm9tIFwiLi9TbG90LmpzXCI7XG5pbXBvcnQgeyBNYXRoVXRpbHMsIFV0aWxzIH0gZnJvbSBcIi4vVXRpbHMuanNcIjtcblxuXG4vKiogQWRqdXN0cyB0aGUgcm90YXRpb24sIHRyYW5zbGF0aW9uLCBhbmQgc2NhbGUgb2YgdGhlIGNvbnN0cmFpbmVkIGJvbmVzIHNvIHRoZXkgZm9sbG93IGEge0BsaW5rIFBhdGhBdHRhY2htZW50fS5cbiAqXG4gKiBTZWUgW1BhdGggY29uc3RyYWludHNdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1wYXRoLWNvbnN0cmFpbnRzKSBpbiB0aGUgU3BpbmUgVXNlciBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQ8UGF0aENvbnN0cmFpbnQsIFBhdGhDb25zdHJhaW50RGF0YSwgUGF0aENvbnN0cmFpbnRQb3NlPiB7XG5cdHN0YXRpYyBOT05FID0gLTE7IHN0YXRpYyBCRUZPUkUgPSAtMjsgc3RhdGljIEFGVEVSID0gLTM7XG5cblx0LyoqIFRoZSBwYXRoIGNvbnN0cmFpbnQncyBzZXR1cCBwb3NlIGRhdGEuICovXG5cdGRhdGE6IFBhdGhDb25zdHJhaW50RGF0YTtcblxuXHQvKiogVGhlIGJvbmVzIHRoYXQgd2lsbCBiZSBtb2RpZmllZCBieSB0aGlzIHBhdGggY29uc3RyYWludC4gKi9cblx0Ym9uZXM6IEFycmF5PEJvbmVQb3NlPjtcblxuXHQvKiogVGhlIHNsb3Qgd2hvc2UgcGF0aCBhdHRhY2htZW50IHdpbGwgYmUgdXNlZCB0byBjb25zdHJhaW5lZCB0aGUgYm9uZXMuICovXG5cdHNsb3Q6IFNsb3Q7XG5cblx0c3BhY2VzID0gW10gYXMgbnVtYmVyW107IHBvc2l0aW9ucyA9IFtdIGFzIG51bWJlcltdO1xuXHR3b3JsZCA9IFtdIGFzIG51bWJlcltdOyBjdXJ2ZXMgPSBbXSBhcyBudW1iZXJbXTsgbGVuZ3RocyA9IFtdIGFzIG51bWJlcltdO1xuXHRzZWdtZW50cyA9IFtdIGFzIG51bWJlcltdO1xuXG5cdGNvbnN0cnVjdG9yIChkYXRhOiBQYXRoQ29uc3RyYWludERhdGEsIHNrZWxldG9uOiBTa2VsZXRvbikge1xuXHRcdHN1cGVyKGRhdGEsIG5ldyBQYXRoQ29uc3RyYWludFBvc2UoKSwgbmV3IFBhdGhDb25zdHJhaW50UG9zZSgpKTtcblx0XHRpZiAoIXNrZWxldG9uKSB0aHJvdyBuZXcgRXJyb3IoXCJza2VsZXRvbiBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0dGhpcy5kYXRhID0gZGF0YTtcblxuXHRcdHRoaXMuYm9uZXMgPSBbXSBhcyBCb25lUG9zZVtdO1xuXHRcdGZvciAoY29uc3QgYm9uZURhdGEgb2YgdGhpcy5kYXRhLmJvbmVzKVxuXHRcdFx0dGhpcy5ib25lcy5wdXNoKHNrZWxldG9uLmJvbmVzW2JvbmVEYXRhLmluZGV4XS5jb25zdHJhaW5lZFBvc2UpO1xuXG5cdFx0dGhpcy5zbG90ID0gc2tlbGV0b24uc2xvdHNbZGF0YS5zbG90LmluZGV4XTtcblx0fVxuXG5cdHB1YmxpYyBjb3B5IChza2VsZXRvbjogU2tlbGV0b24pIHtcblx0XHR2YXIgY29weSA9IG5ldyBQYXRoQ29uc3RyYWludCh0aGlzLmRhdGEsIHNrZWxldG9uKTtcblx0XHRjb3B5LnBvc2Uuc2V0KHRoaXMucG9zZSk7XG5cdFx0cmV0dXJuIGNvcHk7XG5cdH1cblxuXHR1cGRhdGUgKHNrZWxldG9uOiBTa2VsZXRvbiwgcGh5c2ljczogUGh5c2ljcykge1xuXHRcdGNvbnN0IGF0dGFjaG1lbnQgPSB0aGlzLnNsb3QuYXBwbGllZFBvc2UuYXR0YWNobWVudDtcblx0XHRpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgUGF0aEF0dGFjaG1lbnQpKSByZXR1cm47XG5cblx0XHRjb25zdCBwID0gdGhpcy5hcHBsaWVkUG9zZTtcblx0XHRjb25zdCBtaXhSb3RhdGUgPSBwLm1peFJvdGF0ZSwgbWl4WCA9IHAubWl4WCwgbWl4WSA9IHAubWl4WTtcblx0XHRpZiAobWl4Um90YXRlID09PSAwICYmIG1peFggPT09IDAgJiYgbWl4WSA9PT0gMCkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcblx0XHRjb25zdCB0YW5nZW50cyA9IGRhdGEucm90YXRlTW9kZSA9PT0gUm90YXRlTW9kZS5UYW5nZW50LCBzY2FsZSA9IGRhdGEucm90YXRlTW9kZSA9PT0gUm90YXRlTW9kZS5DaGFpblNjYWxlO1xuXG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdGNvbnN0IGJvbmVDb3VudCA9IGJvbmVzLmxlbmd0aCwgc3BhY2VzQ291bnQgPSB0YW5nZW50cyA/IGJvbmVDb3VudCA6IGJvbmVDb3VudCArIDE7XG5cdFx0Y29uc3Qgc3BhY2VzID0gVXRpbHMuc2V0QXJyYXlTaXplKHRoaXMuc3BhY2VzLCBzcGFjZXNDb3VudCksIGxlbmd0aHM6IEFycmF5PG51bWJlcj4gPSBzY2FsZSA/IHRoaXMubGVuZ3RocyA9IFV0aWxzLnNldEFycmF5U2l6ZSh0aGlzLmxlbmd0aHMsIGJvbmVDb3VudCkgOiBbXTtcblx0XHRjb25zdCBzcGFjaW5nID0gcC5zcGFjaW5nO1xuXG5cdFx0c3dpdGNoIChkYXRhLnNwYWNpbmdNb2RlKSB7XG5cdFx0XHRjYXNlIFNwYWNpbmdNb2RlLlBlcmNlbnQ6XG5cdFx0XHRcdGlmIChzY2FsZSkge1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwLCBuID0gc3BhY2VzQ291bnQgLSAxOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBib25lID0gYm9uZXNbaV07XG5cdFx0XHRcdFx0XHRjb25zdCBzZXR1cExlbmd0aCA9IGJvbmUuYm9uZS5kYXRhLmxlbmd0aDtcblx0XHRcdFx0XHRcdGNvbnN0IHggPSBzZXR1cExlbmd0aCAqIGJvbmUuYSwgeSA9IHNldHVwTGVuZ3RoICogYm9uZS5jO1xuXHRcdFx0XHRcdFx0bGVuZ3Roc1tpXSA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0VXRpbHMuYXJyYXlGaWxsKHNwYWNlcywgMSwgc3BhY2VzQ291bnQsIHNwYWNpbmcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgU3BhY2luZ01vZGUuUHJvcG9ydGlvbmFsOiB7XG5cdFx0XHRcdGxldCBzdW0gPSAwO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHNwYWNlc0NvdW50IC0gMTsgaSA8IG47KSB7XG5cdFx0XHRcdFx0Y29uc3QgYm9uZSA9IGJvbmVzW2ldO1xuXHRcdFx0XHRcdGNvbnN0IHNldHVwTGVuZ3RoID0gYm9uZS5ib25lLmRhdGEubGVuZ3RoO1xuXHRcdFx0XHRcdGlmIChzZXR1cExlbmd0aCA8IE1hdGhVdGlscy5lcHNpbG9uKSB7XG5cdFx0XHRcdFx0XHRpZiAoc2NhbGUpIGxlbmd0aHNbaV0gPSAwO1xuXHRcdFx0XHRcdFx0c3BhY2VzWysraV0gPSBzcGFjaW5nO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCB4ID0gc2V0dXBMZW5ndGggKiBib25lLmEsIHkgPSBzZXR1cExlbmd0aCAqIGJvbmUuYztcblx0XHRcdFx0XHRcdGNvbnN0IGxlbmd0aCA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcblx0XHRcdFx0XHRcdGlmIChzY2FsZSkgbGVuZ3Roc1tpXSA9IGxlbmd0aDtcblx0XHRcdFx0XHRcdHNwYWNlc1srK2ldID0gbGVuZ3RoO1xuXHRcdFx0XHRcdFx0c3VtICs9IGxlbmd0aDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHN1bSA+IDApIHtcblx0XHRcdFx0XHRzdW0gPSBzcGFjZXNDb3VudCAvIHN1bSAqIHNwYWNpbmc7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCBzcGFjZXNDb3VudDsgaSsrKVxuXHRcdFx0XHRcdFx0c3BhY2VzW2ldICo9IHN1bTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0Y29uc3QgbGVuZ3RoU3BhY2luZyA9IGRhdGEuc3BhY2luZ01vZGUgPT09IFNwYWNpbmdNb2RlLkxlbmd0aDtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzcGFjZXNDb3VudCAtIDE7IGkgPCBuOykge1xuXHRcdFx0XHRcdGNvbnN0IGJvbmUgPSBib25lc1tpXTtcblx0XHRcdFx0XHRjb25zdCBzZXR1cExlbmd0aCA9IGJvbmUuYm9uZS5kYXRhLmxlbmd0aDtcblx0XHRcdFx0XHRpZiAoc2V0dXBMZW5ndGggPCBNYXRoVXRpbHMuZXBzaWxvbikge1xuXHRcdFx0XHRcdFx0aWYgKHNjYWxlKSBsZW5ndGhzW2ldID0gMDtcblx0XHRcdFx0XHRcdHNwYWNlc1srK2ldID0gc3BhY2luZztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgeCA9IHNldHVwTGVuZ3RoICogYm9uZS5hLCB5ID0gc2V0dXBMZW5ndGggKiBib25lLmM7XG5cdFx0XHRcdFx0XHRjb25zdCBsZW5ndGggPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG5cdFx0XHRcdFx0XHRpZiAoc2NhbGUpIGxlbmd0aHNbaV0gPSBsZW5ndGg7XG5cdFx0XHRcdFx0XHRzcGFjZXNbKytpXSA9IChsZW5ndGhTcGFjaW5nID8gTWF0aC5tYXgoMCwgc2V0dXBMZW5ndGggKyBzcGFjaW5nKSA6IHNwYWNpbmcpICogbGVuZ3RoIC8gc2V0dXBMZW5ndGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgcG9zaXRpb25zID0gdGhpcy5jb21wdXRlV29ybGRQb3NpdGlvbnMoc2tlbGV0b24sIGF0dGFjaG1lbnQsIHNwYWNlc0NvdW50LCB0YW5nZW50cyk7XG5cdFx0bGV0IGJvbmVYID0gcG9zaXRpb25zWzBdLCBib25lWSA9IHBvc2l0aW9uc1sxXSwgb2Zmc2V0Um90YXRpb24gPSBkYXRhLm9mZnNldFJvdGF0aW9uO1xuXHRcdGxldCB0aXAgPSBmYWxzZTtcblx0XHRpZiAob2Zmc2V0Um90YXRpb24gPT09IDApXG5cdFx0XHR0aXAgPSBkYXRhLnJvdGF0ZU1vZGUgPT09IFJvdGF0ZU1vZGUuQ2hhaW47XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aXAgPSBmYWxzZTtcblx0XHRcdGNvbnN0IGJvbmUgPSB0aGlzLnNsb3QuYm9uZS5hcHBsaWVkUG9zZTtcblx0XHRcdG9mZnNldFJvdGF0aW9uICo9IGJvbmUuYSAqIGJvbmUuZCAtIGJvbmUuYiAqIGJvbmUuYyA+IDAgPyBNYXRoVXRpbHMuZGVnUmFkIDogLU1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0fVxuXHRcdGZvciAobGV0IGkgPSAwLCBpcCA9IDM7IGkgPCBib25lQ291bnQ7IGkrKywgaXAgKz0gMykge1xuXHRcdFx0Y29uc3QgYm9uZSA9IGJvbmVzW2ldO1xuXHRcdFx0Ym9uZS5tb2RpZnlXb3JsZChza2VsZXRvbik7XG5cdFx0XHRib25lLndvcmxkWCArPSAoYm9uZVggLSBib25lLndvcmxkWCkgKiBtaXhYO1xuXHRcdFx0Ym9uZS53b3JsZFkgKz0gKGJvbmVZIC0gYm9uZS53b3JsZFkpICogbWl4WTtcblx0XHRcdGNvbnN0IHggPSBwb3NpdGlvbnNbaXBdLCB5ID0gcG9zaXRpb25zW2lwICsgMV0sIGR4ID0geCAtIGJvbmVYLCBkeSA9IHkgLSBib25lWTtcblx0XHRcdGlmIChzY2FsZSkge1xuXHRcdFx0XHRjb25zdCBsZW5ndGggPSBsZW5ndGhzW2ldO1xuXHRcdFx0XHRpZiAobGVuZ3RoICE9PSAwKSB7XG5cdFx0XHRcdFx0Y29uc3QgcyA9IChNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpIC8gbGVuZ3RoIC0gMSkgKiBtaXhSb3RhdGUgKyAxO1xuXHRcdFx0XHRcdGJvbmUuYSAqPSBzO1xuXHRcdFx0XHRcdGJvbmUuYyAqPSBzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRib25lWCA9IHg7XG5cdFx0XHRib25lWSA9IHk7XG5cdFx0XHRpZiAobWl4Um90YXRlID4gMCkge1xuXHRcdFx0XHRsZXQgYSA9IGJvbmUuYSwgYiA9IGJvbmUuYiwgYyA9IGJvbmUuYywgZCA9IGJvbmUuZCwgciA9IDAsIGNvcyA9IDAsIHNpbiA9IDA7XG5cdFx0XHRcdGlmICh0YW5nZW50cylcblx0XHRcdFx0XHRyID0gcG9zaXRpb25zW2lwIC0gMV07XG5cdFx0XHRcdGVsc2UgaWYgKHNwYWNlc1tpICsgMV0gPT09IDApXG5cdFx0XHRcdFx0ciA9IHBvc2l0aW9uc1tpcCArIDJdO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ciA9IE1hdGguYXRhbjIoZHksIGR4KTtcblx0XHRcdFx0ciAtPSBNYXRoLmF0YW4yKGMsIGEpO1xuXHRcdFx0XHRpZiAodGlwKSB7XG5cdFx0XHRcdFx0Y29zID0gTWF0aC5jb3Mocik7XG5cdFx0XHRcdFx0c2luID0gTWF0aC5zaW4ocik7XG5cdFx0XHRcdFx0Y29uc3QgbGVuZ3RoID0gYm9uZS5ib25lLmRhdGEubGVuZ3RoO1xuXHRcdFx0XHRcdGJvbmVYICs9IChsZW5ndGggKiAoY29zICogYSAtIHNpbiAqIGMpIC0gZHgpICogbWl4Um90YXRlO1xuXHRcdFx0XHRcdGJvbmVZICs9IChsZW5ndGggKiAoc2luICogYSArIGNvcyAqIGMpIC0gZHkpICogbWl4Um90YXRlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHIgKz0gb2Zmc2V0Um90YXRpb247XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHIgPiBNYXRoVXRpbHMuUEkpXG5cdFx0XHRcdFx0ciAtPSBNYXRoVXRpbHMuUEkyO1xuXHRcdFx0XHRlbHNlIGlmIChyIDwgLU1hdGhVdGlscy5QSSkgLy9cblx0XHRcdFx0XHRyICs9IE1hdGhVdGlscy5QSTI7XG5cdFx0XHRcdHIgKj0gbWl4Um90YXRlO1xuXHRcdFx0XHRjb3MgPSBNYXRoLmNvcyhyKTtcblx0XHRcdFx0c2luID0gTWF0aC5zaW4ocik7XG5cdFx0XHRcdGJvbmUuYSA9IGNvcyAqIGEgLSBzaW4gKiBjO1xuXHRcdFx0XHRib25lLmIgPSBjb3MgKiBiIC0gc2luICogZDtcblx0XHRcdFx0Ym9uZS5jID0gc2luICogYSArIGNvcyAqIGM7XG5cdFx0XHRcdGJvbmUuZCA9IHNpbiAqIGIgKyBjb3MgKiBkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNvbXB1dGVXb3JsZFBvc2l0aW9ucyAoc2tlbGV0b246IFNrZWxldG9uLCBwYXRoOiBQYXRoQXR0YWNobWVudCwgc3BhY2VzQ291bnQ6IG51bWJlciwgdGFuZ2VudHM6IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzbG90ID0gdGhpcy5zbG90O1xuXHRcdGxldCBwb3NpdGlvbiA9IHRoaXMuYXBwbGllZFBvc2UucG9zaXRpb247XG5cdFx0bGV0IHNwYWNlcyA9IHRoaXMuc3BhY2VzLCBvdXQgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy5wb3NpdGlvbnMsIHNwYWNlc0NvdW50ICogMyArIDIpLCB3b3JsZDogQXJyYXk8bnVtYmVyPiA9IHRoaXMud29ybGQ7XG5cdFx0Y29uc3QgY2xvc2VkID0gcGF0aC5jbG9zZWQ7XG5cdFx0bGV0IHZlcnRpY2VzTGVuZ3RoID0gcGF0aC53b3JsZFZlcnRpY2VzTGVuZ3RoLCBjdXJ2ZUNvdW50ID0gdmVydGljZXNMZW5ndGggLyA2LCBwcmV2Q3VydmUgPSBQYXRoQ29uc3RyYWludC5OT05FO1xuXG5cdFx0aWYgKCFwYXRoLmNvbnN0YW50U3BlZWQpIHtcblx0XHRcdGNvbnN0IGxlbmd0aHMgPSBwYXRoLmxlbmd0aHM7XG5cdFx0XHRjdXJ2ZUNvdW50IC09IGNsb3NlZCA/IDEgOiAyO1xuXHRcdFx0Y29uc3QgcGF0aExlbmd0aCA9IGxlbmd0aHNbY3VydmVDb3VudF07XG5cdFx0XHRpZiAodGhpcy5kYXRhLnBvc2l0aW9uTW9kZSA9PT0gUG9zaXRpb25Nb2RlLlBlcmNlbnQpIHBvc2l0aW9uICo9IHBhdGhMZW5ndGg7XG5cblx0XHRcdGxldCBtdWx0aXBsaWVyOiBudW1iZXI7XG5cdFx0XHRzd2l0Y2ggKHRoaXMuZGF0YS5zcGFjaW5nTW9kZSkge1xuXHRcdFx0XHRjYXNlIFNwYWNpbmdNb2RlLlBlcmNlbnQ6IG11bHRpcGxpZXIgPSBwYXRoTGVuZ3RoOyBicmVhaztcblx0XHRcdFx0Y2FzZSBTcGFjaW5nTW9kZS5Qcm9wb3J0aW9uYWw6IG11bHRpcGxpZXIgPSBwYXRoTGVuZ3RoIC8gc3BhY2VzQ291bnQ7IGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiBtdWx0aXBsaWVyID0gMTtcblx0XHRcdH1cblxuXHRcdFx0d29ybGQgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy53b3JsZCwgOCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMCwgbyA9IDAsIGN1cnZlID0gMDsgaSA8IHNwYWNlc0NvdW50OyBpKyssIG8gKz0gMykge1xuXHRcdFx0XHRjb25zdCBzcGFjZSA9IHNwYWNlc1tpXSAqIG11bHRpcGxpZXI7XG5cdFx0XHRcdHBvc2l0aW9uICs9IHNwYWNlO1xuXHRcdFx0XHRsZXQgcCA9IHBvc2l0aW9uO1xuXG5cdFx0XHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdFx0XHRwICU9IHBhdGhMZW5ndGg7XG5cdFx0XHRcdFx0aWYgKHAgPCAwKSBwICs9IHBhdGhMZW5ndGg7XG5cdFx0XHRcdFx0Y3VydmUgPSAwO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHAgPCAwKSB7XG5cdFx0XHRcdFx0aWYgKHByZXZDdXJ2ZSAhPT0gUGF0aENvbnN0cmFpbnQuQkVGT1JFKSB7XG5cdFx0XHRcdFx0XHRwcmV2Q3VydmUgPSBQYXRoQ29uc3RyYWludC5CRUZPUkU7XG5cdFx0XHRcdFx0XHRwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNrZWxldG9uLCBzbG90LCAyLCA0LCB3b3JsZCwgMCwgMik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuYWRkQmVmb3JlUG9zaXRpb24ocCwgd29ybGQsIDAsIG91dCwgbyk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocCA+IHBhdGhMZW5ndGgpIHtcblx0XHRcdFx0XHRpZiAocHJldkN1cnZlICE9PSBQYXRoQ29uc3RyYWludC5BRlRFUikge1xuXHRcdFx0XHRcdFx0cHJldkN1cnZlID0gUGF0aENvbnN0cmFpbnQuQUZURVI7XG5cdFx0XHRcdFx0XHRwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNrZWxldG9uLCBzbG90LCB2ZXJ0aWNlc0xlbmd0aCAtIDYsIDQsIHdvcmxkLCAwLCAyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5hZGRBZnRlclBvc2l0aW9uKHAgLSBwYXRoTGVuZ3RoLCB3b3JsZCwgMCwgb3V0LCBvKTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIERldGVybWluZSBjdXJ2ZSBjb250YWluaW5nIHBvc2l0aW9uLlxuXHRcdFx0XHRmb3IgKDsgOyBjdXJ2ZSsrKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGVuZ3RoID0gbGVuZ3Roc1tjdXJ2ZV07XG5cdFx0XHRcdFx0aWYgKHAgPiBsZW5ndGgpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmIChjdXJ2ZSA9PT0gMClcblx0XHRcdFx0XHRcdHAgLz0gbGVuZ3RoO1xuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHJldiA9IGxlbmd0aHNbY3VydmUgLSAxXTtcblx0XHRcdFx0XHRcdHAgPSAocCAtIHByZXYpIC8gKGxlbmd0aCAtIHByZXYpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY3VydmUgIT09IHByZXZDdXJ2ZSkge1xuXHRcdFx0XHRcdHByZXZDdXJ2ZSA9IGN1cnZlO1xuXHRcdFx0XHRcdGlmIChjbG9zZWQgJiYgY3VydmUgPT09IGN1cnZlQ291bnQpIHtcblx0XHRcdFx0XHRcdHBhdGguY29tcHV0ZVdvcmxkVmVydGljZXMoc2tlbGV0b24sIHNsb3QsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgNCwgd29ybGQsIDAsIDIpO1xuXHRcdFx0XHRcdFx0cGF0aC5jb21wdXRlV29ybGRWZXJ0aWNlcyhza2VsZXRvbiwgc2xvdCwgMCwgNCwgd29ybGQsIDQsIDIpO1xuXHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0cGF0aC5jb21wdXRlV29ybGRWZXJ0aWNlcyhza2VsZXRvbiwgc2xvdCwgY3VydmUgKiA2ICsgMiwgOCwgd29ybGQsIDAsIDIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuYWRkQ3VydmVQb3NpdGlvbihwLCB3b3JsZFswXSwgd29ybGRbMV0sIHdvcmxkWzJdLCB3b3JsZFszXSwgd29ybGRbNF0sIHdvcmxkWzVdLCB3b3JsZFs2XSwgd29ybGRbN10sIG91dCwgbyxcblx0XHRcdFx0XHR0YW5nZW50cyB8fCAoaSA+IDAgJiYgc3BhY2UgPT09IDApKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvdXQ7XG5cdFx0fVxuXG5cdFx0Ly8gV29ybGQgdmVydGljZXMuXG5cdFx0aWYgKGNsb3NlZCkge1xuXHRcdFx0dmVydGljZXNMZW5ndGggKz0gMjtcblx0XHRcdHdvcmxkID0gVXRpbHMuc2V0QXJyYXlTaXplKHRoaXMud29ybGQsIHZlcnRpY2VzTGVuZ3RoKTtcblx0XHRcdHBhdGguY29tcHV0ZVdvcmxkVmVydGljZXMoc2tlbGV0b24sIHNsb3QsIDIsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgd29ybGQsIDAsIDIpO1xuXHRcdFx0cGF0aC5jb21wdXRlV29ybGRWZXJ0aWNlcyhza2VsZXRvbiwgc2xvdCwgMCwgMiwgd29ybGQsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgMik7XG5cdFx0XHR3b3JsZFt2ZXJ0aWNlc0xlbmd0aCAtIDJdID0gd29ybGRbMF07XG5cdFx0XHR3b3JsZFt2ZXJ0aWNlc0xlbmd0aCAtIDFdID0gd29ybGRbMV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1cnZlQ291bnQtLTtcblx0XHRcdHZlcnRpY2VzTGVuZ3RoIC09IDQ7XG5cdFx0XHR3b3JsZCA9IFV0aWxzLnNldEFycmF5U2l6ZSh0aGlzLndvcmxkLCB2ZXJ0aWNlc0xlbmd0aCk7XG5cdFx0XHRwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNrZWxldG9uLCBzbG90LCAyLCB2ZXJ0aWNlc0xlbmd0aCwgd29ybGQsIDAsIDIpO1xuXHRcdH1cblxuXHRcdC8vIEN1cnZlIGxlbmd0aHMuXG5cdFx0Y29uc3QgY3VydmVzID0gVXRpbHMuc2V0QXJyYXlTaXplKHRoaXMuY3VydmVzLCBjdXJ2ZUNvdW50KTtcblx0XHRsZXQgcGF0aExlbmd0aCA9IDA7XG5cdFx0bGV0IHgxID0gd29ybGRbMF0sIHkxID0gd29ybGRbMV0sIGN4MSA9IDAsIGN5MSA9IDAsIGN4MiA9IDAsIGN5MiA9IDAsIHgyID0gMCwgeTIgPSAwO1xuXHRcdGxldCB0bXB4ID0gMCwgdG1weSA9IDAsIGRkZGZ4ID0gMCwgZGRkZnkgPSAwLCBkZGZ4ID0gMCwgZGRmeSA9IDAsIGRmeCA9IDAsIGRmeSA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIHcgPSAyOyBpIDwgY3VydmVDb3VudDsgaSsrLCB3ICs9IDYpIHtcblx0XHRcdGN4MSA9IHdvcmxkW3ddO1xuXHRcdFx0Y3kxID0gd29ybGRbdyArIDFdO1xuXHRcdFx0Y3gyID0gd29ybGRbdyArIDJdO1xuXHRcdFx0Y3kyID0gd29ybGRbdyArIDNdO1xuXHRcdFx0eDIgPSB3b3JsZFt3ICsgNF07XG5cdFx0XHR5MiA9IHdvcmxkW3cgKyA1XTtcblx0XHRcdHRtcHggPSAoeDEgLSBjeDEgKiAyICsgY3gyKSAqIDAuMTg3NTtcblx0XHRcdHRtcHkgPSAoeTEgLSBjeTEgKiAyICsgY3kyKSAqIDAuMTg3NTtcblx0XHRcdGRkZGZ4ID0gKChjeDEgLSBjeDIpICogMyAtIHgxICsgeDIpICogMC4wOTM3NTtcblx0XHRcdGRkZGZ5ID0gKChjeTEgLSBjeTIpICogMyAtIHkxICsgeTIpICogMC4wOTM3NTtcblx0XHRcdGRkZnggPSB0bXB4ICogMiArIGRkZGZ4O1xuXHRcdFx0ZGRmeSA9IHRtcHkgKiAyICsgZGRkZnk7XG5cdFx0XHRkZnggPSAoY3gxIC0geDEpICogMC43NSArIHRtcHggKyBkZGRmeCAqIDAuMTY2NjY2Njc7XG5cdFx0XHRkZnkgPSAoY3kxIC0geTEpICogMC43NSArIHRtcHkgKyBkZGRmeSAqIDAuMTY2NjY2Njc7XG5cdFx0XHRwYXRoTGVuZ3RoICs9IE1hdGguc3FydChkZnggKiBkZnggKyBkZnkgKiBkZnkpO1xuXHRcdFx0ZGZ4ICs9IGRkZng7XG5cdFx0XHRkZnkgKz0gZGRmeTtcblx0XHRcdGRkZnggKz0gZGRkZng7XG5cdFx0XHRkZGZ5ICs9IGRkZGZ5O1xuXHRcdFx0cGF0aExlbmd0aCArPSBNYXRoLnNxcnQoZGZ4ICogZGZ4ICsgZGZ5ICogZGZ5KTtcblx0XHRcdGRmeCArPSBkZGZ4O1xuXHRcdFx0ZGZ5ICs9IGRkZnk7XG5cdFx0XHRwYXRoTGVuZ3RoICs9IE1hdGguc3FydChkZnggKiBkZnggKyBkZnkgKiBkZnkpO1xuXHRcdFx0ZGZ4ICs9IGRkZnggKyBkZGRmeDtcblx0XHRcdGRmeSArPSBkZGZ5ICsgZGRkZnk7XG5cdFx0XHRwYXRoTGVuZ3RoICs9IE1hdGguc3FydChkZnggKiBkZnggKyBkZnkgKiBkZnkpO1xuXHRcdFx0Y3VydmVzW2ldID0gcGF0aExlbmd0aDtcblx0XHRcdHgxID0geDI7XG5cdFx0XHR5MSA9IHkyO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmRhdGEucG9zaXRpb25Nb2RlID09PSBQb3NpdGlvbk1vZGUuUGVyY2VudCkgcG9zaXRpb24gKj0gcGF0aExlbmd0aDtcblxuXHRcdGxldCBtdWx0aXBsaWVyOiBudW1iZXI7XG5cdFx0c3dpdGNoICh0aGlzLmRhdGEuc3BhY2luZ01vZGUpIHtcblx0XHRcdGNhc2UgU3BhY2luZ01vZGUuUGVyY2VudDogbXVsdGlwbGllciA9IHBhdGhMZW5ndGg7IGJyZWFrO1xuXHRcdFx0Y2FzZSBTcGFjaW5nTW9kZS5Qcm9wb3J0aW9uYWw6IG11bHRpcGxpZXIgPSBwYXRoTGVuZ3RoIC8gc3BhY2VzQ291bnQ7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogbXVsdGlwbGllciA9IDE7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzO1xuXHRcdGxldCBjdXJ2ZUxlbmd0aCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG8gPSAwLCBjdXJ2ZSA9IDAsIHNlZ21lbnQgPSAwOyBpIDwgc3BhY2VzQ291bnQ7IGkrKywgbyArPSAzKSB7XG5cdFx0XHRjb25zdCBzcGFjZSA9IHNwYWNlc1tpXSAqIG11bHRpcGxpZXI7XG5cdFx0XHRwb3NpdGlvbiArPSBzcGFjZTtcblx0XHRcdGxldCBwID0gcG9zaXRpb247XG5cblx0XHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdFx0cCAlPSBwYXRoTGVuZ3RoO1xuXHRcdFx0XHRpZiAocCA8IDApIHAgKz0gcGF0aExlbmd0aDtcblx0XHRcdFx0Y3VydmUgPSAwO1xuXHRcdFx0XHRzZWdtZW50ID0gMDtcblx0XHRcdH0gZWxzZSBpZiAocCA8IDApIHtcblx0XHRcdFx0dGhpcy5hZGRCZWZvcmVQb3NpdGlvbihwLCB3b3JsZCwgMCwgb3V0LCBvKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IGVsc2UgaWYgKHAgPiBwYXRoTGVuZ3RoKSB7XG5cdFx0XHRcdHRoaXMuYWRkQWZ0ZXJQb3NpdGlvbihwIC0gcGF0aExlbmd0aCwgd29ybGQsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgb3V0LCBvKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERldGVybWluZSBjdXJ2ZSBjb250YWluaW5nIHBvc2l0aW9uLlxuXHRcdFx0Zm9yICg7IDsgY3VydmUrKykge1xuXHRcdFx0XHRjb25zdCBsZW5ndGggPSBjdXJ2ZXNbY3VydmVdO1xuXHRcdFx0XHRpZiAocCA+IGxlbmd0aCkgY29udGludWU7XG5cdFx0XHRcdGlmIChjdXJ2ZSA9PT0gMClcblx0XHRcdFx0XHRwIC89IGxlbmd0aDtcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJldiA9IGN1cnZlc1tjdXJ2ZSAtIDFdO1xuXHRcdFx0XHRcdHAgPSAocCAtIHByZXYpIC8gKGxlbmd0aCAtIHByZXYpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDdXJ2ZSBzZWdtZW50IGxlbmd0aHMuXG5cdFx0XHRpZiAoY3VydmUgIT09IHByZXZDdXJ2ZSkge1xuXHRcdFx0XHRwcmV2Q3VydmUgPSBjdXJ2ZTtcblx0XHRcdFx0bGV0IGlpID0gY3VydmUgKiA2O1xuXHRcdFx0XHR4MSA9IHdvcmxkW2lpXTtcblx0XHRcdFx0eTEgPSB3b3JsZFtpaSArIDFdO1xuXHRcdFx0XHRjeDEgPSB3b3JsZFtpaSArIDJdO1xuXHRcdFx0XHRjeTEgPSB3b3JsZFtpaSArIDNdO1xuXHRcdFx0XHRjeDIgPSB3b3JsZFtpaSArIDRdO1xuXHRcdFx0XHRjeTIgPSB3b3JsZFtpaSArIDVdO1xuXHRcdFx0XHR4MiA9IHdvcmxkW2lpICsgNl07XG5cdFx0XHRcdHkyID0gd29ybGRbaWkgKyA3XTtcblx0XHRcdFx0dG1weCA9ICh4MSAtIGN4MSAqIDIgKyBjeDIpICogMC4wMztcblx0XHRcdFx0dG1weSA9ICh5MSAtIGN5MSAqIDIgKyBjeTIpICogMC4wMztcblx0XHRcdFx0ZGRkZnggPSAoKGN4MSAtIGN4MikgKiAzIC0geDEgKyB4MikgKiAwLjAwNjtcblx0XHRcdFx0ZGRkZnkgPSAoKGN5MSAtIGN5MikgKiAzIC0geTEgKyB5MikgKiAwLjAwNjtcblx0XHRcdFx0ZGRmeCA9IHRtcHggKiAyICsgZGRkZng7XG5cdFx0XHRcdGRkZnkgPSB0bXB5ICogMiArIGRkZGZ5O1xuXHRcdFx0XHRkZnggPSAoY3gxIC0geDEpICogMC4zICsgdG1weCArIGRkZGZ4ICogMC4xNjY2NjY2Nztcblx0XHRcdFx0ZGZ5ID0gKGN5MSAtIHkxKSAqIDAuMyArIHRtcHkgKyBkZGRmeSAqIDAuMTY2NjY2Njc7XG5cdFx0XHRcdGN1cnZlTGVuZ3RoID0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRcdHNlZ21lbnRzWzBdID0gY3VydmVMZW5ndGg7XG5cdFx0XHRcdGZvciAoaWkgPSAxOyBpaSA8IDg7IGlpKyspIHtcblx0XHRcdFx0XHRkZnggKz0gZGRmeDtcblx0XHRcdFx0XHRkZnkgKz0gZGRmeTtcblx0XHRcdFx0XHRkZGZ4ICs9IGRkZGZ4O1xuXHRcdFx0XHRcdGRkZnkgKz0gZGRkZnk7XG5cdFx0XHRcdFx0Y3VydmVMZW5ndGggKz0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRcdFx0c2VnbWVudHNbaWldID0gY3VydmVMZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGZ4ICs9IGRkZng7XG5cdFx0XHRcdGRmeSArPSBkZGZ5O1xuXHRcdFx0XHRjdXJ2ZUxlbmd0aCArPSBNYXRoLnNxcnQoZGZ4ICogZGZ4ICsgZGZ5ICogZGZ5KTtcblx0XHRcdFx0c2VnbWVudHNbOF0gPSBjdXJ2ZUxlbmd0aDtcblx0XHRcdFx0ZGZ4ICs9IGRkZnggKyBkZGRmeDtcblx0XHRcdFx0ZGZ5ICs9IGRkZnkgKyBkZGRmeTtcblx0XHRcdFx0Y3VydmVMZW5ndGggKz0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRcdHNlZ21lbnRzWzldID0gY3VydmVMZW5ndGg7XG5cdFx0XHRcdHNlZ21lbnQgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWlnaHQgYnkgc2VnbWVudCBsZW5ndGguXG5cdFx0XHRwICo9IGN1cnZlTGVuZ3RoO1xuXHRcdFx0Zm9yICg7IDsgc2VnbWVudCsrKSB7XG5cdFx0XHRcdGNvbnN0IGxlbmd0aCA9IHNlZ21lbnRzW3NlZ21lbnRdO1xuXHRcdFx0XHRpZiAocCA+IGxlbmd0aCkgY29udGludWU7XG5cdFx0XHRcdGlmIChzZWdtZW50ID09PSAwKVxuXHRcdFx0XHRcdHAgLz0gbGVuZ3RoO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBwcmV2ID0gc2VnbWVudHNbc2VnbWVudCAtIDFdO1xuXHRcdFx0XHRcdHAgPSBzZWdtZW50ICsgKHAgLSBwcmV2KSAvIChsZW5ndGggLSBwcmV2KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHRoaXMuYWRkQ3VydmVQb3NpdGlvbihwICogMC4xLCB4MSwgeTEsIGN4MSwgY3kxLCBjeDIsIGN5MiwgeDIsIHkyLCBvdXQsIG8sIHRhbmdlbnRzIHx8IChpID4gMCAmJiBzcGFjZSA9PT0gMCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0O1xuXHR9XG5cblx0YWRkQmVmb3JlUG9zaXRpb24gKHA6IG51bWJlciwgdGVtcDogQXJyYXk8bnVtYmVyPiwgaTogbnVtYmVyLCBvdXQ6IEFycmF5PG51bWJlcj4sIG86IG51bWJlcikge1xuXHRcdGNvbnN0IHgxID0gdGVtcFtpXSwgeTEgPSB0ZW1wW2kgKyAxXSwgZHggPSB0ZW1wW2kgKyAyXSAtIHgxLCBkeSA9IHRlbXBbaSArIDNdIC0geTEsIHIgPSBNYXRoLmF0YW4yKGR5LCBkeCk7XG5cdFx0b3V0W29dID0geDEgKyBwICogTWF0aC5jb3Mocik7XG5cdFx0b3V0W28gKyAxXSA9IHkxICsgcCAqIE1hdGguc2luKHIpO1xuXHRcdG91dFtvICsgMl0gPSByO1xuXHR9XG5cblx0YWRkQWZ0ZXJQb3NpdGlvbiAocDogbnVtYmVyLCB0ZW1wOiBBcnJheTxudW1iZXI+LCBpOiBudW1iZXIsIG91dDogQXJyYXk8bnVtYmVyPiwgbzogbnVtYmVyKSB7XG5cdFx0Y29uc3QgeDEgPSB0ZW1wW2kgKyAyXSwgeTEgPSB0ZW1wW2kgKyAzXSwgZHggPSB4MSAtIHRlbXBbaV0sIGR5ID0geTEgLSB0ZW1wW2kgKyAxXSwgciA9IE1hdGguYXRhbjIoZHksIGR4KTtcblx0XHRvdXRbb10gPSB4MSArIHAgKiBNYXRoLmNvcyhyKTtcblx0XHRvdXRbbyArIDFdID0geTEgKyBwICogTWF0aC5zaW4ocik7XG5cdFx0b3V0W28gKyAyXSA9IHI7XG5cdH1cblxuXHRhZGRDdXJ2ZVBvc2l0aW9uIChwOiBudW1iZXIsIHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIGN4MTogbnVtYmVyLCBjeTE6IG51bWJlciwgY3gyOiBudW1iZXIsIGN5MjogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLFxuXHRcdG91dDogQXJyYXk8bnVtYmVyPiwgbzogbnVtYmVyLCB0YW5nZW50czogYm9vbGVhbikge1xuXHRcdGlmIChwID09PSAwIHx8IE51bWJlci5pc05hTihwKSkge1xuXHRcdFx0b3V0W29dID0geDE7XG5cdFx0XHRvdXRbbyArIDFdID0geTE7XG5cdFx0XHRvdXRbbyArIDJdID0gTWF0aC5hdGFuMihjeTEgLSB5MSwgY3gxIC0geDEpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB0dCA9IHAgKiBwLCB0dHQgPSB0dCAqIHAsIHUgPSAxIC0gcCwgdXUgPSB1ICogdSwgdXV1ID0gdXUgKiB1O1xuXHRcdGNvbnN0IHV0ID0gdSAqIHAsIHV0MyA9IHV0ICogMywgdXV0MyA9IHUgKiB1dDMsIHV0dDMgPSB1dDMgKiBwO1xuXHRcdGNvbnN0IHggPSB4MSAqIHV1dSArIGN4MSAqIHV1dDMgKyBjeDIgKiB1dHQzICsgeDIgKiB0dHQsIHkgPSB5MSAqIHV1dSArIGN5MSAqIHV1dDMgKyBjeTIgKiB1dHQzICsgeTIgKiB0dHQ7XG5cdFx0b3V0W29dID0geDtcblx0XHRvdXRbbyArIDFdID0geTtcblx0XHRpZiAodGFuZ2VudHMpIHtcblx0XHRcdGlmIChwIDwgMC4wMDEpXG5cdFx0XHRcdG91dFtvICsgMl0gPSBNYXRoLmF0YW4yKGN5MSAtIHkxLCBjeDEgLSB4MSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdG91dFtvICsgMl0gPSBNYXRoLmF0YW4yKHkgLSAoeTEgKiB1dSArIGN5MSAqIHV0ICogMiArIGN5MiAqIHR0KSwgeCAtICh4MSAqIHV1ICsgY3gxICogdXQgKiAyICsgY3gyICogdHQpKTtcblx0XHR9XG5cdH1cblxuXHRzb3J0IChza2VsZXRvbjogU2tlbGV0b24pIHtcblx0XHRjb25zdCBzbG90SW5kZXggPSB0aGlzLnNsb3QuZGF0YS5pbmRleDtcblx0XHRjb25zdCBzbG90Qm9uZSA9IHRoaXMuc2xvdC5ib25lO1xuXHRcdGlmIChza2VsZXRvbi5za2luICE9IG51bGwpIHRoaXMuc29ydFBhdGhTbG90KHNrZWxldG9uLCBza2VsZXRvbi5za2luLCBzbG90SW5kZXgsIHNsb3RCb25lKTtcblx0XHRpZiAoc2tlbGV0b24uZGF0YS5kZWZhdWx0U2tpbiAhPSBudWxsICYmIHNrZWxldG9uLmRhdGEuZGVmYXVsdFNraW4gIT09IHNrZWxldG9uLnNraW4pXG5cdFx0XHR0aGlzLnNvcnRQYXRoU2xvdChza2VsZXRvbiwgc2tlbGV0b24uZGF0YS5kZWZhdWx0U2tpbiwgc2xvdEluZGV4LCBzbG90Qm9uZSk7XG5cdFx0dGhpcy5zb3J0UGF0aChza2VsZXRvbiwgdGhpcy5zbG90LnBvc2UuYXR0YWNobWVudCwgc2xvdEJvbmUpO1xuXHRcdGNvbnN0IGJvbmVzID0gdGhpcy5ib25lcztcblx0XHRjb25zdCBib25lQ291bnQgPSB0aGlzLmJvbmVzLmxlbmd0aDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGJvbmVDb3VudDsgaSsrKSB7XG5cdFx0XHRjb25zdCBib25lID0gYm9uZXNbaV0uYm9uZTtcblx0XHRcdHNrZWxldG9uLnNvcnRCb25lKGJvbmUpO1xuXHRcdFx0c2tlbGV0b24uY29uc3RyYWluZWQoYm9uZSk7XG5cdFx0fVxuXHRcdHNrZWxldG9uLl91cGRhdGVDYWNoZS5wdXNoKHRoaXMpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYm9uZUNvdW50OyBpKyspXG5cdFx0XHRza2VsZXRvbi5zb3J0UmVzZXQoYm9uZXNbaV0uYm9uZS5jaGlsZHJlbik7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBib25lQ291bnQ7IGkrKylcblx0XHRcdGJvbmVzW2ldLmJvbmUuc29ydGVkID0gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgc29ydFBhdGhTbG90IChza2VsZXRvbjogU2tlbGV0b24sIHNraW46IFNraW4sIHNsb3RJbmRleDogbnVtYmVyLCBzbG90Qm9uZTogQm9uZSkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSBza2luLmdldEF0dGFjaG1lbnRzKCk7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBlbnRyaWVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgZW50cnkgPSBlbnRyaWVzW2ldO1xuXHRcdFx0aWYgKGVudHJ5LnNsb3RJbmRleCA9PT0gc2xvdEluZGV4KSB0aGlzLnNvcnRQYXRoKHNrZWxldG9uLCBlbnRyeS5hdHRhY2htZW50LCBzbG90Qm9uZSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzb3J0UGF0aCAoc2tlbGV0b246IFNrZWxldG9uLCBhdHRhY2htZW50OiBBdHRhY2htZW50IHwgbnVsbCwgc2xvdEJvbmU6IEJvbmUpIHtcblx0XHRpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgUGF0aEF0dGFjaG1lbnQpKSByZXR1cm47XG5cdFx0Y29uc3QgcGF0aEJvbmVzID0gYXR0YWNobWVudC5ib25lcztcblx0XHRpZiAocGF0aEJvbmVzID09IG51bGwpXG5cdFx0XHRza2VsZXRvbi5zb3J0Qm9uZShzbG90Qm9uZSk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCBib25lcyA9IHNrZWxldG9uLmJvbmVzO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBwYXRoQm9uZXMubGVuZ3RoOyBpIDwgbjspIHtcblx0XHRcdFx0bGV0IG5uID0gcGF0aEJvbmVzW2krK107XG5cdFx0XHRcdG5uICs9IGk7XG5cdFx0XHRcdHdoaWxlIChpIDwgbm4pXG5cdFx0XHRcdFx0c2tlbGV0b24uc29ydEJvbmUoYm9uZXNbcGF0aEJvbmVzW2krK11dKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpc1NvdXJjZUFjdGl2ZSAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2xvdC5ib25lLmFjdGl2ZTtcblx0fVxufVxuIl19