/******************************************************************************
* 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 { SequenceMode, SequenceModeValues } from "./attachments/Sequence.js";
import { Color, StringSet, Utils } from "./Utils.js";
/** Stores a list of timelines to animate a skeleton's pose over time.
*
* See Applying Animations in the Spine Runtimes
* Guide. */
export class Animation {
/** The animation's name, unique across all animations in the skeleton.
*
* See {@link SkeletonData.findAnimation}. */
name;
/** The duration of the animation in seconds, which is usually the highest time of all frames in the timelines. The duration is
* used to know when the animation has completed and, for animations that repeat, when it should loop back to the start. */
timelines = [];
timelineIds;
/** {@link Skeleton.getBones} indices that this animation's timelines modify.
*
* See {@link BoneTimeline.bones}. */
bones;
// Nonessential.
/** The color of the animation as it was in Spine, or a default color if nonessential data was not exported. */
color = new Color(1, 1, 1, 1);
/** The duration of the animation in seconds, which is usually the highest time of all frames in the timeline. The duration is
* used to know when it has completed and when it should loop back to the start. */
duration;
constructor(name, timelines, duration) {
if (!name)
throw new Error("name cannot be null.");
this.name = name;
this.duration = duration;
this.timelineIds = new StringSet();
this.bones = [];
this.setTimelines(timelines);
}
setTimelines(timelines) {
if (!timelines)
throw new Error("timelines cannot be null.");
this.timelines = timelines;
const n = timelines.length;
this.timelineIds.clear();
this.bones.length = 0;
const boneSet = new Set();
const items = timelines;
for (let i = 0; i < n; i++) {
const timeline = items[i];
this.timelineIds.addAll(timeline.propertyIds);
if (isBoneTimeline(timeline) && boneSet.add(timeline.boneIndex))
this.bones.push(timeline.boneIndex);
}
}
/** Returns true if this animation contains a timeline with any of the specified property IDs.
*
* See {@link Timeline.propertyIds}. */
hasTimeline(ids) {
for (let i = 0; i < ids.length; i++)
if (this.timelineIds.contains(ids[i]))
return true;
return false;
}
/** Applies the animation's timelines to the specified skeleton.
*
* See {@link Timeline.apply} and
* Applying Animations in the Spine Runtimes
* Guide.
* @param skeleton The skeleton the animation is applied to. This provides access to the bones, slots, and other skeleton
* components the timelines may change.
* @param lastTime The last time in seconds this animation was applied. Some timelines trigger only at discrete times, in which
* case all keys are triggered between `lastTime` (exclusive) and `time` (inclusive). Pass -1
* the first time an animation is applied to ensure frame 0 is triggered.
* @param time The time in seconds the skeleton is being posed for. Timelines find the frame before and after this time and
* interpolate between the frame values.
* @param loop True if `time` beyond the {@link duration} repeats the animation, else the last frame is used.
* @param events If any events are fired, they are added to this list. Pass null to ignore fired events or if no timelines fire
* events.
* @param alpha 0 applies setup or current values (depending on `from`), 1 uses timeline values, and intermediate
* values interpolate between them. Adjusting `alpha` over time can mix an animation in or out.
* @param from Controls how `alpha` and `add` mix from current or setup pose values to timeline values.
* @param add If true, for timelines that support it, their values are added to the setup or current values (depending on
* `from`).
* @param out True when the animation is mixing out, else it is mixing in. Used by timelines that perform instant transitions.
* @param appliedPose True to modify {@link Posed.appliedPose}, else {@link Posed.pose} is modified. */
apply(skeleton, lastTime, time, loop, events, alpha, from, add, out, appliedPose) {
if (!skeleton)
throw new Error("skeleton cannot be null.");
if (loop && this.duration !== 0) {
time %= this.duration;
if (lastTime > 0)
lastTime %= this.duration;
}
const timelines = this.timelines;
for (let i = 0, n = timelines.length; i < n; i++)
timelines[i].apply(skeleton, lastTime, time, events, alpha, from, add, out, appliedPose);
}
}
/** Controls whether `alpha` and `add` mix from current or setup pose values and what happens before the
* first key.
*
* See {@link Timeline.apply}. */
export var MixFrom;
(function (MixFrom) {
/** Alpha mixes from the current pose. Before the first key, no change is made. */
MixFrom[MixFrom["current"] = 0] = "current";
/** Alpha mixes from the setup pose. Before the first key, the setup pose is used. */
MixFrom[MixFrom["setup"] = 1] = "setup";
/** Alpha mixes from the current pose. Before the first key, alpha mixes from the current pose to the setup pose. */
MixFrom[MixFrom["first"] = 2] = "first";
})(MixFrom || (MixFrom = {}));
export var Property;
(function (Property) {
Property[Property["rotate"] = 0] = "rotate";
Property[Property["x"] = 1] = "x";
Property[Property["y"] = 2] = "y";
Property[Property["scaleX"] = 3] = "scaleX";
Property[Property["scaleY"] = 4] = "scaleY";
Property[Property["shearX"] = 5] = "shearX";
Property[Property["shearY"] = 6] = "shearY";
Property[Property["inherit"] = 7] = "inherit";
Property[Property["rgb"] = 8] = "rgb";
Property[Property["alpha"] = 9] = "alpha";
Property[Property["rgb2"] = 10] = "rgb2";
Property[Property["attachment"] = 11] = "attachment";
Property[Property["deform"] = 12] = "deform";
Property[Property["event"] = 13] = "event";
Property[Property["drawOrder"] = 14] = "drawOrder";
Property[Property["drawOrderFolder"] = 15] = "drawOrderFolder";
Property[Property["ikConstraint"] = 16] = "ikConstraint";
Property[Property["transformConstraint"] = 17] = "transformConstraint";
Property[Property["pathConstraintPosition"] = 18] = "pathConstraintPosition";
Property[Property["pathConstraintSpacing"] = 19] = "pathConstraintSpacing";
Property[Property["pathConstraintMix"] = 20] = "pathConstraintMix";
Property[Property["physicsConstraintInertia"] = 21] = "physicsConstraintInertia";
Property[Property["physicsConstraintStrength"] = 22] = "physicsConstraintStrength";
Property[Property["physicsConstraintDamping"] = 23] = "physicsConstraintDamping";
Property[Property["physicsConstraintMass"] = 24] = "physicsConstraintMass";
Property[Property["physicsConstraintWind"] = 25] = "physicsConstraintWind";
Property[Property["physicsConstraintGravity"] = 26] = "physicsConstraintGravity";
Property[Property["physicsConstraintMix"] = 27] = "physicsConstraintMix";
Property[Property["physicsConstraintReset"] = 28] = "physicsConstraintReset";
Property[Property["sequence"] = 29] = "sequence";
Property[Property["sliderTime"] = 30] = "sliderTime";
Property[Property["sliderMix"] = 31] = "sliderMix";
})(Property || (Property = {}));
/** The base class for all timelines.
*
* See Applying Animations in the Spine
* Runtimes Guide. */
export class Timeline {
propertyIds;
frames;
/** True if this timeline supports being applied additively.
*
* See the `add` parameter in {@link Timeline.apply}. */
additive = false;
/** True if this timeline sets values instantaneously and does not support interpolation between frames. */
instant = false;
constructor(frameCount, ...propertyIds) {
this.propertyIds = propertyIds;
this.frames = Utils.newFloatArray(frameCount * this.getFrameEntries());
}
getPropertyIds() {
return this.propertyIds;
}
/** The number of values stored per frame. */
getFrameEntries() {
return 1;
}
/** The number of frames in this timeline. */
getFrameCount() {
return this.frames.length / this.getFrameEntries();
}
/** The duration of the timeline in seconds, which is usually the highest time of all frames in the timeline. */
getDuration() {
return this.frames[this.frames.length - this.getFrameEntries()];
}
/** Linear search using the specified stride (default 1).
* @param time Must be >= the first value in `frames`.
* @return The index of the first value <= `time`. */
static search(frames, time, step = 1) {
const n = frames.length;
for (let i = step; i < n; i += step)
if (frames[i] > time)
return i - step;
return n - step;
}
}
export function isSlotTimeline(obj) {
return typeof obj === 'object' && obj !== null && typeof obj.slotIndex === 'number';
}
/** The base class for timelines that interpolate between frame values using stepped, linear, or a Bezier curve. */
export class CurveTimeline extends Timeline {
curves; // type, x, y, ...
constructor(frameCount, bezierCount, ...propertyIds) {
super(frameCount, ...propertyIds);
this.curves = Utils.newFloatArray(frameCount + bezierCount * 18 /*BEZIER_SIZE*/);
this.curves[frameCount - 1] = 1 /*STEPPED*/;
}
/** Sets the specified key frame to linear interpolation. */
setLinear(frame) {
this.curves[frame] = 0 /*LINEAR*/;
}
/** Sets the specified key frame to stepped interpolation. */
setStepped(frame) {
this.curves[frame] = 1 /*STEPPED*/;
}
/** Shrinks the storage for Bezier curves, for use when `bezierCount` (specified in the constructor) was larger
* than the actual number of Bezier curves. */
shrink(bezierCount) {
const size = this.getFrameCount() + bezierCount * 18 /*BEZIER_SIZE*/;
if (this.curves.length > size) {
const newCurves = Utils.newFloatArray(size);
Utils.arrayCopy(this.curves, 0, newCurves, 0, size);
this.curves = newCurves;
}
}
/** Stores the segments for the specified Bezier curve. For timelines that modify multiple values, there may be more than
* one curve per frame.
* @param bezier The ordinal of this Bezier curve for this timeline, between 0 and `bezierCount - 1` (specified
* in the constructor), inclusive.
* @param frame Between 0 and `frameCount - 1`, inclusive.
* @param value The index of the value for this frame that this curve is used for.
* @param time1 The time for the first key.
* @param value1 The value for the first key.
* @param cx1 The time for the first Bezier handle.
* @param cy1 The value for the first Bezier handle.
* @param cx2 The time of the second Bezier handle.
* @param cy2 The value for the second Bezier handle.
* @param time2 The time for the second key.
* @param value2 The value for the second key. */
setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) {
const curves = this.curves;
let i = this.getFrameCount() + bezier * 18 /*BEZIER_SIZE*/;
if (value === 0)
curves[frame] = 2 /*BEZIER*/ + i;
const tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = (value1 - cy1 * 2 + cy2) * 0.03;
const dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = ((cy1 - cy2) * 3 - value1 + value2) * 0.006;
let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;
let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = (cy1 - value1) * 0.3 + tmpy + dddy * 0.16666667;
let x = time1 + dx, y = value1 + dy;
for (let n = i + 18 /*BEZIER_SIZE*/; i < n; i += 2) {
curves[i] = x;
curves[i + 1] = y;
dx += ddx;
dy += ddy;
ddx += dddx;
ddy += dddy;
x += dx;
y += dy;
}
}
/** Returns the Bezier interpolated value for the specified time.
* @param frameIndex The index into {@link frames} for the values of the frame before `time`.
* @param valueOffset The offset from `frameIndex` to the value this curve is used for.
* @param i The index of the Bezier segments. See {@link getCurveType}. */
getBezierValue(time, frameIndex, valueOffset, i) {
const curves = this.curves;
if (curves[i] > time) {
const x = this.frames[frameIndex], y = this.frames[frameIndex + valueOffset];
return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
}
const n = i + 18 /*BEZIER_SIZE*/;
for (i += 2; i < n; i += 2) {
if (curves[i] >= time) {
const x = curves[i - 2], y = curves[i - 1];
return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
}
}
frameIndex += this.getFrameEntries();
const x = curves[n - 2], y = curves[n - 1];
return y + (time - x) / (this.frames[frameIndex] - x) * (this.frames[frameIndex + valueOffset] - y);
}
}
/** The base class for a {@link CurveTimeline} that sets one property with a curve. */
export class CurveTimeline1 extends CurveTimeline {
constructor(frameCount, bezierCount, propertyId) {
super(frameCount, bezierCount, propertyId);
}
getFrameEntries() {
return 2 /*ENTRIES*/;
}
/** Sets the time and value for the specified frame.
* @param frame Between 0 and `frameCount`, inclusive.
* @param time The frame time in seconds. */
setFrame(frame, time, value) {
frame <<= 1;
this.frames[frame] = time;
this.frames[frame + 1 /*VALUE*/] = value;
}
/** Returns the interpolated value for the specified time. */
getCurveValue(time) {
const frames = this.frames;
let i = frames.length - 2;
for (let ii = 2; ii <= i; ii += 2) {
if (frames[ii] > time) {
i = ii - 2;
break;
}
}
const curveType = this.curves[i >> 1];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i], value = frames[i + 1 /*VALUE*/];
return value + (time - before) / (frames[i + 2 /*ENTRIES*/] - before) * (frames[i + 2 /*ENTRIES*/ + 1 /*VALUE*/] - value);
}
case 1 /*STEPPED*/:
return frames[i + 1 /*VALUE*/];
}
return this.getBezierValue(time, i, 1 /*VALUE*/, curveType - 2 /*BEZIER*/);
}
/** Returns the interpolated value for properties relative to the setup value. The timeline value is added to the setup
* value, rather than replacing it.
*
* See {@link Timeline.apply}.
* @param current The current value for the property.
* @param setup The setup value for the property. */
getRelativeValue(time, alpha, from, add, current, setup) {
if (time < this.frames[0])
return CurveTimeline1.beforeFirstKey(from, alpha, current, setup);
const value = this.getCurveValue(time);
return from === MixFrom.setup ? setup + value * alpha : current + (add ? value : value + setup - current) * alpha;
}
getAbsoluteValue(time, alpha, from, add, current, setup, value) {
if (value === undefined)
return this.getAbsoluteValue1(time, alpha, from, add, current, setup);
else
return this.getAbsoluteValue2(time, alpha, from, add, current, setup, value);
}
getAbsoluteValue1(time, alpha, from, add, current, setup) {
if (time < this.frames[0])
return CurveTimeline1.beforeFirstKey(from, alpha, current, setup);
const value = this.getCurveValue(time);
return from === MixFrom.setup ? setup + (add ? value : value - setup) * alpha
: current + (add ? value : value - current) * alpha;
}
getAbsoluteValue2(time, alpha, from, add, current, setup, value) {
if (time < this.frames[0])
return CurveTimeline1.beforeFirstKey(from, alpha, current, setup);
return from === MixFrom.setup ? setup + (add ? value : value - setup) * alpha
: current + (add ? value : value - current) * alpha;
}
/** Returns the interpolated value for scale properties. The timeline and setup values are multiplied and sign adjusted.
*
* See {@link Timeline.apply}.
* @param current The current value for the property.
* @param setup The setup value for the property. */
getScaleValue(time, alpha, from, add, out, current, setup) {
if (time < this.frames[0])
return CurveTimeline1.beforeFirstKey(from, alpha, current, setup);
const value = this.getCurveValue(time) * setup;
if (alpha === 1 && !add)
return value;
let base = from === MixFrom.setup ? setup : current;
if (add)
return base + (value - setup) * alpha;
if (out)
return base + (Math.abs(value) * Math.sign(base) - base) * alpha;
base = Math.abs(base) * Math.sign(value);
return base + (value - base) * alpha;
}
static beforeFirstKey(from, alpha, current, setup) {
switch (from) {
case MixFrom.setup: return setup;
case MixFrom.first: return current + (setup - current) * alpha;
case MixFrom.current: return current;
}
}
}
export function isBoneTimeline(obj) {
return typeof obj === 'object' && obj !== null && typeof obj.boneIndex === 'number';
}
/** The base class for timelines that change 1 bone property with a curve. */
export class BoneTimeline1 extends CurveTimeline1 {
boneIndex;
constructor(frameCount, bezierCount, boneIndex, property) {
super(frameCount, bezierCount, `${property}|${boneIndex}`);
this.boneIndex = boneIndex;
this.additive = true;
}
apply(skeleton, lastTime, time, events, alpha, from, add, out, appliedPose) {
const bone = skeleton.bones[this.boneIndex];
if (bone.active)
this.apply1(appliedPose ? bone.appliedPose : bone.pose, bone.data.setupPose, time, alpha, from, add, out);
}
}
/** The base class for timelines that change two bone properties with a curve. */
export class BoneTimeline2 extends CurveTimeline {
boneIndex;
/** @param bezierCount The maximum number of Bezier curves. See {@link shrink}.
* @param propertyIds Unique identifiers for the properties the timeline modifies. */
constructor(frameCount, bezierCount, boneIndex, property1, property2) {
super(frameCount, bezierCount, `${property1}|${boneIndex}`, `${property2}|${boneIndex}`);
this.boneIndex = boneIndex;
this.additive = true;
}
getFrameEntries() {
return 3 /*ENTRIES*/;
}
/** Sets the time and values for the specified frame.
* @param frame Between 0 and `frameCount`, inclusive.
* @param time The frame time in seconds. */
setFrame(frame, time, value1, value2) {
frame *= 3 /*ENTRIES*/;
this.frames[frame] = time;
this.frames[frame + 1 /*VALUE1*/] = value1;
this.frames[frame + 2 /*VALUE2*/] = value2;
}
apply(skeleton, lastTime, time, events, alpha, from, add, out, appliedPose) {
const bone = skeleton.bones[this.boneIndex];
if (bone.active)
this.apply1(appliedPose ? bone.appliedPose : bone.pose, bone.data.setupPose, time, alpha, from, add, out);
}
}
/** Changes {@link BonePose.rotation}. */
export class RotateTimeline extends BoneTimeline1 {
constructor(frameCount, bezierCount, boneIndex) {
super(frameCount, bezierCount, boneIndex, Property.rotate);
}
apply1(pose, setup, time, alpha, from, add, out) {
pose.rotation = this.getRelativeValue(time, alpha, from, add, pose.rotation, setup.rotation);
}
}
/** Changes {@link BonePose.x} and {@link BonePose.y}. */
export class TranslateTimeline extends BoneTimeline2 {
constructor(frameCount, bezierCount, boneIndex) {
super(frameCount, bezierCount, boneIndex, Property.x, Property.y);
}
apply1(pose, setup, time, alpha, from, add, out) {
const frames = this.frames;
if (time < frames[0]) {
switch (from) {
case MixFrom.setup:
pose.x = setup.x;
pose.y = setup.y;
break;
case MixFrom.first:
pose.x += (setup.x - pose.x) * alpha;
pose.y += (setup.y - pose.y) * alpha;
break;
}
return;
}
let x = 0, y = 0;
const i = Timeline.search(frames, time, 3 /*ENTRIES*/);
const curveType = this.curves[i / 3 /*ENTRIES*/];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i];
x = frames[i + 1 /*VALUE1*/];
y = frames[i + 2 /*VALUE2*/];
const t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
break;
}
case 1 /*STEPPED*/:
x = frames[i + 1 /*VALUE1*/];
y = frames[i + 2 /*VALUE2*/];
break;
default:
x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
}
if (from === MixFrom.setup) {
pose.x = setup.x + x * alpha;
pose.y = setup.y + y * alpha;
}
else if (add) {
pose.x += x * alpha;
pose.y += y * alpha;
}
else {
pose.x += (setup.x + x - pose.x) * alpha;
pose.y += (setup.y + y - pose.y) * alpha;
}
}
}
/** Changes {@link BonePose.x}. */
export class TranslateXTimeline extends BoneTimeline1 {
constructor(frameCount, bezierCount, boneIndex) {
super(frameCount, bezierCount, boneIndex, Property.x);
}
apply1(pose, setup, time, alpha, from, add, out) {
pose.x = this.getRelativeValue(time, alpha, from, add, pose.x, setup.x);
}
}
/** Changes {@link BonePose.y}. */
export class TranslateYTimeline extends BoneTimeline1 {
constructor(frameCount, bezierCount, boneIndex) {
super(frameCount, bezierCount, boneIndex, Property.y);
}
apply1(pose, setup, time, alpha, from, add, out) {
pose.y = this.getRelativeValue(time, alpha, from, add, pose.y, setup.y);
}
}
/** Changes {@link BonePose.scaleX} and {@link BonePose.scaleY}. */
export class ScaleTimeline extends BoneTimeline2 {
constructor(frameCount, bezierCount, boneIndex) {
super(frameCount, bezierCount, boneIndex, Property.scaleX, Property.scaleY);
}
apply1(pose, setup, time, alpha, from, add, out) {
const frames = this.frames;
if (time < frames[0]) {
switch (from) {
case MixFrom.setup:
pose.scaleX = setup.scaleX;
pose.scaleY = setup.scaleY;
break;
case MixFrom.first:
pose.scaleX += (setup.scaleX - pose.scaleX) * alpha;
pose.scaleY += (setup.scaleY - pose.scaleY) * alpha;
break;
}
return;
}
let x, y;
const i = Timeline.search(frames, time, 3 /*ENTRIES*/);
const curveType = this.curves[i / 3 /*ENTRIES*/];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i];
x = frames[i + 1 /*VALUE1*/];
y = frames[i + 2 /*VALUE2*/];
const t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
break;
}
case 1 /*STEPPED*/:
x = frames[i + 1 /*VALUE1*/];
y = frames[i + 2 /*VALUE2*/];
break;
default:
x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
}
x *= setup.scaleX;
y *= setup.scaleY;
if (alpha === 1 && !add) {
pose.scaleX = x;
pose.scaleY = y;
}
else {
let bx = 0, by = 0;
if (from === MixFrom.setup) {
bx = setup.scaleX;
by = setup.scaleY;
}
else {
bx = pose.scaleX;
by = pose.scaleY;
}
if (add) {
pose.scaleX = bx + (x - setup.scaleX) * alpha;
pose.scaleY = by + (y - setup.scaleY) * alpha;
}
else if (out) {
pose.scaleX = bx + (Math.abs(x) * Math.sign(bx) - bx) * alpha;
pose.scaleY = by + (Math.abs(y) * Math.sign(by) - by) * alpha;
}
else {
bx = Math.abs(bx) * Math.sign(x);
by = Math.abs(by) * Math.sign(y);
pose.scaleX = bx + (x - bx) * alpha;
pose.scaleY = by + (y - by) * alpha;
}
}
}
}
/** Changes a {@link BonePose.scaleX}. */
export class ScaleXTimeline extends BoneTimeline1 {
constructor(frameCount, bezierCount, boneIndex) {
super(frameCount, bezierCount, boneIndex, Property.scaleX);
}
apply1(pose, setup, time, alpha, from, add, out) {
pose.scaleX = this.getScaleValue(time, alpha, from, add, out, pose.scaleX, setup.scaleX);
}
}
/** Changes a {@link BonePose.scaleY}. */
export class ScaleYTimeline extends BoneTimeline1 {
constructor(frameCount, bezierCount, boneIndex) {
super(frameCount, bezierCount, boneIndex, Property.scaleY);
}
apply1(pose, setup, time, alpha, from, add, out) {
pose.scaleY = this.getScaleValue(time, alpha, from, add, out, pose.scaleY, setup.scaleY);
}
}
/** Changes {@link Bone.shearX} and {@link Bone.shearY}. */
export class ShearTimeline extends BoneTimeline2 {
constructor(frameCount, bezierCount, boneIndex) {
super(frameCount, bezierCount, boneIndex, Property.shearX, Property.shearY);
}
apply1(pose, setup, time, alpha, from, add, out) {
const frames = this.frames;
if (time < frames[0]) {
switch (from) {
case MixFrom.setup:
pose.shearX = setup.shearX;
pose.shearY = setup.shearY;
break;
case MixFrom.first:
pose.shearX += (setup.shearX - pose.shearX) * alpha;
pose.shearY += (setup.shearY - pose.shearY) * alpha;
break;
}
return;
}
let x = 0, y = 0;
const i = Timeline.search(frames, time, 3 /*ENTRIES*/);
const curveType = this.curves[i / 3 /*ENTRIES*/];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i];
x = frames[i + 1 /*VALUE1*/];
y = frames[i + 2 /*VALUE2*/];
const t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
break;
}
case 1 /*STEPPED*/:
x = frames[i + 1 /*VALUE1*/];
y = frames[i + 2 /*VALUE2*/];
break;
default:
x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
}
if (from === MixFrom.setup) {
pose.shearX = setup.shearX + x * alpha;
pose.shearY = setup.shearY + y * alpha;
}
else if (add) {
pose.shearX += x * alpha;
pose.shearY += y * alpha;
}
else {
pose.shearX += (setup.shearX + x - pose.shearX) * alpha;
pose.shearY += (setup.shearY + y - pose.shearY) * alpha;
}
}
}
/** Changes {@link Bone.shearX} and {@link Bone.shearY}. */
export class ShearXTimeline extends BoneTimeline1 {
constructor(frameCount, bezierCount, boneIndex) {
super(frameCount, bezierCount, boneIndex, Property.shearX);
}
apply1(pose, setup, time, alpha, from, add, out) {
pose.shearX = this.getRelativeValue(time, alpha, from, add, pose.shearX, setup.shearX);
}
}
/** Changes {@link Bone.shearX} and {@link Bone.shearY}. */
export class ShearYTimeline extends BoneTimeline1 {
constructor(frameCount, bezierCount, boneIndex) {
super(frameCount, bezierCount, boneIndex, Property.shearY);
}
apply1(pose, setup, time, alpha, from, add, out) {
pose.shearY = this.getRelativeValue(time, alpha, from, add, pose.shearY, setup.shearY);
}
}
/** Changes {@link BonePose.inherit}. */
export class InheritTimeline extends Timeline {
boneIndex;
constructor(frameCount, boneIndex) {
super(frameCount, `${Property.inherit}|${boneIndex}`);
this.boneIndex = boneIndex;
this.instant = true;
}
getFrameEntries() {
return 2 /*ENTRIES*/;
}
/** Sets the inherit transform mode for the specified frame.
* @param frame Between 0 and `frameCount`, inclusive.
* @param time The frame time in seconds. */
setFrame(frame, time, inherit) {
frame *= 2 /*ENTRIES*/;
this.frames[frame] = time;
this.frames[frame + 1 /*INHERIT*/] = inherit;
}
apply(skeleton, lastTime, time, events, alpha, from, add, out, appliedPose) {
const bone = skeleton.bones[this.boneIndex];
if (!bone.active)
return;
const pose = appliedPose ? bone.appliedPose : bone.pose;
if (out) {
if (from !== MixFrom.current)
pose.inherit = bone.data.setupPose.inherit;
}
else {
const frames = this.frames;
if (time < frames[0]) {
if (from !== MixFrom.current)
pose.inherit = bone.data.setupPose.inherit;
}
else
pose.inherit = this.frames[Timeline.search(frames, time, 2 /*ENTRIES*/) + 1 /*INHERIT*/];
}
}
}
/** The base class for timelines that change any number of slot properties with a curve. */
export class SlotCurveTimeline extends CurveTimeline {
slotIndex;
constructor(frameCount, bezierCount, slotIndex, ...propertyIds) {
super(frameCount, bezierCount, ...propertyIds);
this.slotIndex = slotIndex;
}
apply(skeleton, lastTime, time, events, alpha, from, add, out, appliedPose) {
const slot = skeleton.slots[this.slotIndex];
if (slot.bone.active)
this.apply1(slot, appliedPose ? slot.appliedPose : slot.pose, time, alpha, from, add);
}
}
/** Changes {@link SlotPose.color}. */
export class RGBATimeline extends SlotCurveTimeline {
constructor(frameCount, bezierCount, slotIndex) {
super(frameCount, bezierCount, slotIndex, //
`${Property.rgb}|${slotIndex}`, //
`${Property.alpha}|${slotIndex}`);
}
getFrameEntries() {
return 5 /*ENTRIES*/;
}
/** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */
setFrame(frame, time, r, g, b, a) {
frame *= 5 /*ENTRIES*/;
this.frames[frame] = time;
this.frames[frame + 1 /*R*/] = r;
this.frames[frame + 2 /*G*/] = g;
this.frames[frame + 3 /*B*/] = b;
this.frames[frame + 4 /*A*/] = a;
}
apply1(slot, pose, time, alpha, from, add) {
const color = pose.color;
const frames = this.frames;
if (time < frames[0]) {
const setup = slot.data.setupPose.color;
switch (from) {
case MixFrom.setup:
color.setFromColor(setup);
break;
case MixFrom.first:
color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha, (setup.a - color.a) * alpha);
break;
}
return;
}
let r = 0, g = 0, b = 0, a = 0;
const i = Timeline.search(frames, time, 5 /*ENTRIES*/);
const curveType = this.curves[i / 5 /*ENTRIES*/];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i];
r = frames[i + 1 /*R*/];
g = frames[i + 2 /*G*/];
b = frames[i + 3 /*B*/];
a = frames[i + 4 /*A*/];
const t = (time - before) / (frames[i + 5 /*ENTRIES*/] - before);
r += (frames[i + 5 /*ENTRIES*/ + 1 /*R*/] - r) * t;
g += (frames[i + 5 /*ENTRIES*/ + 2 /*G*/] - g) * t;
b += (frames[i + 5 /*ENTRIES*/ + 3 /*B*/] - b) * t;
a += (frames[i + 5 /*ENTRIES*/ + 4 /*A*/] - a) * t;
break;
}
case 1 /*STEPPED*/:
r = frames[i + 1 /*R*/];
g = frames[i + 2 /*G*/];
b = frames[i + 3 /*B*/];
a = frames[i + 4 /*A*/];
break;
default:
r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
a = this.getBezierValue(time, i, 4 /*A*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
}
if (alpha === 1)
color.set(r, g, b, a);
else {
if (from === MixFrom.setup) {
const setup = slot.data.setupPose.color;
color.set(setup.r + (r - setup.r) * alpha, setup.g + (g - setup.g) * alpha, setup.b + (b - setup.b) * alpha, setup.a + (a - setup.a) * alpha);
}
else
color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);
}
}
}
/** Changes RGB for a slot's {@link SlotPose.color}. */
export class RGBTimeline extends SlotCurveTimeline {
constructor(frameCount, bezierCount, slotIndex) {
super(frameCount, bezierCount, slotIndex, `${Property.rgb}|${slotIndex}`);
}
getFrameEntries() {
return 4 /*ENTRIES*/;
}
/** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */
setFrame(frame, time, r, g, b) {
frame <<= 2;
this.frames[frame] = time;
this.frames[frame + 1 /*R*/] = r;
this.frames[frame + 2 /*G*/] = g;
this.frames[frame + 3 /*B*/] = b;
}
apply1(slot, pose, time, alpha, from, add) {
const color = pose.color;
let r = 0, g = 0, b = 0;
const frames = this.frames;
if (time < frames[0]) {
const setup = slot.data.setupPose.color;
switch (from) {
case MixFrom.setup: {
color.r = setup.r;
color.g = setup.g;
color.b = setup.b;
break;
}
case MixFrom.first: {
color.r += (setup.r - color.r) * alpha;
color.g += (setup.g - color.g) * alpha;
color.b += (setup.b - color.b) * alpha;
break;
}
}
return;
}
const i = Timeline.search(frames, time, 4 /*ENTRIES*/);
const curveType = this.curves[i >> 2];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i];
r = frames[i + 1 /*R*/];
g = frames[i + 2 /*G*/];
b = frames[i + 3 /*B*/];
const t = (time - before) / (frames[i + 4 /*ENTRIES*/] - before);
r += (frames[i + 4 /*ENTRIES*/ + 1 /*R*/] - r) * t;
g += (frames[i + 4 /*ENTRIES*/ + 2 /*G*/] - g) * t;
b += (frames[i + 4 /*ENTRIES*/ + 3 /*B*/] - b) * t;
break;
}
case 1 /*STEPPED*/:
r = frames[i + 1 /*R*/];
g = frames[i + 2 /*G*/];
b = frames[i + 3 /*B*/];
break;
default:
r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
}
if (alpha !== 1) {
if (from === MixFrom.setup) {
const setup = slot.data.setupPose.color;
r = setup.r + (r - setup.r) * alpha;
g = setup.g + (g - setup.g) * alpha;
b = setup.b + (b - setup.b) * alpha;
}
else {
r = color.r + (r - color.r) * alpha;
g = color.g + (g - color.g) * alpha;
b = color.b + (b - color.b) * alpha;
}
}
color.r = r < 0 ? 0 : (r > 1 ? 1 : r);
color.g = g < 0 ? 0 : (g > 1 ? 1 : g);
color.b = b < 0 ? 0 : (b > 1 ? 1 : b);
}
}
/** Changes alpha for a slot's {@link SlotPose.color}. */
export class AlphaTimeline extends CurveTimeline1 {
slotIndex = 0;
constructor(frameCount, bezierCount, slotIndex) {
super(frameCount, bezierCount, `${Property.alpha}|${slotIndex}`);
this.slotIndex = slotIndex;
}
apply(skeleton, lastTime, time, events, alpha, from, add, out, appliedPose) {
const slot = skeleton.slots[this.slotIndex];
if (!slot.bone.active)
return;
const color = (appliedPose ? slot.appliedPose : slot.pose).color;
let a = 0;
const frames = this.frames;
if (time < frames[0]) {
const setup = slot.data.setupPose.color.a;
switch (from) {
case MixFrom.setup:
color.a = setup;
break;
case MixFrom.first:
color.a += (setup - color.a) * alpha;
break;
}
return;
}
a = this.getCurveValue(time);
if (alpha !== 1) {
if (from === MixFrom.setup) {
const setup = slot.data.setupPose.color;
a = setup.a + (a - setup.a) * alpha;
}
else
a = color.a + (a - color.a) * alpha;
}
color.a = a < 0 ? 0 : (a > 1 ? 1 : a);
}
}
/** Changes {@link SlotPose.color} and {@link SlotPose.darkColor} for two color tinting. */
export class RGBA2Timeline extends SlotCurveTimeline {
constructor(frameCount, bezierCount, slotIndex) {
super(frameCount, bezierCount, slotIndex, //
`${Property.rgb}|${slotIndex}`, //
`${Property.alpha}|${slotIndex}`, //
`${Property.rgb2}|${slotIndex}`);
}
getFrameEntries() {
return 8 /*ENTRIES*/;
}
/** Sets the time in seconds, light, and dark colors for the specified key frame. */
setFrame(frame, time, r, g, b, a, r2, g2, b2) {
frame <<= 3;
this.frames[frame] = time;
this.frames[frame + 1 /*R*/] = r;
this.frames[frame + 2 /*G*/] = g;
this.frames[frame + 3 /*B*/] = b;
this.frames[frame + 4 /*A*/] = a;
this.frames[frame + 5 /*R2*/] = r2;
this.frames[frame + 6 /*G2*/] = g2;
this.frames[frame + 7 /*B2*/] = b2;
}
apply1(slot, pose, time, alpha, from, add) {
// biome-ignore lint/style/noNonNullAssertion: reference runtime
const light = pose.color, dark = pose.darkColor;
let r2 = 0, g2 = 0, b2 = 0;
const frames = this.frames;
if (time < frames[0]) {
const setup = slot.data.setupPose;
// biome-ignore lint/style/noNonNullAssertion: reference runtime
const setupLight = setup.color, setupDark = setup.darkColor;
switch (from) {
case MixFrom.setup: {
light.setFromColor(setupLight);
dark.r = setupDark.r;
dark.g = setupDark.g;
dark.b = setupDark.b;
break;
}
case MixFrom.first: {
light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha, (setupLight.a - light.a) * alpha);
dark.r += (setupDark.r - dark.r) * alpha;
dark.g += (setupDark.g - dark.g) * alpha;
dark.b += (setupDark.b - dark.b) * alpha;
break;
}
}
return;
}
let r = 0, g = 0, b = 0, a = 0;
const i = Timeline.search(frames, time, 8 /*ENTRIES*/);
const curveType = this.curves[i >> 3];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i];
r = frames[i + 1 /*R*/];
g = frames[i + 2 /*G*/];
b = frames[i + 3 /*B*/];
a = frames[i + 4 /*A*/];
r2 = frames[i + 5 /*R2*/];
g2 = frames[i + 6 /*G2*/];
b2 = frames[i + 7 /*B2*/];
const t = (time - before) / (frames[i + 8 /*ENTRIES*/] - before);
r += (frames[i + 8 /*ENTRIES*/ + 1 /*R*/] - r) * t;
g += (frames[i + 8 /*ENTRIES*/ + 2 /*G*/] - g) * t;
b += (frames[i + 8 /*ENTRIES*/ + 3 /*B*/] - b) * t;
a += (frames[i + 8 /*ENTRIES*/ + 4 /*A*/] - a) * t;
r2 += (frames[i + 8 /*ENTRIES*/ + 5 /*R2*/] - r2) * t;
g2 += (frames[i + 8 /*ENTRIES*/ + 6 /*G2*/] - g2) * t;
b2 += (frames[i + 8 /*ENTRIES*/ + 7 /*B2*/] - b2) * t;
break;
}
case 1 /*STEPPED*/:
r = frames[i + 1 /*R*/];
g = frames[i + 2 /*G*/];
b = frames[i + 3 /*B*/];
a = frames[i + 4 /*A*/];
r2 = frames[i + 5 /*R2*/];
g2 = frames[i + 6 /*G2*/];
b2 = frames[i + 7 /*B2*/];
break;
default:
r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
a = this.getBezierValue(time, i, 4 /*A*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
r2 = this.getBezierValue(time, i, 5 /*R2*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
g2 = this.getBezierValue(time, i, 6 /*G2*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
b2 = this.getBezierValue(time, i, 7 /*B2*/, curveType + 18 /*BEZIER_SIZE*/ * 6 - 2 /*BEZIER*/);
}
if (alpha === 1)
light.set(r, g, b, a);
else if (from === MixFrom.setup) {
const setupPose = slot.data.setupPose;
let setup = setupPose.color;
light.set(setup.r + (r - setup.r) * alpha, setup.g + (g - setup.g) * alpha, setup.b + (b - setup.b) * alpha, setup.a + (a - setup.a) * alpha);
// biome-ignore lint/style/noNonNullAssertion: reference runtime
setup = setupPose.darkColor;
r2 = setup.r + (r2 - setup.r) * alpha;
g2 = setup.g + (g2 - setup.g) * alpha;
b2 = setup.b + (b2 - setup.b) * alpha;
}
else {
light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha);
r2 = dark.r + (r2 - dark.r) * alpha;
g2 = dark.g + (g2 - dark.g) * alpha;
b2 = dark.b + (b2 - dark.b) * alpha;
}
dark.r = r2 < 0 ? 0 : (r2 > 1 ? 1 : r2);
dark.g = g2 < 0 ? 0 : (g2 > 1 ? 1 : g2);
dark.b = b2 < 0 ? 0 : (b2 > 1 ? 1 : b2);
}
}
/** Changes {@link SlotPose.color} and {@link SlotPose.darkColor} for two color tinting. */
export class RGB2Timeline extends SlotCurveTimeline {
constructor(frameCount, bezierCount, slotIndex) {
super(frameCount, bezierCount, slotIndex, //
`${Property.rgb}|${slotIndex}`, //
`${Property.rgb2}|${slotIndex}`);
}
getFrameEntries() {
return 7 /*ENTRIES*/;
}
/** Sets the time in seconds, light, and dark colors for the specified key frame. */
setFrame(frame, time, r, g, b, r2, g2, b2) {
frame *= 7 /*ENTRIES*/;
this.frames[frame] = time;
this.frames[frame + 1 /*R*/] = r;
this.frames[frame + 2 /*G*/] = g;
this.frames[frame + 3 /*B*/] = b;
this.frames[frame + 4 /*R2*/] = r2;
this.frames[frame + 5 /*G2*/] = g2;
this.frames[frame + 6 /*B2*/] = b2;
}
apply1(slot, pose, time, alpha, from, add) {
// biome-ignore lint/style/noNonNullAssertion: reference runtime
const light = pose.color, dark = pose.darkColor;
let r = 0, g = 0, b = 0, r2 = 0, g2 = 0, b2 = 0;
const frames = this.frames;
if (time < frames[0]) {
const setup = slot.data.setupPose;
// biome-ignore lint/style/noNonNullAssertion: reference runtime
const setupLight = setup.color, setupDark = setup.darkColor;
switch (from) {
case MixFrom.setup:
light.r = setupLight.r;
light.g = setupLight.g;
light.b = setupLight.b;
dark.r = setupDark.r;
dark.g = setupDark.g;
dark.b = setupDark.b;
break;
case MixFrom.first:
light.r += (setupLight.r - light.r) * alpha;
light.g += (setupLight.g - light.g) * alpha;
light.b += (setupLight.b - light.b) * alpha;
dark.r += (setupDark.r - dark.r) * alpha;
dark.g += (setupDark.g - dark.g) * alpha;
dark.b += (setupDark.b - dark.b) * alpha;
break;
}
return;
}
const i = Timeline.search(frames, time, 7 /*ENTRIES*/);
const curveType = this.curves[i / 7 /*ENTRIES*/];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i];
r = frames[i + 1 /*R*/];
g = frames[i + 2 /*G*/];
b = frames[i + 3 /*B*/];
r2 = frames[i + 4 /*R2*/];
g2 = frames[i + 5 /*G2*/];
b2 = frames[i + 6 /*B2*/];
const t = (time - before) / (frames[i + 7 /*ENTRIES*/] - before);
r += (frames[i + 7 /*ENTRIES*/ + 1 /*R*/] - r) * t;
g += (frames[i + 7 /*ENTRIES*/ + 2 /*G*/] - g) * t;
b += (frames[i + 7 /*ENTRIES*/ + 3 /*B*/] - b) * t;
r2 += (frames[i + 7 /*ENTRIES*/ + 4 /*R2*/] - r2) * t;
g2 += (frames[i + 7 /*ENTRIES*/ + 5 /*G2*/] - g2) * t;
b2 += (frames[i + 7 /*ENTRIES*/ + 6 /*B2*/] - b2) * t;
break;
}
case 1 /*STEPPED*/:
r = frames[i + 1 /*R*/];
g = frames[i + 2 /*G*/];
b = frames[i + 3 /*B*/];
r2 = frames[i + 4 /*R2*/];
g2 = frames[i + 5 /*G2*/];
b2 = frames[i + 6 /*B2*/];
break;
default:
r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
r2 = this.getBezierValue(time, i, 4 /*R2*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
g2 = this.getBezierValue(time, i, 5 /*G2*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
b2 = this.getBezierValue(time, i, 6 /*B2*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
}
if (alpha !== 1) {
if (from === MixFrom.setup) {
const setupPose = slot.data.setupPose;
let setup = setupPose.color;
r = setup.r + (r - setup.r) * alpha;
g = setup.g + (g - setup.g) * alpha;
b = setup.b + (b - setup.b) * alpha;
// biome-ignore lint/style/noNonNullAssertion: reference runtime
setup = setupPose.darkColor;
r2 = setup.r + (r2 - setup.r) * alpha;
g2 = setup.g + (g2 - setup.g) * alpha;
b2 = setup.b + (b2 - setup.b) * alpha;
}
else {
r = light.r + (r - light.r) * alpha;
g = light.g + (g - light.g) * alpha;
b = light.b + (b - light.b) * alpha;
r2 = dark.r + (r2 - dark.r) * alpha;
g2 = dark.g + (g2 - dark.g) * alpha;
b2 = dark.b + (b2 - dark.b) * alpha;
}
}
light.r = r < 0 ? 0 : (r > 1 ? 1 : r);
light.g = g < 0 ? 0 : (g > 1 ? 1 : g);
light.b = b < 0 ? 0 : (b > 1 ? 1 : b);
dark.r = r2 < 0 ? 0 : (r2 > 1 ? 1 : r2);
dark.g = g2 < 0 ? 0 : (g2 > 1 ? 1 : g2);
dark.b = b2 < 0 ? 0 : (b2 > 1 ? 1 : b2);
}
}
/** Changes {@link SlotPose.ttachment}. */
export class AttachmentTimeline extends Timeline {
slotIndex = 0;
/** The attachment name for each key frame. May contain null values to clear the attachment. */
attachmentNames;
constructor(frameCount, slotIndex) {
super(frameCount, `${Property.attachment}|${slotIndex}`);
this.slotIndex = slotIndex;
this.attachmentNames = new Array(frameCount);
this.instant = true;
}
getFrameCount() {
return this.frames.length;
}
/** Sets the time in seconds and the attachment name for the specified key frame. */
setFrame(frame, time, attachmentName) {
this.frames[frame] = time;
this.attachmentNames[frame] = attachmentName;
}
apply(skeleton, lastTime, time, events, alpha, from, add, out, appliedPose) {
const slot = skeleton.slots[this.slotIndex];
if (!slot.bone.active)
return;
const pose = appliedPose ? slot.appliedPose : slot.pose;
if (out || time < this.frames[0]) {
if (from !== MixFrom.current)
this.setAttachment(skeleton, pose, slot.data.attachmentName);
}
else
this.setAttachment(skeleton, pose, this.attachmentNames[Timeline.search(this.frames, time)]);
}
setAttachment(skeleton, pose, attachmentName) {
pose.setAttachment(!attachmentName ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
}
}
/** Changes {@link SlotPose.deform} to deform a {@link VertexAttachment}. */
export class DeformTimeline extends CurveTimeline {
slotIndex;
/** The attachment that will be deformed.
*
* See {@link VertexAttachment.getTimelineAttachment}. */
attachment;
/** The vertices for each key frame. */
vertices;
constructor(frameCount, bezierCount, slotIndex, attachment) {
super(frameCount, bezierCount, `${Property.deform}|${slotIndex}|${attachment.id}`);
this.slotIndex = slotIndex;
this.attachment = attachment;
this.vertices = new Array(frameCount);
this.additive = true;
}
getFrameCount() {
return this.frames.length;
}
/** Sets the time and vertices for the specified frame.
* @param frame Between 0 and `frameCount`, inclusive.
* @param time The frame time in seconds.
* @param vertices Vertex positions for an unweighted VertexAttachment, or deform offsets if it has weights. */
setFrame(frame, time, vertices) {
this.frames[frame] = time;
this.vertices[frame] = vertices;
}
/** @param value1 Ignored (0 is used for a deform timeline).
* @param value2 Ignored (1 is used for a deform timeline). */
setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) {
const curves = this.curves;
let i = this.getFrameCount() + bezier * 18 /*BEZIER_SIZE*/;
if (value === 0)
curves[frame] = 2 /*BEZIER*/ + i;
const tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = cy2 * 0.03 - cy1 * 0.06;
const dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = (cy1 - cy2 + 0.33333333) * 0.018;
let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;
let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = cy1 * 0.3 + tmpy + dddy * 0.16666667;
let x = time1 + dx, y = dy;
for (let n = i + 18 /*BEZIER_SIZE*/; i < n; i += 2) {
curves[i] = x;
curves[i + 1] = y;
dx += ddx;
dy += ddy;
ddx += dddx;
ddy += dddy;
x += dx;
y += dy;
}
}
getCurvePercent(time, frame) {
const curves = this.curves;
let i = curves[frame];
switch (i) {
case 0 /*LINEAR*/: {
const x = this.frames[frame];
return (time - x) / (this.frames[frame + this.getFrameEntries()] - x);
}
case 1 /*STEPPED*/:
return 0;
}
i -= 2 /*BEZIER*/;
if (curves[i] > time) {
const x = this.frames[frame];
return curves[i + 1] * (time - x) / (curves[i] - x);
}
const n = i + 18 /*BEZIER_SIZE*/;
for (i += 2; i < n; i += 2) {
if (curves[i] >= time) {
const x = curves[i - 2], y = curves[i - 1];
return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
}
}
const x = curves[n - 2], y = curves[n - 1];
return y + (1 - y) * (time - x) / (this.frames[frame + this.getFrameEntries()] - x);
}
apply(skeleton, lastTime, time, events, alpha, from, add, out, appliedPose) {
const slots = skeleton.slots;
if (!this.attachment.isTimelineActive(slots, this.slotIndex, appliedPose))
return;
const timelineSlots = this.attachment.timelineSlots;
const frames = this.frames;
if (time < frames[0]) {
this.applyBeforeFirst(slots[this.slotIndex], appliedPose, alpha, from);
for (const slotIndex of timelineSlots)
this.applyBeforeFirst(slots[slotIndex], appliedPose, alpha, from);
return;
}
let v1, v2;
let percent;
if (time >= frames[frames.length - 1]) {
percent = 0;
v1 = this.vertices[frames.length - 1];
v2 = null;
}
else {
const frame = Timeline.search(frames, time);
percent = this.getCurvePercent(time, frame);
v1 = this.vertices[frame];
v2 = this.vertices[frame + 1];
}
const vertexCount = this.vertices[0].length;
this.applyToSlot(slots[this.slotIndex], appliedPose, v1, v2, percent, vertexCount, alpha, from, add);
for (const slotIndex of timelineSlots)
this.applyToSlot(slots[slotIndex], appliedPose, v1, v2, percent, vertexCount, alpha, from, add);
}
applyBeforeFirst(slot, appliedPose, alpha, from) {
if (!slot.bone.active)
return;
const pose = appliedPose ? slot.appliedPose : slot.pose;
if (pose.attachment == null || pose.attachment.timelineAttachment !== this.attachment)
return;
const deformArray = pose.deform;
if (deformArray.length === 0)
from = MixFrom.setup;
switch (from) {
case MixFrom.setup:
deformArray.length = 0;
break;
case MixFrom.first: {
if (alpha === 1) {
deformArray.length = 0;
return;
}
const vertexCount = this.vertices[0].length;
deformArray.length = vertexCount;
const deform = deformArray;
const vertexAttachment = pose.attachment;
if (vertexAttachment.bones === null) {
const setupVertices = vertexAttachment.vertices;
for (let i = 0; i < vertexCount; i++)
deform[i] += (setupVertices[i] - deform[i]) * alpha;
}
else {
alpha = 1 - alpha;
for (let i = 0; i < vertexCount; i++)
deform[i] *= alpha;
}
}
}
}
applyToSlot(slot, appliedPose, v1, v2, percent, vertexCount, alpha, from, add) {
if (!slot.bone.active)
return;
const pose = appliedPose ? slot.appliedPose : slot.pose;
if (pose.attachment === null || pose.attachment.timelineAttachment !== this.attachment)
return;
const vertexAttachment = pose.attachment;
const deform = pose.deform;
if (deform.length === 0)
from = MixFrom.setup;
const fromSetup = from === MixFrom.setup;
deform.length = vertexCount;
if (v2 === null) { // Time is after last frame.
if (alpha === 1) {
if (add && !fromSetup) {
if (!vertexAttachment.bones) { // Unweighted vertex positions, no alpha.
const setupVertices = vertexAttachment.vertices;
for (let i = 0; i < vertexCount; i++)
deform[i] += v1[i] - setupVertices[i];
}
else { // Weighted deform offsets, no alpha.
for (let i = 0; i < vertexCount; i++)
deform[i] += v1[i];
}
}
else // Vertex positions or deform offsets, no alpha.
Utils.arrayCopy(v1, 0, deform, 0, vertexCount);
}
else if (fromSetup) {
if (!vertexAttachment.bones) { // Unweighted vertex positions, with alpha.
const setupVertices = vertexAttachment.vertices;
for (let i = 0; i < vertexCount; i++) {
const setup = setupVertices[i];
deform[i] = setup + (v1[i] - setup) * alpha;
}
}
else { // Weighted deform offsets, with alpha.
for (let i = 0; i < vertexCount; i++)
deform[i] = v1[i] * alpha;
}
}
else if (add) {
if (!vertexAttachment.bones) { // Unweighted vertex positions, no alpha.
const setupVertices = vertexAttachment.vertices;
for (let i = 0; i < vertexCount; i++)
deform[i] += (v1[i] - setupVertices[i]) * alpha;
}
else { // Weighted deform offsets, alpha.
for (let i = 0; i < vertexCount; i++)
deform[i] += v1[i] * alpha;
}
}
else { // Vertex positions or deform offsets, with alpha.
for (let i = 0; i < vertexCount; i++)
deform[i] += (v1[i] - deform[i]) * alpha;
}
}
else { // Between frames.
if (alpha === 1) {
if (add && !fromSetup) {
if (!vertexAttachment.bones) { // Unweighted vertex positions, no alpha.
const setupVertices = vertexAttachment.vertices;
for (let i = 0; i < vertexCount; i++) {
const prev = v1[i];
deform[i] += prev + (v2[i] - prev) * percent - setupVertices[i];
}
}
else { // Weighted deform offsets, no alpha.
for (let i = 0; i < vertexCount; i++) {
const prev = v1[i];
deform[i] += prev + (v2[i] - prev) * percent;
}
}
}
else if (percent === 0)
Utils.arrayCopy(v1, 0, deform, 0, vertexCount);
else { // Vertex positions or deform offsets, no alpha.
for (let i = 0; i < vertexCount; i++) {
const prev = v1[i];
deform[i] = prev + (v2[i] - prev) * percent;
}
}
}
else if (fromSetup) {
if (!vertexAttachment.bones) { // Unweighted vertex positions, with alpha.
const setupVertices = vertexAttachment.vertices;
for (let i = 0; i < vertexCount; i++) {
const prev = v1[i], setup = setupVertices[i];
deform[i] = setup + (prev + (v2[i] - prev) * percent - setup) * alpha;
}
}
else { // Weighted deform offsets, with alpha.
for (let i = 0; i < vertexCount; i++) {
const prev = v1[i];
deform[i] = (prev + (v2[i] - prev) * percent) * alpha;
}
}
}
else if (add) {
if (!vertexAttachment.bones) { // Unweighted vertex positions, with alpha.
const setupVertices = vertexAttachment.vertices;
for (let i = 0; i < vertexCount; i++) {
const prev = v1[i];
deform[i] += (prev + (v2[i] - prev) * percent - setupVertices[i]) * alpha;
}
}
else { // Weighted deform offsets, with alpha.
for (let i = 0; i < vertexCount; i++) {
const prev = v1[i];
deform[i] += (prev + (v2[i] - prev) * percent) * alpha;
}
}
}
else {
for (let i = 0; i < vertexCount; i++) {
const prev = v1[i];
deform[i] += (prev + (v2[i] - prev) * percent - deform[i]) * alpha;
}
}
}
}
}
/** Changes {@link Slot.getSequenceIndex} for an attachment's {@link Sequence}. */
export class SequenceTimeline extends Timeline {
static ENTRIES = 3;
static MODE = 1;
static DELAY = 2;
slotIndex;
attachment;
constructor(frameCount, slotIndex, attachment) {
super(frameCount, `${Property.sequence}|${slotIndex}|${attachment.sequence.id}`);
this.slotIndex = slotIndex;
this.attachment = attachment;
this.instant = true;
}
getFrameEntries() {
return SequenceTimeline.ENTRIES;
}
getSlotIndex() {
return this.slotIndex;
}
/** The attachment for which the {@link SlotPose.sequenceIndex} will be set.
*
* See {@link VertexAttachment.timelineAttachment}. */
getAttachment() {
return this.attachment;
}
/** Sets the time, mode, index, and frame time for the specified frame.
* @param frame Between 0 and `frameCount`, inclusive.
* @param time Seconds between frames. */
setFrame(frame, time, mode, index, delay) {
const frames = this.frames;
frame *= SequenceTimeline.ENTRIES;
frames[frame] = time;
frames[frame + SequenceTimeline.MODE] = mode | (index << 4);
frames[frame + SequenceTimeline.DELAY] = delay;
}
apply(skeleton, lastTime, time, events, alpha, from, add, out, appliedPose) {
const slots = skeleton.slots;
if (!this.attachment.isTimelineActive(slots, this.slotIndex, appliedPose))
return;
const timelineSlots = this.attachment.timelineSlots;
const frames = this.frames;
if (out || time < frames[0]) {
if (from !== MixFrom.current) {
this.setupPose(slots[this.slotIndex], appliedPose);
for (const slotIndex of timelineSlots)
this.setupPose(slots[slotIndex], appliedPose);
}
return;
}
const i = Timeline.search(frames, time, SequenceTimeline.ENTRIES);
const before = frames[i];
const modeAndIndex = frames[i + SequenceTimeline.MODE];
const delay = frames[i + SequenceTimeline.DELAY];
this.applyToSlot(slots[this.slotIndex], appliedPose, time, before, modeAndIndex, delay);
for (const slotIndex of timelineSlots)
this.applyToSlot(slots[slotIndex], appliedPose, time, before, modeAndIndex, delay);
}
setupPose(slot, appliedPose) {
if (!slot.bone.active)
return;
const pose = appliedPose ? slot.appliedPose : slot.pose;
if (pose.attachment === null || pose.attachment.timelineAttachment !== this.attachment)
return;
pose.sequenceIndex = -1;
}
applyToSlot(slot, appliedPose, time, before, modeAndIndex, delay) {
if (!slot.bone.active)
return;
const pose = appliedPose ? slot.appliedPose : slot.pose;
if (pose.attachment === null || pose.attachment.timelineAttachment !== this.attachment)
return;
let index = modeAndIndex >> 4, count = pose.attachment.sequence.regions.length;
const mode = SequenceModeValues[modeAndIndex & 0xf];
if (mode !== SequenceMode.hold) {
index += (((time - before) / delay + 0.00001) | 0);
switch (mode) {
case SequenceMode.once:
index = Math.min(count - 1, index);
break;
case SequenceMode.loop:
index %= count;
break;
case SequenceMode.pingpong: {
const n = (count << 1) - 2;
index = n === 0 ? 0 : index % n;
if (index >= count)
index = n - index;
break;
}
case SequenceMode.onceReverse:
index = Math.max(count - 1 - index, 0);
break;
case SequenceMode.loopReverse:
index = count - 1 - (index % count);
break;
case SequenceMode.pingpongReverse: {
const n = (count << 1) - 2;
index = n === 0 ? 0 : (index + count - 1) % n;
if (index >= count)
index = n - index;
}
}
}
pose.sequenceIndex = index;
}
}
/** Fires an {@link Event} when specific animation times are reached. */
export class EventTimeline extends Timeline {
static propertyIds = [`${Property.event}`];
/** The event for each key frame. */
events;
constructor(frameCount) {
super(frameCount, ...EventTimeline.propertyIds);
this.events = new Array(frameCount);
this.instant = true;
}
getFrameCount() {
return this.frames.length;
}
/** Sets the time in seconds and the event for the specified key frame. */
setFrame(frame, event) {
this.frames[frame] = event.time;
this.events[frame] = event;
}
/** Fires events for frames > `lastTime` and <= `time`. */
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
if (!firedEvents)
return;
const frames = this.frames;
const frameCount = this.frames.length;
if (lastTime > time) { // Apply after lastTime for looped animations.
// Reference runtime passes null for MixFrom here. This timeline doesn't use it, but TS keeps the type non-null.
this.apply(null, lastTime, Number.MAX_VALUE, firedEvents, 0, from, false, false, false);
lastTime = -1;
}
else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame.
return;
if (time < frames[0])
return;
let i = 0;
if (lastTime < frames[0])
i = 0;
else {
i = Timeline.search(frames, lastTime) + 1;
const frameTime = frames[i];
while (i > 0) { // Fire multiple events with the same frame.
if (frames[i - 1] !== frameTime)
break;
i--;
}
}
for (; i < frameCount && time >= frames[i]; i++)
firedEvents.push(this.events[i]);
}
}
/** Changes the {@link Skeleton.getDrawOrder}. */
export class DrawOrderTimeline extends Timeline {
static propertyID = `${Property.drawOrder}`;
static propertyIds = [DrawOrderTimeline.propertyID];
/** The draw order for each key frame. See {@link setFrame}. */
drawOrders;
constructor(frameCount) {
super(frameCount, ...DrawOrderTimeline.propertyIds);
this.drawOrders = new Array(frameCount);
this.instant = true;
}
getFrameCount() {
return this.frames.length;
}
/** Sets the time in seconds and the draw order for the specified key frame.
* @param drawOrder Ordered {@link Skeleton.slots} indices, or null to use setup pose
* draw order. */
setFrame(frame, time, drawOrder) {
this.frames[frame] = time;
this.drawOrders[frame] = drawOrder;
}
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
const pose = (appliedPose ? skeleton.drawOrder.appliedPose : skeleton.drawOrder.pose);
const setup = skeleton.slots;
if (out || time < this.frames[0]) {
if (from !== MixFrom.current)
Utils.arrayCopy(setup, 0, pose, 0, skeleton.slots.length);
return;
}
const order = this.drawOrders[Timeline.search(this.frames, time)];
if (!order)
Utils.arrayCopy(setup, 0, pose, 0, skeleton.slots.length);
else {
for (let i = 0, n = order.length; i < n; i++)
pose[i] = setup[order[i]];
}
}
}
/** Changes a subset of the {@link Skeleton.getDrawOrder | draw order}. */
export class DrawOrderFolderTimeline extends Timeline {
static propertyID = `${Property.drawOrderFolder}`;
slots;
inFolder;
drawOrders;
/** @param slots {@link Skeleton.slots} indices controlled by this timeline, in setup order.
* @param slotCount The maximum number of slots in the skeleton. */
constructor(frameCount, slots, slotCount) {
super(frameCount, ...DrawOrderFolderTimeline.propertyIds(slots));
this.slots = slots;
this.drawOrders = new Array(frameCount);
this.inFolder = new Array(slotCount);
for (const i of slots)
this.inFolder[i] = true;
this.instant = true;
}
static propertyIds(slots) {
const n = slots.length;
const ids = new Array(n);
for (let i = 0; i < n; i++)
ids[i] = `${DrawOrderFolderTimeline.propertyID}|${slots[i]}`;
return ids;
}
getFrameCount() {
return this.frames.length;
}
/** The {@link Skeleton.getSlots} indices that this timeline affects, in setup order. */
getSlots() {
return this.slots;
}
/** The draw order for each frame. See {@link setFrame}. */
getDrawOrders() {
return this.drawOrders;
}
/** Sets the time and draw order for the specified frame.
* @param frame Between 0 and `frameCount`, inclusive.
* @param time The frame time in seconds.
* @param drawOrder Ordered {@link getSlots} indices, or null to use setup pose order. */
setFrame(frame, time, drawOrder) {
this.frames[frame] = time;
this.drawOrders[frame] = drawOrder;
}
apply(skeleton, lastTime, time, events, alpha, from, add, out, appliedPose) {
const pose = (appliedPose ? skeleton.drawOrder.appliedPose : skeleton.drawOrder.pose);
const setup = skeleton.slots;
if (out || time < this.frames[0]) {
if (from !== MixFrom.current)
this.setup(pose, setup);
}
else {
const order = this.drawOrders[Timeline.search(this.frames, time)];
if (!order)
this.setup(pose, setup);
else {
const inFolder = this.inFolder;
const slots = this.slots;
for (let i = 0, found = 0, done = slots.length;; i++) {
if (inFolder[pose[i].data.index]) {
pose[i] = setup[slots[order[found]]];
if (++found === done)
break;
}
}
}
}
}
setup(pose, setup) {
const { inFolder, slots } = this;
for (let i = 0, found = 0, done = slots.length;; i++) {
if (inFolder[pose[i].data.index]) {
pose[i] = setup[slots[found]];
if (++found === done)
break;
}
}
}
}
export function isConstraintTimeline(obj) {
return typeof obj === 'object' && obj !== null && typeof obj.constraintIndex === 'number';
}
/** Changes {@link IkConstraintPose.mix)}, {@link IkConstraintPose.softness},
* {@link IkConstraintPose.bendDirection}, {@link IkConstraintPose.stretch}, and
* {@link IkConstraintPose.compress}. */
export class IkConstraintTimeline extends CurveTimeline {
constraintIndex = 0;
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, `${Property.ikConstraint}|${constraintIndex}`);
this.constraintIndex = constraintIndex;
}
getFrameEntries() {
return 6 /*ENTRIES*/;
}
/** Sets the time, mix, softness, bend direction, compress, and stretch for the specified frame.
* @param frame Between 0 and `frameCount`, inclusive.
* @param time The frame time in seconds.
* @param bendDirection 1 or -1. */
setFrame(frame, time, mix, softness, bendDirection, compress, stretch) {
frame *= 6 /*ENTRIES*/;
this.frames[frame] = time;
this.frames[frame + 1 /*MIX*/] = mix;
this.frames[frame + 2 /*SOFTNESS*/] = softness;
this.frames[frame + 3 /*BEND_DIRECTION*/] = bendDirection;
this.frames[frame + 4 /*COMPRESS*/] = compress ? 1 : 0;
this.frames[frame + 5 /*STRETCH*/] = stretch ? 1 : 0;
}
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
const constraint = skeleton.constraints[this.constraintIndex];
if (!constraint.active)
return;
const pose = appliedPose ? constraint.appliedPose : constraint.pose;
const frames = this.frames;
if (time < frames[0]) {
const setup = constraint.data.setupPose;
switch (from) {
case MixFrom.setup: {
pose.mix = setup.mix;
pose.softness = setup.softness;
pose.bendDirection = setup.bendDirection;
pose.compress = setup.compress;
pose.stretch = setup.stretch;
break;
}
case MixFrom.first: {
pose.mix += (setup.mix - pose.mix) * alpha;
pose.softness += (setup.softness - pose.softness) * alpha;
pose.bendDirection = setup.bendDirection;
pose.compress = setup.compress;
pose.stretch = setup.stretch;
break;
}
}
return;
}
let mix = 0, softness = 0;
const i = Timeline.search(frames, time, 6 /*ENTRIES*/);
const curveType = this.curves[i / 6 /*ENTRIES*/];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i];
mix = frames[i + 1 /*MIX*/];
softness = frames[i + 2 /*SOFTNESS*/];
const t = (time - before) / (frames[i + 6 /*ENTRIES*/] - before);
mix += (frames[i + 6 /*ENTRIES*/ + 1 /*MIX*/] - mix) * t;
softness += (frames[i + 6 /*ENTRIES*/ + 2 /*SOFTNESS*/] - softness) * t;
break;
}
case 1 /*STEPPED*/:
mix = frames[i + 1 /*MIX*/];
softness = frames[i + 2 /*SOFTNESS*/];
break;
default:
mix = this.getBezierValue(time, i, 1 /*MIX*/, curveType - 2 /*BEZIER*/);
softness = this.getBezierValue(time, i, 2 /*SOFTNESS*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
}
const base = from === MixFrom.setup ? constraint.data.setupPose : pose;
pose.mix = base.mix + (mix - base.mix) * alpha;
pose.softness = base.softness + (softness - base.softness) * alpha;
if (out) {
if (from === MixFrom.setup) {
pose.bendDirection = base.bendDirection;
pose.compress = base.compress;
pose.stretch = base.stretch;
}
}
else {
pose.bendDirection = frames[i + 3 /*BEND_DIRECTION*/];
pose.compress = frames[i + 4 /*COMPRESS*/] !== 0;
pose.stretch = frames[i + 5 /*STRETCH*/] !== 0;
}
}
}
/** Changes {@link TransformConstraintPose.mixRotate}, {@link TransformConstraintPose.mixX},
* {@link TransformConstraintPose.mixY}, {@link TransformConstraintPose.mixScaleX},
* {@link TransformConstraintPose.mixScaleY}, and {@link TransformConstraintPose.mixShearY}. */
export class TransformConstraintTimeline extends CurveTimeline {
/** The index of the transform constraint slot in {@link Skeleton.transformConstraints} that will be changed. */
constraintIndex = 0;
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, `${Property.transformConstraint}|${constraintIndex}`);
this.constraintIndex = constraintIndex;
this.additive = true;
}
getFrameEntries() {
return 7 /*ENTRIES*/;
}
/** Sets the time, rotate mix, translate mix, scale mix, and shear mix for the specified frame.
* @param frame Between 0 and `frameCount`, inclusive.
* @param time The frame time in seconds. */
setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY) {
const frames = this.frames;
frame *= 7 /*ENTRIES*/;
frames[frame] = time;
frames[frame + 1 /*ROTATE*/] = mixRotate;
frames[frame + 2 /*X*/] = mixX;
frames[frame + 3 /*Y*/] = mixY;
frames[frame + 4 /*SCALEX*/] = mixScaleX;
frames[frame + 5 /*SCALEY*/] = mixScaleY;
frames[frame + 6 /*SHEARY*/] = mixShearY;
}
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
const constraint = skeleton.constraints[this.constraintIndex];
if (!constraint.active)
return;
const pose = appliedPose ? constraint.appliedPose : constraint.pose;
const frames = this.frames;
if (time < frames[0]) {
const setup = constraint.data.setupPose;
switch (from) {
case MixFrom.setup: {
pose.mixRotate = setup.mixRotate;
pose.mixX = setup.mixX;
pose.mixY = setup.mixY;
pose.mixScaleX = setup.mixScaleX;
pose.mixScaleY = setup.mixScaleY;
pose.mixShearY = setup.mixShearY;
break;
}
case MixFrom.first: {
pose.mixRotate += (setup.mixRotate - pose.mixRotate) * alpha;
pose.mixX += (setup.mixX - pose.mixX) * alpha;
pose.mixY += (setup.mixY - pose.mixY) * alpha;
pose.mixScaleX += (setup.mixScaleX - pose.mixScaleX) * alpha;
pose.mixScaleY += (setup.mixScaleY - pose.mixScaleY) * alpha;
pose.mixShearY += (setup.mixShearY - pose.mixShearY) * alpha;
break;
}
}
return;
}
let rotate, x, y, scaleX, scaleY, shearY;
const i = Timeline.search(frames, time, 7 /*ENTRIES*/);
const curveType = this.curves[i / 7 /*ENTRIES*/];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i];
rotate = frames[i + 1 /*ROTATE*/];
x = frames[i + 2 /*X*/];
y = frames[i + 3 /*Y*/];
scaleX = frames[i + 4 /*SCALEX*/];
scaleY = frames[i + 5 /*SCALEY*/];
shearY = frames[i + 6 /*SHEARY*/];
const t = (time - before) / (frames[i + 7 /*ENTRIES*/] - before);
rotate += (frames[i + 7 /*ENTRIES*/ + 1 /*ROTATE*/] - rotate) * t;
x += (frames[i + 7 /*ENTRIES*/ + 2 /*X*/] - x) * t;
y += (frames[i + 7 /*ENTRIES*/ + 3 /*Y*/] - y) * t;
scaleX += (frames[i + 7 /*ENTRIES*/ + 4 /*SCALEX*/] - scaleX) * t;
scaleY += (frames[i + 7 /*ENTRIES*/ + 5 /*SCALEY*/] - scaleY) * t;
shearY += (frames[i + 7 /*ENTRIES*/ + 6 /*SHEARY*/] - shearY) * t;
break;
}
case 1 /*STEPPED*/:
rotate = frames[i + 1 /*ROTATE*/];
x = frames[i + 2 /*X*/];
y = frames[i + 3 /*Y*/];
scaleX = frames[i + 4 /*SCALEX*/];
scaleY = frames[i + 5 /*SCALEY*/];
shearY = frames[i + 6 /*SHEARY*/];
break;
default:
rotate = this.getBezierValue(time, i, 1 /*ROTATE*/, curveType - 2 /*BEZIER*/);
x = this.getBezierValue(time, i, 2 /*X*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
y = this.getBezierValue(time, i, 3 /*Y*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
scaleX = this.getBezierValue(time, i, 4 /*SCALEX*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
scaleY = this.getBezierValue(time, i, 5 /*SCALEY*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
shearY = this.getBezierValue(time, i, 6 /*SHEARY*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
}
const base = from === MixFrom.setup ? constraint.data.setupPose : pose;
if (add) {
pose.mixRotate = base.mixRotate + rotate * alpha;
pose.mixX = base.mixX + x * alpha;
pose.mixY = base.mixY + y * alpha;
pose.mixScaleX = base.mixScaleX + scaleX * alpha;
pose.mixScaleY = base.mixScaleY + scaleY * alpha;
pose.mixShearY = base.mixShearY + shearY * alpha;
}
else {
pose.mixRotate = base.mixRotate + (rotate - base.mixRotate) * alpha;
pose.mixX = base.mixX + (x - base.mixX) * alpha;
pose.mixY = base.mixY + (y - base.mixY) * alpha;
pose.mixScaleX = base.mixScaleX + (scaleX - base.mixScaleX) * alpha;
pose.mixScaleY = base.mixScaleY + (scaleY - base.mixScaleY) * alpha;
pose.mixShearY = base.mixShearY + (shearY - base.mixShearY) * alpha;
}
}
}
/** The base class for timelines that change 1 constraint property with a curve. */
export class ConstraintTimeline1 extends CurveTimeline1 {
constraintIndex;
constructor(frameCount, bezierCount, constraintIndex, property) {
super(frameCount, bezierCount, `${property}|${constraintIndex}`);
this.constraintIndex = constraintIndex;
}
}
/** Changes {@link PathConstraintPose.position}. */
export class PathConstraintPositionTimeline extends ConstraintTimeline1 {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.pathConstraintPosition);
this.additive = true;
}
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
const constraint = skeleton.constraints[this.constraintIndex];
if (constraint.active) {
const pose = appliedPose ? constraint.appliedPose : constraint.pose;
pose.position = this.getAbsoluteValue(time, alpha, from, add, pose.position, constraint.data.setupPose.position);
}
}
}
/** Changes {@link PathConstraintPose.spacing}. */
export class PathConstraintSpacingTimeline extends ConstraintTimeline1 {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.pathConstraintSpacing);
}
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
const constraint = skeleton.constraints[this.constraintIndex];
if (constraint.active) {
const pose = appliedPose ? constraint.appliedPose : constraint.pose;
pose.spacing = this.getAbsoluteValue(time, alpha, from, false, pose.spacing, constraint.data.setupPose.spacing);
}
}
}
/** Changes {@link PathConstraint.mixRotate}, {@link PathConstraint.mixX}, and
* {@link PathConstraint.mixY}. */
export class PathConstraintMixTimeline extends CurveTimeline {
constraintIndex;
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, `${Property.pathConstraintMix}|${constraintIndex}`);
this.constraintIndex = constraintIndex;
}
getFrameEntries() {
return 4 /*ENTRIES*/;
}
/** Sets the time and color for the specified frame.
* @param frame Between 0 and `frameCount`, inclusive.
* @param time The frame time in seconds. */
setFrame(frame, time, mixRotate, mixX, mixY) {
const frames = this.frames;
frame <<= 2;
frames[frame] = time;
frames[frame + 1 /*ROTATE*/] = mixRotate;
frames[frame + 2 /*X*/] = mixX;
frames[frame + 3 /*Y*/] = mixY;
}
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
const constraint = skeleton.constraints[this.constraintIndex];
if (!constraint.active)
return;
const pose = appliedPose ? constraint.appliedPose : constraint.pose;
const frames = this.frames;
if (time < frames[0]) {
const setup = constraint.data.setupPose;
switch (from) {
case MixFrom.setup: {
pose.mixRotate = setup.mixRotate;
pose.mixX = setup.mixX;
pose.mixY = setup.mixY;
break;
}
case MixFrom.first: {
pose.mixRotate += (setup.mixRotate - pose.mixRotate) * alpha;
pose.mixX += (setup.mixX - pose.mixX) * alpha;
pose.mixY += (setup.mixY - pose.mixY) * alpha;
break;
}
}
return;
}
let rotate, x, y;
const i = Timeline.search(frames, time, 4 /*ENTRIES*/);
const curveType = this.curves[i >> 2];
switch (curveType) {
case 0 /*LINEAR*/: {
const before = frames[i];
rotate = frames[i + 1 /*ROTATE*/];
x = frames[i + 2 /*X*/];
y = frames[i + 3 /*Y*/];
const t = (time - before) / (frames[i + 4 /*ENTRIES*/] - before);
rotate += (frames[i + 4 /*ENTRIES*/ + 1 /*ROTATE*/] - rotate) * t;
x += (frames[i + 4 /*ENTRIES*/ + 2 /*X*/] - x) * t;
y += (frames[i + 4 /*ENTRIES*/ + 3 /*Y*/] - y) * t;
break;
}
case 1 /*STEPPED*/:
rotate = frames[i + 1 /*ROTATE*/];
x = frames[i + 2 /*X*/];
y = frames[i + 3 /*Y*/];
break;
default:
rotate = this.getBezierValue(time, i, 1 /*ROTATE*/, curveType - 2 /*BEZIER*/);
x = this.getBezierValue(time, i, 2 /*X*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
y = this.getBezierValue(time, i, 3 /*Y*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
}
const base = from === MixFrom.setup ? constraint.data.setupPose : pose;
if (add) {
pose.mixRotate = base.mixRotate + rotate * alpha;
pose.mixX = base.mixX + x * alpha;
pose.mixY = base.mixY + y * alpha;
}
else {
pose.mixRotate = base.mixRotate + (rotate - base.mixRotate) * alpha;
pose.mixX = base.mixX + (x - base.mixX) * alpha;
pose.mixY = base.mixY + (y - base.mixY) * alpha;
}
}
}
/** The base class for most {@link PhysicsConstraint} timelines. */
export class PhysicsConstraintTimeline extends ConstraintTimeline1 {
/** @param constraintIndex -1 for all physics constraints in the skeleton. */
constructor(frameCount, bezierCount, constraintIndex, property) {
super(frameCount, bezierCount, constraintIndex, property);
}
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
if (add && !this.additive)
add = false;
if (this.constraintIndex === -1) {
const value = time >= this.frames[0] ? this.getCurveValue(time) : 0;
const constraints = skeleton.physics;
for (const constraint of constraints) {
if (constraint.active && this.global(constraint.data)) {
const pose = appliedPose ? constraint.appliedPose : constraint.pose;
this.set(pose, this.getAbsoluteValue(time, alpha, from, add, this.get(pose), this.get(constraint.data.setupPose), value));
}
}
}
else {
const constraint = skeleton.constraints[this.constraintIndex];
if (constraint.active) {
const pose = appliedPose ? constraint.appliedPose : constraint.pose;
this.set(pose, this.getAbsoluteValue(time, alpha, from, add, this.get(pose), this.get(constraint.data.setupPose)));
}
}
}
}
/** Changes {@link PhysicsConstraintPose.inertia}. */
export class PhysicsConstraintInertiaTimeline extends PhysicsConstraintTimeline {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintInertia);
}
get(pose) {
return pose.inertia;
}
set(pose, value) {
pose.inertia = value;
}
global(constraint) {
return constraint.inertiaGlobal;
}
}
/** Changes {@link PhysicsConstraintPose.strength}. */
export class PhysicsConstraintStrengthTimeline extends PhysicsConstraintTimeline {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintStrength);
}
get(pose) {
return pose.strength;
}
set(pose, value) {
pose.strength = value;
}
global(constraint) {
return constraint.strengthGlobal;
}
}
/** Changes {@link PhysicsConstraintPose.damping}. */
export class PhysicsConstraintDampingTimeline extends PhysicsConstraintTimeline {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintDamping);
}
get(pose) {
return pose.damping;
}
set(pose, value) {
pose.damping = value;
}
global(constraint) {
return constraint.dampingGlobal;
}
}
/** Changes {@link PhysicsConstraintPose.massInverse}. The timeline values are not inverted. */
export class PhysicsConstraintMassTimeline extends PhysicsConstraintTimeline {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintMass);
}
get(pose) {
return 1 / pose.massInverse;
}
set(pose, value) {
pose.massInverse = 1 / value;
}
global(constraint) {
return constraint.massGlobal;
}
}
/** Changes {@link PhysicsConstraintPose.wind}. */
export class PhysicsConstraintWindTimeline extends PhysicsConstraintTimeline {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintWind);
this.additive = true;
}
get(pose) {
return pose.wind;
}
set(pose, value) {
pose.wind = value;
}
global(constraint) {
return constraint.windGlobal;
}
}
/** Changes {@link PhysicsConstraintPose.gravity}. */
export class PhysicsConstraintGravityTimeline extends PhysicsConstraintTimeline {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintGravity);
this.additive = true;
}
get(pose) {
return pose.gravity;
}
set(pose, value) {
pose.gravity = value;
}
global(constraint) {
return constraint.gravityGlobal;
}
}
/** Changes {@link PhysicsConstraintPose.mix}. */
export class PhysicsConstraintMixTimeline extends PhysicsConstraintTimeline {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.physicsConstraintMix);
}
get(pose) {
return pose.mix;
}
set(pose, value) {
pose.mix = value;
}
global(constraint) {
return constraint.mixGlobal;
}
}
/** Resets a physics constraint when specific animation times are reached. */
export class PhysicsConstraintResetTimeline extends Timeline {
static propertyIds = [Property.physicsConstraintReset.toString()];
/** The index of the physics constraint in {@link Skeleton.contraints} that will be reset when this timeline is
* applied, or -1 if all physics constraints in the skeleton will be reset. */
constraintIndex;
/** @param constraintIndex -1 for all physics constraints in the skeleton. */
constructor(frameCount, constraintIndex) {
super(frameCount, ...PhysicsConstraintResetTimeline.propertyIds);
this.constraintIndex = constraintIndex;
this.instant = true;
}
getFrameCount() {
return this.frames.length;
}
/** Sets the time for the specified frame.
* @param frame Between 0 and `frameCount`, inclusive. */
setFrame(frame, time) {
this.frames[frame] = time;
}
/** Resets the physics constraint when frames > `lastTime` and <= `time`. */
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
let constraint;
if (this.constraintIndex !== -1) {
constraint = skeleton.constraints[this.constraintIndex];
if (!constraint.active)
return;
}
const frames = this.frames;
if (lastTime > time) { // Apply after lastTime for looped animations.
// Reference runtime passes null for MixFrom here. This timeline doesn't use it, but TS keeps the type non-null.
this.apply(skeleton, lastTime, Number.MAX_VALUE, [], alpha, from, false, false, false);
lastTime = -1;
}
else if (lastTime >= frames[frames.length - 1]) // Last time is after last frame.
return;
if (time < frames[0])
return;
if (lastTime < frames[0] || time >= frames[Timeline.search(frames, lastTime) + 1]) {
if (constraint != null)
constraint.reset(skeleton);
else {
for (const constraint of skeleton.physics) {
if (constraint.active)
constraint.reset(skeleton);
}
}
}
}
}
/** Changes {@link SliderPose.time}. */
export class SliderTimeline extends ConstraintTimeline1 {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.sliderTime);
}
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
const constraint = skeleton.constraints[this.constraintIndex];
if (constraint.active) {
const pose = appliedPose ? constraint.appliedPose : constraint.pose;
pose.time = this.getAbsoluteValue(time, alpha, from, add, pose.time, constraint.data.setupPose.time);
}
}
}
/** Changes {@link SliderPose.mix}. */
export class SliderMixTimeline extends ConstraintTimeline1 {
constructor(frameCount, bezierCount, constraintIndex) {
super(frameCount, bezierCount, constraintIndex, Property.sliderMix);
this.additive = true;
}
apply(skeleton, lastTime, time, firedEvents, alpha, from, add, out, appliedPose) {
const constraint = skeleton.constraints[this.constraintIndex];
if (constraint.active) {
const pose = appliedPose ? constraint.appliedPose : constraint.pose;
pose.mix = this.getAbsoluteValue(time, alpha, from, add, pose.mix, constraint.data.setupPose.mix);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5pbWF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0FuaW1hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFJL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBcUI3RSxPQUFPLEVBQUUsS0FBSyxFQUF3QixTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTNFOzs7WUFHWTtBQUNaLE1BQU0sT0FBTyxTQUFTO0lBQ3JCOztpREFFNkM7SUFDcEMsSUFBSSxDQUFTO0lBRXRCOytIQUMySDtJQUMzSCxTQUFTLEdBQW9CLEVBQUUsQ0FBQztJQUV2QixXQUFXLENBQVk7SUFFaEM7O3lDQUVxQztJQUM1QixLQUFLLENBQWdCO0lBRTlCLGdCQUFnQjtJQUNoQiwrR0FBK0c7SUFDdEcsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXZDO3VGQUNtRjtJQUNuRixRQUFRLENBQVM7SUFFakIsWUFBYSxJQUFZLEVBQUUsU0FBMEIsRUFBRSxRQUFnQjtRQUN0RSxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFjLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsWUFBWSxDQUFFLFNBQTBCO1FBQ3ZDLElBQUksQ0FBQyxTQUFTO1lBQUUs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QUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUEsZUFBZSxDQUFDO1FBQzFELElBQUksS0FBSyxLQUFLLENBQUM7WUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDakQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3BGLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDM0csSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pELElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLFVBQVUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQzlHLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFBLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFF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QUMsQ0FBQSxLQUFLLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQSxlQUFlLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RixDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQSxLQUFLLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQSxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQ0QsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakIsSUFBSSxJQUFJLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7Z0JBQ3hDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3BDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3BDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDckMsQ0FBQztpQkFBTSxDQUFDO2dCQUNQLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3BDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3BDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FB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S0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLGdFQUFnRTtZQUNoRSxLQUFLLEdBQUcsU0FBUyxDQUFDLFNBQVUsQ0FBQztZQUM3QixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3RDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDdEMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNQLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ3RHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDcEMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNwQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FB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QSxNQUFNLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQSxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBRUQsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakIsSUFBSSxJQUFJLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDdEMsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztnQkFDNUIsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsZ0VBQWdFO2dCQUNoRSxLQUFLLEdBQUcsU0FBUyxDQUFDLFNBQVUsQ0FBQztnQkFDN0IsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDdEMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDdEMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN2QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ1AsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNyQyxDQUFDO1FBQ0YsQ0FBQztRQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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Q0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUNqQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxLQUFLLENBQUMsQ0FBQztnQkFDdkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsV0FBVyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFdBQVcsR0FBRyxDQUFDLENBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLEdBQUcsQ0FBQyxDQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsV0FBVyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUMs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ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRhY2htZW50LCBWZXJ0ZXhBdHRhY2htZW50IH0gZnJvbSBcIi4vYXR0YWNobWVudHMvQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBIYXNTZXF1ZW5jZSB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0hhc1NlcXVlbmNlLmpzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU1vZGUsIFNlcXVlbmNlTW9kZVZhbHVlcyB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL1NlcXVlbmNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJvbmUgfSBmcm9tIFwiLi9Cb25lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEluaGVyaXQgfSBmcm9tIFwiLi9Cb25lRGF0YS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCb25lUG9zZSB9IGZyb20gXCIuL0JvbmVQb3NlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSBcIi4vRXZlbnQuanNcIjtcbmltcG9ydCB0eXBlIHsgSWtDb25zdHJhaW50IH0gZnJvbSBcIi4vSWtDb25zdHJhaW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IElrQ29uc3RyYWludFBvc2UgfSBmcm9tIFwiLi9Ja0NvbnN0cmFpbnRQb3NlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhDb25zdHJhaW50IH0gZnJvbSBcIi4vUGF0aENvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB0eXBlIHsgUGF0aENvbnN0cmFpbnRQb3NlIH0gZnJvbSBcIi4vUGF0aENvbnN0cmFpbnRQb3NlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBoeXNpY3NDb25zdHJhaW50IH0gZnJvbSBcIi4vUGh5c2ljc0NvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB0eXBlIHsgUGh5c2ljc0NvbnN0cmFpbnREYXRhIH0gZnJvbSBcIi4vUGh5c2ljc0NvbnN0cmFpbnREYXRhLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBoeXNpY3NDb25zdHJhaW50UG9zZSB9IGZyb20gXCIuL1BoeXNpY3NDb25zdHJhaW50UG9zZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NlZCB9IGZyb20gXCIuL1Bvc2VkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNrZWxldG9uIH0gZnJvbSBcIi4vU2tlbGV0b24uanNcIjtcbmltcG9ydCB0eXBlIHsgU2tlbGV0b25EYXRhIH0gZnJvbSBcIi4vU2tlbGV0b25EYXRhLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsaWRlciB9IGZyb20gXCIuL1NsaWRlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTbGlkZXJQb3NlIH0gZnJvbSBcIi4vU2xpZGVyUG9zZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTbG90IH0gZnJvbSBcIi4vU2xvdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTbG90UG9zZSB9IGZyb20gXCIuL1Nsb3RQb3NlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybUNvbnN0cmFpbnQgfSBmcm9tIFwiLi9UcmFuc2Zvcm1Db25zdHJhaW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybUNvbnN0cmFpbnRQb3NlIH0gZnJvbSBcIi4vVHJhbnNmb3JtQ29uc3RyYWludFBvc2UuanNcIjtcbmltcG9ydCB7IENvbG9yLCB0eXBlIE51bWJlckFycmF5TGlrZSwgU3RyaW5nU2V0LCBVdGlscyB9IGZyb20gXCIuL1V0aWxzLmpzXCI7XG5cbi8qKiBTdG9yZXMgYSBsaXN0IG9mIHRpbWVsaW5lcyB0byBhbmltYXRlIGEgc2tlbGV0b24ncyBwb3NlIG92ZXIgdGltZS5cbiAqXG4gKiBTZWUgPGEgaHJlZj0naHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1hcHBseWluZy1hbmltYXRpb25zI1RpbWVsaW5lLUFQSSc+QXBwbHlpbmcgQW5pbWF0aW9uczwvYT4gaW4gdGhlIFNwaW5lIFJ1bnRpbWVzXG4gKiBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBBbmltYXRpb24ge1xuXHQvKiogVGhlIGFuaW1hdGlvbidzIG5hbWUsIHVuaXF1ZSBhY3Jvc3MgYWxsIGFuaW1hdGlvbnMgaW4gdGhlIHNrZWxldG9uLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIFNrZWxldG9uRGF0YS5maW5kQW5pbWF0aW9ufS4gKi9cblx0cmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG5cdC8qKiBUaGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBzZWNvbmRzLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBoaWdoZXN0IHRpbWUgb2YgYWxsIGZyYW1lcyBpbiB0aGUgdGltZWxpbmVzLiBUaGUgZHVyYXRpb24gaXNcblx0ICogdXNlZCB0byBrbm93IHdoZW4gdGhlIGFuaW1hdGlvbiBoYXMgY29tcGxldGVkIGFuZCwgZm9yIGFuaW1hdGlvbnMgdGhhdCByZXBlYXQsIHdoZW4gaXQgc2hvdWxkIGxvb3AgYmFjayB0byB0aGUgc3RhcnQuICovXG5cdHRpbWVsaW5lczogQXJyYXk8VGltZWxpbmU+ID0gW107XG5cblx0cmVhZG9ubHkgdGltZWxpbmVJZHM6IFN0cmluZ1NldDtcblxuXHQvKioge0BsaW5rIFNrZWxldG9uLmdldEJvbmVzfSBpbmRpY2VzIHRoYXQgdGhpcyBhbmltYXRpb24ncyB0aW1lbGluZXMgbW9kaWZ5LlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIEJvbmVUaW1lbGluZS5ib25lc30uICovXG5cdHJlYWRvbmx5IGJvbmVzOiBBcnJheTxudW1iZXI+O1xuXG5cdC8vIE5vbmVzc2VudGlhbC5cblx0LyoqIFRoZSBjb2xvciBvZiB0aGUgYW5pbWF0aW9uIGFzIGl0IHdhcyBpbiBTcGluZSwgb3IgYSBkZWZhdWx0IGNvbG9yIGlmIG5vbmVzc2VudGlhbCBkYXRhIHdhcyBub3QgZXhwb3J0ZWQuICovXG5cdHJlYWRvbmx5IGNvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xuXG5cdC8qKiBUaGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBzZWNvbmRzLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBoaWdoZXN0IHRpbWUgb2YgYWxsIGZyYW1lcyBpbiB0aGUgdGltZWxpbmUuIFRoZSBkdXJhdGlvbiBpc1xuXHQgKiB1c2VkIHRvIGtub3cgd2hlbiBpdCBoYXMgY29tcGxldGVkIGFuZCB3aGVuIGl0IHNob3VsZCBsb29wIGJhY2sgdG8gdGhlIHN0YXJ0LiAqL1xuXHRkdXJhdGlvbjogbnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yIChuYW1lOiBzdHJpbmcsIHRpbWVsaW5lczogQXJyYXk8VGltZWxpbmU+LCBkdXJhdGlvbjogbnVtYmVyKSB7XG5cdFx0aWYgKCFuYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcblx0XHR0aGlzLnRpbWVsaW5lSWRzID0gbmV3IFN0cmluZ1NldCgpO1xuXHRcdHRoaXMuYm9uZXMgPSBbXSBhcyBudW1iZXJbXTtcblx0XHR0aGlzLnNldFRpbWVsaW5lcyh0aW1lbGluZXMpO1xuXHR9XG5cblx0c2V0VGltZWxpbmVzICh0aW1lbGluZXM6IEFycmF5PFRpbWVsaW5lPikge1xuXHRcdGlmICghdGltZWxpbmVzKSB0aHJvdyBuZXcgRXJyb3IoXCJ0aW1lbGluZXMgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdHRoaXMudGltZWxpbmVzID0gdGltZWxpbmVzO1xuXG5cdFx0Y29uc3QgbiA9IHRpbWVsaW5lcy5sZW5ndGg7XG5cdFx0dGhpcy50aW1lbGluZUlkcy5jbGVhcigpO1xuXHRcdHRoaXMuYm9uZXMubGVuZ3RoID0gMDtcblx0XHRjb25zdCBib25lU2V0ID0gbmV3IFNldCgpO1xuXHRcdGNvbnN0IGl0ZW1zID0gdGltZWxpbmVzO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCB0aW1lbGluZSA9IGl0ZW1zW2ldO1xuXHRcdFx0dGhpcy50aW1lbGluZUlkcy5hZGRBbGwodGltZWxpbmUucHJvcGVydHlJZHMpO1xuXHRcdFx0aWYgKGlzQm9uZVRpbWVsaW5lKHRpbWVsaW5lKSAmJiBib25lU2V0LmFkZCh0aW1lbGluZS5ib25lSW5kZXgpKVxuXHRcdFx0XHR0aGlzLmJvbmVzLnB1c2godGltZWxpbmUuYm9uZUluZGV4KTtcblx0XHR9XG5cdH1cblxuXHQvKiogUmV0dXJucyB0cnVlIGlmIHRoaXMgYW5pbWF0aW9uIGNvbnRhaW5zIGEgdGltZWxpbmUgd2l0aCBhbnkgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBJRHMuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgVGltZWxpbmUucHJvcGVydHlJZHN9LiAqL1xuXHRoYXNUaW1lbGluZSAoaWRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKVxuXHRcdFx0aWYgKHRoaXMudGltZWxpbmVJZHMuY29udGFpbnMoaWRzW2ldKSkgcmV0dXJuIHRydWU7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqIEFwcGxpZXMgdGhlIGFuaW1hdGlvbidzIHRpbWVsaW5lcyB0byB0aGUgc3BlY2lmaWVkIHNrZWxldG9uLlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIFRpbWVsaW5lLmFwcGx5fSBhbmRcblx0ICogPGEgaHJlZj0naHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1hcHBseWluZy1hbmltYXRpb25zI1RpbWVsaW5lLUFQSSc+QXBwbHlpbmcgQW5pbWF0aW9uczwvYT4gaW4gdGhlIFNwaW5lIFJ1bnRpbWVzXG5cdCAqIEd1aWRlLlxuXHQgKiBAcGFyYW0gc2tlbGV0b24gVGhlIHNrZWxldG9uIHRoZSBhbmltYXRpb24gaXMgYXBwbGllZCB0by4gVGhpcyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGJvbmVzLCBzbG90cywgYW5kIG90aGVyIHNrZWxldG9uXG5cdCAqICAgICAgICAgICBjb21wb25lbnRzIHRoZSB0aW1lbGluZXMgbWF5IGNoYW5nZS5cblx0ICogQHBhcmFtIGxhc3RUaW1lIFRoZSBsYXN0IHRpbWUgaW4gc2Vjb25kcyB0aGlzIGFuaW1hdGlvbiB3YXMgYXBwbGllZC4gU29tZSB0aW1lbGluZXMgdHJpZ2dlciBvbmx5IGF0IGRpc2NyZXRlIHRpbWVzLCBpbiB3aGljaFxuXHQgKiAgICAgICAgICAgY2FzZSBhbGwga2V5cyBhcmUgdHJpZ2dlcmVkIGJldHdlZW4gYGxhc3RUaW1lYCAoZXhjbHVzaXZlKSBhbmQgYHRpbWVgIChpbmNsdXNpdmUpLiBQYXNzIC0xXG5cdCAqICAgICAgICAgICB0aGUgZmlyc3QgdGltZSBhbiBhbmltYXRpb24gaXMgYXBwbGllZCB0byBlbnN1cmUgZnJhbWUgMCBpcyB0cmlnZ2VyZWQuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIGluIHNlY29uZHMgdGhlIHNrZWxldG9uIGlzIGJlaW5nIHBvc2VkIGZvci4gVGltZWxpbmVzIGZpbmQgdGhlIGZyYW1lIGJlZm9yZSBhbmQgYWZ0ZXIgdGhpcyB0aW1lIGFuZFxuXHQgKiAgICAgICAgICAgaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGUgZnJhbWUgdmFsdWVzLlxuXHQgKiBAcGFyYW0gbG9vcCBUcnVlIGlmIGB0aW1lYCBiZXlvbmQgdGhlIHtAbGluayBkdXJhdGlvbn0gcmVwZWF0cyB0aGUgYW5pbWF0aW9uLCBlbHNlIHRoZSBsYXN0IGZyYW1lIGlzIHVzZWQuXG5cdCAqIEBwYXJhbSBldmVudHMgSWYgYW55IGV2ZW50cyBhcmUgZmlyZWQsIHRoZXkgYXJlIGFkZGVkIHRvIHRoaXMgbGlzdC4gUGFzcyBudWxsIHRvIGlnbm9yZSBmaXJlZCBldmVudHMgb3IgaWYgbm8gdGltZWxpbmVzIGZpcmVcblx0ICogICAgICAgICAgIGV2ZW50cy5cblx0ICogQHBhcmFtIGFscGhhIDAgYXBwbGllcyBzZXR1cCBvciBjdXJyZW50IHZhbHVlcyAoZGVwZW5kaW5nIG9uIGBmcm9tYCksIDEgdXNlcyB0aW1lbGluZSB2YWx1ZXMsIGFuZCBpbnRlcm1lZGlhdGVcblx0ICogICAgICAgICAgIHZhbHVlcyBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZW0uIEFkanVzdGluZyBgYWxwaGFgIG92ZXIgdGltZSBjYW4gbWl4IGFuIGFuaW1hdGlvbiBpbiBvciBvdXQuXG5cdCAqIEBwYXJhbSBmcm9tIENvbnRyb2xzIGhvdyBgYWxwaGFgIGFuZCBgYWRkYCBtaXggZnJvbSBjdXJyZW50IG9yIHNldHVwIHBvc2UgdmFsdWVzIHRvIHRpbWVsaW5lIHZhbHVlcy5cblx0ICogQHBhcmFtIGFkZCBJZiB0cnVlLCBmb3IgdGltZWxpbmVzIHRoYXQgc3VwcG9ydCBpdCwgdGhlaXIgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgc2V0dXAgb3IgY3VycmVudCB2YWx1ZXMgKGRlcGVuZGluZyBvblxuXHQgKiAgICAgICAgICAgYGZyb21gKS5cblx0ICogQHBhcmFtIG91dCBUcnVlIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBtaXhpbmcgb3V0LCBlbHNlIGl0IGlzIG1peGluZyBpbi4gVXNlZCBieSB0aW1lbGluZXMgdGhhdCBwZXJmb3JtIGluc3RhbnQgdHJhbnNpdGlvbnMuXG5cdCAqIEBwYXJhbSBhcHBsaWVkUG9zZSBUcnVlIHRvIG1vZGlmeSB7QGxpbmsgUG9zZWQuYXBwbGllZFBvc2V9LCBlbHNlIHtAbGluayBQb3NlZC5wb3NlfSBpcyBtb2RpZmllZC4gKi9cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBsb29wOiBib29sZWFuLCBldmVudHM6IEFycmF5PEV2ZW50PiB8IG51bGwsIGFscGhhOiBudW1iZXIsXG5cdFx0ZnJvbTogTWl4RnJvbSwgYWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKSB7XG5cdFx0aWYgKCFza2VsZXRvbikgdGhyb3cgbmV3IEVycm9yKFwic2tlbGV0b24gY2Fubm90IGJlIG51bGwuXCIpO1xuXG5cdFx0aWYgKGxvb3AgJiYgdGhpcy5kdXJhdGlvbiAhPT0gMCkge1xuXHRcdFx0dGltZSAlPSB0aGlzLmR1cmF0aW9uO1xuXHRcdFx0aWYgKGxhc3RUaW1lID4gMCkgbGFzdFRpbWUgJT0gdGhpcy5kdXJhdGlvbjtcblx0XHR9XG5cblx0XHRjb25zdCB0aW1lbGluZXMgPSB0aGlzLnRpbWVsaW5lcztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHRpbWVsaW5lcy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHR0aW1lbGluZXNbaV0uYXBwbHkoc2tlbGV0b24sIGxhc3RUaW1lLCB0aW1lLCBldmVudHMsIGFscGhhLCBmcm9tLCBhZGQsIG91dCwgYXBwbGllZFBvc2UpO1xuXHR9XG59XG5cbi8qKiBDb250cm9scyB3aGV0aGVyIGBhbHBoYWAgYW5kIGBhZGRgIG1peCBmcm9tIGN1cnJlbnQgb3Igc2V0dXAgcG9zZSB2YWx1ZXMgYW5kIHdoYXQgaGFwcGVucyBiZWZvcmUgdGhlXG4gKiBmaXJzdCBrZXkuXG4gKlxuICogU2VlIHtAbGluayBUaW1lbGluZS5hcHBseX0uICovXG5leHBvcnQgZW51bSBNaXhGcm9tIHtcblx0LyoqIEFscGhhIG1peGVzIGZyb20gdGhlIGN1cnJlbnQgcG9zZS4gQmVmb3JlIHRoZSBmaXJzdCBrZXksIG5vIGNoYW5nZSBpcyBtYWRlLiAqL1xuXHRjdXJyZW50LFxuXHQvKiogQWxwaGEgbWl4ZXMgZnJvbSB0aGUgc2V0dXAgcG9zZS4gQmVmb3JlIHRoZSBmaXJzdCBrZXksIHRoZSBzZXR1cCBwb3NlIGlzIHVzZWQuICovXG5cdHNldHVwLFxuXHQvKiogQWxwaGEgbWl4ZXMgZnJvbSB0aGUgY3VycmVudCBwb3NlLiBCZWZvcmUgdGhlIGZpcnN0IGtleSwgYWxwaGEgbWl4ZXMgZnJvbSB0aGUgY3VycmVudCBwb3NlIHRvIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHRmaXJzdCxcbn1cblxuZXhwb3J0IGVudW0gUHJvcGVydHkge1xuXHRyb3RhdGUsXG5cdHgsXG5cdHksXG5cdHNjYWxlWCxcblx0c2NhbGVZLFxuXHRzaGVhclgsXG5cdHNoZWFyWSxcblx0aW5oZXJpdCxcblx0cmdiLFxuXHRhbHBoYSxcblx0cmdiMixcblx0YXR0YWNobWVudCxcblx0ZGVmb3JtLFxuXHRldmVudCxcblx0ZHJhd09yZGVyLFxuXHRkcmF3T3JkZXJGb2xkZXIsXG5cdGlrQ29uc3RyYWludCxcblx0dHJhbnNmb3JtQ29uc3RyYWludCxcblx0cGF0aENvbnN0cmFpbnRQb3NpdGlvbixcblx0cGF0aENvbnN0cmFpbnRTcGFjaW5nLFxuXHRwYXRoQ29uc3RyYWludE1peCxcblx0cGh5c2ljc0NvbnN0cmFpbnRJbmVydGlhLFxuXHRwaHlzaWNzQ29uc3RyYWludFN0cmVuZ3RoLFxuXHRwaHlzaWNzQ29uc3RyYWludERhbXBpbmcsXG5cdHBoeXNpY3NDb25zdHJhaW50TWFzcyxcblx0cGh5c2ljc0NvbnN0cmFpbnRXaW5kLFxuXHRwaHlzaWNzQ29uc3RyYWludEdyYXZpdHksXG5cdHBoeXNpY3NDb25zdHJhaW50TWl4LFxuXHRwaHlzaWNzQ29uc3RyYWludFJlc2V0LFxuXHRzZXF1ZW5jZSxcblx0c2xpZGVyVGltZSxcblx0c2xpZGVyTWl4LFxufVxuXG4vKiogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCB0aW1lbGluZXMuXG4gKlxuICogU2VlIDxhIGhyZWY9J2h0dHBzOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtYXBwbHlpbmctYW5pbWF0aW9ucyNUaW1lbGluZS1BUEknPkFwcGx5aW5nIEFuaW1hdGlvbnM8L2E+IGluIHRoZSBTcGluZVxuICogUnVudGltZXMgR3VpZGUuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGltZWxpbmUge1xuXHRyZWFkb25seSBwcm9wZXJ0eUlkczogc3RyaW5nW107XG5cdHJlYWRvbmx5IGZyYW1lczogTnVtYmVyQXJyYXlMaWtlO1xuXG5cdC8qKiBUcnVlIGlmIHRoaXMgdGltZWxpbmUgc3VwcG9ydHMgYmVpbmcgYXBwbGllZCBhZGRpdGl2ZWx5LlxuXHQgKlxuXHQgKiBTZWUgdGhlIGBhZGRgIHBhcmFtZXRlciBpbiB7QGxpbmsgVGltZWxpbmUuYXBwbHl9LiAqL1xuXHRhZGRpdGl2ZSA9IGZhbHNlO1xuXG5cdC8qKiBUcnVlIGlmIHRoaXMgdGltZWxpbmUgc2V0cyB2YWx1ZXMgaW5zdGFudGFuZW91c2x5IGFuZCBkb2VzIG5vdCBzdXBwb3J0IGludGVycG9sYXRpb24gYmV0d2VlbiBmcmFtZXMuICovXG5cdGluc3RhbnQgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCAuLi5wcm9wZXJ0eUlkczogc3RyaW5nW10pIHtcblx0XHR0aGlzLnByb3BlcnR5SWRzID0gcHJvcGVydHlJZHM7XG5cdFx0dGhpcy5mcmFtZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KGZyYW1lQ291bnQgKiB0aGlzLmdldEZyYW1lRW50cmllcygpKTtcblx0fVxuXG5cdGdldFByb3BlcnR5SWRzICgpIHtcblx0XHRyZXR1cm4gdGhpcy5wcm9wZXJ0eUlkcztcblx0fVxuXG5cdC8qKiBUaGUgbnVtYmVyIG9mIHZhbHVlcyBzdG9yZWQgcGVyIGZyYW1lLiAqL1xuXHRnZXRGcmFtZUVudHJpZXMgKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHQvKiogVGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhpcyB0aW1lbGluZS4gKi9cblx0Z2V0RnJhbWVDb3VudCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aCAvIHRoaXMuZ2V0RnJhbWVFbnRyaWVzKCk7XG5cdH1cblxuXHQvKiogVGhlIGR1cmF0aW9uIG9mIHRoZSB0aW1lbGluZSBpbiBzZWNvbmRzLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBoaWdoZXN0IHRpbWUgb2YgYWxsIGZyYW1lcyBpbiB0aGUgdGltZWxpbmUuICovXG5cdGdldER1cmF0aW9uICgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmZyYW1lc1t0aGlzLmZyYW1lcy5sZW5ndGggLSB0aGlzLmdldEZyYW1lRW50cmllcygpXTtcblx0fVxuXG5cdC8qKiBBcHBsaWVzIHRoaXMgdGltZWxpbmUgdG8gdGhlIHNrZWxldG9uLlxuXHQgKlxuXHQgKiBTZWUgPGEgaHJlZj0naHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1hcHBseWluZy1hbmltYXRpb25zI1RpbWVsaW5lLUFQSSc+QXBwbHlpbmcgQW5pbWF0aW9uczwvYT4gaW4gdGhlIFNwaW5lXG5cdCAqIFJ1bnRpbWVzIEd1aWRlLlxuXHQgKiBAcGFyYW0gc2tlbGV0b24gVGhlIHNrZWxldG9uIHRoZSB0aW1lbGluZSBpcyBhcHBsaWVkIHRvLiBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYm9uZXMsIHNsb3RzLCBhbmQgb3RoZXIgc2tlbGV0b25cblx0ICogICAgICAgICAgIGNvbXBvbmVudHMgdGhlIHRpbWVsaW5lcyBtYXkgY2hhbmdlLlxuXHQgKiBAcGFyYW0gbGFzdFRpbWUgVGhlIGxhc3QgdGltZSBpbiBzZWNvbmRzIHRoaXMgdGltZWxpbmUgd2FzIGFwcGxpZWQuIFNvbWUgdGltZWxpbmVzIHRyaWdnZXIgb25seSBhdCBkaXNjcmV0ZSB0aW1lcywgaW5cblx0ICogICAgICAgICAgIHdoaWNoIGNhc2UgYWxsIGtleXMgYXJlIHRyaWdnZXJlZCBiZXR3ZWVuIGBsYXN0VGltZWAgKGV4Y2x1c2l2ZSkgYW5kIGB0aW1lYCAoaW5jbHVzaXZlKS5cblx0ICogICAgICAgICAgIFBhc3MgLTEgdGhlIGZpcnN0IHRpbWUgYSB0aW1lbGluZSBpcyBhcHBsaWVkIHRvIGVuc3VyZSBmcmFtZSAwIGlzIHRyaWdnZXJlZC5cblx0ICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgaW4gc2Vjb25kcyB0aGUgc2tlbGV0b24gaXMgYmVpbmcgcG9zZWQgZm9yLiBUaW1lbGluZXMgZmluZCB0aGUgZnJhbWUgYmVmb3JlIGFuZCBhZnRlciB0aGlzIHRpbWUgYW5kXG5cdCAqICAgICAgICAgICBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZSBmcmFtZSB2YWx1ZXMuXG5cdCAqIEBwYXJhbSBldmVudHMgSWYgYW55IGV2ZW50cyBhcmUgZmlyZWQsIHRoZXkgYXJlIGFkZGVkIHRvIHRoaXMgbGlzdC4gUGFzcyBudWxsIHRvIGlnbm9yZSBmaXJlZCBldmVudHMgb3IgaWYgbm8gdGltZWxpbmVzXG5cdCAqICAgICAgICAgICBmaXJlIGV2ZW50cy5cblx0ICogQHBhcmFtIGFscGhhIDAgYXBwbGllcyBzZXR1cCBvciBjdXJyZW50IHZhbHVlcyAoZGVwZW5kaW5nIG9uIGBmcm9tYCksIDEgdXNlcyB0aW1lbGluZSB2YWx1ZXMsIGFuZCBpbnRlcm1lZGlhdGVcblx0ICogICAgICAgICAgIHZhbHVlcyBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZW0uIEFkanVzdGluZyBgYWxwaGFgIG92ZXIgdGltZSBjYW4gbWl4IGEgdGltZWxpbmUgaW4gb3Igb3V0LlxuXHQgKiBAcGFyYW0gZnJvbSBDb250cm9scyBob3cgYGFscGhhYCBhbmQgYGFkZGAgbWl4IGZyb20gY3VycmVudCBvciBzZXR1cCBwb3NlIHZhbHVlcyB0byB0aW1lbGluZVxuXHQgKiAgICAgICAgICAgdmFsdWVzLlxuXHQgKiBAcGFyYW0gYWRkIElmIHRydWUsIGZvciB0aW1lbGluZXMgdGhhdCBzdXBwb3J0IGl0LCB0aGVpciB2YWx1ZXMgYXJlIGFkZGVkIHRvIHRoZSBzZXR1cCBvciBjdXJyZW50IHZhbHVlcyAoZGVwZW5kaW5nIG9uXG5cdCAqICAgICAgICAgICBgZnJvbWApLlxuXHQgKiBAcGFyYW0gb3V0IFRydWUgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIG1peGluZyBvdXQsIGVsc2UgaXQgaXMgbWl4aW5nIGluLiBVc2VkIGJ5IHRpbWVsaW5lcyB0aGF0IHBlcmZvcm0gaW5zdGFudFxuXHQgKiAgICAgICAgICAgdHJhbnNpdGlvbnMuXG5cdCAqIEBwYXJhbSBhcHBsaWVkUG9zZSBUcnVlIHRvIG1vZGlmeSB7QGxpbmsgUG9zZWQuYXBwbGllZFBvc2V9LCBlbHNlIHtAbGluayBQb3NlZC5wb3NlfSBpcyBtb2RpZmllZC4gKi9cblx0YWJzdHJhY3QgYXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiB8IG51bGwsIGFscGhhOiBudW1iZXIsXG5cdFx0ZnJvbTogTWl4RnJvbSwgYWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKTogdm9pZDtcblxuXHQvKiogTGluZWFyIHNlYXJjaCB1c2luZyB0aGUgc3BlY2lmaWVkIHN0cmlkZSAoZGVmYXVsdCAxKS5cblx0ICogQHBhcmFtIHRpbWUgTXVzdCBiZSA+PSB0aGUgZmlyc3QgdmFsdWUgaW4gYGZyYW1lc2AuXG5cdCAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB2YWx1ZSA8PSBgdGltZWAuICovXG5cdHN0YXRpYyBzZWFyY2ggKGZyYW1lczogTnVtYmVyQXJyYXlMaWtlLCB0aW1lOiBudW1iZXIsIHN0ZXAgPSAxKSB7XG5cdFx0Y29uc3QgbiA9IGZyYW1lcy5sZW5ndGg7XG5cdFx0Zm9yIChsZXQgaSA9IHN0ZXA7IGkgPCBuOyBpICs9IHN0ZXApXG5cdFx0XHRpZiAoZnJhbWVzW2ldID4gdGltZSkgcmV0dXJuIGkgLSBzdGVwO1xuXHRcdHJldHVybiBuIC0gc3RlcDtcblx0fVxufVxuXG4vKiogQW4gaW50ZXJmYWNlIGZvciB0aW1lbGluZXMgdGhhdCBjaGFuZ2UgYSBzbG90J3MgcHJvcGVydGllcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xvdFRpbWVsaW5lIHtcblx0LyoqIFRoZSBpbmRleCBvZiB0aGUgc2xvdCBpbiB7QGxpbmsgU2tlbGV0b24uc2xvdHN9IHRoYXQgd2lsbCBiZSBjaGFuZ2VkIHdoZW4gdGhpcyB0aW1lbGluZSBpcyBhcHBsaWVkLiAqL1xuXHRzbG90SW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2xvdFRpbWVsaW5lIChvYmo6IFRpbWVsaW5lICYgUGFydGlhbDxTbG90VGltZWxpbmU+KTogb2JqIGlzIFRpbWVsaW5lICYgU2xvdFRpbWVsaW5lIHtcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqLnNsb3RJbmRleCA9PT0gJ251bWJlcic7XG59XG5cbi8qKiBUaGUgYmFzZSBjbGFzcyBmb3IgdGltZWxpbmVzIHRoYXQgaW50ZXJwb2xhdGUgYmV0d2VlbiBmcmFtZSB2YWx1ZXMgdXNpbmcgc3RlcHBlZCwgbGluZWFyLCBvciBhIEJlemllciBjdXJ2ZS4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDdXJ2ZVRpbWVsaW5lIGV4dGVuZHMgVGltZWxpbmUge1xuXHRwcm90ZWN0ZWQgY3VydmVzOiBOdW1iZXJBcnJheUxpa2U7IC8vIHR5cGUsIHgsIHksIC4uLlxuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIC4uLnByb3BlcnR5SWRzOiBzdHJpbmdbXSkge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIC4uLnByb3BlcnR5SWRzKTtcblx0XHR0aGlzLmN1cnZlcyA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkoZnJhbWVDb3VudCArIGJlemllckNvdW50ICogMTgvKkJFWklFUl9TSVpFKi8pO1xuXHRcdHRoaXMuY3VydmVzW2ZyYW1lQ291bnQgLSAxXSA9IDEvKlNURVBQRUQqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSBzcGVjaWZpZWQga2V5IGZyYW1lIHRvIGxpbmVhciBpbnRlcnBvbGF0aW9uLiAqL1xuXHRzZXRMaW5lYXIgKGZyYW1lOiBudW1iZXIpIHtcblx0XHR0aGlzLmN1cnZlc1tmcmFtZV0gPSAwLypMSU5FQVIqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSBzcGVjaWZpZWQga2V5IGZyYW1lIHRvIHN0ZXBwZWQgaW50ZXJwb2xhdGlvbi4gKi9cblx0c2V0U3RlcHBlZCAoZnJhbWU6IG51bWJlcikge1xuXHRcdHRoaXMuY3VydmVzW2ZyYW1lXSA9IDEvKlNURVBQRUQqLztcblx0fVxuXG5cdC8qKiBTaHJpbmtzIHRoZSBzdG9yYWdlIGZvciBCZXppZXIgY3VydmVzLCBmb3IgdXNlIHdoZW4gYGJlemllckNvdW50YCAoc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvcikgd2FzIGxhcmdlclxuXHQgKiB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIEJlemllciBjdXJ2ZXMuICovXG5cdHNocmluayAoYmV6aWVyQ291bnQ6IG51bWJlcikge1xuXHRcdGNvbnN0IHNpemUgPSB0aGlzLmdldEZyYW1lQ291bnQoKSArIGJlemllckNvdW50ICogMTgvKkJFWklFUl9TSVpFKi87XG5cdFx0aWYgKHRoaXMuY3VydmVzLmxlbmd0aCA+IHNpemUpIHtcblx0XHRcdGNvbnN0IG5ld0N1cnZlcyA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkoc2l6ZSk7XG5cdFx0XHRVdGlscy5hcnJheUNvcHkodGhpcy5jdXJ2ZXMsIDAsIG5ld0N1cnZlcywgMCwgc2l6ZSk7XG5cdFx0XHR0aGlzLmN1cnZlcyA9IG5ld0N1cnZlcztcblx0XHR9XG5cdH1cblxuXHQvKiogU3RvcmVzIHRoZSBzZWdtZW50cyBmb3IgdGhlIHNwZWNpZmllZCBCZXppZXIgY3VydmUuIEZvciB0aW1lbGluZXMgdGhhdCBtb2RpZnkgbXVsdGlwbGUgdmFsdWVzLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuXG5cdCAqIG9uZSBjdXJ2ZSBwZXIgZnJhbWUuXG5cdCAqIEBwYXJhbSBiZXppZXIgVGhlIG9yZGluYWwgb2YgdGhpcyBCZXppZXIgY3VydmUgZm9yIHRoaXMgdGltZWxpbmUsIGJldHdlZW4gMCBhbmQgYGJlemllckNvdW50IC0gMWAgKHNwZWNpZmllZFxuXHQgKiAgICAgICAgICAgaW4gdGhlIGNvbnN0cnVjdG9yKSwgaW5jbHVzaXZlLlxuXHQgKiBAcGFyYW0gZnJhbWUgQmV0d2VlbiAwIGFuZCBgZnJhbWVDb3VudCAtIDFgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgaW5kZXggb2YgdGhlIHZhbHVlIGZvciB0aGlzIGZyYW1lIHRoYXQgdGhpcyBjdXJ2ZSBpcyB1c2VkIGZvci5cblx0ICogQHBhcmFtIHRpbWUxIFRoZSB0aW1lIGZvciB0aGUgZmlyc3Qga2V5LlxuXHQgKiBAcGFyYW0gdmFsdWUxIFRoZSB2YWx1ZSBmb3IgdGhlIGZpcnN0IGtleS5cblx0ICogQHBhcmFtIGN4MSBUaGUgdGltZSBmb3IgdGhlIGZpcnN0IEJlemllciBoYW5kbGUuXG5cdCAqIEBwYXJhbSBjeTEgVGhlIHZhbHVlIGZvciB0aGUgZmlyc3QgQmV6aWVyIGhhbmRsZS5cblx0ICogQHBhcmFtIGN4MiBUaGUgdGltZSBvZiB0aGUgc2Vjb25kIEJlemllciBoYW5kbGUuXG5cdCAqIEBwYXJhbSBjeTIgVGhlIHZhbHVlIGZvciB0aGUgc2Vjb25kIEJlemllciBoYW5kbGUuXG5cdCAqIEBwYXJhbSB0aW1lMiBUaGUgdGltZSBmb3IgdGhlIHNlY29uZCBrZXkuXG5cdCAqIEBwYXJhbSB2YWx1ZTIgVGhlIHZhbHVlIGZvciB0aGUgc2Vjb25kIGtleS4gKi9cblx0c2V0QmV6aWVyIChiZXppZXI6IG51bWJlciwgZnJhbWU6IG51bWJlciwgdmFsdWU6IG51bWJlciwgdGltZTE6IG51bWJlciwgdmFsdWUxOiBudW1iZXIsIGN4MTogbnVtYmVyLCBjeTE6IG51bWJlciwgY3gyOiBudW1iZXIsXG5cdFx0Y3kyOiBudW1iZXIsIHRpbWUyOiBudW1iZXIsIHZhbHVlMjogbnVtYmVyKSB7XG5cdFx0Y29uc3QgY3VydmVzID0gdGhpcy5jdXJ2ZXM7XG5cdFx0bGV0IGkgPSB0aGlzLmdldEZyYW1lQ291bnQoKSArIGJlemllciAqIDE4LypCRVpJRVJfU0laRSovO1xuXHRcdGlmICh2YWx1ZSA9PT0gMCkgY3VydmVzW2ZyYW1lXSA9IDIvKkJFWklFUiovICsgaTtcblx0XHRjb25zdCB0bXB4ID0gKHRpbWUxIC0gY3gxICogMiArIGN4MikgKiAwLjAzLCB0bXB5ID0gKHZhbHVlMSAtIGN5MSAqIDIgKyBjeTIpICogMC4wMztcblx0XHRjb25zdCBkZGR4ID0gKChjeDEgLSBjeDIpICogMyAtIHRpbWUxICsgdGltZTIpICogMC4wMDYsIGRkZHkgPSAoKGN5MSAtIGN5MikgKiAzIC0gdmFsdWUxICsgdmFsdWUyKSAqIDAuMDA2O1xuXHRcdGxldCBkZHggPSB0bXB4ICogMiArIGRkZHgsIGRkeSA9IHRtcHkgKiAyICsgZGRkeTtcblx0XHRsZXQgZHggPSAoY3gxIC0gdGltZTEpICogMC4zICsgdG1weCArIGRkZHggKiAwLjE2NjY2NjY3LCBkeSA9IChjeTEgLSB2YWx1ZTEpICogMC4zICsgdG1weSArIGRkZHkgKiAwLjE2NjY2NjY3O1xuXHRcdGxldCB4ID0gdGltZTEgKyBkeCwgeSA9IHZhbHVlMSArIGR5O1xuXHRcdGZvciAobGV0IG4gPSBpICsgMTgvKkJFWklFUl9TSVpFKi87IGkgPCBuOyBpICs9IDIpIHtcblx0XHRcdGN1cnZlc1tpXSA9IHg7XG5cdFx0XHRjdXJ2ZXNbaSArIDFdID0geTtcblx0XHRcdGR4ICs9IGRkeDtcblx0XHRcdGR5ICs9IGRkeTtcblx0XHRcdGRkeCArPSBkZGR4O1xuXHRcdFx0ZGR5ICs9IGRkZHk7XG5cdFx0XHR4ICs9IGR4O1xuXHRcdFx0eSArPSBkeTtcblx0XHR9XG5cdH1cblxuXHQvKiogUmV0dXJucyB0aGUgQmV6aWVyIGludGVycG9sYXRlZCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCB0aW1lLlxuXHQgKiBAcGFyYW0gZnJhbWVJbmRleCBUaGUgaW5kZXggaW50byB7QGxpbmsgZnJhbWVzfSBmb3IgdGhlIHZhbHVlcyBvZiB0aGUgZnJhbWUgYmVmb3JlIGB0aW1lYC5cblx0ICogQHBhcmFtIHZhbHVlT2Zmc2V0IFRoZSBvZmZzZXQgZnJvbSBgZnJhbWVJbmRleGAgdG8gdGhlIHZhbHVlIHRoaXMgY3VydmUgaXMgdXNlZCBmb3IuXG5cdCAqIEBwYXJhbSBpIFRoZSBpbmRleCBvZiB0aGUgQmV6aWVyIHNlZ21lbnRzLiBTZWUge0BsaW5rIGdldEN1cnZlVHlwZX0uICovXG5cdGdldEJlemllclZhbHVlICh0aW1lOiBudW1iZXIsIGZyYW1lSW5kZXg6IG51bWJlciwgdmFsdWVPZmZzZXQ6IG51bWJlciwgaTogbnVtYmVyKSB7XG5cdFx0Y29uc3QgY3VydmVzID0gdGhpcy5jdXJ2ZXM7XG5cdFx0aWYgKGN1cnZlc1tpXSA+IHRpbWUpIHtcblx0XHRcdGNvbnN0IHggPSB0aGlzLmZyYW1lc1tmcmFtZUluZGV4XSwgeSA9IHRoaXMuZnJhbWVzW2ZyYW1lSW5kZXggKyB2YWx1ZU9mZnNldF07XG5cdFx0XHRyZXR1cm4geSArICh0aW1lIC0geCkgLyAoY3VydmVzW2ldIC0geCkgKiAoY3VydmVzW2kgKyAxXSAtIHkpO1xuXHRcdH1cblx0XHRjb25zdCBuID0gaSArIDE4LypCRVpJRVJfU0laRSovO1xuXHRcdGZvciAoaSArPSAyOyBpIDwgbjsgaSArPSAyKSB7XG5cdFx0XHRpZiAoY3VydmVzW2ldID49IHRpbWUpIHtcblx0XHRcdFx0Y29uc3QgeCA9IGN1cnZlc1tpIC0gMl0sIHkgPSBjdXJ2ZXNbaSAtIDFdO1xuXHRcdFx0XHRyZXR1cm4geSArICh0aW1lIC0geCkgLyAoY3VydmVzW2ldIC0geCkgKiAoY3VydmVzW2kgKyAxXSAtIHkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRmcmFtZUluZGV4ICs9IHRoaXMuZ2V0RnJhbWVFbnRyaWVzKCk7XG5cdFx0Y29uc3QgeCA9IGN1cnZlc1tuIC0gMl0sIHkgPSBjdXJ2ZXNbbiAtIDFdO1xuXHRcdHJldHVybiB5ICsgKHRpbWUgLSB4KSAvICh0aGlzLmZyYW1lc1tmcmFtZUluZGV4XSAtIHgpICogKHRoaXMuZnJhbWVzW2ZyYW1lSW5kZXggKyB2YWx1ZU9mZnNldF0gLSB5KTtcblx0fVxufVxuXG4vKiogVGhlIGJhc2UgY2xhc3MgZm9yIGEge0BsaW5rIEN1cnZlVGltZWxpbmV9IHRoYXQgc2V0cyBvbmUgcHJvcGVydHkgd2l0aCBhIGN1cnZlLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEN1cnZlVGltZWxpbmUxIGV4dGVuZHMgQ3VydmVUaW1lbGluZSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHByb3BlcnR5SWQ6IHN0cmluZykge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBwcm9wZXJ0eUlkKTtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDIvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGFuZCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSBmcmFtZSB0aW1lIGluIHNlY29uZHMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcblx0XHRmcmFtZSA8PD0gMTtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qVkFMVUUqL10gPSB2YWx1ZTtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgdGltZS4gKi9cblx0Z2V0Q3VydmVWYWx1ZSAodGltZTogbnVtYmVyKSB7XG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0bGV0IGkgPSBmcmFtZXMubGVuZ3RoIC0gMjtcblx0XHRmb3IgKGxldCBpaSA9IDI7IGlpIDw9IGk7IGlpICs9IDIpIHtcblx0XHRcdGlmIChmcmFtZXNbaWldID4gdGltZSkge1xuXHRcdFx0XHRpID0gaWkgLSAyO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpID4+IDFdO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOiB7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXSwgdmFsdWUgPSBmcmFtZXNbaSArIDEvKlZBTFVFKi9dO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgKyAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyAyLypFTlRSSUVTKi9dIC0gYmVmb3JlKSAqIChmcmFtZXNbaSArIDIvKkVOVFJJRVMqLyArIDEvKlZBTFVFKi9dIC0gdmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHJldHVybiBmcmFtZXNbaSArIDEvKlZBTFVFKi9dO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypWQUxVRSovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdH1cblxuXHQvKiogUmV0dXJucyB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlIGZvciBwcm9wZXJ0aWVzIHJlbGF0aXZlIHRvIHRoZSBzZXR1cCB2YWx1ZS4gVGhlIHRpbWVsaW5lIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBzZXR1cFxuXHQgKiB2YWx1ZSwgcmF0aGVyIHRoYW4gcmVwbGFjaW5nIGl0LlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIFRpbWVsaW5lLmFwcGx5fS5cblx0ICogQHBhcmFtIGN1cnJlbnQgVGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHNldHVwIFRoZSBzZXR1cCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LiAqL1xuXHRnZXRSZWxhdGl2ZVZhbHVlICh0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbiwgY3VycmVudDogbnVtYmVyLCBzZXR1cDogbnVtYmVyKSB7XG5cdFx0aWYgKHRpbWUgPCB0aGlzLmZyYW1lc1swXSkgcmV0dXJuIEN1cnZlVGltZWxpbmUxLmJlZm9yZUZpcnN0S2V5KGZyb20sIGFscGhhLCBjdXJyZW50LCBzZXR1cCk7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldEN1cnZlVmFsdWUodGltZSk7XG5cdFx0cmV0dXJuIGZyb20gPT09IE1peEZyb20uc2V0dXAgPyBzZXR1cCArIHZhbHVlICogYWxwaGEgOiBjdXJyZW50ICsgKGFkZCA/IHZhbHVlIDogdmFsdWUgKyBzZXR1cCAtIGN1cnJlbnQpICogYWxwaGE7XG5cdH1cblxuXHQvKiogUmV0dXJucyB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlIGZvciBwcm9wZXJ0aWVzIHNldCBhcyBhYnNvbHV0ZSB2YWx1ZXMuIFRoZSB0aW1lbGluZSB2YWx1ZSByZXBsYWNlcyB0aGUgc2V0dXAgdmFsdWUsXG5cdCAqIHJhdGhlciB0aGFuIGJlaW5nIHJlbGF0aXZlIHRvIGl0LlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIFRpbWVsaW5lLmFwcGx5fS5cblx0ICogQHBhcmFtIGN1cnJlbnQgVGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHNldHVwIFRoZSBzZXR1cCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LiAqL1xuXHRnZXRBYnNvbHV0ZVZhbHVlICh0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbiwgY3VycmVudDogbnVtYmVyLCBzZXR1cDogbnVtYmVyKTogbnVtYmVyO1xuXG5cdC8qKiBSZXR1cm5zIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgZm9yIHByb3BlcnRpZXMgc2V0IGFzIGFic29sdXRlIHZhbHVlcywgdXNpbmcgdGhlIHNwZWNpZmllZCB0aW1lbGluZSB2YWx1ZSByYXRoZXIgdGhhblxuXHQgKiBjYWxsaW5nIHtAbGluayBnZXRDdXJ2ZVZhbHVlfS5cblx0ICpcblx0ICogU2VlIHtAbGluayBUaW1lbGluZS5hcHBseX0uXG5cdCAqIEBwYXJhbSBjdXJyZW50IFRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgcHJvcGVydHkuXG5cdCAqIEBwYXJhbSBzZXR1cCBUaGUgc2V0dXAgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSB0aW1lbGluZSB2YWx1ZSB0byBhcHBseS4gKi9cblx0Z2V0QWJzb2x1dGVWYWx1ZSAodGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tLCBhZGQ6IGJvb2xlYW4sIGN1cnJlbnQ6IG51bWJlciwgc2V0dXA6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IG51bWJlcjtcblxuXHRnZXRBYnNvbHV0ZVZhbHVlICh0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbiwgY3VycmVudDogbnVtYmVyLCBzZXR1cDogbnVtYmVyLCB2YWx1ZT86IG51bWJlcikge1xuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0QWJzb2x1dGVWYWx1ZTEodGltZSwgYWxwaGEsIGZyb20sIGFkZCwgY3VycmVudCwgc2V0dXApO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB0aGlzLmdldEFic29sdXRlVmFsdWUyKHRpbWUsIGFscGhhLCBmcm9tLCBhZGQsIGN1cnJlbnQsIHNldHVwLCB2YWx1ZSk7XG5cdH1cblxuXHRwcml2YXRlIGdldEFic29sdXRlVmFsdWUxICh0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbiwgY3VycmVudDogbnVtYmVyLCBzZXR1cDogbnVtYmVyKSB7XG5cdFx0aWYgKHRpbWUgPCB0aGlzLmZyYW1lc1swXSkgcmV0dXJuIEN1cnZlVGltZWxpbmUxLmJlZm9yZUZpcnN0S2V5KGZyb20sIGFscGhhLCBjdXJyZW50LCBzZXR1cCk7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldEN1cnZlVmFsdWUodGltZSk7XG5cdFx0cmV0dXJuIGZyb20gPT09IE1peEZyb20uc2V0dXAgPyBzZXR1cCArIChhZGQgPyB2YWx1ZSA6IHZhbHVlIC0gc2V0dXApICogYWxwaGFcblx0XHRcdDogY3VycmVudCArIChhZGQgPyB2YWx1ZSA6IHZhbHVlIC0gY3VycmVudCkgKiBhbHBoYTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0QWJzb2x1dGVWYWx1ZTIgKHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSwgYWRkOiBib29sZWFuLCBjdXJyZW50OiBudW1iZXIsIHNldHVwOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcblx0XHRpZiAodGltZSA8IHRoaXMuZnJhbWVzWzBdKSByZXR1cm4gQ3VydmVUaW1lbGluZTEuYmVmb3JlRmlyc3RLZXkoZnJvbSwgYWxwaGEsIGN1cnJlbnQsIHNldHVwKTtcblx0XHRyZXR1cm4gZnJvbSA9PT0gTWl4RnJvbS5zZXR1cCA/IHNldHVwICsgKGFkZCA/IHZhbHVlIDogdmFsdWUgLSBzZXR1cCkgKiBhbHBoYVxuXHRcdFx0OiBjdXJyZW50ICsgKGFkZCA/IHZhbHVlIDogdmFsdWUgLSBjdXJyZW50KSAqIGFscGhhO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdGhlIGludGVycG9sYXRlZCB2YWx1ZSBmb3Igc2NhbGUgcHJvcGVydGllcy4gVGhlIHRpbWVsaW5lIGFuZCBzZXR1cCB2YWx1ZXMgYXJlIG11bHRpcGxpZWQgYW5kIHNpZ24gYWRqdXN0ZWQuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgVGltZWxpbmUuYXBwbHl9LlxuXHQgKiBAcGFyYW0gY3VycmVudCBUaGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LlxuXHQgKiBAcGFyYW0gc2V0dXAgVGhlIHNldHVwIHZhbHVlIGZvciB0aGUgcHJvcGVydHkuICovXG5cdGdldFNjYWxlVmFsdWUgKHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSwgYWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGN1cnJlbnQ6IG51bWJlciwgc2V0dXA6IG51bWJlcikge1xuXHRcdGlmICh0aW1lIDwgdGhpcy5mcmFtZXNbMF0pIHJldHVybiBDdXJ2ZVRpbWVsaW5lMS5iZWZvcmVGaXJzdEtleShmcm9tLCBhbHBoYSwgY3VycmVudCwgc2V0dXApO1xuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDdXJ2ZVZhbHVlKHRpbWUpICogc2V0dXA7XG5cdFx0aWYgKGFscGhhID09PSAxICYmICFhZGQpIHJldHVybiB2YWx1ZTtcblx0XHRsZXQgYmFzZSA9IGZyb20gPT09IE1peEZyb20uc2V0dXAgPyBzZXR1cCA6IGN1cnJlbnQ7XG5cdFx0aWYgKGFkZCkgcmV0dXJuIGJhc2UgKyAodmFsdWUgLSBzZXR1cCkgKiBhbHBoYTtcblx0XHRpZiAob3V0KSByZXR1cm4gYmFzZSArIChNYXRoLmFicyh2YWx1ZSkgKiBNYXRoLnNpZ24oYmFzZSkgLSBiYXNlKSAqIGFscGhhO1xuXHRcdGJhc2UgPSBNYXRoLmFicyhiYXNlKSAqIE1hdGguc2lnbih2YWx1ZSk7XG5cdFx0cmV0dXJuIGJhc2UgKyAodmFsdWUgLSBiYXNlKSAqIGFscGhhO1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgYmVmb3JlRmlyc3RLZXkgKGZyb206IE1peEZyb20sIGFscGhhOiBudW1iZXIsIGN1cnJlbnQ6IG51bWJlciwgc2V0dXA6IG51bWJlcik6IG51bWJlciB7XG5cdFx0c3dpdGNoIChmcm9tKSB7XG5cdFx0XHRjYXNlIE1peEZyb20uc2V0dXA6IHJldHVybiBzZXR1cDtcblx0XHRcdGNhc2UgTWl4RnJvbS5maXJzdDogcmV0dXJuIGN1cnJlbnQgKyAoc2V0dXAgLSBjdXJyZW50KSAqIGFscGhhO1xuXHRcdFx0Y2FzZSBNaXhGcm9tLmN1cnJlbnQ6IHJldHVybiBjdXJyZW50O1xuXHRcdH1cblx0fVxufVxuXG4vKiogQW4gaW50ZXJmYWNlIGZvciB0aW1lbGluZXMgdGhhdCBjaGFuZ2UgYSBib25lJ3MgcHJvcGVydGllcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9uZVRpbWVsaW5lIHtcblx0LyoqIFRoZSBpbmRleCBvZiB0aGUgYm9uZSBpbiB7QGxpbmsgU2tlbGV0b24uYm9uZXN9IHRoYXQgaXMgY2hhbmdlZCBieSB0aGlzIHRpbWVsaW5lLiAqL1xuXHRib25lSW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9uZVRpbWVsaW5lIChvYmo6IFRpbWVsaW5lICYgUGFydGlhbDxCb25lVGltZWxpbmU+KTogb2JqIGlzIFRpbWVsaW5lICYgQm9uZVRpbWVsaW5lIHtcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqLmJvbmVJbmRleCA9PT0gJ251bWJlcic7XG59XG5cbi8qKiBUaGUgYmFzZSBjbGFzcyBmb3IgdGltZWxpbmVzIHRoYXQgY2hhbmdlIDEgYm9uZSBwcm9wZXJ0eSB3aXRoIGEgY3VydmUuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQm9uZVRpbWVsaW5lMSBleHRlbmRzIEN1cnZlVGltZWxpbmUxIGltcGxlbWVudHMgQm9uZVRpbWVsaW5lIHtcblx0cmVhZG9ubHkgYm9uZUluZGV4OiBudW1iZXI7XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIsIHByb3BlcnR5OiBQcm9wZXJ0eSkge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBgJHtwcm9wZXJ0eX18JHtib25lSW5kZXh9YCk7XG5cdFx0dGhpcy5ib25lSW5kZXggPSBib25lSW5kZXg7XG5cdFx0dGhpcy5hZGRpdGl2ZSA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgYXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiB8IG51bGwsIGFscGhhOiBudW1iZXIsXG5cdFx0ZnJvbTogTWl4RnJvbSwgYWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKSB7XG5cdFx0Y29uc3QgYm9uZSA9IHNrZWxldG9uLmJvbmVzW3RoaXMuYm9uZUluZGV4XTtcblx0XHRpZiAoYm9uZS5hY3RpdmUpXG5cdFx0XHR0aGlzLmFwcGx5MShhcHBsaWVkUG9zZSA/IGJvbmUuYXBwbGllZFBvc2UgOiBib25lLnBvc2UsIGJvbmUuZGF0YS5zZXR1cFBvc2UsIHRpbWUsIGFscGhhLCBmcm9tLCBhZGQsIG91dCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbixcblx0XHRvdXQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG4vKiogVGhlIGJhc2UgY2xhc3MgZm9yIHRpbWVsaW5lcyB0aGF0IGNoYW5nZSB0d28gYm9uZSBwcm9wZXJ0aWVzIHdpdGggYSBjdXJ2ZS4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCb25lVGltZWxpbmUyIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIEJvbmVUaW1lbGluZSB7XG5cdHJlYWRvbmx5IGJvbmVJbmRleDtcblxuXHQvKiogQHBhcmFtIGJlemllckNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiBCZXppZXIgY3VydmVzLiBTZWUge0BsaW5rIHNocmlua30uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eUlkcyBVbmlxdWUgaWRlbnRpZmllcnMgZm9yIHRoZSBwcm9wZXJ0aWVzIHRoZSB0aW1lbGluZSBtb2RpZmllcy4gKi9cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIsIHByb3BlcnR5MTogUHJvcGVydHksIHByb3BlcnR5MjogUHJvcGVydHkpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgYCR7cHJvcGVydHkxfXwke2JvbmVJbmRleH1gLCBgJHtwcm9wZXJ0eTJ9fCR7Ym9uZUluZGV4fWApO1xuXHRcdHRoaXMuYm9uZUluZGV4ID0gYm9uZUluZGV4O1xuXHRcdHRoaXMuYWRkaXRpdmUgPSB0cnVlO1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gMy8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgYW5kIHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSBmcmFtZSB0aW1lIGluIHNlY29uZHMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIHZhbHVlMTogbnVtYmVyLCB2YWx1ZTI6IG51bWJlcikge1xuXHRcdGZyYW1lICo9IDMvKkVOVFJJRVMqLztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qVkFMVUUxKi9dID0gdmFsdWUxO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMi8qVkFMVUUyKi9dID0gdmFsdWUyO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiB8IG51bGwsIGFscGhhOiBudW1iZXIsXG5cdFx0ZnJvbTogTWl4RnJvbSwgYWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgYm9uZSA9IHNrZWxldG9uLmJvbmVzW3RoaXMuYm9uZUluZGV4XTtcblx0XHRpZiAoYm9uZS5hY3RpdmUpXG5cdFx0XHR0aGlzLmFwcGx5MShhcHBsaWVkUG9zZSA/IGJvbmUuYXBwbGllZFBvc2UgOiBib25lLnBvc2UsIGJvbmUuZGF0YS5zZXR1cFBvc2UsIHRpbWUsIGFscGhhLCBmcm9tLCBhZGQsIG91dCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbixcblx0XHRvdXQ6IGJvb2xlYW4sKTogdm9pZDtcbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIEJvbmVQb3NlLnJvdGF0aW9ufS4gKi9cbmV4cG9ydCBjbGFzcyBSb3RhdGVUaW1lbGluZSBleHRlbmRzIEJvbmVUaW1lbGluZTEge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBib25lSW5kZXgsIFByb3BlcnR5LnJvdGF0ZSk7XG5cdH1cblxuXHRhcHBseTEgKHBvc2U6IEJvbmVQb3NlLCBzZXR1cDogQm9uZVBvc2UsIHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSwgYWRkOiBib29sZWFuLFxuXHRcdG91dDogYm9vbGVhbikge1xuXHRcdHBvc2Uucm90YXRpb24gPSB0aGlzLmdldFJlbGF0aXZlVmFsdWUodGltZSwgYWxwaGEsIGZyb20sIGFkZCwgcG9zZS5yb3RhdGlvbiwgc2V0dXAucm90YXRpb24pO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBCb25lUG9zZS54fSBhbmQge0BsaW5rIEJvbmVQb3NlLnl9LiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zbGF0ZVRpbWVsaW5lIGV4dGVuZHMgQm9uZVRpbWVsaW5lMiB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGJvbmVJbmRleCwgUHJvcGVydHkueCwgUHJvcGVydHkueSk7XG5cdH1cblxuXHRhcHBseTEgKHBvc2U6IEJvbmVQb3NlLCBzZXR1cDogQm9uZVBvc2UsIHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSwgYWRkOiBib29sZWFuLFxuXHRcdG91dDogYm9vbGVhbikge1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRzd2l0Y2ggKGZyb20pIHtcblx0XHRcdFx0Y2FzZSBNaXhGcm9tLnNldHVwOlxuXHRcdFx0XHRcdHBvc2UueCA9IHNldHVwLng7XG5cdFx0XHRcdFx0cG9zZS55ID0gc2V0dXAueTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBNaXhGcm9tLmZpcnN0OlxuXHRcdFx0XHRcdHBvc2UueCArPSAoc2V0dXAueCAtIHBvc2UueCkgKiBhbHBoYTtcblx0XHRcdFx0XHRwb3NlLnkgKz0gKHNldHVwLnkgLSBwb3NlLnkpICogYWxwaGE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHggPSAwLCB5ID0gMDtcblx0XHRjb25zdCBpID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSwgMy8qRU5UUklFUyovKTtcblx0XHRjb25zdCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpIC8gMy8qRU5UUklFUyovXTtcblx0XHRzd2l0Y2ggKGN1cnZlVHlwZSkge1xuXHRcdFx0Y2FzZSAwLypMSU5FQVIqLzoge1xuXHRcdFx0XHRjb25zdCBiZWZvcmUgPSBmcmFtZXNbaV07XG5cdFx0XHRcdHggPSBmcmFtZXNbaSArIDEvKlZBTFVFMSovXTtcblx0XHRcdFx0eSA9IGZyYW1lc1tpICsgMi8qVkFMVUUyKi9dO1xuXHRcdFx0XHRjb25zdCB0ID0gKHRpbWUgLSBiZWZvcmUpIC8gKGZyYW1lc1tpICsgMy8qRU5UUklFUyovXSAtIGJlZm9yZSk7XG5cdFx0XHRcdHggKz0gKGZyYW1lc1tpICsgMy8qRU5UUklFUyovICsgMS8qVkFMVUUxKi9dIC0geCkgKiB0O1xuXHRcdFx0XHR5ICs9IChmcmFtZXNbaSArIDMvKkVOVFJJRVMqLyArIDIvKlZBTFVFMiovXSAtIHkpICogdDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0eCA9IGZyYW1lc1tpICsgMS8qVkFMVUUxKi9dO1xuXHRcdFx0XHR5ID0gZnJhbWVzW2kgKyAyLypWQUxVRTIqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0eCA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qVkFMVUUxKi8sIGN1cnZlVHlwZSAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0eSA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMi8qVkFMVUUyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdH1cblxuXHRcdGlmIChmcm9tID09PSBNaXhGcm9tLnNldHVwKSB7XG5cdFx0XHRwb3NlLnggPSBzZXR1cC54ICsgeCAqIGFscGhhO1xuXHRcdFx0cG9zZS55ID0gc2V0dXAueSArIHkgKiBhbHBoYTtcblx0XHR9IGVsc2UgaWYgKGFkZCkge1xuXHRcdFx0cG9zZS54ICs9IHggKiBhbHBoYTtcblx0XHRcdHBvc2UueSArPSB5ICogYWxwaGE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBvc2UueCArPSAoc2V0dXAueCArIHggLSBwb3NlLngpICogYWxwaGE7XG5cdFx0XHRwb3NlLnkgKz0gKHNldHVwLnkgKyB5IC0gcG9zZS55KSAqIGFscGhhO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgQm9uZVBvc2UueH0uICovXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRlWFRpbWVsaW5lIGV4dGVuZHMgQm9uZVRpbWVsaW5lMSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGJvbmVJbmRleCwgUHJvcGVydHkueCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbixcblx0XHRvdXQ6IGJvb2xlYW4pIHtcblx0XHRwb3NlLnggPSB0aGlzLmdldFJlbGF0aXZlVmFsdWUodGltZSwgYWxwaGEsIGZyb20sIGFkZCwgcG9zZS54LCBzZXR1cC54KTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgQm9uZVBvc2UueX0uICovXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRlWVRpbWVsaW5lIGV4dGVuZHMgQm9uZVRpbWVsaW5lMSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGJvbmVJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGJvbmVJbmRleCwgUHJvcGVydHkueSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbixcblx0XHRvdXQ6IGJvb2xlYW4pIHtcblx0XHRwb3NlLnkgPSB0aGlzLmdldFJlbGF0aXZlVmFsdWUodGltZSwgYWxwaGEsIGZyb20sIGFkZCwgcG9zZS55LCBzZXR1cC55KTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgQm9uZVBvc2Uuc2NhbGVYfSBhbmQge0BsaW5rIEJvbmVQb3NlLnNjYWxlWX0uICovXG5leHBvcnQgY2xhc3MgU2NhbGVUaW1lbGluZSBleHRlbmRzIEJvbmVUaW1lbGluZTIge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBib25lSW5kZXgsIFByb3BlcnR5LnNjYWxlWCwgUHJvcGVydHkuc2NhbGVZKTtcblx0fVxuXG5cdHByb3RlY3RlZCBhcHBseTEgKHBvc2U6IEJvbmVQb3NlLCBzZXR1cDogQm9uZVBvc2UsIHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSwgYWRkOiBib29sZWFuLFxuXHRcdG91dDogYm9vbGVhbikge1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRzd2l0Y2ggKGZyb20pIHtcblx0XHRcdFx0Y2FzZSBNaXhGcm9tLnNldHVwOlxuXHRcdFx0XHRcdHBvc2Uuc2NhbGVYID0gc2V0dXAuc2NhbGVYO1xuXHRcdFx0XHRcdHBvc2Uuc2NhbGVZID0gc2V0dXAuc2NhbGVZO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIE1peEZyb20uZmlyc3Q6XG5cdFx0XHRcdFx0cG9zZS5zY2FsZVggKz0gKHNldHVwLnNjYWxlWCAtIHBvc2Uuc2NhbGVYKSAqIGFscGhhO1xuXHRcdFx0XHRcdHBvc2Uuc2NhbGVZICs9IChzZXR1cC5zY2FsZVkgLSBwb3NlLnNjYWxlWSkgKiBhbHBoYTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgeDogbnVtYmVyLCB5OiBudW1iZXI7XG5cdFx0Y29uc3QgaSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDMvKkVOVFJJRVMqLyk7XG5cdFx0Y29uc3QgY3VydmVUeXBlID0gdGhpcy5jdXJ2ZXNbaSAvIDMvKkVOVFJJRVMqL107XG5cdFx0c3dpdGNoIChjdXJ2ZVR5cGUpIHtcblx0XHRcdGNhc2UgMC8qTElORUFSKi86IHtcblx0XHRcdFx0Y29uc3QgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAxLypWQUxVRTEqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDIvKlZBTFVFMiovXTtcblx0XHRcdFx0Y29uc3QgdCA9ICh0aW1lIC0gYmVmb3JlKSAvIChmcmFtZXNbaSArIDMvKkVOVFJJRVMqL10gLSBiZWZvcmUpO1xuXHRcdFx0XHR4ICs9IChmcmFtZXNbaSArIDMvKkVOVFJJRVMqLyArIDEvKlZBTFVFMSovXSAtIHgpICogdDtcblx0XHRcdFx0eSArPSAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi8gKyAyLypWQUxVRTIqL10gLSB5KSAqIHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHggPSBmcmFtZXNbaSArIDEvKlZBTFVFMSovXTtcblx0XHRcdFx0eSA9IGZyYW1lc1tpICsgMi8qVkFMVUUyKi9dO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHggPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDEvKlZBTFVFMSovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdHkgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDIvKlZBTFVFMiovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cdFx0eCAqPSBzZXR1cC5zY2FsZVg7XG5cdFx0eSAqPSBzZXR1cC5zY2FsZVk7XG5cblx0XHRpZiAoYWxwaGEgPT09IDEgJiYgIWFkZCkge1xuXHRcdFx0cG9zZS5zY2FsZVggPSB4O1xuXHRcdFx0cG9zZS5zY2FsZVkgPSB5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgYnggPSAwLCBieSA9IDA7XG5cdFx0XHRpZiAoZnJvbSA9PT0gTWl4RnJvbS5zZXR1cCkge1xuXHRcdFx0XHRieCA9IHNldHVwLnNjYWxlWDtcblx0XHRcdFx0YnkgPSBzZXR1cC5zY2FsZVk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRieCA9IHBvc2Uuc2NhbGVYO1xuXHRcdFx0XHRieSA9IHBvc2Uuc2NhbGVZO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFkZCkge1xuXHRcdFx0XHRwb3NlLnNjYWxlWCA9IGJ4ICsgKHggLSBzZXR1cC5zY2FsZVgpICogYWxwaGE7XG5cdFx0XHRcdHBvc2Uuc2NhbGVZID0gYnkgKyAoeSAtIHNldHVwLnNjYWxlWSkgKiBhbHBoYTtcblx0XHRcdH0gZWxzZSBpZiAob3V0KSB7XG5cdFx0XHRcdHBvc2Uuc2NhbGVYID0gYnggKyAoTWF0aC5hYnMoeCkgKiBNYXRoLnNpZ24oYngpIC0gYngpICogYWxwaGE7XG5cdFx0XHRcdHBvc2Uuc2NhbGVZID0gYnkgKyAoTWF0aC5hYnMoeSkgKiBNYXRoLnNpZ24oYnkpIC0gYnkpICogYWxwaGE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRieCA9IE1hdGguYWJzKGJ4KSAqIE1hdGguc2lnbih4KTtcblx0XHRcdFx0YnkgPSBNYXRoLmFicyhieSkgKiBNYXRoLnNpZ24oeSk7XG5cdFx0XHRcdHBvc2Uuc2NhbGVYID0gYnggKyAoeCAtIGJ4KSAqIGFscGhhO1xuXHRcdFx0XHRwb3NlLnNjYWxlWSA9IGJ5ICsgKHkgLSBieSkgKiBhbHBoYTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSB7QGxpbmsgQm9uZVBvc2Uuc2NhbGVYfS4gKi9cbmV4cG9ydCBjbGFzcyBTY2FsZVhUaW1lbGluZSBleHRlbmRzIEJvbmVUaW1lbGluZTEge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBib25lSW5kZXgsIFByb3BlcnR5LnNjYWxlWCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbixcblx0XHRvdXQ6IGJvb2xlYW4pIHtcblx0XHRwb3NlLnNjYWxlWCA9IHRoaXMuZ2V0U2NhbGVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbSwgYWRkLCBvdXQsIHBvc2Uuc2NhbGVYLCBzZXR1cC5zY2FsZVgpO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIGEge0BsaW5rIEJvbmVQb3NlLnNjYWxlWX0uICovXG5leHBvcnQgY2xhc3MgU2NhbGVZVGltZWxpbmUgZXh0ZW5kcyBCb25lVGltZWxpbmUxIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgYm9uZUluZGV4LCBQcm9wZXJ0eS5zY2FsZVkpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFwcGx5MSAocG9zZTogQm9uZVBvc2UsIHNldHVwOiBCb25lUG9zZSwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tLCBhZGQ6IGJvb2xlYW4sXG5cdFx0b3V0OiBib29sZWFuKSB7XG5cdFx0cG9zZS5zY2FsZVkgPSB0aGlzLmdldFNjYWxlVmFsdWUodGltZSwgYWxwaGEsIGZyb20sIGFkZCwgb3V0LCBwb3NlLnNjYWxlWSwgc2V0dXAuc2NhbGVZKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgQm9uZS5zaGVhclh9IGFuZCB7QGxpbmsgQm9uZS5zaGVhcll9LiAqL1xuZXhwb3J0IGNsYXNzIFNoZWFyVGltZWxpbmUgZXh0ZW5kcyBCb25lVGltZWxpbmUyIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgYm9uZUluZGV4LCBQcm9wZXJ0eS5zaGVhclgsIFByb3BlcnR5LnNoZWFyWSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCkge1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRzd2l0Y2ggKGZyb20pIHtcblx0XHRcdFx0Y2FzZSBNaXhGcm9tLnNldHVwOlxuXHRcdFx0XHRcdHBvc2Uuc2hlYXJYID0gc2V0dXAuc2hlYXJYO1xuXHRcdFx0XHRcdHBvc2Uuc2hlYXJZID0gc2V0dXAuc2hlYXJZO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIE1peEZyb20uZmlyc3Q6XG5cdFx0XHRcdFx0cG9zZS5zaGVhclggKz0gKHNldHVwLnNoZWFyWCAtIHBvc2Uuc2hlYXJYKSAqIGFscGhhO1xuXHRcdFx0XHRcdHBvc2Uuc2hlYXJZICs9IChzZXR1cC5zaGVhclkgLSBwb3NlLnNoZWFyWSkgKiBhbHBoYTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgeCA9IDAsIHkgPSAwO1xuXHRcdGNvbnN0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCAzLypFTlRSSUVTKi8pO1xuXHRcdGNvbnN0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyAzLypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOiB7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRcdFx0eCA9IGZyYW1lc1tpICsgMS8qVkFMVUUxKi9dO1xuXHRcdFx0XHR5ID0gZnJhbWVzW2kgKyAyLypWQUxVRTIqL107XG5cdFx0XHRcdGNvbnN0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0eCArPSAoZnJhbWVzW2kgKyAzLypFTlRSSUVTKi8gKyAxLypWQUxVRTEqL10gLSB4KSAqIHQ7XG5cdFx0XHRcdHkgKz0gKGZyYW1lc1tpICsgMy8qRU5UUklFUyovICsgMi8qVkFMVUUyKi9dIC0geSkgKiB0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAxLypWQUxVRTEqL107XG5cdFx0XHRcdHkgPSBmcmFtZXNbaSArIDIvKlZBTFVFMiovXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR4ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypWQUxVRTEqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHR5ID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypWQUxVRTIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0fVxuXG5cdFx0aWYgKGZyb20gPT09IE1peEZyb20uc2V0dXApIHtcblx0XHRcdHBvc2Uuc2hlYXJYID0gc2V0dXAuc2hlYXJYICsgeCAqIGFscGhhO1xuXHRcdFx0cG9zZS5zaGVhclkgPSBzZXR1cC5zaGVhclkgKyB5ICogYWxwaGE7XG5cdFx0fSBlbHNlIGlmIChhZGQpIHtcblx0XHRcdHBvc2Uuc2hlYXJYICs9IHggKiBhbHBoYTtcblx0XHRcdHBvc2Uuc2hlYXJZICs9IHkgKiBhbHBoYTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zZS5zaGVhclggKz0gKHNldHVwLnNoZWFyWCArIHggLSBwb3NlLnNoZWFyWCkgKiBhbHBoYTtcblx0XHRcdHBvc2Uuc2hlYXJZICs9IChzZXR1cC5zaGVhclkgKyB5IC0gcG9zZS5zaGVhclkpICogYWxwaGE7XG5cdFx0fVxuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBCb25lLnNoZWFyWH0gYW5kIHtAbGluayBCb25lLnNoZWFyWX0uICovXG5leHBvcnQgY2xhc3MgU2hlYXJYVGltZWxpbmUgZXh0ZW5kcyBCb25lVGltZWxpbmUxIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgYm9uZUluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgYm9uZUluZGV4LCBQcm9wZXJ0eS5zaGVhclgpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFwcGx5MSAocG9zZTogQm9uZVBvc2UsIHNldHVwOiBCb25lUG9zZSwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tLCBhZGQ6IGJvb2xlYW4sXG5cdFx0b3V0OiBib29sZWFuKSB7XG5cdFx0cG9zZS5zaGVhclggPSB0aGlzLmdldFJlbGF0aXZlVmFsdWUodGltZSwgYWxwaGEsIGZyb20sIGFkZCwgcG9zZS5zaGVhclgsIHNldHVwLnNoZWFyWCk7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIEJvbmUuc2hlYXJYfSBhbmQge0BsaW5rIEJvbmUuc2hlYXJZfS4gKi9cbmV4cG9ydCBjbGFzcyBTaGVhcllUaW1lbGluZSBleHRlbmRzIEJvbmVUaW1lbGluZTEge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBib25lSW5kZXgsIFByb3BlcnR5LnNoZWFyWSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChwb3NlOiBCb25lUG9zZSwgc2V0dXA6IEJvbmVQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbixcblx0XHRvdXQ6IGJvb2xlYW4pIHtcblx0XHRwb3NlLnNoZWFyWSA9IHRoaXMuZ2V0UmVsYXRpdmVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbSwgYWRkLCBwb3NlLnNoZWFyWSwgc2V0dXAuc2hlYXJZKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgQm9uZVBvc2UuaW5oZXJpdH0uICovXG5leHBvcnQgY2xhc3MgSW5oZXJpdFRpbWVsaW5lIGV4dGVuZHMgVGltZWxpbmUgaW1wbGVtZW50cyBCb25lVGltZWxpbmUge1xuXHRyZWFkb25seSBib25lSW5kZXg6IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBib25lSW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGAke1Byb3BlcnR5LmluaGVyaXR9fCR7Ym9uZUluZGV4fWApO1xuXHRcdHRoaXMuYm9uZUluZGV4ID0gYm9uZUluZGV4O1xuXHRcdHRoaXMuaW5zdGFudCA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gMi8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIGluaGVyaXQgdHJhbnNmb3JtIG1vZGUgZm9yIHRoZSBzcGVjaWZpZWQgZnJhbWUuXG5cdCAqIEBwYXJhbSBmcmFtZSBCZXR3ZWVuIDAgYW5kIGBmcmFtZUNvdW50YCwgaW5jbHVzaXZlLlxuXHQgKiBAcGFyYW0gdGltZSBUaGUgZnJhbWUgdGltZSBpbiBzZWNvbmRzLiAqL1xuXHRwdWJsaWMgc2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgaW5oZXJpdDogSW5oZXJpdCkge1xuXHRcdGZyYW1lICo9IDIvKkVOVFJJRVMqLztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qSU5IRVJJVCovXSA9IGluaGVyaXQ7XG5cdH1cblxuXHRwdWJsaWMgYXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSxcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbi5ib25lc1t0aGlzLmJvbmVJbmRleF07XG5cdFx0aWYgKCFib25lLmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IGJvbmUuYXBwbGllZFBvc2UgOiBib25lLnBvc2U7XG5cblx0XHRpZiAob3V0KSB7XG5cdFx0XHRpZiAoZnJvbSAhPT0gTWl4RnJvbS5jdXJyZW50KSBwb3NlLmluaGVyaXQgPSBib25lLmRhdGEuc2V0dXBQb3NlLmluaGVyaXQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdFx0aWYgKGZyb20gIT09IE1peEZyb20uY3VycmVudCkgcG9zZS5pbmhlcml0ID0gYm9uZS5kYXRhLnNldHVwUG9zZS5pbmhlcml0O1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdHBvc2UuaW5oZXJpdCA9IHRoaXMuZnJhbWVzW1RpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDIvKkVOVFJJRVMqLykgKyAxLypJTkhFUklUKi9dO1xuXHRcdH1cblx0fVxufVxuLyoqIFRoZSBiYXNlIGNsYXNzIGZvciB0aW1lbGluZXMgdGhhdCBjaGFuZ2UgYW55IG51bWJlciBvZiBzbG90IHByb3BlcnRpZXMgd2l0aCBhIGN1cnZlLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNsb3RDdXJ2ZVRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIFNsb3RUaW1lbGluZSB7XG5cdHJlYWRvbmx5IHNsb3RJbmRleDogbnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyLCAuLi5wcm9wZXJ0eUlkczogc3RyaW5nW10pIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgLi4ucHJvcGVydHlJZHMpO1xuXHRcdHRoaXMuc2xvdEluZGV4ID0gc2xvdEluZGV4O1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBldmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSxcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGNvbnN0IHNsb3QgPSBza2VsZXRvbi5zbG90c1t0aGlzLnNsb3RJbmRleF07XG5cdFx0aWYgKHNsb3QuYm9uZS5hY3RpdmUpIHRoaXMuYXBwbHkxKHNsb3QsIGFwcGxpZWRQb3NlID8gc2xvdC5hcHBsaWVkUG9zZSA6IHNsb3QucG9zZSwgdGltZSwgYWxwaGEsIGZyb20sIGFkZCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgYXBwbHkxIChzbG90OiBTbG90LCBwb3NlOiBTbG90UG9zZSwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tLCBhZGQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgU2xvdFBvc2UuY29sb3J9LiAqL1xuZXhwb3J0IGNsYXNzIFJHQkFUaW1lbGluZSBleHRlbmRzIFNsb3RDdXJ2ZVRpbWVsaW5lIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgc2xvdEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgc2xvdEluZGV4LCAvL1xuXHRcdFx0YCR7UHJvcGVydHkucmdifXwke3Nsb3RJbmRleH1gLCAvL1xuXHRcdFx0YCR7UHJvcGVydHkuYWxwaGF9fCR7c2xvdEluZGV4fWApO1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gNS8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgaW4gc2Vjb25kcywgcmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIGZvciB0aGUgc3BlY2lmaWVkIGtleSBmcmFtZS4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyKSB7XG5cdFx0ZnJhbWUgKj0gNS8qRU5UUklFUyovO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypSKi9dID0gcjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDIvKkcqL10gPSBnO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMy8qQiovXSA9IGI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA0LypBKi9dID0gYTtcblx0fVxuXG5cdHByb3RlY3RlZCBhcHBseTEgKHNsb3Q6IFNsb3QsIHBvc2U6IFNsb3RQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbikge1xuXHRcdGNvbnN0IGNvbG9yID0gcG9zZS5jb2xvcjtcblx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0Y29uc3Qgc2V0dXAgPSBzbG90LmRhdGEuc2V0dXBQb3NlLmNvbG9yO1xuXHRcdFx0c3dpdGNoIChmcm9tKSB7XG5cdFx0XHRcdGNhc2UgTWl4RnJvbS5zZXR1cDogY29sb3Iuc2V0RnJvbUNvbG9yKHNldHVwKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgTWl4RnJvbS5maXJzdDogY29sb3IuYWRkKChzZXR1cC5yIC0gY29sb3IucikgKiBhbHBoYSwgKHNldHVwLmcgLSBjb2xvci5nKSAqIGFscGhhLCAoc2V0dXAuYiAtIGNvbG9yLmIpICogYWxwaGEsXG5cdFx0XHRcdFx0KHNldHVwLmEgLSBjb2xvci5hKSAqIGFscGhhKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgciA9IDAsIGcgPSAwLCBiID0gMCwgYSA9IDA7XG5cdFx0Y29uc3QgaSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDUvKkVOVFJJRVMqLyk7XG5cdFx0Y29uc3QgY3VydmVUeXBlID0gdGhpcy5jdXJ2ZXNbaSAvIDUvKkVOVFJJRVMqL107XG5cdFx0c3dpdGNoIChjdXJ2ZVR5cGUpIHtcblx0XHRcdGNhc2UgMC8qTElORUFSKi86IHtcblx0XHRcdFx0Y29uc3QgYmVmb3JlID0gZnJhbWVzW2ldO1xuXHRcdFx0XHRyID0gZnJhbWVzW2kgKyAxLypSKi9dO1xuXHRcdFx0XHRnID0gZnJhbWVzW2kgKyAyLypHKi9dO1xuXHRcdFx0XHRiID0gZnJhbWVzW2kgKyAzLypCKi9dO1xuXHRcdFx0XHRhID0gZnJhbWVzW2kgKyA0LypBKi9dO1xuXHRcdFx0XHRjb25zdCB0ID0gKHRpbWUgLSBiZWZvcmUpIC8gKGZyYW1lc1tpICsgNS8qRU5UUklFUyovXSAtIGJlZm9yZSk7XG5cdFx0XHRcdHIgKz0gKGZyYW1lc1tpICsgNS8qRU5UUklFUyovICsgMS8qUiovXSAtIHIpICogdDtcblx0XHRcdFx0ZyArPSAoZnJhbWVzW2kgKyA1LypFTlRSSUVTKi8gKyAyLypHKi9dIC0gZykgKiB0O1xuXHRcdFx0XHRiICs9IChmcmFtZXNbaSArIDUvKkVOVFJJRVMqLyArIDMvKkIqL10gLSBiKSAqIHQ7XG5cdFx0XHRcdGEgKz0gKGZyYW1lc1tpICsgNS8qRU5UUklFUyovICsgNC8qQSovXSAtIGEpICogdDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0ciA9IGZyYW1lc1tpICsgMS8qUiovXTtcblx0XHRcdFx0ZyA9IGZyYW1lc1tpICsgMi8qRyovXTtcblx0XHRcdFx0YiA9IGZyYW1lc1tpICsgMy8qQiovXTtcblx0XHRcdFx0YSA9IGZyYW1lc1tpICsgNC8qQSovXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypSKi8sIGN1cnZlVHlwZSAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0ZyA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMi8qRyovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0YiA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMy8qQiovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDIgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGEgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDQvKkEqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiAzIC0gMi8qQkVaSUVSKi8pO1xuXHRcdH1cblx0XHRpZiAoYWxwaGEgPT09IDEpXG5cdFx0XHRjb2xvci5zZXQociwgZywgYiwgYSk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRpZiAoZnJvbSA9PT0gTWl4RnJvbS5zZXR1cCkge1xuXHRcdFx0XHRjb25zdCBzZXR1cCA9IHNsb3QuZGF0YS5zZXR1cFBvc2UuY29sb3I7XG5cdFx0XHRcdGNvbG9yLnNldChzZXR1cC5yICsgKHIgLSBzZXR1cC5yKSAqIGFscGhhLCBzZXR1cC5nICsgKGcgLSBzZXR1cC5nKSAqIGFscGhhLCBzZXR1cC5iICsgKGIgLSBzZXR1cC5iKSAqIGFscGhhLFxuXHRcdFx0XHRcdHNldHVwLmEgKyAoYSAtIHNldHVwLmEpICogYWxwaGEpO1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdGNvbG9yLmFkZCgociAtIGNvbG9yLnIpICogYWxwaGEsIChnIC0gY29sb3IuZykgKiBhbHBoYSwgKGIgLSBjb2xvci5iKSAqIGFscGhhLCAoYSAtIGNvbG9yLmEpICogYWxwaGEpO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyBSR0IgZm9yIGEgc2xvdCdzIHtAbGluayBTbG90UG9zZS5jb2xvcn0uICovXG5leHBvcnQgY2xhc3MgUkdCVGltZWxpbmUgZXh0ZW5kcyBTbG90Q3VydmVUaW1lbGluZSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIHNsb3RJbmRleCwgYCR7UHJvcGVydHkucmdifXwke3Nsb3RJbmRleH1gKTtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDQvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMsIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZnJhbWUuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpIHtcblx0XHRmcmFtZSA8PD0gMjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qUiovXSA9IHI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAyLypHKi9dID0gZztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDMvKkIqL10gPSBiO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFwcGx5MSAoc2xvdDogU2xvdCwgcG9zZTogU2xvdFBvc2UsIHRpbWU6IG51bWJlciwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSwgYWRkOiBib29sZWFuKSB7XG5cdFx0Y29uc3QgY29sb3IgPSBwb3NlLmNvbG9yO1xuXHRcdGxldCByID0gMCwgZyA9IDAsIGIgPSAwO1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRjb25zdCBzZXR1cCA9IHNsb3QuZGF0YS5zZXR1cFBvc2UuY29sb3I7XG5cdFx0XHRzd2l0Y2ggKGZyb20pIHtcblx0XHRcdFx0Y2FzZSBNaXhGcm9tLnNldHVwOiB7XG5cdFx0XHRcdFx0Y29sb3IuciA9IHNldHVwLnI7XG5cdFx0XHRcdFx0Y29sb3IuZyA9IHNldHVwLmc7XG5cdFx0XHRcdFx0Y29sb3IuYiA9IHNldHVwLmI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2FzZSBNaXhGcm9tLmZpcnN0OiB7XG5cdFx0XHRcdFx0Y29sb3IuciArPSAoc2V0dXAuciAtIGNvbG9yLnIpICogYWxwaGE7XG5cdFx0XHRcdFx0Y29sb3IuZyArPSAoc2V0dXAuZyAtIGNvbG9yLmcpICogYWxwaGE7XG5cdFx0XHRcdFx0Y29sb3IuYiArPSAoc2V0dXAuYiAtIGNvbG9yLmIpICogYWxwaGE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSwgNC8qRU5UUklFUyovKTtcblx0XHRjb25zdCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpID4+IDJdO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOiB7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRcdFx0ciA9IGZyYW1lc1tpICsgMS8qUiovXTtcblx0XHRcdFx0ZyA9IGZyYW1lc1tpICsgMi8qRyovXTtcblx0XHRcdFx0YiA9IGZyYW1lc1tpICsgMy8qQiovXTtcblx0XHRcdFx0Y29uc3QgdCA9ICh0aW1lIC0gYmVmb3JlKSAvIChmcmFtZXNbaSArIDQvKkVOVFJJRVMqL10gLSBiZWZvcmUpO1xuXHRcdFx0XHRyICs9IChmcmFtZXNbaSArIDQvKkVOVFJJRVMqLyArIDEvKlIqL10gLSByKSAqIHQ7XG5cdFx0XHRcdGcgKz0gKGZyYW1lc1tpICsgNC8qRU5UUklFUyovICsgMi8qRyovXSAtIGcpICogdDtcblx0XHRcdFx0YiArPSAoZnJhbWVzW2kgKyA0LypFTlRSSUVTKi8gKyAzLypCKi9dIC0gYikgKiB0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgMS8qU1RFUFBFRCovOlxuXHRcdFx0XHRyID0gZnJhbWVzW2kgKyAxLypSKi9dO1xuXHRcdFx0XHRnID0gZnJhbWVzW2kgKyAyLypHKi9dO1xuXHRcdFx0XHRiID0gZnJhbWVzW2kgKyAzLypCKi9dO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDEvKlIqLywgY3VydmVUeXBlIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRnID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypHKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRiID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAzLypCKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMiAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cdFx0aWYgKGFscGhhICE9PSAxKSB7XG5cdFx0XHRpZiAoZnJvbSA9PT0gTWl4RnJvbS5zZXR1cCkge1xuXHRcdFx0XHRjb25zdCBzZXR1cCA9IHNsb3QuZGF0YS5zZXR1cFBvc2UuY29sb3I7XG5cdFx0XHRcdHIgPSBzZXR1cC5yICsgKHIgLSBzZXR1cC5yKSAqIGFscGhhO1xuXHRcdFx0XHRnID0gc2V0dXAuZyArIChnIC0gc2V0dXAuZykgKiBhbHBoYTtcblx0XHRcdFx0YiA9IHNldHVwLmIgKyAoYiAtIHNldHVwLmIpICogYWxwaGE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyID0gY29sb3IuciArIChyIC0gY29sb3IucikgKiBhbHBoYTtcblx0XHRcdFx0ZyA9IGNvbG9yLmcgKyAoZyAtIGNvbG9yLmcpICogYWxwaGE7XG5cdFx0XHRcdGIgPSBjb2xvci5iICsgKGIgLSBjb2xvci5iKSAqIGFscGhhO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb2xvci5yID0gciA8IDAgPyAwIDogKHIgPiAxID8gMSA6IHIpO1xuXHRcdGNvbG9yLmcgPSBnIDwgMCA/IDAgOiAoZyA+IDEgPyAxIDogZyk7XG5cdFx0Y29sb3IuYiA9IGIgPCAwID8gMCA6IChiID4gMSA/IDEgOiBiKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyBhbHBoYSBmb3IgYSBzbG90J3Mge0BsaW5rIFNsb3RQb3NlLmNvbG9yfS4gKi9cbmV4cG9ydCBjbGFzcyBBbHBoYVRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZTEgaW1wbGVtZW50cyBTbG90VGltZWxpbmUge1xuXHRzbG90SW5kZXggPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGAke1Byb3BlcnR5LmFscGhhfXwke3Nsb3RJbmRleH1gKTtcblx0XHR0aGlzLnNsb3RJbmRleCA9IHNsb3RJbmRleDtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sXG5cdFx0YWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKSB7XG5cblx0XHRjb25zdCBzbG90ID0gc2tlbGV0b24uc2xvdHNbdGhpcy5zbG90SW5kZXhdO1xuXHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgY29sb3IgPSAoYXBwbGllZFBvc2UgPyBzbG90LmFwcGxpZWRQb3NlIDogc2xvdC5wb3NlKS5jb2xvcjtcblx0XHRsZXQgYSA9IDA7XG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdGNvbnN0IHNldHVwID0gc2xvdC5kYXRhLnNldHVwUG9zZS5jb2xvci5hO1xuXHRcdFx0c3dpdGNoIChmcm9tKSB7XG5cdFx0XHRcdGNhc2UgTWl4RnJvbS5zZXR1cDogY29sb3IuYSA9IHNldHVwOyBicmVhaztcblx0XHRcdFx0Y2FzZSBNaXhGcm9tLmZpcnN0OiBjb2xvci5hICs9IChzZXR1cCAtIGNvbG9yLmEpICogYWxwaGE7IGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGEgPSB0aGlzLmdldEN1cnZlVmFsdWUodGltZSk7XG5cdFx0aWYgKGFscGhhICE9PSAxKSB7XG5cdFx0XHRpZiAoZnJvbSA9PT0gTWl4RnJvbS5zZXR1cCkge1xuXHRcdFx0XHRjb25zdCBzZXR1cCA9IHNsb3QuZGF0YS5zZXR1cFBvc2UuY29sb3I7XG5cdFx0XHRcdGEgPSBzZXR1cC5hICsgKGEgLSBzZXR1cC5hKSAqIGFscGhhO1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdGEgPSBjb2xvci5hICsgKGEgLSBjb2xvci5hKSAqIGFscGhhO1xuXHRcdH1cblx0XHRjb2xvci5hID0gYSA8IDAgPyAwIDogKGEgPiAxID8gMSA6IGEpO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBTbG90UG9zZS5jb2xvcn0gYW5kIHtAbGluayBTbG90UG9zZS5kYXJrQ29sb3J9IGZvciB0d28gY29sb3IgdGludGluZy4gKi9cbmV4cG9ydCBjbGFzcyBSR0JBMlRpbWVsaW5lIGV4dGVuZHMgU2xvdEN1cnZlVGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBzbG90SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBzbG90SW5kZXgsIC8vXG5cdFx0XHRgJHtQcm9wZXJ0eS5yZ2J9fCR7c2xvdEluZGV4fWAsIC8vXG5cdFx0XHRgJHtQcm9wZXJ0eS5hbHBoYX18JHtzbG90SW5kZXh9YCwgLy9cblx0XHRcdGAke1Byb3BlcnR5LnJnYjJ9fCR7c2xvdEluZGV4fWApO1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gOC8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgaW4gc2Vjb25kcywgbGlnaHQsIGFuZCBkYXJrIGNvbG9ycyBmb3IgdGhlIHNwZWNpZmllZCBrZXkgZnJhbWUuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciwgcjI6IG51bWJlciwgZzI6IG51bWJlciwgYjI6IG51bWJlcikge1xuXHRcdGZyYW1lIDw8PSAzO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypSKi9dID0gcjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDIvKkcqL10gPSBnO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMy8qQiovXSA9IGI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA0LypBKi9dID0gYTtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDUvKlIyKi9dID0gcjI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA2LypHMiovXSA9IGcyO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgNy8qQjIqL10gPSBiMjtcblx0fVxuXG5cdHByb3RlY3RlZCBhcHBseTEgKHNsb3Q6IFNsb3QsIHBvc2U6IFNsb3RQb3NlLCB0aW1lOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbikge1xuXHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRjb25zdCBsaWdodCA9IHBvc2UuY29sb3IsIGRhcmsgPSBwb3NlLmRhcmtDb2xvciE7XG5cdFx0bGV0IHIyID0gMCwgZzIgPSAwLCBiMiA9IDBcblx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0Y29uc3Qgc2V0dXAgPSBzbG90LmRhdGEuc2V0dXBQb3NlO1xuXHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiByZWZlcmVuY2UgcnVudGltZVxuXHRcdFx0Y29uc3Qgc2V0dXBMaWdodCA9IHNldHVwLmNvbG9yLCBzZXR1cERhcmsgPSBzZXR1cC5kYXJrQ29sb3IhO1xuXHRcdFx0c3dpdGNoIChmcm9tKSB7XG5cdFx0XHRcdGNhc2UgTWl4RnJvbS5zZXR1cDoge1xuXHRcdFx0XHRcdGxpZ2h0LnNldEZyb21Db2xvcihzZXR1cExpZ2h0KTtcblx0XHRcdFx0XHRkYXJrLnIgPSBzZXR1cERhcmsucjtcblx0XHRcdFx0XHRkYXJrLmcgPSBzZXR1cERhcmsuZztcblx0XHRcdFx0XHRkYXJrLmIgPSBzZXR1cERhcmsuYjtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXNlIE1peEZyb20uZmlyc3Q6IHtcblx0XHRcdFx0XHRsaWdodC5hZGQoKHNldHVwTGlnaHQuciAtIGxpZ2h0LnIpICogYWxwaGEsIChzZXR1cExpZ2h0LmcgLSBsaWdodC5nKSAqIGFscGhhLCAoc2V0dXBMaWdodC5iIC0gbGlnaHQuYikgKiBhbHBoYSxcblx0XHRcdFx0XHRcdChzZXR1cExpZ2h0LmEgLSBsaWdodC5hKSAqIGFscGhhKTtcblx0XHRcdFx0XHRkYXJrLnIgKz0gKHNldHVwRGFyay5yIC0gZGFyay5yKSAqIGFscGhhO1xuXHRcdFx0XHRcdGRhcmsuZyArPSAoc2V0dXBEYXJrLmcgLSBkYXJrLmcpICogYWxwaGE7XG5cdFx0XHRcdFx0ZGFyay5iICs9IChzZXR1cERhcmsuYiAtIGRhcmsuYikgKiBhbHBoYTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGxldCByID0gMCwgZyA9IDAsIGIgPSAwLCBhID0gMDtcblx0XHRjb25zdCBpID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSwgOC8qRU5UUklFUyovKTtcblx0XHRjb25zdCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpID4+IDNdO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOiB7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRcdFx0ciA9IGZyYW1lc1tpICsgMS8qUiovXTtcblx0XHRcdFx0ZyA9IGZyYW1lc1tpICsgMi8qRyovXTtcblx0XHRcdFx0YiA9IGZyYW1lc1tpICsgMy8qQiovXTtcblx0XHRcdFx0YSA9IGZyYW1lc1tpICsgNC8qQSovXTtcblx0XHRcdFx0cjIgPSBmcmFtZXNbaSArIDUvKlIyKi9dO1xuXHRcdFx0XHRnMiA9IGZyYW1lc1tpICsgNi8qRzIqL107XG5cdFx0XHRcdGIyID0gZnJhbWVzW2kgKyA3LypCMiovXTtcblx0XHRcdFx0Y29uc3QgdCA9ICh0aW1lIC0gYmVmb3JlKSAvIChmcmFtZXNbaSArIDgvKkVOVFJJRVMqL10gLSBiZWZvcmUpO1xuXHRcdFx0XHRyICs9IChmcmFtZXNbaSArIDgvKkVOVFJJRVMqLyArIDEvKlIqL10gLSByKSAqIHQ7XG5cdFx0XHRcdGcgKz0gKGZyYW1lc1tpICsgOC8qRU5UUklFUyovICsgMi8qRyovXSAtIGcpICogdDtcblx0XHRcdFx0YiArPSAoZnJhbWVzW2kgKyA4LypFTlRSSUVTKi8gKyAzLypCKi9dIC0gYikgKiB0O1xuXHRcdFx0XHRhICs9IChmcmFtZXNbaSArIDgvKkVOVFJJRVMqLyArIDQvKkEqL10gLSBhKSAqIHQ7XG5cdFx0XHRcdHIyICs9IChmcmFtZXNbaSArIDgvKkVOVFJJRVMqLyArIDUvKlIyKi9dIC0gcjIpICogdDtcblx0XHRcdFx0ZzIgKz0gKGZyYW1lc1tpICsgOC8qRU5UUklFUyovICsgNi8qRzIqL10gLSBnMikgKiB0O1xuXHRcdFx0XHRiMiArPSAoZnJhbWVzW2kgKyA4LypFTlRSSUVTKi8gKyA3LypCMiovXSAtIGIyKSAqIHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHIgPSBmcmFtZXNbaSArIDEvKlIqL107XG5cdFx0XHRcdGcgPSBmcmFtZXNbaSArIDIvKkcqL107XG5cdFx0XHRcdGIgPSBmcmFtZXNbaSArIDMvKkIqL107XG5cdFx0XHRcdGEgPSBmcmFtZXNbaSArIDQvKkEqL107XG5cdFx0XHRcdHIyID0gZnJhbWVzW2kgKyA1LypSMiovXTtcblx0XHRcdFx0ZzIgPSBmcmFtZXNbaSArIDYvKkcyKi9dO1xuXHRcdFx0XHRiMiA9IGZyYW1lc1tpICsgNy8qQjIqL107XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ciA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qUiovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGcgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDIvKkcqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDMvKkIqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiAyIC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRhID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA0LypBKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMyAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0cjIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDUvKlIyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogNCAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0ZzIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDYvKkcyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogNSAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0YjIgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDcvKkIyKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogNiAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cblx0XHRpZiAoYWxwaGEgPT09IDEpXG5cdFx0XHRsaWdodC5zZXQociwgZywgYiwgYSk7XG5cdFx0ZWxzZSBpZiAoZnJvbSA9PT0gTWl4RnJvbS5zZXR1cCkge1xuXHRcdFx0Y29uc3Qgc2V0dXBQb3NlID0gc2xvdC5kYXRhLnNldHVwUG9zZTtcblx0XHRcdGxldCBzZXR1cCA9IHNldHVwUG9zZS5jb2xvcjtcblx0XHRcdGxpZ2h0LnNldChzZXR1cC5yICsgKHIgLSBzZXR1cC5yKSAqIGFscGhhLCBzZXR1cC5nICsgKGcgLSBzZXR1cC5nKSAqIGFscGhhLCBzZXR1cC5iICsgKGIgLSBzZXR1cC5iKSAqIGFscGhhLFxuXHRcdFx0XHRzZXR1cC5hICsgKGEgLSBzZXR1cC5hKSAqIGFscGhhKTtcblx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRcdHNldHVwID0gc2V0dXBQb3NlLmRhcmtDb2xvciE7XG5cdFx0XHRyMiA9IHNldHVwLnIgKyAocjIgLSBzZXR1cC5yKSAqIGFscGhhO1xuXHRcdFx0ZzIgPSBzZXR1cC5nICsgKGcyIC0gc2V0dXAuZykgKiBhbHBoYTtcblx0XHRcdGIyID0gc2V0dXAuYiArIChiMiAtIHNldHVwLmIpICogYWxwaGE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpZ2h0LmFkZCgociAtIGxpZ2h0LnIpICogYWxwaGEsIChnIC0gbGlnaHQuZykgKiBhbHBoYSwgKGIgLSBsaWdodC5iKSAqIGFscGhhLCAoYSAtIGxpZ2h0LmEpICogYWxwaGEpO1xuXHRcdFx0cjIgPSBkYXJrLnIgKyAocjIgLSBkYXJrLnIpICogYWxwaGE7XG5cdFx0XHRnMiA9IGRhcmsuZyArIChnMiAtIGRhcmsuZykgKiBhbHBoYTtcblx0XHRcdGIyID0gZGFyay5iICsgKGIyIC0gZGFyay5iKSAqIGFscGhhO1xuXHRcdH1cblx0XHRkYXJrLnIgPSByMiA8IDAgPyAwIDogKHIyID4gMSA/IDEgOiByMik7XG5cdFx0ZGFyay5nID0gZzIgPCAwID8gMCA6IChnMiA+IDEgPyAxIDogZzIpO1xuXHRcdGRhcmsuYiA9IGIyIDwgMCA/IDAgOiAoYjIgPiAxID8gMSA6IGIyKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgU2xvdFBvc2UuY29sb3J9IGFuZCB7QGxpbmsgU2xvdFBvc2UuZGFya0NvbG9yfSBmb3IgdHdvIGNvbG9yIHRpbnRpbmcuICovXG5leHBvcnQgY2xhc3MgUkdCMlRpbWVsaW5lIGV4dGVuZHMgU2xvdEN1cnZlVGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBzbG90SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBzbG90SW5kZXgsIC8vXG5cdFx0XHRgJHtQcm9wZXJ0eS5yZ2J9fCR7c2xvdEluZGV4fWAsIC8vXG5cdFx0XHRgJHtQcm9wZXJ0eS5yZ2IyfXwke3Nsb3RJbmRleH1gKTtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDcvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMsIGxpZ2h0LCBhbmQgZGFyayBjb2xvcnMgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyYW1lLiAqL1xuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCByMjogbnVtYmVyLCBnMjogbnVtYmVyLCBiMjogbnVtYmVyKSB7XG5cdFx0ZnJhbWUgKj0gNy8qRU5UUklFUyovO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyAxLypSKi9dID0gcjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDIvKkcqL10gPSBnO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMy8qQiovXSA9IGI7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWUgKyA0LypSMiovXSA9IHIyO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgNS8qRzIqL10gPSBnMjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDYvKkIyKi9dID0gYjI7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYXBwbHkxIChzbG90OiBTbG90LCBwb3NlOiBTbG90UG9zZSwgdGltZTogbnVtYmVyLCBhbHBoYTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tLCBhZGQ6IGJvb2xlYW4pIHtcblx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IHJlZmVyZW5jZSBydW50aW1lXG5cdFx0Y29uc3QgbGlnaHQgPSBwb3NlLmNvbG9yLCBkYXJrID0gcG9zZS5kYXJrQ29sb3IhO1xuXHRcdGxldCByID0gMCwgZyA9IDAsIGIgPSAwLCByMiA9IDAsIGcyID0gMCwgYjIgPSAwXG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdGNvbnN0IHNldHVwID0gc2xvdC5kYXRhLnNldHVwUG9zZTtcblx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRcdGNvbnN0IHNldHVwTGlnaHQgPSBzZXR1cC5jb2xvciwgc2V0dXBEYXJrID0gc2V0dXAuZGFya0NvbG9yITtcblx0XHRcdHN3aXRjaCAoZnJvbSkge1xuXHRcdFx0XHRjYXNlIE1peEZyb20uc2V0dXA6XG5cdFx0XHRcdFx0bGlnaHQuciA9IHNldHVwTGlnaHQucjtcblx0XHRcdFx0XHRsaWdodC5nID0gc2V0dXBMaWdodC5nO1xuXHRcdFx0XHRcdGxpZ2h0LmIgPSBzZXR1cExpZ2h0LmI7XG5cdFx0XHRcdFx0ZGFyay5yID0gc2V0dXBEYXJrLnI7XG5cdFx0XHRcdFx0ZGFyay5nID0gc2V0dXBEYXJrLmc7XG5cdFx0XHRcdFx0ZGFyay5iID0gc2V0dXBEYXJrLmI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgTWl4RnJvbS5maXJzdDpcblx0XHRcdFx0XHRsaWdodC5yICs9IChzZXR1cExpZ2h0LnIgLSBsaWdodC5yKSAqIGFscGhhO1xuXHRcdFx0XHRcdGxpZ2h0LmcgKz0gKHNldHVwTGlnaHQuZyAtIGxpZ2h0LmcpICogYWxwaGE7XG5cdFx0XHRcdFx0bGlnaHQuYiArPSAoc2V0dXBMaWdodC5iIC0gbGlnaHQuYikgKiBhbHBoYTtcblx0XHRcdFx0XHRkYXJrLnIgKz0gKHNldHVwRGFyay5yIC0gZGFyay5yKSAqIGFscGhhO1xuXHRcdFx0XHRcdGRhcmsuZyArPSAoc2V0dXBEYXJrLmcgLSBkYXJrLmcpICogYWxwaGE7XG5cdFx0XHRcdFx0ZGFyay5iICs9IChzZXR1cERhcmsuYiAtIGRhcmsuYikgKiBhbHBoYTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSwgNy8qRU5UUklFUyovKTtcblx0XHRjb25zdCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpIC8gNy8qRU5UUklFUyovXTtcblx0XHRzd2l0Y2ggKGN1cnZlVHlwZSkge1xuXHRcdFx0Y2FzZSAwLypMSU5FQVIqLzoge1xuXHRcdFx0XHRjb25zdCBiZWZvcmUgPSBmcmFtZXNbaV07XG5cdFx0XHRcdHIgPSBmcmFtZXNbaSArIDEvKlIqL107XG5cdFx0XHRcdGcgPSBmcmFtZXNbaSArIDIvKkcqL107XG5cdFx0XHRcdGIgPSBmcmFtZXNbaSArIDMvKkIqL107XG5cdFx0XHRcdHIyID0gZnJhbWVzW2kgKyA0LypSMiovXTtcblx0XHRcdFx0ZzIgPSBmcmFtZXNbaSArIDUvKkcyKi9dO1xuXHRcdFx0XHRiMiA9IGZyYW1lc1tpICsgNi8qQjIqL107XG5cdFx0XHRcdGNvbnN0IHQgPSAodGltZSAtIGJlZm9yZSkgLyAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi9dIC0gYmVmb3JlKTtcblx0XHRcdFx0ciArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyAxLypSKi9dIC0gcikgKiB0O1xuXHRcdFx0XHRnICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDIvKkcqL10gLSBnKSAqIHQ7XG5cdFx0XHRcdGIgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgMy8qQiovXSAtIGIpICogdDtcblx0XHRcdFx0cjIgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgNC8qUjIqL10gLSByMikgKiB0O1xuXHRcdFx0XHRnMiArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyA1LypHMiovXSAtIGcyKSAqIHQ7XG5cdFx0XHRcdGIyICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDYvKkIyKi9dIC0gYjIpICogdDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0ciA9IGZyYW1lc1tpICsgMS8qUiovXTtcblx0XHRcdFx0ZyA9IGZyYW1lc1tpICsgMi8qRyovXTtcblx0XHRcdFx0YiA9IGZyYW1lc1tpICsgMy8qQiovXTtcblx0XHRcdFx0cjIgPSBmcmFtZXNbaSArIDQvKlIyKi9dO1xuXHRcdFx0XHRnMiA9IGZyYW1lc1tpICsgNS8qRzIqL107XG5cdFx0XHRcdGIyID0gZnJhbWVzW2kgKyA2LypCMiovXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAxLypSKi8sIGN1cnZlVHlwZSAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0ZyA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMi8qRyovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0YiA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMy8qQiovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDIgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdHIyID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA0LypSMiovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDMgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGcyID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA1LypHMiovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDQgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdGIyID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA2LypCMiovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDUgLSAyLypCRVpJRVIqLyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFscGhhICE9PSAxKSB7XG5cdFx0XHRpZiAoZnJvbSA9PT0gTWl4RnJvbS5zZXR1cCkge1xuXHRcdFx0XHRjb25zdCBzZXR1cFBvc2UgPSBzbG90LmRhdGEuc2V0dXBQb3NlO1xuXHRcdFx0XHRsZXQgc2V0dXAgPSBzZXR1cFBvc2UuY29sb3I7XG5cdFx0XHRcdHIgPSBzZXR1cC5yICsgKHIgLSBzZXR1cC5yKSAqIGFscGhhO1xuXHRcdFx0XHRnID0gc2V0dXAuZyArIChnIC0gc2V0dXAuZykgKiBhbHBoYTtcblx0XHRcdFx0YiA9IHNldHVwLmIgKyAoYiAtIHNldHVwLmIpICogYWxwaGE7XG5cdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRcdFx0c2V0dXAgPSBzZXR1cFBvc2UuZGFya0NvbG9yITtcblx0XHRcdFx0cjIgPSBzZXR1cC5yICsgKHIyIC0gc2V0dXAucikgKiBhbHBoYTtcblx0XHRcdFx0ZzIgPSBzZXR1cC5nICsgKGcyIC0gc2V0dXAuZykgKiBhbHBoYTtcblx0XHRcdFx0YjIgPSBzZXR1cC5iICsgKGIyIC0gc2V0dXAuYikgKiBhbHBoYTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHIgPSBsaWdodC5yICsgKHIgLSBsaWdodC5yKSAqIGFscGhhO1xuXHRcdFx0XHRnID0gbGlnaHQuZyArIChnIC0gbGlnaHQuZykgKiBhbHBoYTtcblx0XHRcdFx0YiA9IGxpZ2h0LmIgKyAoYiAtIGxpZ2h0LmIpICogYWxwaGE7XG5cdFx0XHRcdHIyID0gZGFyay5yICsgKHIyIC0gZGFyay5yKSAqIGFscGhhO1xuXHRcdFx0XHRnMiA9IGRhcmsuZyArIChnMiAtIGRhcmsuZykgKiBhbHBoYTtcblx0XHRcdFx0YjIgPSBkYXJrLmIgKyAoYjIgLSBkYXJrLmIpICogYWxwaGE7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGxpZ2h0LnIgPSByIDwgMCA/IDAgOiAociA+IDEgPyAxIDogcik7XG5cdFx0bGlnaHQuZyA9IGcgPCAwID8gMCA6IChnID4gMSA/IDEgOiBnKTtcblx0XHRsaWdodC5iID0gYiA8IDAgPyAwIDogKGIgPiAxID8gMSA6IGIpO1xuXHRcdGRhcmsuciA9IHIyIDwgMCA/IDAgOiAocjIgPiAxID8gMSA6IHIyKTtcblx0XHRkYXJrLmcgPSBnMiA8IDAgPyAwIDogKGcyID4gMSA/IDEgOiBnMik7XG5cdFx0ZGFyay5iID0gYjIgPCAwID8gMCA6IChiMiA+IDEgPyAxIDogYjIpO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBTbG90UG9zZS50dGFjaG1lbnR9LiAqL1xuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRUaW1lbGluZSBleHRlbmRzIFRpbWVsaW5lIGltcGxlbWVudHMgU2xvdFRpbWVsaW5lIHtcblx0c2xvdEluZGV4ID0gMDtcblxuXHQvKiogVGhlIGF0dGFjaG1lbnQgbmFtZSBmb3IgZWFjaCBrZXkgZnJhbWUuIE1heSBjb250YWluIG51bGwgdmFsdWVzIHRvIGNsZWFyIHRoZSBhdHRhY2htZW50LiAqL1xuXHRhdHRhY2htZW50TmFtZXM6IEFycmF5PHN0cmluZyB8IG51bGw+O1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYCR7UHJvcGVydHkuYXR0YWNobWVudH18JHtzbG90SW5kZXh9YCk7XG5cdFx0dGhpcy5zbG90SW5kZXggPSBzbG90SW5kZXg7XG5cdFx0dGhpcy5hdHRhY2htZW50TmFtZXMgPSBuZXcgQXJyYXk8c3RyaW5nPihmcmFtZUNvdW50KTtcblx0XHR0aGlzLmluc3RhbnQgPSB0cnVlO1xuXHR9XG5cblx0Z2V0RnJhbWVDb3VudCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aDtcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGluIHNlY29uZHMgYW5kIHRoZSBhdHRhY2htZW50IG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyYW1lLiAqL1xuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBhdHRhY2htZW50TmFtZTogc3RyaW5nIHwgbnVsbCkge1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0dGhpcy5hdHRhY2htZW50TmFtZXNbZnJhbWVdID0gYXR0YWNobWVudE5hbWU7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXG5cdFx0Y29uc3Qgc2xvdCA9IHNrZWxldG9uLnNsb3RzW3RoaXMuc2xvdEluZGV4XTtcblx0XHRpZiAoIXNsb3QuYm9uZS5hY3RpdmUpIHJldHVybjtcblx0XHRjb25zdCBwb3NlID0gYXBwbGllZFBvc2UgPyBzbG90LmFwcGxpZWRQb3NlIDogc2xvdC5wb3NlO1xuXG5cdFx0aWYgKG91dCB8fCB0aW1lIDwgdGhpcy5mcmFtZXNbMF0pIHtcblx0XHRcdGlmIChmcm9tICE9PSBNaXhGcm9tLmN1cnJlbnQpIHRoaXMuc2V0QXR0YWNobWVudChza2VsZXRvbiwgcG9zZSwgc2xvdC5kYXRhLmF0dGFjaG1lbnROYW1lKTtcblx0XHR9IGVsc2Vcblx0XHRcdHRoaXMuc2V0QXR0YWNobWVudChza2VsZXRvbiwgcG9zZSwgdGhpcy5hdHRhY2htZW50TmFtZXNbVGltZWxpbmUuc2VhcmNoKHRoaXMuZnJhbWVzLCB0aW1lKV0pO1xuXHR9XG5cblx0c2V0QXR0YWNobWVudCAoc2tlbGV0b246IFNrZWxldG9uLCBwb3NlOiBTbG90UG9zZSwgYXR0YWNobWVudE5hbWU6IHN0cmluZyB8IG51bGwpIHtcblx0XHRwb3NlLnNldEF0dGFjaG1lbnQoIWF0dGFjaG1lbnROYW1lID8gbnVsbCA6IHNrZWxldG9uLmdldEF0dGFjaG1lbnQodGhpcy5zbG90SW5kZXgsIGF0dGFjaG1lbnROYW1lKSk7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIFNsb3RQb3NlLmRlZm9ybX0gdG8gZGVmb3JtIGEge0BsaW5rIFZlcnRleEF0dGFjaG1lbnR9LiAqL1xuZXhwb3J0IGNsYXNzIERlZm9ybVRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIFNsb3RUaW1lbGluZSB7XG5cdHJlYWRvbmx5IHNsb3RJbmRleDogbnVtYmVyO1xuXG5cdC8qKiBUaGUgYXR0YWNobWVudCB0aGF0IHdpbGwgYmUgZGVmb3JtZWQuXG5cdCAqXG5cdCAqIFNlZSB7QGxpbmsgVmVydGV4QXR0YWNobWVudC5nZXRUaW1lbGluZUF0dGFjaG1lbnR9LiAqL1xuXHRyZWFkb25seSBhdHRhY2htZW50OiBWZXJ0ZXhBdHRhY2htZW50O1xuXG5cdC8qKiBUaGUgdmVydGljZXMgZm9yIGVhY2gga2V5IGZyYW1lLiAqL1xuXHR2ZXJ0aWNlczogQXJyYXk8TnVtYmVyQXJyYXlMaWtlPjtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBzbG90SW5kZXg6IG51bWJlciwgYXR0YWNobWVudDogVmVydGV4QXR0YWNobWVudCkge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBgJHtQcm9wZXJ0eS5kZWZvcm19fCR7c2xvdEluZGV4fXwke2F0dGFjaG1lbnQuaWR9YCk7XG5cdFx0dGhpcy5zbG90SW5kZXggPSBzbG90SW5kZXg7XG5cdFx0dGhpcy5hdHRhY2htZW50ID0gYXR0YWNobWVudDtcblx0XHR0aGlzLnZlcnRpY2VzID0gbmV3IEFycmF5PE51bWJlckFycmF5TGlrZT4oZnJhbWVDb3VudCk7XG5cdFx0dGhpcy5hZGRpdGl2ZSA9IHRydWU7XG5cdH1cblxuXHRnZXRGcmFtZUNvdW50ICgpIHtcblx0XHRyZXR1cm4gdGhpcy5mcmFtZXMubGVuZ3RoO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgYW5kIHZlcnRpY2VzIGZvciB0aGUgc3BlY2lmaWVkIGZyYW1lLlxuXHQgKiBAcGFyYW0gZnJhbWUgQmV0d2VlbiAwIGFuZCBgZnJhbWVDb3VudGAsIGluY2x1c2l2ZS5cblx0ICogQHBhcmFtIHRpbWUgVGhlIGZyYW1lIHRpbWUgaW4gc2Vjb25kcy5cblx0ICogQHBhcmFtIHZlcnRpY2VzIFZlcnRleCBwb3NpdGlvbnMgZm9yIGFuIHVud2VpZ2h0ZWQgVmVydGV4QXR0YWNobWVudCwgb3IgZGVmb3JtIG9mZnNldHMgaWYgaXQgaGFzIHdlaWdodHMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UpIHtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMudmVydGljZXNbZnJhbWVdID0gdmVydGljZXM7XG5cdH1cblxuXHQvKiogQHBhcmFtIHZhbHVlMSBJZ25vcmVkICgwIGlzIHVzZWQgZm9yIGEgZGVmb3JtIHRpbWVsaW5lKS5cblx0ICogQHBhcmFtIHZhbHVlMiBJZ25vcmVkICgxIGlzIHVzZWQgZm9yIGEgZGVmb3JtIHRpbWVsaW5lKS4gKi9cblx0c2V0QmV6aWVyIChiZXppZXI6IG51bWJlciwgZnJhbWU6IG51bWJlciwgdmFsdWU6IG51bWJlciwgdGltZTE6IG51bWJlciwgdmFsdWUxOiBudW1iZXIsIGN4MTogbnVtYmVyLCBjeTE6IG51bWJlciwgY3gyOiBudW1iZXIsXG5cdFx0Y3kyOiBudW1iZXIsIHRpbWUyOiBudW1iZXIsIHZhbHVlMjogbnVtYmVyKSB7XG5cdFx0Y29uc3QgY3VydmVzID0gdGhpcy5jdXJ2ZXM7XG5cdFx0bGV0IGkgPSB0aGlzLmdldEZyYW1lQ291bnQoKSArIGJlemllciAqIDE4LypCRVpJRVJfU0laRSovO1xuXHRcdGlmICh2YWx1ZSA9PT0gMCkgY3VydmVzW2ZyYW1lXSA9IDIvKkJFWklFUiovICsgaTtcblx0XHRjb25zdCB0bXB4ID0gKHRpbWUxIC0gY3gxICogMiArIGN4MikgKiAwLjAzLCB0bXB5ID0gY3kyICogMC4wMyAtIGN5MSAqIDAuMDY7XG5cdFx0Y29uc3QgZGRkeCA9ICgoY3gxIC0gY3gyKSAqIDMgLSB0aW1lMSArIHRpbWUyKSAqIDAuMDA2LCBkZGR5ID0gKGN5MSAtIGN5MiArIDAuMzMzMzMzMzMpICogMC4wMTg7XG5cdFx0bGV0IGRkeCA9IHRtcHggKiAyICsgZGRkeCwgZGR5ID0gdG1weSAqIDIgKyBkZGR5O1xuXHRcdGxldCBkeCA9IChjeDEgLSB0aW1lMSkgKiAwLjMgKyB0bXB4ICsgZGRkeCAqIDAuMTY2NjY2NjcsIGR5ID0gY3kxICogMC4zICsgdG1weSArIGRkZHkgKiAwLjE2NjY2NjY3O1xuXHRcdGxldCB4ID0gdGltZTEgKyBkeCwgeSA9IGR5O1xuXHRcdGZvciAobGV0IG4gPSBpICsgMTgvKkJFWklFUl9TSVpFKi87IGkgPCBuOyBpICs9IDIpIHtcblx0XHRcdGN1cnZlc1tpXSA9IHg7XG5cdFx0XHRjdXJ2ZXNbaSArIDFdID0geTtcblx0XHRcdGR4ICs9IGRkeDtcblx0XHRcdGR5ICs9IGRkeTtcblx0XHRcdGRkeCArPSBkZGR4O1xuXHRcdFx0ZGR5ICs9IGRkZHk7XG5cdFx0XHR4ICs9IGR4O1xuXHRcdFx0eSArPSBkeTtcblx0XHR9XG5cdH1cblxuXHRnZXRDdXJ2ZVBlcmNlbnQgKHRpbWU6IG51bWJlciwgZnJhbWU6IG51bWJlcikge1xuXHRcdGNvbnN0IGN1cnZlcyA9IHRoaXMuY3VydmVzO1xuXHRcdGxldCBpID0gY3VydmVzW2ZyYW1lXTtcblx0XHRzd2l0Y2ggKGkpIHtcblx0XHRcdGNhc2UgMC8qTElORUFSKi86IHtcblx0XHRcdFx0Y29uc3QgeCA9IHRoaXMuZnJhbWVzW2ZyYW1lXTtcblx0XHRcdFx0cmV0dXJuICh0aW1lIC0geCkgLyAodGhpcy5mcmFtZXNbZnJhbWUgKyB0aGlzLmdldEZyYW1lRW50cmllcygpXSAtIHgpO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHJldHVybiAwO1xuXHRcdH1cblx0XHRpIC09IDIvKkJFWklFUiovO1xuXHRcdGlmIChjdXJ2ZXNbaV0gPiB0aW1lKSB7XG5cdFx0XHRjb25zdCB4ID0gdGhpcy5mcmFtZXNbZnJhbWVdO1xuXHRcdFx0cmV0dXJuIGN1cnZlc1tpICsgMV0gKiAodGltZSAtIHgpIC8gKGN1cnZlc1tpXSAtIHgpO1xuXHRcdH1cblx0XHRjb25zdCBuID0gaSArIDE4LypCRVpJRVJfU0laRSovO1xuXHRcdGZvciAoaSArPSAyOyBpIDwgbjsgaSArPSAyKSB7XG5cdFx0XHRpZiAoY3VydmVzW2ldID49IHRpbWUpIHtcblx0XHRcdFx0Y29uc3QgeCA9IGN1cnZlc1tpIC0gMl0sIHkgPSBjdXJ2ZXNbaSAtIDFdO1xuXHRcdFx0XHRyZXR1cm4geSArICh0aW1lIC0geCkgLyAoY3VydmVzW2ldIC0geCkgKiAoY3VydmVzW2kgKyAxXSAtIHkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCB4ID0gY3VydmVzW24gLSAyXSwgeSA9IGN1cnZlc1tuIC0gMV07XG5cdFx0cmV0dXJuIHkgKyAoMSAtIHkpICogKHRpbWUgLSB4KSAvICh0aGlzLmZyYW1lc1tmcmFtZSArIHRoaXMuZ2V0RnJhbWVFbnRyaWVzKCldIC0geCk7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogRXZlbnRbXSB8IG51bGwsIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sXG5cdFx0YWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgc2xvdHMgPSBza2VsZXRvbi5zbG90cztcblx0XHRpZiAoIXRoaXMuYXR0YWNobWVudC5pc1RpbWVsaW5lQWN0aXZlKHNsb3RzLCB0aGlzLnNsb3RJbmRleCwgYXBwbGllZFBvc2UpKSByZXR1cm47XG5cdFx0Y29uc3QgdGltZWxpbmVTbG90cyA9IHRoaXMuYXR0YWNobWVudC50aW1lbGluZVNsb3RzO1xuXG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKHRpbWUgPCBmcmFtZXNbMF0pIHtcblx0XHRcdHRoaXMuYXBwbHlCZWZvcmVGaXJzdChzbG90c1t0aGlzLnNsb3RJbmRleF0sIGFwcGxpZWRQb3NlLCBhbHBoYSwgZnJvbSk7XG5cdFx0XHRmb3IgKGNvbnN0IHNsb3RJbmRleCBvZiB0aW1lbGluZVNsb3RzKVxuXHRcdFx0XHR0aGlzLmFwcGx5QmVmb3JlRmlyc3Qoc2xvdHNbc2xvdEluZGV4XSwgYXBwbGllZFBvc2UsIGFscGhhLCBmcm9tKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXQgdjE6IE51bWJlckFycmF5TGlrZSwgdjI6IE51bWJlckFycmF5TGlrZSB8IG51bGw7XG5cdFx0bGV0IHBlcmNlbnQ6IG51bWJlcjtcblx0XHRpZiAodGltZSA+PSBmcmFtZXNbZnJhbWVzLmxlbmd0aCAtIDFdKSB7XG5cdFx0XHRwZXJjZW50ID0gMDtcblx0XHRcdHYxID0gdGhpcy52ZXJ0aWNlc1tmcmFtZXMubGVuZ3RoIC0gMV07XG5cdFx0XHR2MiA9IG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGZyYW1lID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSk7XG5cdFx0XHRwZXJjZW50ID0gdGhpcy5nZXRDdXJ2ZVBlcmNlbnQodGltZSwgZnJhbWUpO1xuXHRcdFx0djEgPSB0aGlzLnZlcnRpY2VzW2ZyYW1lXTtcblx0XHRcdHYyID0gdGhpcy52ZXJ0aWNlc1tmcmFtZSArIDFdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZlcnRleENvdW50ID0gdGhpcy52ZXJ0aWNlc1swXS5sZW5ndGg7XG5cdFx0dGhpcy5hcHBseVRvU2xvdChzbG90c1t0aGlzLnNsb3RJbmRleF0sIGFwcGxpZWRQb3NlLCB2MSwgdjIsIHBlcmNlbnQsIHZlcnRleENvdW50LCBhbHBoYSwgZnJvbSwgYWRkKTtcblx0XHRmb3IgKGNvbnN0IHNsb3RJbmRleCBvZiB0aW1lbGluZVNsb3RzKVxuXHRcdFx0dGhpcy5hcHBseVRvU2xvdChzbG90c1tzbG90SW5kZXhdLCBhcHBsaWVkUG9zZSwgdjEsIHYyLCBwZXJjZW50LCB2ZXJ0ZXhDb3VudCwgYWxwaGEsIGZyb20sIGFkZCk7XG5cdH1cblxuXHRwcml2YXRlIGFwcGx5QmVmb3JlRmlyc3QgKHNsb3Q6IFNsb3QsIGFwcGxpZWRQb3NlOiBib29sZWFuLCBhbHBoYTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tKSB7XG5cdFx0aWYgKCFzbG90LmJvbmUuYWN0aXZlKSByZXR1cm47XG5cdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gc2xvdC5hcHBsaWVkUG9zZSA6IHNsb3QucG9zZTtcblx0XHRpZiAocG9zZS5hdHRhY2htZW50ID09IG51bGwgfHwgcG9zZS5hdHRhY2htZW50LnRpbWVsaW5lQXR0YWNobWVudCAhPT0gdGhpcy5hdHRhY2htZW50KSByZXR1cm47XG5cdFx0Y29uc3QgZGVmb3JtQXJyYXkgPSBwb3NlLmRlZm9ybTtcblx0XHRpZiAoZGVmb3JtQXJyYXkubGVuZ3RoID09PSAwKSBmcm9tID0gTWl4RnJvbS5zZXR1cDtcblx0XHRzd2l0Y2ggKGZyb20pIHtcblx0XHRcdGNhc2UgTWl4RnJvbS5zZXR1cDogZGVmb3JtQXJyYXkubGVuZ3RoID0gMDsgYnJlYWs7XG5cdFx0XHRjYXNlIE1peEZyb20uZmlyc3Q6IHtcblx0XHRcdFx0aWYgKGFscGhhID09PSAxKSB7XG5cdFx0XHRcdFx0ZGVmb3JtQXJyYXkubGVuZ3RoID0gMDtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgdmVydGV4Q291bnQgPSB0aGlzLnZlcnRpY2VzWzBdLmxlbmd0aDtcblx0XHRcdFx0ZGVmb3JtQXJyYXkubGVuZ3RoID0gdmVydGV4Q291bnQ7XG5cdFx0XHRcdGNvbnN0IGRlZm9ybSA9IGRlZm9ybUFycmF5O1xuXHRcdFx0XHRjb25zdCB2ZXJ0ZXhBdHRhY2htZW50ID0gcG9zZS5hdHRhY2htZW50IGFzIFZlcnRleEF0dGFjaG1lbnQ7XG5cdFx0XHRcdGlmICh2ZXJ0ZXhBdHRhY2htZW50LmJvbmVzID09PSBudWxsKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2V0dXBWZXJ0aWNlcyA9IHZlcnRleEF0dGFjaG1lbnQudmVydGljZXM7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9IChzZXR1cFZlcnRpY2VzW2ldIC0gZGVmb3JtW2ldKSAqIGFscGhhO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFscGhhID0gMSAtIGFscGhhO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKylcblx0XHRcdFx0XHRcdGRlZm9ybVtpXSAqPSBhbHBoYTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXBwbHlUb1Nsb3QgKHNsb3Q6IFNsb3QsIGFwcGxpZWRQb3NlOiBib29sZWFuLCB2MTogTnVtYmVyQXJyYXlMaWtlLCB2MjogTnVtYmVyQXJyYXlMaWtlIHwgbnVsbCwgcGVyY2VudDogbnVtYmVyLCB2ZXJ0ZXhDb3VudDogbnVtYmVyLFxuXHRcdGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbikge1xuXHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IHNsb3QuYXBwbGllZFBvc2UgOiBzbG90LnBvc2U7XG5cdFx0aWYgKHBvc2UuYXR0YWNobWVudCA9PT0gbnVsbCB8fCBwb3NlLmF0dGFjaG1lbnQudGltZWxpbmVBdHRhY2htZW50ICE9PSB0aGlzLmF0dGFjaG1lbnQpIHJldHVybjtcblxuXHRcdGNvbnN0IHZlcnRleEF0dGFjaG1lbnQgPSBwb3NlLmF0dGFjaG1lbnQgYXMgVmVydGV4QXR0YWNobWVudDtcblx0XHRjb25zdCBkZWZvcm0gPSBwb3NlLmRlZm9ybTtcblx0XHRpZiAoZGVmb3JtLmxlbmd0aCA9PT0gMCkgZnJvbSA9IE1peEZyb20uc2V0dXA7XG5cdFx0Y29uc3QgZnJvbVNldHVwID0gZnJvbSA9PT0gTWl4RnJvbS5zZXR1cDtcblx0XHRkZWZvcm0ubGVuZ3RoID0gdmVydGV4Q291bnQ7XG5cblx0XHRpZiAodjIgPT09IG51bGwpIHsgLy8gVGltZSBpcyBhZnRlciBsYXN0IGZyYW1lLlxuXHRcdFx0aWYgKGFscGhhID09PSAxKSB7XG5cdFx0XHRcdGlmIChhZGQgJiYgIWZyb21TZXR1cCkge1xuXHRcdFx0XHRcdGlmICghdmVydGV4QXR0YWNobWVudC5ib25lcykgeyAvLyBVbndlaWdodGVkIHZlcnRleCBwb3NpdGlvbnMsIG5vIGFscGhhLlxuXHRcdFx0XHRcdFx0Y29uc3Qgc2V0dXBWZXJ0aWNlcyA9IHZlcnRleEF0dGFjaG1lbnQudmVydGljZXM7XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspXG5cdFx0XHRcdFx0XHRcdGRlZm9ybVtpXSArPSB2MVtpXSAtIHNldHVwVmVydGljZXNbaV07XG5cdFx0XHRcdFx0fSBlbHNlIHsgLy8gV2VpZ2h0ZWQgZGVmb3JtIG9mZnNldHMsIG5vIGFscGhhLlxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0XHRcdFx0XHRkZWZvcm1baV0gKz0gdjFbaV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgLy8gVmVydGV4IHBvc2l0aW9ucyBvciBkZWZvcm0gb2Zmc2V0cywgbm8gYWxwaGEuXG5cdFx0XHRcdFx0VXRpbHMuYXJyYXlDb3B5KHYxLCAwLCBkZWZvcm0sIDAsIHZlcnRleENvdW50KTtcblx0XHRcdH0gZWxzZSBpZiAoZnJvbVNldHVwKSB7XG5cdFx0XHRcdGlmICghdmVydGV4QXR0YWNobWVudC5ib25lcykgeyAvLyBVbndlaWdodGVkIHZlcnRleCBwb3NpdGlvbnMsIHdpdGggYWxwaGEuXG5cdFx0XHRcdFx0Y29uc3Qgc2V0dXBWZXJ0aWNlcyA9IHZlcnRleEF0dGFjaG1lbnQudmVydGljZXM7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzZXR1cCA9IHNldHVwVmVydGljZXNbaV07XG5cdFx0XHRcdFx0XHRkZWZvcm1baV0gPSBzZXR1cCArICh2MVtpXSAtIHNldHVwKSAqIGFscGhhO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHsgLy8gV2VpZ2h0ZWQgZGVmb3JtIG9mZnNldHMsIHdpdGggYWxwaGEuXG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0XHRcdFx0ZGVmb3JtW2ldID0gdjFbaV0gKiBhbHBoYTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhZGQpIHtcblx0XHRcdFx0aWYgKCF2ZXJ0ZXhBdHRhY2htZW50LmJvbmVzKSB7IC8vIFVud2VpZ2h0ZWQgdmVydGV4IHBvc2l0aW9ucywgbm8gYWxwaGEuXG5cdFx0XHRcdFx0Y29uc3Qgc2V0dXBWZXJ0aWNlcyA9IHZlcnRleEF0dGFjaG1lbnQudmVydGljZXM7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9ICh2MVtpXSAtIHNldHVwVmVydGljZXNbaV0pICogYWxwaGE7XG5cdFx0XHRcdH0gZWxzZSB7IC8vIFdlaWdodGVkIGRlZm9ybSBvZmZzZXRzLCBhbHBoYS5cblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspXG5cdFx0XHRcdFx0XHRkZWZvcm1baV0gKz0gdjFbaV0gKiBhbHBoYTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHsgLy8gVmVydGV4IHBvc2l0aW9ucyBvciBkZWZvcm0gb2Zmc2V0cywgd2l0aCBhbHBoYS5cblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKVxuXHRcdFx0XHRcdGRlZm9ybVtpXSArPSAodjFbaV0gLSBkZWZvcm1baV0pICogYWxwaGE7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHsgLy8gQmV0d2VlbiBmcmFtZXMuXG5cdFx0XHRpZiAoYWxwaGEgPT09IDEpIHtcblx0XHRcdFx0aWYgKGFkZCAmJiAhZnJvbVNldHVwKSB7XG5cdFx0XHRcdFx0aWYgKCF2ZXJ0ZXhBdHRhY2htZW50LmJvbmVzKSB7IC8vIFVud2VpZ2h0ZWQgdmVydGV4IHBvc2l0aW9ucywgbm8gYWxwaGEuXG5cdFx0XHRcdFx0XHRjb25zdCBzZXR1cFZlcnRpY2VzID0gdmVydGV4QXR0YWNobWVudC52ZXJ0aWNlcztcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBwcmV2ID0gdjFbaV07XG5cdFx0XHRcdFx0XHRcdGRlZm9ybVtpXSArPSBwcmV2ICsgKHYyW2ldIC0gcHJldikgKiBwZXJjZW50IC0gc2V0dXBWZXJ0aWNlc1tpXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgeyAvLyBXZWlnaHRlZCBkZWZvcm0gb2Zmc2V0cywgbm8gYWxwaGEuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgcHJldiA9IHYxW2ldO1xuXHRcdFx0XHRcdFx0XHRkZWZvcm1baV0gKz0gcHJldiArICh2MltpXSAtIHByZXYpICogcGVyY2VudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAocGVyY2VudCA9PT0gMClcblx0XHRcdFx0XHRVdGlscy5hcnJheUNvcHkodjEsIDAsIGRlZm9ybSwgMCwgdmVydGV4Q291bnQpXG5cdFx0XHRcdGVsc2UgeyAvLyBWZXJ0ZXggcG9zaXRpb25zIG9yIGRlZm9ybSBvZmZzZXRzLCBubyBhbHBoYS5cblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IHByZXYgPSB2MVtpXTtcblx0XHRcdFx0XHRcdGRlZm9ybVtpXSA9IHByZXYgKyAodjJbaV0gLSBwcmV2KSAqIHBlcmNlbnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGZyb21TZXR1cCkge1xuXHRcdFx0XHRpZiAoIXZlcnRleEF0dGFjaG1lbnQuYm9uZXMpIHsgLy8gVW53ZWlnaHRlZCB2ZXJ0ZXggcG9zaXRpb25zLCB3aXRoIGFscGhhLlxuXHRcdFx0XHRcdGNvbnN0IHNldHVwVmVydGljZXMgPSB2ZXJ0ZXhBdHRhY2htZW50LnZlcnRpY2VzO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHJldiA9IHYxW2ldLCBzZXR1cCA9IHNldHVwVmVydGljZXNbaV07XG5cdFx0XHRcdFx0XHRkZWZvcm1baV0gPSBzZXR1cCArIChwcmV2ICsgKHYyW2ldIC0gcHJldikgKiBwZXJjZW50IC0gc2V0dXApICogYWxwaGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgeyAvLyBXZWlnaHRlZCBkZWZvcm0gb2Zmc2V0cywgd2l0aCBhbHBoYS5cblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IHByZXYgPSB2MVtpXTtcblx0XHRcdFx0XHRcdGRlZm9ybVtpXSA9IChwcmV2ICsgKHYyW2ldIC0gcHJldikgKiBwZXJjZW50KSAqIGFscGhhO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhZGQpIHtcblx0XHRcdFx0aWYgKCF2ZXJ0ZXhBdHRhY2htZW50LmJvbmVzKSB7IC8vIFVud2VpZ2h0ZWQgdmVydGV4IHBvc2l0aW9ucywgd2l0aCBhbHBoYS5cblx0XHRcdFx0XHRjb25zdCBzZXR1cFZlcnRpY2VzID0gdmVydGV4QXR0YWNobWVudC52ZXJ0aWNlcztcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IHByZXYgPSB2MVtpXTtcblx0XHRcdFx0XHRcdGRlZm9ybVtpXSArPSAocHJldiArICh2MltpXSAtIHByZXYpICogcGVyY2VudCAtIHNldHVwVmVydGljZXNbaV0pICogYWxwaGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgeyAvLyBXZWlnaHRlZCBkZWZvcm0gb2Zmc2V0cywgd2l0aCBhbHBoYS5cblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IHByZXYgPSB2MVtpXTtcblx0XHRcdFx0XHRcdGRlZm9ybVtpXSArPSAocHJldiArICh2MltpXSAtIHByZXYpICogcGVyY2VudCkgKiBhbHBoYTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkrKykge1xuXHRcdFx0XHRcdGNvbnN0IHByZXYgPSB2MVtpXTtcblx0XHRcdFx0XHRkZWZvcm1baV0gKz0gKHByZXYgKyAodjJbaV0gLSBwcmV2KSAqIHBlcmNlbnQgLSBkZWZvcm1baV0pICogYWxwaGE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIFNsb3QuZ2V0U2VxdWVuY2VJbmRleH0gZm9yIGFuIGF0dGFjaG1lbnQncyB7QGxpbmsgU2VxdWVuY2V9LiAqL1xuZXhwb3J0IGNsYXNzIFNlcXVlbmNlVGltZWxpbmUgZXh0ZW5kcyBUaW1lbGluZSBpbXBsZW1lbnRzIFNsb3RUaW1lbGluZSB7XG5cdHN0YXRpYyBFTlRSSUVTID0gMztcblx0c3RhdGljIE1PREUgPSAxO1xuXHRzdGF0aWMgREVMQVkgPSAyO1xuXG5cdHJlYWRvbmx5IHNsb3RJbmRleDogbnVtYmVyO1xuXHRyZWFkb25seSBhdHRhY2htZW50OiBBdHRhY2htZW50O1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyLCBhdHRhY2htZW50OiBBdHRhY2htZW50KSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYCR7UHJvcGVydHkuc2VxdWVuY2V9fCR7c2xvdEluZGV4fXwkeyhhdHRhY2htZW50IGFzIHVua25vd24gYXMgSGFzU2VxdWVuY2UpLnNlcXVlbmNlLmlkfWApO1xuXHRcdHRoaXMuc2xvdEluZGV4ID0gc2xvdEluZGV4O1xuXHRcdHRoaXMuYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7XG5cdFx0dGhpcy5pbnN0YW50ID0gdHJ1ZTtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIFNlcXVlbmNlVGltZWxpbmUuRU5UUklFUztcblx0fVxuXG5cdGdldFNsb3RJbmRleCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2xvdEluZGV4O1xuXHR9XG5cblx0LyoqIFRoZSBhdHRhY2htZW50IGZvciB3aGljaCB0aGUge0BsaW5rIFNsb3RQb3NlLnNlcXVlbmNlSW5kZXh9IHdpbGwgYmUgc2V0LlxuXHQgKlxuXHQgKiBTZWUge0BsaW5rIFZlcnRleEF0dGFjaG1lbnQudGltZWxpbmVBdHRhY2htZW50fS4gKi9cblx0Z2V0QXR0YWNobWVudCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0YWNobWVudDtcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lLCBtb2RlLCBpbmRleCwgYW5kIGZyYW1lIHRpbWUgZm9yIHRoZSBzcGVjaWZpZWQgZnJhbWUuXG5cdCAqIEBwYXJhbSBmcmFtZSBCZXR3ZWVuIDAgYW5kIGBmcmFtZUNvdW50YCwgaW5jbHVzaXZlLlxuXHQgKiBAcGFyYW0gdGltZSBTZWNvbmRzIGJldHdlZW4gZnJhbWVzLiAqL1xuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBtb2RlOiBTZXF1ZW5jZU1vZGUsIGluZGV4OiBudW1iZXIsIGRlbGF5OiBudW1iZXIpIHtcblx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRmcmFtZSAqPSBTZXF1ZW5jZVRpbWVsaW5lLkVOVFJJRVM7XG5cdFx0ZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdFx0ZnJhbWVzW2ZyYW1lICsgU2VxdWVuY2VUaW1lbGluZS5NT0RFXSA9IG1vZGUgfCAoaW5kZXggPDwgNCk7XG5cdFx0ZnJhbWVzW2ZyYW1lICsgU2VxdWVuY2VUaW1lbGluZS5ERUxBWV0gPSBkZWxheTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sXG5cdFx0YWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgc2xvdHMgPSBza2VsZXRvbi5zbG90cztcblx0XHRpZiAoIXRoaXMuYXR0YWNobWVudC5pc1RpbWVsaW5lQWN0aXZlKHNsb3RzLCB0aGlzLnNsb3RJbmRleCwgYXBwbGllZFBvc2UpKSByZXR1cm47XG5cdFx0Y29uc3QgdGltZWxpbmVTbG90cyA9IHRoaXMuYXR0YWNobWVudC50aW1lbGluZVNsb3RzO1xuXG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0aWYgKG91dCB8fCB0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRpZiAoZnJvbSAhPT0gTWl4RnJvbS5jdXJyZW50KSB7XG5cdFx0XHRcdHRoaXMuc2V0dXBQb3NlKHNsb3RzW3RoaXMuc2xvdEluZGV4XSwgYXBwbGllZFBvc2UpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNsb3RJbmRleCBvZiB0aW1lbGluZVNsb3RzKVxuXHRcdFx0XHRcdHRoaXMuc2V0dXBQb3NlKHNsb3RzW3Nsb3RJbmRleF0sIGFwcGxpZWRQb3NlKVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGkgPSBUaW1lbGluZS5zZWFyY2goZnJhbWVzLCB0aW1lLCBTZXF1ZW5jZVRpbWVsaW5lLkVOVFJJRVMpO1xuXHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRjb25zdCBtb2RlQW5kSW5kZXggPSBmcmFtZXNbaSArIFNlcXVlbmNlVGltZWxpbmUuTU9ERV07XG5cdFx0Y29uc3QgZGVsYXkgPSBmcmFtZXNbaSArIFNlcXVlbmNlVGltZWxpbmUuREVMQVldO1xuXG5cdFx0dGhpcy5hcHBseVRvU2xvdChzbG90c1t0aGlzLnNsb3RJbmRleF0sIGFwcGxpZWRQb3NlLCB0aW1lLCBiZWZvcmUsIG1vZGVBbmRJbmRleCwgZGVsYXkpO1xuXHRcdGZvciAoY29uc3Qgc2xvdEluZGV4IG9mIHRpbWVsaW5lU2xvdHMpXG5cdFx0XHR0aGlzLmFwcGx5VG9TbG90KHNsb3RzW3Nsb3RJbmRleF0sIGFwcGxpZWRQb3NlLCB0aW1lLCBiZWZvcmUsIG1vZGVBbmRJbmRleCwgZGVsYXkpO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXR1cFBvc2UgKHNsb3Q6IFNsb3QsIGFwcGxpZWRQb3NlOiBib29sZWFuKSB7XG5cdFx0aWYgKCFzbG90LmJvbmUuYWN0aXZlKSByZXR1cm47XG5cdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gc2xvdC5hcHBsaWVkUG9zZSA6IHNsb3QucG9zZTtcblx0XHRpZiAocG9zZS5hdHRhY2htZW50ID09PSBudWxsIHx8IHBvc2UuYXR0YWNobWVudC50aW1lbGluZUF0dGFjaG1lbnQgIT09IHRoaXMuYXR0YWNobWVudCkgcmV0dXJuO1xuXHRcdHBvc2Uuc2VxdWVuY2VJbmRleCA9IC0xO1xuXHR9XG5cblx0cHJpdmF0ZSBhcHBseVRvU2xvdCAoc2xvdDogU2xvdCwgYXBwbGllZFBvc2U6IGJvb2xlYW4sIHRpbWU6IG51bWJlciwgYmVmb3JlOiBudW1iZXIsIG1vZGVBbmRJbmRleDogbnVtYmVyLCBkZWxheTogbnVtYmVyKSB7XG5cdFx0aWYgKCFzbG90LmJvbmUuYWN0aXZlKSByZXR1cm47XG5cdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gc2xvdC5hcHBsaWVkUG9zZSA6IHNsb3QucG9zZTtcblx0XHRpZiAocG9zZS5hdHRhY2htZW50ID09PSBudWxsIHx8IHBvc2UuYXR0YWNobWVudC50aW1lbGluZUF0dGFjaG1lbnQgIT09IHRoaXMuYXR0YWNobWVudCkgcmV0dXJuO1xuXG5cdFx0bGV0IGluZGV4ID0gbW9kZUFuZEluZGV4ID4+IDQsIGNvdW50ID0gKHBvc2UuYXR0YWNobWVudCBhcyB1bmtub3duIGFzIEhhc1NlcXVlbmNlKS5zZXF1ZW5jZS5yZWdpb25zLmxlbmd0aDtcblx0XHRjb25zdCBtb2RlID0gU2VxdWVuY2VNb2RlVmFsdWVzW21vZGVBbmRJbmRleCAmIDB4Zl07XG5cdFx0aWYgKG1vZGUgIT09IFNlcXVlbmNlTW9kZS5ob2xkKSB7XG5cdFx0XHRpbmRleCArPSAoKCh0aW1lIC0gYmVmb3JlKSAvIGRlbGF5ICsgMC4wMDAwMSkgfCAwKTtcblx0XHRcdHN3aXRjaCAobW9kZSkge1xuXHRcdFx0XHRjYXNlIFNlcXVlbmNlTW9kZS5vbmNlOiBpbmRleCA9IE1hdGgubWluKGNvdW50IC0gMSwgaW5kZXgpOyBicmVhaztcblx0XHRcdFx0Y2FzZSBTZXF1ZW5jZU1vZGUubG9vcDogaW5kZXggJT0gY291bnQ7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIFNlcXVlbmNlTW9kZS5waW5ncG9uZzoge1xuXHRcdFx0XHRcdGNvbnN0IG4gPSAoY291bnQgPDwgMSkgLSAyO1xuXHRcdFx0XHRcdGluZGV4ID0gbiA9PT0gMCA/IDAgOiBpbmRleCAlIG47XG5cdFx0XHRcdFx0aWYgKGluZGV4ID49IGNvdW50KSBpbmRleCA9IG4gLSBpbmRleDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXNlIFNlcXVlbmNlTW9kZS5vbmNlUmV2ZXJzZTogaW5kZXggPSBNYXRoLm1heChjb3VudCAtIDEgLSBpbmRleCwgMCk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIFNlcXVlbmNlTW9kZS5sb29wUmV2ZXJzZTogaW5kZXggPSBjb3VudCAtIDEgLSAoaW5kZXggJSBjb3VudCk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIFNlcXVlbmNlTW9kZS5waW5ncG9uZ1JldmVyc2U6IHtcblx0XHRcdFx0XHRjb25zdCBuID0gKGNvdW50IDw8IDEpIC0gMjtcblx0XHRcdFx0XHRpbmRleCA9IG4gPT09IDAgPyAwIDogKGluZGV4ICsgY291bnQgLSAxKSAlIG47XG5cdFx0XHRcdFx0aWYgKGluZGV4ID49IGNvdW50KSBpbmRleCA9IG4gLSBpbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRwb3NlLnNlcXVlbmNlSW5kZXggPSBpbmRleDtcblx0fVxufVxuXG4vKiogRmlyZXMgYW4ge0BsaW5rIEV2ZW50fSB3aGVuIHNwZWNpZmljIGFuaW1hdGlvbiB0aW1lcyBhcmUgcmVhY2hlZC4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudFRpbWVsaW5lIGV4dGVuZHMgVGltZWxpbmUge1xuXHRzdGF0aWMgcHJvcGVydHlJZHMgPSBbYCR7UHJvcGVydHkuZXZlbnR9YF07XG5cblx0LyoqIFRoZSBldmVudCBmb3IgZWFjaCBrZXkgZnJhbWUuICovXG5cdGV2ZW50czogQXJyYXk8RXZlbnQ+O1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCAuLi5FdmVudFRpbWVsaW5lLnByb3BlcnR5SWRzKTtcblx0XHR0aGlzLmV2ZW50cyA9IG5ldyBBcnJheTxFdmVudD4oZnJhbWVDb3VudCk7XG5cdFx0dGhpcy5pbnN0YW50ID0gdHJ1ZTtcblx0fVxuXG5cdGdldEZyYW1lQ291bnQgKCkge1xuXHRcdHJldHVybiB0aGlzLmZyYW1lcy5sZW5ndGg7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgdGltZSBpbiBzZWNvbmRzIGFuZCB0aGUgZXZlbnQgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyYW1lLiAqL1xuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgZXZlbnQ6IEV2ZW50KSB7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWVdID0gZXZlbnQudGltZTtcblx0XHR0aGlzLmV2ZW50c1tmcmFtZV0gPSBldmVudDtcblx0fVxuXG5cdC8qKiBGaXJlcyBldmVudHMgZm9yIGZyYW1lcyA+IGBsYXN0VGltZWAgYW5kIDw9IGB0aW1lYC4gKi9cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiB8IG51bGwsIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlcixcblx0XHRmcm9tOiBNaXhGcm9tLCBhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGlmICghZmlyZWRFdmVudHMpIHJldHVybjtcblxuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGNvbnN0IGZyYW1lQ291bnQgPSB0aGlzLmZyYW1lcy5sZW5ndGg7XG5cblx0XHRpZiAobGFzdFRpbWUgPiB0aW1lKSB7IC8vIEFwcGx5IGFmdGVyIGxhc3RUaW1lIGZvciBsb29wZWQgYW5pbWF0aW9ucy5cblx0XHRcdC8vIFJlZmVyZW5jZSBydW50aW1lIHBhc3NlcyBudWxsIGZvciBNaXhGcm9tIGhlcmUuIFRoaXMgdGltZWxpbmUgZG9lc24ndCB1c2UgaXQsIGJ1dCBUUyBrZWVwcyB0aGUgdHlwZSBub24tbnVsbC5cblx0XHRcdHRoaXMuYXBwbHkobnVsbCwgbGFzdFRpbWUsIE51bWJlci5NQVhfVkFMVUUsIGZpcmVkRXZlbnRzLCAwLCBmcm9tLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblx0XHRcdGxhc3RUaW1lID0gLTE7XG5cdFx0fSBlbHNlIGlmIChsYXN0VGltZSA+PSBmcmFtZXNbZnJhbWVDb3VudCAtIDFdKSAvLyBMYXN0IHRpbWUgaXMgYWZ0ZXIgbGFzdCBmcmFtZS5cblx0XHRcdHJldHVybjtcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkgcmV0dXJuO1xuXG5cdFx0bGV0IGkgPSAwO1xuXHRcdGlmIChsYXN0VGltZSA8IGZyYW1lc1swXSlcblx0XHRcdGkgPSAwO1xuXHRcdGVsc2Uge1xuXHRcdFx0aSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIGxhc3RUaW1lKSArIDE7XG5cdFx0XHRjb25zdCBmcmFtZVRpbWUgPSBmcmFtZXNbaV07XG5cdFx0XHR3aGlsZSAoaSA+IDApIHsgLy8gRmlyZSBtdWx0aXBsZSBldmVudHMgd2l0aCB0aGUgc2FtZSBmcmFtZS5cblx0XHRcdFx0aWYgKGZyYW1lc1tpIC0gMV0gIT09IGZyYW1lVGltZSkgYnJlYWs7XG5cdFx0XHRcdGktLTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yICg7IGkgPCBmcmFtZUNvdW50ICYmIHRpbWUgPj0gZnJhbWVzW2ldOyBpKyspXG5cdFx0XHRmaXJlZEV2ZW50cy5wdXNoKHRoaXMuZXZlbnRzW2ldKTtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB0aGUge0BsaW5rIFNrZWxldG9uLmdldERyYXdPcmRlcn0uICovXG5leHBvcnQgY2xhc3MgRHJhd09yZGVyVGltZWxpbmUgZXh0ZW5kcyBUaW1lbGluZSB7XG5cdHN0YXRpYyByZWFkb25seSBwcm9wZXJ0eUlEID0gYCR7UHJvcGVydHkuZHJhd09yZGVyfWA7XG5cdHN0YXRpYyBwcm9wZXJ0eUlkcyA9IFtEcmF3T3JkZXJUaW1lbGluZS5wcm9wZXJ0eUlEXTtcblxuXHQvKiogVGhlIGRyYXcgb3JkZXIgZm9yIGVhY2gga2V5IGZyYW1lLiBTZWUge0BsaW5rIHNldEZyYW1lfS4gKi9cblx0cHJpdmF0ZSByZWFkb25seSBkcmF3T3JkZXJzOiBBcnJheTxBcnJheTxudW1iZXI+IHwgbnVsbD47XG5cblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIC4uLkRyYXdPcmRlclRpbWVsaW5lLnByb3BlcnR5SWRzKTtcblx0XHR0aGlzLmRyYXdPcmRlcnMgPSBuZXcgQXJyYXk8QXJyYXk8bnVtYmVyPiB8IG51bGw+KGZyYW1lQ291bnQpO1xuXHRcdHRoaXMuaW5zdGFudCA9IHRydWU7XG5cdH1cblxuXHRnZXRGcmFtZUNvdW50ICgpIHtcblx0XHRyZXR1cm4gdGhpcy5mcmFtZXMubGVuZ3RoO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUgaW4gc2Vjb25kcyBhbmQgdGhlIGRyYXcgb3JkZXIgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyYW1lLlxuXHQgKiBAcGFyYW0gZHJhd09yZGVyIE9yZGVyZWQge0BsaW5rIFNrZWxldG9uLnNsb3RzfSBpbmRpY2VzLCBvciBudWxsIHRvIHVzZSBzZXR1cCBwb3NlXG5cdCAqICAgICAgICAgICBkcmF3IG9yZGVyLiAqL1xuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBkcmF3T3JkZXI6IEFycmF5PG51bWJlcj4gfCBudWxsKSB7XG5cdFx0dGhpcy5mcmFtZXNbZnJhbWVdID0gdGltZTtcblx0XHR0aGlzLmRyYXdPcmRlcnNbZnJhbWVdID0gZHJhd09yZGVyO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBmaXJlZEV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLFxuXHRcdGZyb206IE1peEZyb20sIGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXHRcdGNvbnN0IHBvc2UgPSAoYXBwbGllZFBvc2UgPyBza2VsZXRvbi5kcmF3T3JkZXIuYXBwbGllZFBvc2UgOiBza2VsZXRvbi5kcmF3T3JkZXIucG9zZSk7XG5cdFx0Y29uc3Qgc2V0dXAgPSBza2VsZXRvbi5zbG90cztcblx0XHRpZiAob3V0IHx8IHRpbWUgPCB0aGlzLmZyYW1lc1swXSkge1xuXHRcdFx0aWYgKGZyb20gIT09IE1peEZyb20uY3VycmVudCkgVXRpbHMuYXJyYXlDb3B5KHNldHVwLCAwLCBwb3NlLCAwLCBza2VsZXRvbi5zbG90cy5sZW5ndGgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9yZGVyID0gdGhpcy5kcmF3T3JkZXJzW1RpbWVsaW5lLnNlYXJjaCh0aGlzLmZyYW1lcywgdGltZSldO1xuXHRcdGlmICghb3JkZXIpXG5cdFx0XHRVdGlscy5hcnJheUNvcHkoc2V0dXAsIDAsIHBvc2UsIDAsIHNrZWxldG9uLnNsb3RzLmxlbmd0aCk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMCwgbiA9IG9yZGVyLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdFx0cG9zZVtpXSA9IHNldHVwW29yZGVyW2ldXTtcblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMgYSBzdWJzZXQgb2YgdGhlIHtAbGluayBTa2VsZXRvbi5nZXREcmF3T3JkZXIgfCBkcmF3IG9yZGVyfS4gKi9cbmV4cG9ydCBjbGFzcyBEcmF3T3JkZXJGb2xkZXJUaW1lbGluZSBleHRlbmRzIFRpbWVsaW5lIHtcblx0c3RhdGljIHJlYWRvbmx5IHByb3BlcnR5SUQgPSBgJHtQcm9wZXJ0eS5kcmF3T3JkZXJGb2xkZXJ9YDtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHNsb3RzOiBudW1iZXJbXTtcblx0cHJpdmF0ZSByZWFkb25seSBpbkZvbGRlcjogYm9vbGVhbltdO1xuXHRwcml2YXRlIHJlYWRvbmx5IGRyYXdPcmRlcnM6IEFycmF5PEFycmF5PG51bWJlcj4gfCBudWxsPjtcblxuXHQvKiogQHBhcmFtIHNsb3RzIHtAbGluayBTa2VsZXRvbi5zbG90c30gaW5kaWNlcyBjb250cm9sbGVkIGJ5IHRoaXMgdGltZWxpbmUsIGluIHNldHVwIG9yZGVyLlxuXHQgKiBAcGFyYW0gc2xvdENvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzbG90cyBpbiB0aGUgc2tlbGV0b24uICovXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIHNsb3RzOiBudW1iZXJbXSwgc2xvdENvdW50OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCAuLi5EcmF3T3JkZXJGb2xkZXJUaW1lbGluZS5wcm9wZXJ0eUlkcyhzbG90cykpO1xuXHRcdHRoaXMuc2xvdHMgPSBzbG90cztcblx0XHR0aGlzLmRyYXdPcmRlcnMgPSBuZXcgQXJyYXkoZnJhbWVDb3VudCk7XG5cdFx0dGhpcy5pbkZvbGRlciA9IG5ldyBBcnJheShzbG90Q291bnQpO1xuXHRcdGZvciAoY29uc3QgaSBvZiBzbG90cylcblx0XHRcdHRoaXMuaW5Gb2xkZXJbaV0gPSB0cnVlO1xuXHRcdHRoaXMuaW5zdGFudCA9IHRydWU7XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBwcm9wZXJ0eUlkcyAoc2xvdHM6IG51bWJlcltdKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IG4gPSBzbG90cy5sZW5ndGg7XG5cdFx0Y29uc3QgaWRzID0gbmV3IEFycmF5KG4pO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKVxuXHRcdFx0aWRzW2ldID0gYCR7RHJhd09yZGVyRm9sZGVyVGltZWxpbmUucHJvcGVydHlJRH18JHtzbG90c1tpXX1gO1xuXHRcdHJldHVybiBpZHM7XG5cdH1cblxuXHRnZXRGcmFtZUNvdW50ICgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmZyYW1lcy5sZW5ndGg7XG5cdH1cblxuXHQvKiogVGhlIHtAbGluayBTa2VsZXRvbi5nZXRTbG90c30gaW5kaWNlcyB0aGF0IHRoaXMgdGltZWxpbmUgYWZmZWN0cywgaW4gc2V0dXAgb3JkZXIuICovXG5cdGdldFNsb3RzICgpOiBudW1iZXJbXSB7XG5cdFx0cmV0dXJuIHRoaXMuc2xvdHM7XG5cdH1cblxuXHQvKiogVGhlIGRyYXcgb3JkZXIgZm9yIGVhY2ggZnJhbWUuIFNlZSB7QGxpbmsgc2V0RnJhbWV9LiAqL1xuXHRnZXREcmF3T3JkZXJzICgpOiBBcnJheTxBcnJheTxudW1iZXI+IHwgbnVsbD4ge1xuXHRcdHJldHVybiB0aGlzLmRyYXdPcmRlcnM7XG5cdH1cblxuXHQvKiogU2V0cyB0aGUgdGltZSBhbmQgZHJhdyBvcmRlciBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSBmcmFtZSB0aW1lIGluIHNlY29uZHMuXG5cdCAqIEBwYXJhbSBkcmF3T3JkZXIgT3JkZXJlZCB7QGxpbmsgZ2V0U2xvdHN9IGluZGljZXMsIG9yIG51bGwgdG8gdXNlIHNldHVwIHBvc2Ugb3JkZXIuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGRyYXdPcmRlcjogQXJyYXk8bnVtYmVyPiB8IG51bGwpOiB2b2lkIHtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZHJhd09yZGVyc1tmcmFtZV0gPSBkcmF3T3JkZXI7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IHBvc2UgPSAoYXBwbGllZFBvc2UgPyBza2VsZXRvbi5kcmF3T3JkZXIuYXBwbGllZFBvc2UgOiBza2VsZXRvbi5kcmF3T3JkZXIucG9zZSk7XG5cdFx0Y29uc3Qgc2V0dXAgPSBza2VsZXRvbi5zbG90cztcblx0XHRpZiAob3V0IHx8IHRpbWUgPCB0aGlzLmZyYW1lc1swXSkge1xuXHRcdFx0aWYgKGZyb20gIT09IE1peEZyb20uY3VycmVudCkgdGhpcy5zZXR1cChwb3NlLCBzZXR1cCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9yZGVyID0gdGhpcy5kcmF3T3JkZXJzW1RpbWVsaW5lLnNlYXJjaCh0aGlzLmZyYW1lcywgdGltZSldO1xuXHRcdFx0aWYgKCFvcmRlcilcblx0XHRcdFx0dGhpcy5zZXR1cChwb3NlLCBzZXR1cCk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y29uc3QgaW5Gb2xkZXIgPSB0aGlzLmluRm9sZGVyO1xuXHRcdFx0XHRjb25zdCBzbG90cyA9IHRoaXMuc2xvdHM7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwLCBmb3VuZCA9IDAsIGRvbmUgPSBzbG90cy5sZW5ndGg7IDsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKGluRm9sZGVyW3Bvc2VbaV0uZGF0YS5pbmRleF0pIHtcblx0XHRcdFx0XHRcdHBvc2VbaV0gPSBzZXR1cFtzbG90c1tvcmRlcltmb3VuZF1dXTtcblx0XHRcdFx0XHRcdGlmICgrK2ZvdW5kID09PSBkb25lKSBicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHNldHVwIChwb3NlOiBTbG90W10sIHNldHVwOiBTbG90W10pOiB2b2lkIHtcblx0XHRjb25zdCB7IGluRm9sZGVyLCBzbG90cyB9ID0gdGhpcztcblx0XHRmb3IgKGxldCBpID0gMCwgZm91bmQgPSAwLCBkb25lID0gc2xvdHMubGVuZ3RoOyA7IGkrKykge1xuXHRcdFx0aWYgKGluRm9sZGVyW3Bvc2VbaV0uZGF0YS5pbmRleF0pIHtcblx0XHRcdFx0cG9zZVtpXSA9IHNldHVwW3Nsb3RzW2ZvdW5kXV07XG5cdFx0XHRcdGlmICgrK2ZvdW5kID09PSBkb25lKSBicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25zdHJhaW50VGltZWxpbmUge1xuXHQvKiogVGhlIGluZGV4IG9mIHRoZSBjb25zdHJhaW50IGluIHtAbGluayBTa2VsZXRvbi5jb25zdHJhaW50c30gdGhhdCB3aWxsIGJlIGNoYW5nZWQgd2hlbiB0aGlzIHRpbWVsaW5lIGlzIGFwcGxpZWQsIG9yIC0xIGlmXG5cdCAqIGEgc3BlY2lmaWMgY29uc3RyYWludCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAqL1xuXHRyZWFkb25seSBjb25zdHJhaW50SW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uc3RyYWludFRpbWVsaW5lIChvYmo6IFRpbWVsaW5lICYgUGFydGlhbDxDb25zdHJhaW50VGltZWxpbmU+KTogb2JqIGlzIFRpbWVsaW5lICYgQ29uc3RyYWludFRpbWVsaW5lIHtcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqLmNvbnN0cmFpbnRJbmRleCA9PT0gJ251bWJlcic7XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBJa0NvbnN0cmFpbnRQb3NlLm1peCl9LCB7QGxpbmsgSWtDb25zdHJhaW50UG9zZS5zb2Z0bmVzc30sXG4gKiB7QGxpbmsgSWtDb25zdHJhaW50UG9zZS5iZW5kRGlyZWN0aW9ufSwge0BsaW5rIElrQ29uc3RyYWludFBvc2Uuc3RyZXRjaH0sIGFuZFxuICoge0BsaW5rIElrQ29uc3RyYWludFBvc2UuY29tcHJlc3N9LiAqL1xuZXhwb3J0IGNsYXNzIElrQ29uc3RyYWludFRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIENvbnN0cmFpbnRUaW1lbGluZSB7XG5cdHJlYWRvbmx5IGNvbnN0cmFpbnRJbmRleDogbnVtYmVyID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBgJHtQcm9wZXJ0eS5pa0NvbnN0cmFpbnR9fCR7Y29uc3RyYWludEluZGV4fWApO1xuXHRcdHRoaXMuY29uc3RyYWludEluZGV4ID0gY29uc3RyYWludEluZGV4O1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gNi8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUsIG1peCwgc29mdG5lc3MsIGJlbmQgZGlyZWN0aW9uLCBjb21wcmVzcywgYW5kIHN0cmV0Y2ggZm9yIHRoZSBzcGVjaWZpZWQgZnJhbWUuXG5cdCAqIEBwYXJhbSBmcmFtZSBCZXR3ZWVuIDAgYW5kIGBmcmFtZUNvdW50YCwgaW5jbHVzaXZlLlxuXHQgKiBAcGFyYW0gdGltZSBUaGUgZnJhbWUgdGltZSBpbiBzZWNvbmRzLlxuXHQgKiBAcGFyYW0gYmVuZERpcmVjdGlvbiAxIG9yIC0xLiAqL1xuXHRzZXRGcmFtZSAoZnJhbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBtaXg6IG51bWJlciwgc29mdG5lc3M6IG51bWJlciwgYmVuZERpcmVjdGlvbjogbnVtYmVyLCBjb21wcmVzczogYm9vbGVhbiwgc3RyZXRjaDogYm9vbGVhbikge1xuXHRcdGZyYW1lICo9IDYvKkVOVFJJRVMqLztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMS8qTUlYKi9dID0gbWl4O1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lICsgMi8qU09GVE5FU1MqL10gPSBzb2Z0bmVzcztcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDMvKkJFTkRfRElSRUNUSU9OKi9dID0gYmVuZERpcmVjdGlvbjtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDQvKkNPTVBSRVNTKi9dID0gY29tcHJlc3MgPyAxIDogMDtcblx0XHR0aGlzLmZyYW1lc1tmcmFtZSArIDUvKlNUUkVUQ0gqL10gPSBzdHJldGNoID8gMSA6IDA7XG5cdH1cblxuXHRhcHBseSAoc2tlbGV0b246IFNrZWxldG9uLCBsYXN0VGltZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIGZpcmVkRXZlbnRzOiBBcnJheTxFdmVudD4sIGFscGhhOiBudW1iZXIsIGZyb206IE1peEZyb20sXG5cdFx0YWRkOiBib29sZWFuLCBvdXQ6IGJvb2xlYW4sIGFwcGxpZWRQb3NlOiBib29sZWFuKSB7XG5cblx0XHRjb25zdCBjb25zdHJhaW50ID0gc2tlbGV0b24uY29uc3RyYWludHNbdGhpcy5jb25zdHJhaW50SW5kZXhdIGFzIElrQ29uc3RyYWludDtcblx0XHRpZiAoIWNvbnN0cmFpbnQuYWN0aXZlKSByZXR1cm47XG5cdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gY29uc3RyYWludC5hcHBsaWVkUG9zZSA6IGNvbnN0cmFpbnQucG9zZTtcblxuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRjb25zdCBzZXR1cCA9IGNvbnN0cmFpbnQuZGF0YS5zZXR1cFBvc2U7XG5cdFx0XHRzd2l0Y2ggKGZyb20pIHtcblx0XHRcdFx0Y2FzZSBNaXhGcm9tLnNldHVwOiB7XG5cdFx0XHRcdFx0cG9zZS5taXggPSBzZXR1cC5taXg7XG5cdFx0XHRcdFx0cG9zZS5zb2Z0bmVzcyA9IHNldHVwLnNvZnRuZXNzO1xuXHRcdFx0XHRcdHBvc2UuYmVuZERpcmVjdGlvbiA9IHNldHVwLmJlbmREaXJlY3Rpb247XG5cdFx0XHRcdFx0cG9zZS5jb21wcmVzcyA9IHNldHVwLmNvbXByZXNzO1xuXHRcdFx0XHRcdHBvc2Uuc3RyZXRjaCA9IHNldHVwLnN0cmV0Y2g7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2FzZSBNaXhGcm9tLmZpcnN0OiB7XG5cdFx0XHRcdFx0cG9zZS5taXggKz0gKHNldHVwLm1peCAtIHBvc2UubWl4KSAqIGFscGhhO1xuXHRcdFx0XHRcdHBvc2Uuc29mdG5lc3MgKz0gKHNldHVwLnNvZnRuZXNzIC0gcG9zZS5zb2Z0bmVzcykgKiBhbHBoYTtcblx0XHRcdFx0XHRwb3NlLmJlbmREaXJlY3Rpb24gPSBzZXR1cC5iZW5kRGlyZWN0aW9uO1xuXHRcdFx0XHRcdHBvc2UuY29tcHJlc3MgPSBzZXR1cC5jb21wcmVzcztcblx0XHRcdFx0XHRwb3NlLnN0cmV0Y2ggPSBzZXR1cC5zdHJldGNoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IG1peCA9IDAsIHNvZnRuZXNzID0gMDtcblx0XHRjb25zdCBpID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSwgNi8qRU5UUklFUyovKVxuXHRcdGNvbnN0IGN1cnZlVHlwZSA9IHRoaXMuY3VydmVzW2kgLyA2LypFTlRSSUVTKi9dO1xuXHRcdHN3aXRjaCAoY3VydmVUeXBlKSB7XG5cdFx0XHRjYXNlIDAvKkxJTkVBUiovOiB7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGZyYW1lc1tpXTtcblx0XHRcdFx0bWl4ID0gZnJhbWVzW2kgKyAxLypNSVgqL107XG5cdFx0XHRcdHNvZnRuZXNzID0gZnJhbWVzW2kgKyAyLypTT0ZUTkVTUyovXTtcblx0XHRcdFx0Y29uc3QgdCA9ICh0aW1lIC0gYmVmb3JlKSAvIChmcmFtZXNbaSArIDYvKkVOVFJJRVMqL10gLSBiZWZvcmUpO1xuXHRcdFx0XHRtaXggKz0gKGZyYW1lc1tpICsgNi8qRU5UUklFUyovICsgMS8qTUlYKi9dIC0gbWl4KSAqIHQ7XG5cdFx0XHRcdHNvZnRuZXNzICs9IChmcmFtZXNbaSArIDYvKkVOVFJJRVMqLyArIDIvKlNPRlRORVNTKi9dIC0gc29mdG5lc3MpICogdDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIDEvKlNURVBQRUQqLzpcblx0XHRcdFx0bWl4ID0gZnJhbWVzW2kgKyAxLypNSVgqL107XG5cdFx0XHRcdHNvZnRuZXNzID0gZnJhbWVzW2kgKyAyLypTT0ZUTkVTUyovXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRtaXggPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDEvKk1JWCovLCBjdXJ2ZVR5cGUgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdHNvZnRuZXNzID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCAyLypTT0ZUTkVTUyovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAtIDIvKkJFWklFUiovKTtcblx0XHR9XG5cblx0XHRjb25zdCBiYXNlID0gZnJvbSA9PT0gTWl4RnJvbS5zZXR1cCA/IGNvbnN0cmFpbnQuZGF0YS5zZXR1cFBvc2UgOiBwb3NlO1xuXHRcdHBvc2UubWl4ID0gYmFzZS5taXggKyAobWl4IC0gYmFzZS5taXgpICogYWxwaGE7XG5cdFx0cG9zZS5zb2Z0bmVzcyA9IGJhc2Uuc29mdG5lc3MgKyAoc29mdG5lc3MgLSBiYXNlLnNvZnRuZXNzKSAqIGFscGhhO1xuXHRcdGlmIChvdXQpIHtcblx0XHRcdGlmIChmcm9tID09PSBNaXhGcm9tLnNldHVwKSB7XG5cdFx0XHRcdHBvc2UuYmVuZERpcmVjdGlvbiA9IGJhc2UuYmVuZERpcmVjdGlvbjtcblx0XHRcdFx0cG9zZS5jb21wcmVzcyA9IGJhc2UuY29tcHJlc3M7XG5cdFx0XHRcdHBvc2Uuc3RyZXRjaCA9IGJhc2Uuc3RyZXRjaDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zZS5iZW5kRGlyZWN0aW9uID0gZnJhbWVzW2kgKyAzLypCRU5EX0RJUkVDVElPTiovXTtcblx0XHRcdHBvc2UuY29tcHJlc3MgPSBmcmFtZXNbaSArIDQvKkNPTVBSRVNTKi9dICE9PSAwO1xuXHRcdFx0cG9zZS5zdHJldGNoID0gZnJhbWVzW2kgKyA1LypTVFJFVENIKi9dICE9PSAwO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgVHJhbnNmb3JtQ29uc3RyYWludFBvc2UubWl4Um90YXRlfSwge0BsaW5rIFRyYW5zZm9ybUNvbnN0cmFpbnRQb3NlLm1peFh9LFxuICoge0BsaW5rIFRyYW5zZm9ybUNvbnN0cmFpbnRQb3NlLm1peFl9LCB7QGxpbmsgVHJhbnNmb3JtQ29uc3RyYWludFBvc2UubWl4U2NhbGVYfSxcbiAqIHtAbGluayBUcmFuc2Zvcm1Db25zdHJhaW50UG9zZS5taXhTY2FsZVl9LCBhbmQge0BsaW5rIFRyYW5zZm9ybUNvbnN0cmFpbnRQb3NlLm1peFNoZWFyWX0uICovXG5leHBvcnQgY2xhc3MgVHJhbnNmb3JtQ29uc3RyYWludFRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIENvbnN0cmFpbnRUaW1lbGluZSB7XG5cdC8qKiBUaGUgaW5kZXggb2YgdGhlIHRyYW5zZm9ybSBjb25zdHJhaW50IHNsb3QgaW4ge0BsaW5rIFNrZWxldG9uLnRyYW5zZm9ybUNvbnN0cmFpbnRzfSB0aGF0IHdpbGwgYmUgY2hhbmdlZC4gKi9cblx0Y29uc3RyYWludEluZGV4OiBudW1iZXIgPSAwO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGAke1Byb3BlcnR5LnRyYW5zZm9ybUNvbnN0cmFpbnR9fCR7Y29uc3RyYWludEluZGV4fWApO1xuXHRcdHRoaXMuY29uc3RyYWludEluZGV4ID0gY29uc3RyYWludEluZGV4O1xuXHRcdHRoaXMuYWRkaXRpdmUgPSB0cnVlO1xuXHR9XG5cblx0Z2V0RnJhbWVFbnRyaWVzICgpIHtcblx0XHRyZXR1cm4gNy8qRU5UUklFUyovO1xuXHR9XG5cblx0LyoqIFNldHMgdGhlIHRpbWUsIHJvdGF0ZSBtaXgsIHRyYW5zbGF0ZSBtaXgsIHNjYWxlIG1peCwgYW5kIHNoZWFyIG1peCBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSBmcmFtZSB0aW1lIGluIHNlY29uZHMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIG1peFJvdGF0ZTogbnVtYmVyLCBtaXhYOiBudW1iZXIsIG1peFk6IG51bWJlciwgbWl4U2NhbGVYOiBudW1iZXIsIG1peFNjYWxlWTogbnVtYmVyLFxuXHRcdG1peFNoZWFyWTogbnVtYmVyKSB7XG5cdFx0Y29uc3QgZnJhbWVzID0gdGhpcy5mcmFtZXM7XG5cdFx0ZnJhbWUgKj0gNy8qRU5UUklFUyovO1xuXHRcdGZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdGZyYW1lc1tmcmFtZSArIDEvKlJPVEFURSovXSA9IG1peFJvdGF0ZTtcblx0XHRmcmFtZXNbZnJhbWUgKyAyLypYKi9dID0gbWl4WDtcblx0XHRmcmFtZXNbZnJhbWUgKyAzLypZKi9dID0gbWl4WTtcblx0XHRmcmFtZXNbZnJhbWUgKyA0LypTQ0FMRVgqL10gPSBtaXhTY2FsZVg7XG5cdFx0ZnJhbWVzW2ZyYW1lICsgNS8qU0NBTEVZKi9dID0gbWl4U2NhbGVZO1xuXHRcdGZyYW1lc1tmcmFtZSArIDYvKlNIRUFSWSovXSA9IG1peFNoZWFyWTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSxcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbi5jb25zdHJhaW50c1t0aGlzLmNvbnN0cmFpbnRJbmRleF0gYXMgVHJhbnNmb3JtQ29uc3RyYWludDtcblx0XHRpZiAoIWNvbnN0cmFpbnQuYWN0aXZlKSByZXR1cm47XG5cdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gY29uc3RyYWludC5hcHBsaWVkUG9zZSA6IGNvbnN0cmFpbnQucG9zZTtcblxuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGlmICh0aW1lIDwgZnJhbWVzWzBdKSB7XG5cdFx0XHRjb25zdCBzZXR1cCA9IGNvbnN0cmFpbnQuZGF0YS5zZXR1cFBvc2U7XG5cdFx0XHRzd2l0Y2ggKGZyb20pIHtcblx0XHRcdFx0Y2FzZSBNaXhGcm9tLnNldHVwOiB7XG5cdFx0XHRcdFx0cG9zZS5taXhSb3RhdGUgPSBzZXR1cC5taXhSb3RhdGU7XG5cdFx0XHRcdFx0cG9zZS5taXhYID0gc2V0dXAubWl4WDtcblx0XHRcdFx0XHRwb3NlLm1peFkgPSBzZXR1cC5taXhZO1xuXHRcdFx0XHRcdHBvc2UubWl4U2NhbGVYID0gc2V0dXAubWl4U2NhbGVYO1xuXHRcdFx0XHRcdHBvc2UubWl4U2NhbGVZID0gc2V0dXAubWl4U2NhbGVZO1xuXHRcdFx0XHRcdHBvc2UubWl4U2hlYXJZID0gc2V0dXAubWl4U2hlYXJZO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhc2UgTWl4RnJvbS5maXJzdDoge1xuXHRcdFx0XHRcdHBvc2UubWl4Um90YXRlICs9IChzZXR1cC5taXhSb3RhdGUgLSBwb3NlLm1peFJvdGF0ZSkgKiBhbHBoYTtcblx0XHRcdFx0XHRwb3NlLm1peFggKz0gKHNldHVwLm1peFggLSBwb3NlLm1peFgpICogYWxwaGE7XG5cdFx0XHRcdFx0cG9zZS5taXhZICs9IChzZXR1cC5taXhZIC0gcG9zZS5taXhZKSAqIGFscGhhO1xuXHRcdFx0XHRcdHBvc2UubWl4U2NhbGVYICs9IChzZXR1cC5taXhTY2FsZVggLSBwb3NlLm1peFNjYWxlWCkgKiBhbHBoYTtcblx0XHRcdFx0XHRwb3NlLm1peFNjYWxlWSArPSAoc2V0dXAubWl4U2NhbGVZIC0gcG9zZS5taXhTY2FsZVkpICogYWxwaGE7XG5cdFx0XHRcdFx0cG9zZS5taXhTaGVhclkgKz0gKHNldHVwLm1peFNoZWFyWSAtIHBvc2UubWl4U2hlYXJZKSAqIGFscGhhO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IHJvdGF0ZTogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgc2NhbGVYOiBudW1iZXIsIHNjYWxlWTogbnVtYmVyLCBzaGVhclk6IG51bWJlcjtcblx0XHRjb25zdCBpID0gVGltZWxpbmUuc2VhcmNoKGZyYW1lcywgdGltZSwgNy8qRU5UUklFUyovKTtcblx0XHRjb25zdCBjdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlc1tpIC8gNy8qRU5UUklFUyovXTtcblx0XHRzd2l0Y2ggKGN1cnZlVHlwZSkge1xuXHRcdFx0Y2FzZSAwLypMSU5FQVIqLzoge1xuXHRcdFx0XHRjb25zdCBiZWZvcmUgPSBmcmFtZXNbaV07XG5cdFx0XHRcdHJvdGF0ZSA9IGZyYW1lc1tpICsgMS8qUk9UQVRFKi9dO1xuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAyLypYKi9dO1xuXHRcdFx0XHR5ID0gZnJhbWVzW2kgKyAzLypZKi9dO1xuXHRcdFx0XHRzY2FsZVggPSBmcmFtZXNbaSArIDQvKlNDQUxFWCovXTtcblx0XHRcdFx0c2NhbGVZID0gZnJhbWVzW2kgKyA1LypTQ0FMRVkqL107XG5cdFx0XHRcdHNoZWFyWSA9IGZyYW1lc1tpICsgNi8qU0hFQVJZKi9dO1xuXHRcdFx0XHRjb25zdCB0ID0gKHRpbWUgLSBiZWZvcmUpIC8gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovXSAtIGJlZm9yZSk7XG5cdFx0XHRcdHJvdGF0ZSArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyAxLypST1RBVEUqL10gLSByb3RhdGUpICogdDtcblx0XHRcdFx0eCArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyAyLypYKi9dIC0geCkgKiB0O1xuXHRcdFx0XHR5ICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDMvKlkqL10gLSB5KSAqIHQ7XG5cdFx0XHRcdHNjYWxlWCArPSAoZnJhbWVzW2kgKyA3LypFTlRSSUVTKi8gKyA0LypTQ0FMRVgqL10gLSBzY2FsZVgpICogdDtcblx0XHRcdFx0c2NhbGVZICs9IChmcmFtZXNbaSArIDcvKkVOVFJJRVMqLyArIDUvKlNDQUxFWSovXSAtIHNjYWxlWSkgKiB0O1xuXHRcdFx0XHRzaGVhclkgKz0gKGZyYW1lc1tpICsgNy8qRU5UUklFUyovICsgNi8qU0hFQVJZKi9dIC0gc2hlYXJZKSAqIHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHJvdGF0ZSA9IGZyYW1lc1tpICsgMS8qUk9UQVRFKi9dO1xuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAyLypYKi9dO1xuXHRcdFx0XHR5ID0gZnJhbWVzW2kgKyAzLypZKi9dO1xuXHRcdFx0XHRzY2FsZVggPSBmcmFtZXNbaSArIDQvKlNDQUxFWCovXTtcblx0XHRcdFx0c2NhbGVZID0gZnJhbWVzW2kgKyA1LypTQ0FMRVkqL107XG5cdFx0XHRcdHNoZWFyWSA9IGZyYW1lc1tpICsgNi8qU0hFQVJZKi9dO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJvdGF0ZSA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qUk9UQVRFKi8sIGN1cnZlVHlwZSAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0eCA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMi8qWCovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0eSA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMy8qWSovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDIgLSAyLypCRVpJRVIqLyk7XG5cdFx0XHRcdHNjYWxlWCA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgNC8qU0NBTEVYKi8sIGN1cnZlVHlwZSArIDE4LypCRVpJRVJfU0laRSovICogMyAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0c2NhbGVZID0gdGhpcy5nZXRCZXppZXJWYWx1ZSh0aW1lLCBpLCA1LypTQ0FMRVkqLywgY3VydmVUeXBlICsgMTgvKkJFWklFUl9TSVpFKi8gKiA0IC0gMi8qQkVaSUVSKi8pO1xuXHRcdFx0XHRzaGVhclkgPSB0aGlzLmdldEJlemllclZhbHVlKHRpbWUsIGksIDYvKlNIRUFSWSovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDUgLSAyLypCRVpJRVIqLyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYmFzZSA9IGZyb20gPT09IE1peEZyb20uc2V0dXAgPyBjb25zdHJhaW50LmRhdGEuc2V0dXBQb3NlIDogcG9zZTtcblx0XHRpZiAoYWRkKSB7XG5cdFx0XHRwb3NlLm1peFJvdGF0ZSA9IGJhc2UubWl4Um90YXRlICsgcm90YXRlICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFggPSBiYXNlLm1peFggKyB4ICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFkgPSBiYXNlLm1peFkgKyB5ICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFNjYWxlWCA9IGJhc2UubWl4U2NhbGVYICsgc2NhbGVYICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFNjYWxlWSA9IGJhc2UubWl4U2NhbGVZICsgc2NhbGVZICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFNoZWFyWSA9IGJhc2UubWl4U2hlYXJZICsgc2hlYXJZICogYWxwaGE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBvc2UubWl4Um90YXRlID0gYmFzZS5taXhSb3RhdGUgKyAocm90YXRlIC0gYmFzZS5taXhSb3RhdGUpICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFggPSBiYXNlLm1peFggKyAoeCAtIGJhc2UubWl4WCkgKiBhbHBoYTtcblx0XHRcdHBvc2UubWl4WSA9IGJhc2UubWl4WSArICh5IC0gYmFzZS5taXhZKSAqIGFscGhhO1xuXHRcdFx0cG9zZS5taXhTY2FsZVggPSBiYXNlLm1peFNjYWxlWCArIChzY2FsZVggLSBiYXNlLm1peFNjYWxlWCkgKiBhbHBoYTtcblx0XHRcdHBvc2UubWl4U2NhbGVZID0gYmFzZS5taXhTY2FsZVkgKyAoc2NhbGVZIC0gYmFzZS5taXhTY2FsZVkpICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFNoZWFyWSA9IGJhc2UubWl4U2hlYXJZICsgKHNoZWFyWSAtIGJhc2UubWl4U2hlYXJZKSAqIGFscGhhO1xuXHRcdH1cblx0fVxufVxuXG4vKiogVGhlIGJhc2UgY2xhc3MgZm9yIHRpbWVsaW5lcyB0aGF0IGNoYW5nZSAxIGNvbnN0cmFpbnQgcHJvcGVydHkgd2l0aCBhIGN1cnZlLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbnN0cmFpbnRUaW1lbGluZTEgZXh0ZW5kcyBDdXJ2ZVRpbWVsaW5lMSBpbXBsZW1lbnRzIENvbnN0cmFpbnRUaW1lbGluZSB7XG5cdHJlYWRvbmx5IGNvbnN0cmFpbnRJbmRleDogbnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyLCBwcm9wZXJ0eTogUHJvcGVydHkpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgYCR7cHJvcGVydHl9fCR7Y29uc3RyYWludEluZGV4fWApO1xuXHRcdHRoaXMuY29uc3RyYWludEluZGV4ID0gY29uc3RyYWludEluZGV4O1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBQYXRoQ29uc3RyYWludFBvc2UucG9zaXRpb259LiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhDb25zdHJhaW50UG9zaXRpb25UaW1lbGluZSBleHRlbmRzIENvbnN0cmFpbnRUaW1lbGluZTEge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBjb25zdHJhaW50SW5kZXgsIFByb3BlcnR5LnBhdGhDb25zdHJhaW50UG9zaXRpb24pO1xuXHRcdHRoaXMuYWRkaXRpdmUgPSB0cnVlO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBmaXJlZEV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXG5cdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uLmNvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XSBhcyBQYXRoQ29uc3RyYWludDtcblx0XHRpZiAoY29uc3RyYWludC5hY3RpdmUpIHtcblx0XHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IGNvbnN0cmFpbnQuYXBwbGllZFBvc2UgOiBjb25zdHJhaW50LnBvc2U7XG5cdFx0XHRwb3NlLnBvc2l0aW9uID0gdGhpcy5nZXRBYnNvbHV0ZVZhbHVlKHRpbWUsIGFscGhhLCBmcm9tLCBhZGQsIHBvc2UucG9zaXRpb24sIGNvbnN0cmFpbnQuZGF0YS5zZXR1cFBvc2UucG9zaXRpb24pO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgUGF0aENvbnN0cmFpbnRQb3NlLnNwYWNpbmd9LiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhDb25zdHJhaW50U3BhY2luZ1RpbWVsaW5lIGV4dGVuZHMgQ29uc3RyYWludFRpbWVsaW5lMSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGNvbnN0cmFpbnRJbmRleCwgUHJvcGVydHkucGF0aENvbnN0cmFpbnRTcGFjaW5nKTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSxcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbi5jb25zdHJhaW50c1t0aGlzLmNvbnN0cmFpbnRJbmRleF0gYXMgUGF0aENvbnN0cmFpbnQ7XG5cdFx0aWYgKGNvbnN0cmFpbnQuYWN0aXZlKSB7XG5cdFx0XHRjb25zdCBwb3NlID0gYXBwbGllZFBvc2UgPyBjb25zdHJhaW50LmFwcGxpZWRQb3NlIDogY29uc3RyYWludC5wb3NlO1xuXHRcdFx0cG9zZS5zcGFjaW5nID0gdGhpcy5nZXRBYnNvbHV0ZVZhbHVlKHRpbWUsIGFscGhhLCBmcm9tLCBmYWxzZSwgcG9zZS5zcGFjaW5nLFxuXHRcdFx0XHRjb25zdHJhaW50LmRhdGEuc2V0dXBQb3NlLnNwYWNpbmcpO1xuXHRcdH1cblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgUGF0aENvbnN0cmFpbnQubWl4Um90YXRlfSwge0BsaW5rIFBhdGhDb25zdHJhaW50Lm1peFh9LCBhbmRcbiAqIHtAbGluayBQYXRoQ29uc3RyYWludC5taXhZfS4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoQ29uc3RyYWludE1peFRpbWVsaW5lIGV4dGVuZHMgQ3VydmVUaW1lbGluZSBpbXBsZW1lbnRzIENvbnN0cmFpbnRUaW1lbGluZSB7XG5cdHJlYWRvbmx5IGNvbnN0cmFpbnRJbmRleDogbnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGAke1Byb3BlcnR5LnBhdGhDb25zdHJhaW50TWl4fXwke2NvbnN0cmFpbnRJbmRleH1gKTtcblx0XHR0aGlzLmNvbnN0cmFpbnRJbmRleCA9IGNvbnN0cmFpbnRJbmRleDtcblx0fVxuXG5cdGdldEZyYW1lRW50cmllcyAoKSB7XG5cdFx0cmV0dXJuIDQvKkVOVFJJRVMqLztcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGFuZCBjb2xvciBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS5cblx0ICogQHBhcmFtIGZyYW1lIEJldHdlZW4gMCBhbmQgYGZyYW1lQ291bnRgLCBpbmNsdXNpdmUuXG5cdCAqIEBwYXJhbSB0aW1lIFRoZSBmcmFtZSB0aW1lIGluIHNlY29uZHMuICovXG5cdHNldEZyYW1lIChmcmFtZTogbnVtYmVyLCB0aW1lOiBudW1iZXIsIG1peFJvdGF0ZTogbnVtYmVyLCBtaXhYOiBudW1iZXIsIG1peFk6IG51bWJlcikge1xuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXHRcdGZyYW1lIDw8PSAyO1xuXHRcdGZyYW1lc1tmcmFtZV0gPSB0aW1lO1xuXHRcdGZyYW1lc1tmcmFtZSArIDEvKlJPVEFURSovXSA9IG1peFJvdGF0ZTtcblx0XHRmcmFtZXNbZnJhbWUgKyAyLypYKi9dID0gbWl4WDtcblx0XHRmcmFtZXNbZnJhbWUgKyAzLypZKi9dID0gbWl4WTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSxcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbi5jb25zdHJhaW50c1t0aGlzLmNvbnN0cmFpbnRJbmRleF0gYXMgUGF0aENvbnN0cmFpbnQ7XG5cdFx0aWYgKCFjb25zdHJhaW50LmFjdGl2ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvc2UgPSBhcHBsaWVkUG9zZSA/IGNvbnN0cmFpbnQuYXBwbGllZFBvc2UgOiBjb25zdHJhaW50LnBvc2U7XG5cblx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcztcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkge1xuXHRcdFx0Y29uc3Qgc2V0dXAgPSBjb25zdHJhaW50LmRhdGEuc2V0dXBQb3NlO1xuXHRcdFx0c3dpdGNoIChmcm9tKSB7XG5cdFx0XHRcdGNhc2UgTWl4RnJvbS5zZXR1cDoge1xuXHRcdFx0XHRcdHBvc2UubWl4Um90YXRlID0gc2V0dXAubWl4Um90YXRlO1xuXHRcdFx0XHRcdHBvc2UubWl4WCA9IHNldHVwLm1peFg7XG5cdFx0XHRcdFx0cG9zZS5taXhZID0gc2V0dXAubWl4WTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXNlIE1peEZyb20uZmlyc3Q6IHtcblx0XHRcdFx0XHRwb3NlLm1peFJvdGF0ZSArPSAoc2V0dXAubWl4Um90YXRlIC0gcG9zZS5taXhSb3RhdGUpICogYWxwaGE7XG5cdFx0XHRcdFx0cG9zZS5taXhYICs9IChzZXR1cC5taXhYIC0gcG9zZS5taXhYKSAqIGFscGhhO1xuXHRcdFx0XHRcdHBvc2UubWl4WSArPSAoc2V0dXAubWl4WSAtIHBvc2UubWl4WSkgKiBhbHBoYTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGxldCByb3RhdGU6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXI7XG5cdFx0Y29uc3QgaSA9IFRpbWVsaW5lLnNlYXJjaChmcmFtZXMsIHRpbWUsIDQvKkVOVFJJRVMqLyk7XG5cdFx0Y29uc3QgY3VydmVUeXBlID0gdGhpcy5jdXJ2ZXNbaSA+PiAyXTtcblx0XHRzd2l0Y2ggKGN1cnZlVHlwZSkge1xuXHRcdFx0Y2FzZSAwLypMSU5FQVIqLzoge1xuXHRcdFx0XHRjb25zdCBiZWZvcmUgPSBmcmFtZXNbaV07XG5cdFx0XHRcdHJvdGF0ZSA9IGZyYW1lc1tpICsgMS8qUk9UQVRFKi9dO1xuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAyLypYKi9dO1xuXHRcdFx0XHR5ID0gZnJhbWVzW2kgKyAzLypZKi9dO1xuXHRcdFx0XHRjb25zdCB0ID0gKHRpbWUgLSBiZWZvcmUpIC8gKGZyYW1lc1tpICsgNC8qRU5UUklFUyovXSAtIGJlZm9yZSk7XG5cdFx0XHRcdHJvdGF0ZSArPSAoZnJhbWVzW2kgKyA0LypFTlRSSUVTKi8gKyAxLypST1RBVEUqL10gLSByb3RhdGUpICogdDtcblx0XHRcdFx0eCArPSAoZnJhbWVzW2kgKyA0LypFTlRSSUVTKi8gKyAyLypYKi9dIC0geCkgKiB0O1xuXHRcdFx0XHR5ICs9IChmcmFtZXNbaSArIDQvKkVOVFJJRVMqLyArIDMvKlkqL10gLSB5KSAqIHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxLypTVEVQUEVEKi86XG5cdFx0XHRcdHJvdGF0ZSA9IGZyYW1lc1tpICsgMS8qUk9UQVRFKi9dO1xuXHRcdFx0XHR4ID0gZnJhbWVzW2kgKyAyLypYKi9dO1xuXHRcdFx0XHR5ID0gZnJhbWVzW2kgKyAzLypZKi9dO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJvdGF0ZSA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMS8qUk9UQVRFKi8sIGN1cnZlVHlwZSAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0eCA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMi8qWCovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAtIDIvKkJFWklFUiovKTtcblx0XHRcdFx0eSA9IHRoaXMuZ2V0QmV6aWVyVmFsdWUodGltZSwgaSwgMy8qWSovLCBjdXJ2ZVR5cGUgKyAxOC8qQkVaSUVSX1NJWkUqLyAqIDIgLSAyLypCRVpJRVIqLyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYmFzZSA9IGZyb20gPT09IE1peEZyb20uc2V0dXAgPyBjb25zdHJhaW50LmRhdGEuc2V0dXBQb3NlIDogcG9zZTtcblx0XHRpZiAoYWRkKSB7XG5cdFx0XHRwb3NlLm1peFJvdGF0ZSA9IGJhc2UubWl4Um90YXRlICsgcm90YXRlICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFggPSBiYXNlLm1peFggKyB4ICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFkgPSBiYXNlLm1peFkgKyB5ICogYWxwaGE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBvc2UubWl4Um90YXRlID0gYmFzZS5taXhSb3RhdGUgKyAocm90YXRlIC0gYmFzZS5taXhSb3RhdGUpICogYWxwaGE7XG5cdFx0XHRwb3NlLm1peFggPSBiYXNlLm1peFggKyAoeCAtIGJhc2UubWl4WCkgKiBhbHBoYTtcblx0XHRcdHBvc2UubWl4WSA9IGJhc2UubWl4WSArICh5IC0gYmFzZS5taXhZKSAqIGFscGhhO1xuXHRcdH1cblx0fVxufVxuXG4vKiogVGhlIGJhc2UgY2xhc3MgZm9yIG1vc3Qge0BsaW5rIFBoeXNpY3NDb25zdHJhaW50fSB0aW1lbGluZXMuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGh5c2ljc0NvbnN0cmFpbnRUaW1lbGluZSBleHRlbmRzIENvbnN0cmFpbnRUaW1lbGluZTEge1xuXHQvKiogQHBhcmFtIGNvbnN0cmFpbnRJbmRleCAtMSBmb3IgYWxsIHBoeXNpY3MgY29uc3RyYWludHMgaW4gdGhlIHNrZWxldG9uLiAqL1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlciwgcHJvcGVydHk6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBjb25zdHJhaW50SW5kZXgsIHByb3BlcnR5KTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSxcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGlmIChhZGQgJiYgIXRoaXMuYWRkaXRpdmUpIGFkZCA9IGZhbHNlO1xuXHRcdGlmICh0aGlzLmNvbnN0cmFpbnRJbmRleCA9PT0gLTEpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gdGltZSA+PSB0aGlzLmZyYW1lc1swXSA/IHRoaXMuZ2V0Q3VydmVWYWx1ZSh0aW1lKSA6IDA7XG5cdFx0XHRjb25zdCBjb25zdHJhaW50cyA9IHNrZWxldG9uLnBoeXNpY3M7XG5cdFx0XHRmb3IgKGNvbnN0IGNvbnN0cmFpbnQgb2YgY29uc3RyYWludHMpIHtcblx0XHRcdFx0aWYgKGNvbnN0cmFpbnQuYWN0aXZlICYmIHRoaXMuZ2xvYmFsKGNvbnN0cmFpbnQuZGF0YSkpIHtcblx0XHRcdFx0XHRjb25zdCBwb3NlID0gYXBwbGllZFBvc2UgPyBjb25zdHJhaW50LmFwcGxpZWRQb3NlIDogY29uc3RyYWludC5wb3NlO1xuXHRcdFx0XHRcdHRoaXMuc2V0KHBvc2UsIHRoaXMuZ2V0QWJzb2x1dGVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbSwgYWRkLCB0aGlzLmdldChwb3NlKSwgdGhpcy5nZXQoY29uc3RyYWludC5kYXRhLnNldHVwUG9zZSksIHZhbHVlKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uLmNvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XSBhcyBQaHlzaWNzQ29uc3RyYWludDtcblx0XHRcdGlmIChjb25zdHJhaW50LmFjdGl2ZSkge1xuXHRcdFx0XHRjb25zdCBwb3NlID0gYXBwbGllZFBvc2UgPyBjb25zdHJhaW50LmFwcGxpZWRQb3NlIDogY29uc3RyYWludC5wb3NlO1xuXHRcdFx0XHR0aGlzLnNldChwb3NlLCB0aGlzLmdldEFic29sdXRlVmFsdWUodGltZSwgYWxwaGEsIGZyb20sIGFkZCwgdGhpcy5nZXQocG9zZSksIHRoaXMuZ2V0KGNvbnN0cmFpbnQuZGF0YS5zZXR1cFBvc2UpKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YWJzdHJhY3QgZ2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UpOiBudW1iZXI7XG5cblx0YWJzdHJhY3Qgc2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UsIHZhbHVlOiBudW1iZXIpOiB2b2lkO1xuXG5cdGFic3RyYWN0IGdsb2JhbCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnREYXRhKTogYm9vbGVhbjtcbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIFBoeXNpY3NDb25zdHJhaW50UG9zZS5pbmVydGlhfS4gKi9cbmV4cG9ydCBjbGFzcyBQaHlzaWNzQ29uc3RyYWludEluZXJ0aWFUaW1lbGluZSBleHRlbmRzIFBoeXNpY3NDb25zdHJhaW50VGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBjb25zdHJhaW50SW5kZXgsIFByb3BlcnR5LnBoeXNpY3NDb25zdHJhaW50SW5lcnRpYSk7XG5cdH1cblxuXHRnZXQgKHBvc2U6IFBoeXNpY3NDb25zdHJhaW50UG9zZSk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHBvc2UuaW5lcnRpYTtcblx0fVxuXG5cdHNldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG5cdFx0cG9zZS5pbmVydGlhID0gdmFsdWU7XG5cdH1cblxuXHRnbG9iYWwgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50RGF0YSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb25zdHJhaW50LmluZXJ0aWFHbG9iYWw7XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIFBoeXNpY3NDb25zdHJhaW50UG9zZS5zdHJlbmd0aH0uICovXG5leHBvcnQgY2xhc3MgUGh5c2ljc0NvbnN0cmFpbnRTdHJlbmd0aFRpbWVsaW5lIGV4dGVuZHMgUGh5c2ljc0NvbnN0cmFpbnRUaW1lbGluZSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGNvbnN0cmFpbnRJbmRleCwgUHJvcGVydHkucGh5c2ljc0NvbnN0cmFpbnRTdHJlbmd0aCk7XG5cdH1cblx0Z2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UpOiBudW1iZXIge1xuXHRcdHJldHVybiBwb3NlLnN0cmVuZ3RoO1xuXHR9XG5cblx0c2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRwb3NlLnN0cmVuZ3RoID0gdmFsdWU7XG5cdH1cblxuXHRnbG9iYWwgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50RGF0YSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb25zdHJhaW50LnN0cmVuZ3RoR2xvYmFsO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBQaHlzaWNzQ29uc3RyYWludFBvc2UuZGFtcGluZ30uICovXG5leHBvcnQgY2xhc3MgUGh5c2ljc0NvbnN0cmFpbnREYW1waW5nVGltZWxpbmUgZXh0ZW5kcyBQaHlzaWNzQ29uc3RyYWludFRpbWVsaW5lIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgY29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgY29uc3RyYWludEluZGV4LCBQcm9wZXJ0eS5waHlzaWNzQ29uc3RyYWludERhbXBpbmcpO1xuXHR9XG5cblx0Z2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UpOiBudW1iZXIge1xuXHRcdHJldHVybiBwb3NlLmRhbXBpbmc7XG5cdH1cblxuXHRzZXQgKHBvc2U6IFBoeXNpY3NDb25zdHJhaW50UG9zZSwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuXHRcdHBvc2UuZGFtcGluZyA9IHZhbHVlO1xuXHR9XG5cblx0Z2xvYmFsIChjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludERhdGEpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29uc3RyYWludC5kYW1waW5nR2xvYmFsO1xuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBQaHlzaWNzQ29uc3RyYWludFBvc2UubWFzc0ludmVyc2V9LiBUaGUgdGltZWxpbmUgdmFsdWVzIGFyZSBub3QgaW52ZXJ0ZWQuICovXG5leHBvcnQgY2xhc3MgUGh5c2ljc0NvbnN0cmFpbnRNYXNzVGltZWxpbmUgZXh0ZW5kcyBQaHlzaWNzQ29uc3RyYWludFRpbWVsaW5lIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgY29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgY29uc3RyYWludEluZGV4LCBQcm9wZXJ0eS5waHlzaWNzQ29uc3RyYWludE1hc3MpO1xuXHR9XG5cblx0Z2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UpOiBudW1iZXIge1xuXHRcdHJldHVybiAxIC8gcG9zZS5tYXNzSW52ZXJzZTtcblx0fVxuXG5cdHNldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG5cdFx0cG9zZS5tYXNzSW52ZXJzZSA9IDEgLyB2YWx1ZTtcblx0fVxuXG5cdGdsb2JhbCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnREYXRhKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQubWFzc0dsb2JhbDtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnRQb3NlLndpbmR9LiAqL1xuZXhwb3J0IGNsYXNzIFBoeXNpY3NDb25zdHJhaW50V2luZFRpbWVsaW5lIGV4dGVuZHMgUGh5c2ljc0NvbnN0cmFpbnRUaW1lbGluZSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGNvbnN0cmFpbnRJbmRleCwgUHJvcGVydHkucGh5c2ljc0NvbnN0cmFpbnRXaW5kKTtcblx0XHR0aGlzLmFkZGl0aXZlID0gdHJ1ZTtcblx0fVxuXG5cdGdldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gcG9zZS53aW5kO1xuXHR9XG5cblx0c2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRwb3NlLndpbmQgPSB2YWx1ZTtcblx0fVxuXG5cdGdsb2JhbCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnREYXRhKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQud2luZEdsb2JhbDtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnRQb3NlLmdyYXZpdHl9LiAqL1xuZXhwb3J0IGNsYXNzIFBoeXNpY3NDb25zdHJhaW50R3Jhdml0eVRpbWVsaW5lIGV4dGVuZHMgUGh5c2ljc0NvbnN0cmFpbnRUaW1lbGluZSB7XG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGJlemllckNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgYmV6aWVyQ291bnQsIGNvbnN0cmFpbnRJbmRleCwgUHJvcGVydHkucGh5c2ljc0NvbnN0cmFpbnRHcmF2aXR5KTtcblx0XHR0aGlzLmFkZGl0aXZlID0gdHJ1ZTtcblx0fVxuXG5cdGdldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gcG9zZS5ncmF2aXR5O1xuXHR9XG5cblx0c2V0IChwb3NlOiBQaHlzaWNzQ29uc3RyYWludFBvc2UsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRwb3NlLmdyYXZpdHkgPSB2YWx1ZTtcblx0fVxuXG5cdGdsb2JhbCAoY29uc3RyYWludDogUGh5c2ljc0NvbnN0cmFpbnREYXRhKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbnN0cmFpbnQuZ3Jhdml0eUdsb2JhbDtcblx0fVxufVxuXG4vKiogQ2hhbmdlcyB7QGxpbmsgUGh5c2ljc0NvbnN0cmFpbnRQb3NlLm1peH0uICovXG5leHBvcnQgY2xhc3MgUGh5c2ljc0NvbnN0cmFpbnRNaXhUaW1lbGluZSBleHRlbmRzIFBoeXNpY3NDb25zdHJhaW50VGltZWxpbmUge1xuXHRjb25zdHJ1Y3RvciAoZnJhbWVDb3VudDogbnVtYmVyLCBiZXppZXJDb3VudDogbnVtYmVyLCBjb25zdHJhaW50SW5kZXg6IG51bWJlcikge1xuXHRcdHN1cGVyKGZyYW1lQ291bnQsIGJlemllckNvdW50LCBjb25zdHJhaW50SW5kZXgsIFByb3BlcnR5LnBoeXNpY3NDb25zdHJhaW50TWl4KTtcblx0fVxuXG5cdGdldCAocG9zZTogUGh5c2ljc0NvbnN0cmFpbnRQb3NlKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gcG9zZS5taXg7XG5cdH1cblxuXHRzZXQgKHBvc2U6IFBoeXNpY3NDb25zdHJhaW50UG9zZSwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuXHRcdHBvc2UubWl4ID0gdmFsdWU7XG5cdH1cblxuXHRnbG9iYWwgKGNvbnN0cmFpbnQ6IFBoeXNpY3NDb25zdHJhaW50RGF0YSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb25zdHJhaW50Lm1peEdsb2JhbDtcblx0fVxufVxuXG4vKiogUmVzZXRzIGEgcGh5c2ljcyBjb25zdHJhaW50IHdoZW4gc3BlY2lmaWMgYW5pbWF0aW9uIHRpbWVzIGFyZSByZWFjaGVkLiAqL1xuZXhwb3J0IGNsYXNzIFBoeXNpY3NDb25zdHJhaW50UmVzZXRUaW1lbGluZSBleHRlbmRzIFRpbWVsaW5lIGltcGxlbWVudHMgQ29uc3RyYWludFRpbWVsaW5lIHtcblx0cHJpdmF0ZSBzdGF0aWMgcHJvcGVydHlJZHM6IHN0cmluZ1tdID0gW1Byb3BlcnR5LnBoeXNpY3NDb25zdHJhaW50UmVzZXQudG9TdHJpbmcoKV07XG5cblx0LyoqIFRoZSBpbmRleCBvZiB0aGUgcGh5c2ljcyBjb25zdHJhaW50IGluIHtAbGluayBTa2VsZXRvbi5jb250cmFpbnRzfSB0aGF0IHdpbGwgYmUgcmVzZXQgd2hlbiB0aGlzIHRpbWVsaW5lIGlzXG5cdCogYXBwbGllZCwgb3IgLTEgaWYgYWxsIHBoeXNpY3MgY29uc3RyYWludHMgaW4gdGhlIHNrZWxldG9uIHdpbGwgYmUgcmVzZXQuICovXG5cdHJlYWRvbmx5IGNvbnN0cmFpbnRJbmRleDogbnVtYmVyO1xuXG5cdC8qKiBAcGFyYW0gY29uc3RyYWludEluZGV4IC0xIGZvciBhbGwgcGh5c2ljcyBjb25zdHJhaW50cyBpbiB0aGUgc2tlbGV0b24uICovXG5cdGNvbnN0cnVjdG9yIChmcmFtZUNvdW50OiBudW1iZXIsIGNvbnN0cmFpbnRJbmRleDogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJhbWVDb3VudCwgLi4uUGh5c2ljc0NvbnN0cmFpbnRSZXNldFRpbWVsaW5lLnByb3BlcnR5SWRzKTtcblx0XHR0aGlzLmNvbnN0cmFpbnRJbmRleCA9IGNvbnN0cmFpbnRJbmRleDtcblx0XHR0aGlzLmluc3RhbnQgPSB0cnVlO1xuXHR9XG5cblx0Z2V0RnJhbWVDb3VudCAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJhbWVzLmxlbmd0aDtcblx0fVxuXG5cdC8qKiBTZXRzIHRoZSB0aW1lIGZvciB0aGUgc3BlY2lmaWVkIGZyYW1lLlxuXHQgKiBAcGFyYW0gZnJhbWUgQmV0d2VlbiAwIGFuZCBgZnJhbWVDb3VudGAsIGluY2x1c2l2ZS4gKi9cblx0c2V0RnJhbWUgKGZyYW1lOiBudW1iZXIsIHRpbWU6IG51bWJlcikge1xuXHRcdHRoaXMuZnJhbWVzW2ZyYW1lXSA9IHRpbWU7XG5cdH1cblxuXHQvKiogUmVzZXRzIHRoZSBwaHlzaWNzIGNvbnN0cmFpbnQgd2hlbiBmcmFtZXMgPiBgbGFzdFRpbWVgIGFuZCA8PSBgdGltZWAuICovXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSxcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGxldCBjb25zdHJhaW50OiBQaHlzaWNzQ29uc3RyYWludCB8IHVuZGVmaW5lZDtcblx0XHRpZiAodGhpcy5jb25zdHJhaW50SW5kZXggIT09IC0xKSB7XG5cdFx0XHRjb25zdHJhaW50ID0gc2tlbGV0b24uY29uc3RyYWludHNbdGhpcy5jb25zdHJhaW50SW5kZXhdIGFzIFBoeXNpY3NDb25zdHJhaW50O1xuXHRcdFx0aWYgKCFjb25zdHJhaW50LmFjdGl2ZSkgcmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZyYW1lcyA9IHRoaXMuZnJhbWVzO1xuXG5cdFx0aWYgKGxhc3RUaW1lID4gdGltZSkgeyAvLyBBcHBseSBhZnRlciBsYXN0VGltZSBmb3IgbG9vcGVkIGFuaW1hdGlvbnMuXG5cdFx0XHQvLyBSZWZlcmVuY2UgcnVudGltZSBwYXNzZXMgbnVsbCBmb3IgTWl4RnJvbSBoZXJlLiBUaGlzIHRpbWVsaW5lIGRvZXNuJ3QgdXNlIGl0LCBidXQgVFMga2VlcHMgdGhlIHR5cGUgbm9uLW51bGwuXG5cdFx0XHR0aGlzLmFwcGx5KHNrZWxldG9uLCBsYXN0VGltZSwgTnVtYmVyLk1BWF9WQUxVRSwgW10sIGFscGhhLCBmcm9tLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcblx0XHRcdGxhc3RUaW1lID0gLTE7XG5cdFx0fSBlbHNlIGlmIChsYXN0VGltZSA+PSBmcmFtZXNbZnJhbWVzLmxlbmd0aCAtIDFdKSAvLyBMYXN0IHRpbWUgaXMgYWZ0ZXIgbGFzdCBmcmFtZS5cblx0XHRcdHJldHVybjtcblx0XHRpZiAodGltZSA8IGZyYW1lc1swXSkgcmV0dXJuO1xuXG5cdFx0aWYgKGxhc3RUaW1lIDwgZnJhbWVzWzBdIHx8IHRpbWUgPj0gZnJhbWVzW1RpbWVsaW5lLnNlYXJjaChmcmFtZXMsIGxhc3RUaW1lKSArIDFdKSB7XG5cdFx0XHRpZiAoY29uc3RyYWludCAhPSBudWxsKVxuXHRcdFx0XHRjb25zdHJhaW50LnJlc2V0KHNrZWxldG9uKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGNvbnN0cmFpbnQgb2Ygc2tlbGV0b24ucGh5c2ljcykge1xuXHRcdFx0XHRcdGlmIChjb25zdHJhaW50LmFjdGl2ZSkgY29uc3RyYWludC5yZXNldChza2VsZXRvbik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqIENoYW5nZXMge0BsaW5rIFNsaWRlclBvc2UudGltZX0uICovXG5leHBvcnQgY2xhc3MgU2xpZGVyVGltZWxpbmUgZXh0ZW5kcyBDb25zdHJhaW50VGltZWxpbmUxIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgY29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgY29uc3RyYWludEluZGV4LCBQcm9wZXJ0eS5zbGlkZXJUaW1lKTtcblx0fVxuXG5cdGFwcGx5IChza2VsZXRvbjogU2tlbGV0b24sIGxhc3RUaW1lOiBudW1iZXIsIHRpbWU6IG51bWJlciwgZmlyZWRFdmVudHM6IEFycmF5PEV2ZW50PiwgYWxwaGE6IG51bWJlciwgZnJvbTogTWl4RnJvbSxcblx0XHRhZGQ6IGJvb2xlYW4sIG91dDogYm9vbGVhbiwgYXBwbGllZFBvc2U6IGJvb2xlYW4pIHtcblxuXHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbi5jb25zdHJhaW50c1t0aGlzLmNvbnN0cmFpbnRJbmRleF0gYXMgU2xpZGVyO1xuXHRcdGlmIChjb25zdHJhaW50LmFjdGl2ZSkge1xuXHRcdFx0Y29uc3QgcG9zZSA9IGFwcGxpZWRQb3NlID8gY29uc3RyYWludC5hcHBsaWVkUG9zZSA6IGNvbnN0cmFpbnQucG9zZTtcblx0XHRcdHBvc2UudGltZSA9IHRoaXMuZ2V0QWJzb2x1dGVWYWx1ZSh0aW1lLCBhbHBoYSwgZnJvbSwgYWRkLCBwb3NlLnRpbWUsIGNvbnN0cmFpbnQuZGF0YS5zZXR1cFBvc2UudGltZSk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKiBDaGFuZ2VzIHtAbGluayBTbGlkZXJQb3NlLm1peH0uICovXG5leHBvcnQgY2xhc3MgU2xpZGVyTWl4VGltZWxpbmUgZXh0ZW5kcyBDb25zdHJhaW50VGltZWxpbmUxIHtcblx0Y29uc3RydWN0b3IgKGZyYW1lQ291bnQ6IG51bWJlciwgYmV6aWVyQ291bnQ6IG51bWJlciwgY29uc3RyYWludEluZGV4OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcmFtZUNvdW50LCBiZXppZXJDb3VudCwgY29uc3RyYWludEluZGV4LCBQcm9wZXJ0eS5zbGlkZXJNaXgpO1xuXHRcdHRoaXMuYWRkaXRpdmUgPSB0cnVlO1xuXHR9XG5cblx0YXBwbHkgKHNrZWxldG9uOiBTa2VsZXRvbiwgbGFzdFRpbWU6IG51bWJlciwgdGltZTogbnVtYmVyLCBmaXJlZEV2ZW50czogQXJyYXk8RXZlbnQ+LCBhbHBoYTogbnVtYmVyLCBmcm9tOiBNaXhGcm9tLFxuXHRcdGFkZDogYm9vbGVhbiwgb3V0OiBib29sZWFuLCBhcHBsaWVkUG9zZTogYm9vbGVhbikge1xuXG5cdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uLmNvbnN0cmFpbnRzW3RoaXMuY29uc3RyYWludEluZGV4XSBhcyBTbGlkZXI7XG5cdFx0aWYgKGNvbnN0cmFpbnQuYWN0aXZlKSB7XG5cdFx0XHRjb25zdCBwb3NlID0gYXBwbGllZFBvc2UgPyBjb25zdHJhaW50LmFwcGxpZWRQb3NlIDogY29uc3RyYWludC5wb3NlO1xuXHRcdFx0cG9zZS5taXggPSB0aGlzLmdldEFic29sdXRlVmFsdWUodGltZSwgYWxwaGEsIGZyb20sIGFkZCwgcG9zZS5taXgsIGNvbnN0cmFpbnQuZGF0YS5zZXR1cFBvc2UubWl4KTtcblx0XHR9XG5cdH1cbn1cbiJdfQ==