@workflow/web-shared 5.0.0-beta.35 → 5.0.0-beta.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/components/event-list.js +10 -7
- package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/components/split-pane.js +5 -5
- package/dist/components/new-trace-viewer/components/timeline.d.ts +8 -2
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/components/timeline.js +95 -26
- package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +2 -2
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +14 -11
- package/dist/components/new-trace-viewer/utils.d.ts +29 -0
- package/dist/components/new-trace-viewer/utils.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/utils.js +46 -3
- package/package.json +4 -4
- package/src/components/new-trace-viewer/components/event-list.tsx +21 -11
- package/src/components/new-trace-viewer/components/split-pane.tsx +14 -4
- package/src/components/new-trace-viewer/components/timeline.tsx +158 -47
- package/src/components/new-trace-viewer/components/trace-shortcut-helper.tsx +1 -1
- package/src/components/new-trace-viewer/trace-viewer.tsx +44 -38
- package/src/components/new-trace-viewer/utils.test.ts +199 -0
- package/src/components/new-trace-viewer/utils.ts +79 -2
|
@@ -95,6 +95,10 @@ export function computeTimeMarkers(viewDuration, offset) {
|
|
|
95
95
|
}
|
|
96
96
|
return markers;
|
|
97
97
|
}
|
|
98
|
+
/** Project an absolute time onto the viewport as a clamped [0, 1] fraction. */
|
|
99
|
+
function toViewportFrac(ms, viewStart, range) {
|
|
100
|
+
return Math.min(Math.max((ms - viewStart) / range, 0), 1);
|
|
101
|
+
}
|
|
98
102
|
export function computeSpanGaps(spans, viewStart, viewEnd) {
|
|
99
103
|
const range = viewEnd - viewStart;
|
|
100
104
|
if (range <= 0)
|
|
@@ -106,14 +110,53 @@ export function computeSpanGaps(spans, viewStart, viewEnd) {
|
|
|
106
110
|
const gapMs = startTime - endTime;
|
|
107
111
|
if (gapMs <= 0)
|
|
108
112
|
continue;
|
|
109
|
-
const leftFrac =
|
|
110
|
-
const rightFrac =
|
|
113
|
+
const leftFrac = toViewportFrac(endTime, viewStart, range);
|
|
114
|
+
const rightFrac = toViewportFrac(startTime, viewStart, range);
|
|
111
115
|
if (rightFrac - leftFrac < 0.001)
|
|
112
116
|
continue;
|
|
113
117
|
gaps.push({ gapMs, leftFrac, rightFrac, rowIndex: i });
|
|
114
118
|
}
|
|
115
119
|
return gaps;
|
|
116
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Measure the temporal delta between an anchor (selected) span and a hovered
|
|
123
|
+
* span for the Alt+hover measurement overlay. Ordering the two spans by start
|
|
124
|
+
* time (E = earlier-starting, L = later-starting), the measurement runs to
|
|
125
|
+
* L's start from E's end when the spans are disjoint ("how long after E ended
|
|
126
|
+
* did L start"), or from E's start when they overlap ("how long after E
|
|
127
|
+
* started did L start"). Fractions are clamped to the viewport like
|
|
128
|
+
* `computeSpanGaps`; `deltaMs` is always the true duration. Returns null when
|
|
129
|
+
* the measurement lies entirely outside the viewport.
|
|
130
|
+
*/
|
|
131
|
+
export function computeSpanDelta(anchor, hovered, viewStart, viewEnd) {
|
|
132
|
+
const range = viewEnd - viewStart;
|
|
133
|
+
if (range <= 0)
|
|
134
|
+
return null;
|
|
135
|
+
const anchorStart = getHighResInMs(anchor.startTime);
|
|
136
|
+
const hoveredStart = getHighResInMs(hovered.startTime);
|
|
137
|
+
const anchorIsEarlier = anchorStart <= hoveredStart;
|
|
138
|
+
const earlierStart = anchorIsEarlier ? anchorStart : hoveredStart;
|
|
139
|
+
const earlierEnd = getHighResInMs(anchorIsEarlier ? anchor.endTime : hovered.endTime);
|
|
140
|
+
const laterStart = anchorIsEarlier ? hoveredStart : anchorStart;
|
|
141
|
+
const originMs = earlierEnd <= laterStart ? earlierEnd : earlierStart;
|
|
142
|
+
const deltaMs = laterStart - originMs;
|
|
143
|
+
// Entirely outside the viewport. Compared in time-space (not clamped
|
|
144
|
+
// fractions) so a zero-delta point sitting exactly on a viewport edge —
|
|
145
|
+
// e.g. the root span selected at default zoom — still renders.
|
|
146
|
+
if (laterStart < viewStart || originMs > viewEnd) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
const originFrac = toViewportFrac(originMs, viewStart, range);
|
|
150
|
+
const laterFrac = toViewportFrac(laterStart, viewStart, range);
|
|
151
|
+
const hoveredEnd = getHighResInMs(hovered.endTime);
|
|
152
|
+
return {
|
|
153
|
+
deltaMs,
|
|
154
|
+
anchorFrac: anchorIsEarlier ? originFrac : laterFrac,
|
|
155
|
+
hoveredFrac: anchorIsEarlier ? laterFrac : originFrac,
|
|
156
|
+
anchorEdge: anchorIsEarlier && earlierEnd <= laterStart ? 'end' : 'start',
|
|
157
|
+
hoveredOffscreen: hoveredStart > viewEnd ? 'right' : hoveredEnd < viewStart ? 'left' : null,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
117
160
|
// ---------------------------------------------------------------------------
|
|
118
161
|
// Resource colors
|
|
119
162
|
// ---------------------------------------------------------------------------
|
|
@@ -384,4 +427,4 @@ export function computeOffscreenMarkers(markers, visibleStartMs, visibleEndMs) {
|
|
|
384
427
|
right: rightCount > 0 ? { count: rightCount, nearestMs: nearestRight } : null,
|
|
385
428
|
};
|
|
386
429
|
}
|
|
387
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uZXctdHJhY2Utdmlld2VyL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLGNBQWMsR0FDZixNQUFNLDZCQUE2QixDQUFDO0FBYXJDLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUN4QyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFFdEMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEdBQUcsUUFBUTtZQUFFLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsTUFBTTtZQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFB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aUJBQWlCLENBQUM7SUFDNUMsS0FBSyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUM7UUFDakMsSUFBSSxNQUFNLEdBQUcsY0FBYyxFQUFFLENBQUM7WUFDNUIsU0FBUyxFQUFFLENBQUM7WUFDWixJQUFJLE1BQU0sR0FBRyxXQUFXO2dCQUFFLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDakQsQ0FBQzthQUFNLElBQUksTUFBTSxHQUFHLFlBQVksRUFBRSxDQUFDO1lBQ2pDLFVBQVUsRUFBRSxDQUFDO1lBQ2IsSUFBSSxNQUFNLEdBQUcsWUFBWTtnQkFBRSxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTztRQUNMLElBQUksRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ3pFLEtBQUssRUFDSCxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO0tBQ3pFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZm9ybWF0RHVyYXRpb24sXG4gIGZvcm1hdER1cmF0aW9uUHJlY2lzZSxcbiAgZ2V0SGlnaFJlc0luTXMsXG59IGZyb20gJy4uL3RyYWNlLXZpZXdlci91dGlsL3RpbWluZyc7XG5pbXBvcnQgdHlwZSB7IFNwYW4sIFNwYW5FdmVudCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJvb3QgYm91bmRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBSb290Qm91bmRzIHtcbiAgc3RhcnRUaW1lOiBudW1iZXI7XG4gIGVuZFRpbWU6IG51bWJlcjtcbiAgZHVyYXRpb246IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSb290Qm91bmRzKHNwYW5zOiBTcGFuW10pOiBSb290Qm91bmRzIHtcbiAgbGV0IG1pblN0YXJ0ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICBsZXQgbWF4RW5kID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuXG4gIGZvciAoY29uc3Qgc3BhbiBvZiBzcGFucykge1xuICAgIGNvbnN0IHMgPSBnZXRIaWdoUmVzSW5NcyhzcGFuLnN0YXJ0VGltZSk7XG4gICAgY29uc3QgZSA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uZW5kVGltZSk7XG4gICAgaWYgKHMgPCBtaW5TdGFydCkgbWluU3RhcnQgPSBzO1xuICAgIGlmIChlID4gbWF4RW5kKSBtYXhFbmQgPSBlO1xuICB9XG5cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobWluU3RhcnQpIHx8ICFOdW1iZXIuaXNGaW5pdGUobWF4RW5kKSkge1xuICAgIHJldHVybiB7IHN0YXJ0VGltZTogMCwgZW5kVGltZTogMSwgZHVyYXRpb246IDEgfTtcbiAgfVxuXG4gIGNvbnN0IGR1cmF0aW9uID0gTWF0aC5tYXgobWF4RW5kIC0gbWluU3RhcnQsIDEpO1xuICByZXR1cm4geyBzdGFydFRpbWU6IG1pblN0YXJ0LCBlbmRUaW1lOiBtYXhFbmQsIGR1cmF0aW9uIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFuRHVyYXRpb25NcyhzcGFuOiBTcGFuKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KFxuICAgIDAsXG4gICAgZ2V0SGlnaFJlc0luTXMoc3Bhbi5lbmRUaW1lKSAtIGdldEhpZ2hSZXNJbk1zKHNwYW4uc3RhcnRUaW1lKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTcGFuRXJyb3JlZChzcGFuOiBTcGFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHdvcmtmbG93U3RhdHVzID0gKHNwYW4uYXR0cmlidXRlcy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgID8uc3RhdHVzIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHNwYW4uc3RhdHVzLmNvZGUgPT09IDIgfHwgd29ya2Zsb3dTdGF0dXMgPT09ICdmYWlsZWQnO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFZpZXdwb3J0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBWaWV3cG9ydFJhbmdlIHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2xhbXAgYSBjYW5kaWRhdGUgdmlld3BvcnQgdG8gdGhlIHJvb3QgZXh0ZW50LiBUaGUgcmVxdWVzdGVkIGR1cmF0aW9uIGlzXG4gKiBwcmVzZXJ2ZWQgd2hlcmUgcG9zc2libGUgKGNsYW1wZWQgdG8gW21pbkR1cmF0aW9uTXMsIHJvb3QgZHVyYXRpb25dKSwgdGhlblxuICogdGhlIHdpbmRvdyBpcyBzaGlmdGVkIGJhY2sgaW5zaWRlIHRoZSByb290IGJvdW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wVmlld3BvcnRUb1Jvb3QoXG4gIG5leHQ6IFZpZXdwb3J0UmFuZ2UsXG4gIHJvb3RTdGFydDogbnVtYmVyLFxuICByb290RW5kOiBudW1iZXIsXG4gIG1pbkR1cmF0aW9uTXM6IG51bWJlclxuKTogVmlld3BvcnRSYW5nZSB7XG4gIGNvbnN0IHJvb3REdXJhdGlvbiA9IE1hdGgubWF4KHJvb3RFbmQgLSByb290U3RhcnQsIG1pbkR1cmF0aW9uTXMpO1xuICBjb25zdCBkdXJhdGlvbiA9IE1hdGgubWluKFxuICAgIHJvb3REdXJhdGlvbixcbiAgICBNYXRoLm1heChtaW5EdXJhdGlvbk1zLCBuZXh0LmVuZCAtIG5leHQuc3RhcnQpXG4gICk7XG4gIGNvbnN0IG1heFN0YXJ0ID0gcm9vdEVuZCAtIGR1cmF0aW9uO1xuICBjb25zdCBzdGFydCA9IE1hdGgubWluKE1hdGgubWF4KG5leHQuc3RhcnQsIHJvb3RTdGFydCksIG1heFN0YXJ0KTtcbiAgcmV0dXJuIHsgc3RhcnQsIGVuZDogc3RhcnQgKyBkdXJhdGlvbiB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdoZWVsIGdlc3R1cmVzIOKAlCBzaGFyZWQgYmV0d2VlbiB0aGUgdGltZWxpbmUgYW5kIHRoZSBtaW5pbWFwXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENvbnZlcnQgYSB3aGVlbCBkZWx0YSB0byBwaXhlbCB1bml0cyAobGluZS1tb2RlIGRlbHRhcyBhcnJpdmUgaW4gbGluZXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdoZWVsRGVsdGFUb1BpeGVscyhkZWx0YTogbnVtYmVyLCBkZWx0YU1vZGU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBkZWx0YU1vZGUgPT09IDEgPyBkZWx0YSAqIDE2IDogZGVsdGE7XG59XG5cbi8qKlxuICogRXhwb25lbnRpYWwgem9vbSBmYWN0b3IgZm9yIGEgd2hlZWwgZ2VzdHVyZS4gQ29hcnNlIG1vdXNlLXdoZWVsIHN0ZXBzIGFyZVxuICogZGFtcGVkIGhhcmRlciB0aGFuIHRyYWNrcGFkIHBpbmNoZXMgc28gYm90aCBmZWVsIHNpbWlsYXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGVlbFpvb21TY2FsZUZhY3RvcihldmVudDoge1xuICBkZWx0YVk6IG51bWJlcjtcbiAgZGVsdGFNb2RlOiBudW1iZXI7XG59KTogbnVtYmVyIHtcbiAgY29uc3QgZHkgPSB3aGVlbERlbHRhVG9QaXhlbHMoZXZlbnQuZGVsdGFZLCBldmVudC5kZWx0YU1vZGUpO1xuICBjb25zdCBpc01vdXNlV2hlZWwgPSBldmVudC5kZWx0YU1vZGUgPT09IDEgfHwgTWF0aC5hYnMoZXZlbnQuZGVsdGFZKSA+PSA1MDtcbiAgcmV0dXJuIDIgKiogKGR5IC8gKGlzTW91c2VXaGVlbCA/IDIwMCA6IDYwKSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGltZSBtYXJrZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lTWFya2VyIHtcbiAgcG9zaXRpb246IG51bWJlcjtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuY29uc3QgTklDRV9JTlRFUlZBTFMgPSBbXG4gIDEsIDIsIDUsIDEwLCAyMCwgNTAsIDEwMCwgMjAwLCA1MDAsIDFfMDAwLCAyXzAwMCwgNV8wMDAsIDEwXzAwMCwgMjBfMDAwLFxuICA1MF8wMDAsIDEwMF8wMDAsIDIwMF8wMDAsIDUwMF8wMDAsIDFfMDAwXzAwMCwgMl8wMDBfMDAwLCA1XzAwMF8wMDAsXG4gIDEwXzAwMF8wMDAsIDIwXzAwMF8wMDAsIDUwXzAwMF8wMDAsIDEwMF8wMDBfMDAwLCAyMDBfMDAwXzAwMCwgNTAwXzAwMF8wMDAsXG4gIDFfMDAwXzAwMF8wMDAsIDJfMDAwXzAwMF8wMDAsIDVfMDAwXzAwMF8wMDAsXG5dO1xuXG5jb25zdCBNQVhfTUFSS0VSUyA9IDg7XG5cbmNvbnN0IE1TX0lOX1NFQ09ORCA9IDEwMDA7XG5cbmZ1bmN0aW9uIHBpY2tJbnRlcnZhbCh2aWV3RHVyYXRpb246IG51bWJlciwgbWF4VGlja3M6IG51bWJlcik6IG51bWJlciB7XG4gIGZvciAoY29uc3QgaW50ZXJ2YWwgb2YgTklDRV9JTlRFUlZBTFMpIHtcbiAgICBpZiAodmlld0R1cmF0aW9uIC8gaW50ZXJ2YWwgPD0gbWF4VGlja3MpIHJldHVybiBpbnRlcnZhbDtcbiAgfVxuICByZXR1cm4gTklDRV9JTlRFUlZBTFNbTklDRV9JTlRFUlZBTFMubGVuZ3RoIC0gMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlVGltZU1hcmtlcnMoXG4gIHZpZXdEdXJhdGlvbjogbnVtYmVyLFxuICBvZmZzZXQ6IG51bWJlclxuKTogVGltZU1hcmtlcltdIHtcbiAgaWYgKHZpZXdEdXJhdGlvbiA8PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgbWF4VGlja3MgPSA2O1xuICBjb25zdCBpbnRlcnZhbCA9IHBpY2tJbnRlcnZhbCh2aWV3RHVyYXRpb24sIG1heFRpY2tzKTtcblxuICAvLyBTdWItc2Vjb25kIHN0ZXBzIG5lZWQgZnJhY3Rpb25hbCBsYWJlbHMsIG9yIHRpY2tzIHBhc3QgMXMgY29sbGlkZSBhc1xuICAvLyBkdXBsaWNhdGUgd2hvbGUgc2Vjb25kcyAoXCLigKYxcywgMnMsIDJzLCAzc1wiKS4gU2NhbGUgZGVjaW1hbHMgdG8gdGhlIHN0ZXAuXG4gIGNvbnN0IGZyYWN0aW9uRGlnaXRzID1cbiAgICBpbnRlcnZhbCA+PSBNU19JTl9TRUNPTkRcbiAgICAgID8gMFxuICAgICAgOiBNYXRoLmNlaWwoLU1hdGgubG9nMTAoaW50ZXJ2YWwgLyBNU19JTl9TRUNPTkQpKTtcblxuICBjb25zdCBmaXJzdFRpY2sgPSBNYXRoLmNlaWwob2Zmc2V0IC8gaW50ZXJ2YWwpICogaW50ZXJ2YWw7XG4gIGNvbnN0IG1hcmtlcnM6IFRpbWVNYXJrZXJbXSA9IFtdO1xuXG4gIGZvciAobGV0IHQgPSBmaXJzdFRpY2s7IHQgPD0gb2Zmc2V0ICsgdmlld0R1cmF0aW9uOyB0ICs9IGludGVydmFsKSB7XG4gICAgY29uc3QgcG9zaXRpb24gPSAodCAtIG9mZnNldCkgLyB2aWV3RHVyYXRpb247XG4gICAgaWYgKHBvc2l0aW9uIDwgLTAuMDEgfHwgcG9zaXRpb24gPiAxLjAxKSBjb250aW51ZTtcbiAgICBtYXJrZXJzLnB1c2goe1xuICAgICAgcG9zaXRpb246IE1hdGgubWluKE1hdGgubWF4KHBvc2l0aW9uLCAwKSwgMSksXG4gICAgICBsYWJlbDpcbiAgICAgICAgZnJhY3Rpb25EaWdpdHMgPT09IDBcbiAgICAgICAgICA/IGZvcm1hdER1cmF0aW9uKE1hdGguYWJzKHQpLCB0cnVlKVxuICAgICAgICAgIDogZm9ybWF0RHVyYXRpb25QcmVjaXNlKE1hdGguYWJzKHQpLCBmcmFjdGlvbkRpZ2l0cyksXG4gICAgICB2YWx1ZTogdCxcbiAgICB9KTtcbiAgICBpZiAobWFya2Vycy5sZW5ndGggPj0gTUFYX01BUktFUlMpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIG1hcmtlcnM7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3BhbiBnYXBzIOKAlCB0aW1lIGRlbHRhcyBiZXR3ZWVuIGNvbnNlY3V0aXZlIHNwYW5zIChBbHQta2V5IG92ZXJsYXkpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBTcGFuR2FwIHtcbiAgZ2FwTXM6IG51bWJlcjtcbiAgbGVmdEZyYWM6IG51bWJlcjtcbiAgcmlnaHRGcmFjOiBudW1iZXI7XG4gIHJvd0luZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3BhbkdhcHMoXG4gIHNwYW5zOiBTcGFuW10sXG4gIHZpZXdTdGFydDogbnVtYmVyLFxuICB2aWV3RW5kOiBudW1iZXJcbik6IFNwYW5HYXBbXSB7XG4gIGNvbnN0IHJhbmdlID0gdmlld0VuZCAtIHZpZXdTdGFydDtcbiAgaWYgKHJhbmdlIDw9IDApIHJldHVybiBbXTtcblxuICBjb25zdCBnYXBzOiBTcGFuR2FwW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBlbmRUaW1lID0gZ2V0SGlnaFJlc0luTXMoc3BhbnNbaV0uZW5kVGltZSk7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gZ2V0SGlnaFJlc0luTXMoc3BhbnNbaSArIDFdLnN0YXJ0VGltZSk7XG4gICAgY29uc3QgZ2FwTXMgPSBzdGFydFRpbWUgLSBlbmRUaW1lO1xuICAgIGlmIChnYXBNcyA8PSAwKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGxlZnRGcmFjID0gTWF0aC5taW4oTWF0aC5tYXgoKGVuZFRpbWUgLSB2aWV3U3RhcnQpIC8gcmFuZ2UsIDApLCAxKTtcbiAgICBjb25zdCByaWdodEZyYWMgPSBNYXRoLm1pbihNYXRoLm1heCgoc3RhcnRUaW1lIC0gdmlld1N0YXJ0KSAvIHJhbmdlLCAwKSwgMSk7XG4gICAgaWYgKHJpZ2h0RnJhYyAtIGxlZnRGcmFjIDwgMC4wMDEpIGNvbnRpbnVlO1xuXG4gICAgZ2Fwcy5wdXNoKHsgZ2FwTXMsIGxlZnRGcmFjLCByaWdodEZyYWMsIHJvd0luZGV4OiBpIH0pO1xuICB9XG4gIHJldHVybiBnYXBzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlc291cmNlIGNvbG9yc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBSRVNPVVJDRV9DT0xPUlM6IFJlY29yZDxcbiAgc3RyaW5nLFxuICB7XG4gICAgYmc6IHN0cmluZztcbiAgICBib3JkZXI6IHN0cmluZztcbiAgICBlcnJvckJnPzogc3RyaW5nO1xuICAgIGVycm9yQm9yZGVyPzogc3RyaW5nO1xuICB9XG4+ID0ge1xuICBydW46IHtcbiAgICBiZzogJ3ZhcigtLWRzLWJsdWUtMjAwKScsXG4gICAgYm9yZGVyOiAndmFyKC0tZHMtYmx1ZS01MDApJyxcbiAgICBlcnJvckJnOiAndmFyKC0tZHMtcmVkLTIwMCknLFxuICAgIGVycm9yQm9yZGVyOiAndmFyKC0tZHMtcmVkLTUwMCknLFxuICB9LFxuICBzdGVwOiB7XG4gICAgYmc6ICd2YXIoLS1kcy1ncmVlbi0yMDApJyxcbiAgICBib3JkZXI6ICd2YXIoLS1kcy1ncmVlbi01MDApJyxcbiAgICBlcnJvckJnOiAndmFyKC0tZHMtcmVkLTIwMCknLFxuICAgIGVycm9yQm9yZGVyOiAndmFyKC0tZHMtcmVkLTUwMCknLFxuICB9LFxuICAvLyBQYXNzaXZlIHNwYW5zIChob29rcykgc3RheSBncmF5IOKAlCBtYXRjaGVzIGV2ZW50LWxpc3QgaWNvbnMgYW5kIHRoZSBtaW5pbWFwLlxuICBob29rOiB7XG4gICAgYmc6ICd2YXIoLS1kcy1ncmF5LTIwMCknLFxuICAgIGJvcmRlcjogJ3ZhcigtLWRzLWdyYXktNTAwKScsXG4gICAgZXJyb3JCZzogJ3ZhcigtLWRzLXJlZC0yMDApJyxcbiAgICBlcnJvckJvcmRlcjogJ3ZhcigtLWRzLXJlZC01MDApJyxcbiAgfSxcbiAgc2xlZXA6IHtcbiAgICBiZzogJ3ZhcigtLWRzLXB1cnBsZS0yMDApJyxcbiAgICBib3JkZXI6ICd2YXIoLS1kcy1wdXJwbGUtNTAwKScsXG4gICAgZXJyb3JCZzogJ3ZhcigtLWRzLXJlZC0yMDApJyxcbiAgICBlcnJvckJvcmRlcjogJ3ZhcigtLWRzLXJlZC01MDApJyxcbiAgfSxcbiAgZGVmYXVsdDoge1xuICAgIGJnOiAndmFyKC0tZHMtZ3JheS0yMDApJyxcbiAgICBib3JkZXI6ICd2YXIoLS1kcy1ncmF5LTUwMCknLFxuICAgIGVycm9yQmc6ICd2YXIoLS1kcy1yZWQtMjAwKScsXG4gICAgZXJyb3JCb3JkZXI6ICd2YXIoLS1kcy1yZWQtNTAwKScsXG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzb3VyY2VDb2xvcihyZXNvdXJjZTogc3RyaW5nKToge1xuICBiZzogc3RyaW5nO1xuICBib3JkZXI6IHN0cmluZztcbiAgZXJyb3JCZz86IHN0cmluZztcbiAgZXJyb3JCb3JkZXI/OiBzdHJpbmc7XG59IHtcbiAgcmV0dXJuIFJFU09VUkNFX0NPTE9SU1tyZXNvdXJjZV0gPz8gUkVTT1VSQ0VfQ09MT1JTLmRlZmF1bHQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3BhbiBzZWdtZW50cyDigJQgc3BsaXQgYSB0aW1lbGluZSBiYXIgaW50byBjb2xvcmVkIHNlY3Rpb25zIGJ5IGV2ZW50IHN0YXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFN0YXR1cyA9XG4gIHwgJ3F1ZXVlZCdcbiAgfCAncGVuZGluZydcbiAgfCAncnVubmluZydcbiAgfCAnY29tcGxldGVkJ1xuICB8ICdmYWlsZWQnXG4gIHwgJ3JldHJ5aW5nJ1xuICB8ICdzdWNjZWVkZWQnXG4gIHwgJ3dhaXRpbmcnXG4gIHwgJ3NsZWVwaW5nJ1xuICB8ICdyZWNlaXZlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VnbWVudCB7XG4gIHN0YXJ0RnJhY3Rpb246IG51bWJlcjtcbiAgZW5kRnJhY3Rpb246IG51bWJlcjtcbiAgc3RhdHVzOiBTZWdtZW50U3RhdHVzO1xufVxuXG5mdW5jdGlvbiBjbGFtcEZyYWN0aW9uKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gdGltZVRvRnJhY3Rpb24oXG4gIHRpbWU6IG51bWJlcixcbiAgc3BhblN0YXJ0OiBudW1iZXIsXG4gIHNwYW5EdXJhdGlvbjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBpZiAoc3BhbkR1cmF0aW9uIDw9IDApIHJldHVybiAwO1xuICByZXR1cm4gY2xhbXBGcmFjdGlvbigodGltZSAtIHNwYW5TdGFydCkgLyBzcGFuRHVyYXRpb24pO1xufVxuXG5pbnRlcmZhY2UgRXZlbnRNYXJrIHtcbiAgdGltZTogbnVtYmVyO1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIHNvcnRlZEV2ZW50TWFya3MoXG4gIGV2ZW50czogU3BhbkV2ZW50W10sXG4gIHJlbGV2YW50TmFtZXM6IHN0cmluZ1tdXG4pOiBFdmVudE1hcmtbXSB7XG4gIHJldHVybiBldmVudHNcbiAgICAuZmlsdGVyKChlKSA9PiByZWxldmFudE5hbWVzLmluY2x1ZGVzKGUubmFtZSkpXG4gICAgLm1hcCgoZSkgPT4gKHsgdGltZTogZ2V0SGlnaFJlc0luTXMoZS50aW1lc3RhbXApLCB0eXBlOiBlLm5hbWUgfSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEudGltZSAtIGIudGltZSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTdGVwU2VnbWVudHNGcm9tU3BhbihcbiAgc3RhcnRNczogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICBldmVudHM6IFNwYW5FdmVudFtdXG4pOiBTZWdtZW50W10ge1xuICBjb25zdCBzZWdtZW50czogU2VnbWVudFtdID0gW107XG4gIGlmIChkdXJhdGlvbiA8PSAwKSByZXR1cm4gc2VnbWVudHM7XG5cbiAgY29uc3QgbWFya3MgPSBzb3J0ZWRFdmVudE1hcmtzKGV2ZW50cywgW1xuICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAnc3RlcF9mYWlsZWQnLFxuICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gIF0pO1xuXG4gIGlmIChtYXJrcy5sZW5ndGggPT09IDApIHtcbiAgICBzZWdtZW50cy5wdXNoKHsgc3RhcnRGcmFjdGlvbjogMCwgZW5kRnJhY3Rpb246IDEsIHN0YXR1czogJ3F1ZXVlZCcgfSk7XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgY29uc3QgZmlyc3RGcmFjdGlvbiA9IHRpbWVUb0ZyYWN0aW9uKG1hcmtzWzBdLnRpbWUsIHN0YXJ0TXMsIGR1cmF0aW9uKTtcbiAgaWYgKGZpcnN0RnJhY3Rpb24gPiAwLjAwMSkge1xuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogMCxcbiAgICAgIGVuZEZyYWN0aW9uOiBmaXJzdEZyYWN0aW9uLFxuICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBtYXJrID0gbWFya3NbaV07XG4gICAgY29uc3QgbWFya0ZyYWMgPSB0aW1lVG9GcmFjdGlvbihtYXJrLnRpbWUsIHN0YXJ0TXMsIGR1cmF0aW9uKTtcbiAgICBjb25zdCBuZXh0TWFyayA9IG1hcmtzW2kgKyAxXTtcbiAgICBjb25zdCBuZXh0RnJhYyA9IG5leHRNYXJrXG4gICAgICA/IHRpbWVUb0ZyYWN0aW9uKG5leHRNYXJrLnRpbWUsIHN0YXJ0TXMsIGR1cmF0aW9uKVxuICAgICAgOiAxO1xuXG4gICAgaWYgKG1hcmsudHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcpIHtcbiAgICAgIGlmIChpID09PSBtYXJrcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0RnJhY3Rpb246IG1hcmtGcmFjLFxuICAgICAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgICAgIHN0YXR1czogJ3N1Y2NlZWRlZCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dFR5cGUgPSBuZXh0TWFyay50eXBlO1xuICAgICAgICBjb25zdCBhdHRlbXB0U3RhdHVzOiBTZWdtZW50U3RhdHVzID1cbiAgICAgICAgICBuZXh0VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnIHx8IG5leHRUeXBlID09PSAnc3RlcF9mYWlsZWQnXG4gICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICA6IG5leHRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnXG4gICAgICAgICAgICAgID8gJ3N1Y2NlZWRlZCdcbiAgICAgICAgICAgICAgOiAncmV0cnlpbmcnO1xuICAgICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgICBzdGFydEZyYWN0aW9uOiBtYXJrRnJhYyxcbiAgICAgICAgICBlbmRGcmFjdGlvbjogbmV4dEZyYWMsXG4gICAgICAgICAgc3RhdHVzOiBhdHRlbXB0U3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1hcmsudHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgc3RhcnRGcmFjdGlvbjogbWFya0ZyYWMsXG4gICAgICAgIGVuZEZyYWN0aW9uOiBuZXh0RnJhYyxcbiAgICAgICAgc3RhdHVzOiAncmV0cnlpbmcnLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXJrLnR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpIHtcbiAgICAgIGlmIChtYXJrRnJhYyA8IDAuOTk5KSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0RnJhY3Rpb246IG1hcmtGcmFjLFxuICAgICAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUhvb2tTZWdtZW50c0Zyb21TcGFuKFxuICBzdGFydE1zOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGV2ZW50czogU3BhbkV2ZW50W11cbik6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcbiAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybiBzZWdtZW50cztcblxuICBjb25zdCBkaXNwb3NlZCA9IHNvcnRlZEV2ZW50TWFya3MoZXZlbnRzLCBbJ2hvb2tfZGlzcG9zZWQnXSlbMF07XG4gIGNvbnN0IGRpc3Bvc2VkRnJhYyA9IGRpc3Bvc2VkXG4gICAgPyB0aW1lVG9GcmFjdGlvbihkaXNwb3NlZC50aW1lLCBzdGFydE1zLCBkdXJhdGlvbilcbiAgICA6IG51bGw7XG5cbiAgY29uc3Qgd2FpdGluZ0VuZCA9IGRpc3Bvc2VkRnJhYyA/PyAxO1xuICBpZiAod2FpdGluZ0VuZCA+IDAuMDAxKSB7XG4gICAgc2VnbWVudHMucHVzaCh7XG4gICAgICBzdGFydEZyYWN0aW9uOiAwLFxuICAgICAgZW5kRnJhY3Rpb246IHdhaXRpbmdFbmQsXG4gICAgICBzdGF0dXM6ICd3YWl0aW5nJyxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChkaXNwb3NlZEZyYWMgIT09IG51bGwgJiYgZGlzcG9zZWRGcmFjIDwgMC45OTkpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IGRpc3Bvc2VkRnJhYyxcbiAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgc3RhdHVzOiAnc3VjY2VlZGVkJyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVNsZWVwU2VnbWVudHNGcm9tU3BhbihcbiAgX3N0YXJ0TXM6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlcixcbiAgX2V2ZW50czogU3BhbkV2ZW50W11cbik6IFNlZ21lbnRbXSB7XG4gIGlmIChkdXJhdGlvbiA8PSAwKSByZXR1cm4gW107XG4gIHJldHVybiBbeyBzdGFydEZyYWN0aW9uOiAwLCBlbmRGcmFjdGlvbjogMSwgc3RhdHVzOiAnc2xlZXBpbmcnIH1dO1xufVxuXG5mdW5jdGlvbiBydW5TZWdtZW50U3RhdHVzKHJ1blN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkKTogU2VnbWVudFN0YXR1cyB7XG4gIGlmIChydW5TdGF0dXMgPT09ICdmYWlsZWQnKSByZXR1cm4gJ2ZhaWxlZCc7XG4gIGlmIChydW5TdGF0dXMgPT09ICdwZW5kaW5nJykgcmV0dXJuICdwZW5kaW5nJztcbiAgaWYgKHJ1blN0YXR1cyA9PT0gJ3J1bm5pbmcnKSByZXR1cm4gJ3J1bm5pbmcnO1xuICByZXR1cm4gJ2NvbXBsZXRlZCc7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVSdW5TZWdtZW50c0Zyb21TcGFuKFxuICBzdGFydE1zOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGFjdGl2ZVN0YXJ0TXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgZXZlbnRzOiBTcGFuRXZlbnRbXSxcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcbiAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybiBzZWdtZW50cztcblxuICBjb25zdCBzb3J0ZWQgPSBbLi4uZXZlbnRzXVxuICAgIC5tYXAoKGUpID0+ICh7IG5hbWU6IGUubmFtZSwgdGltZTogZ2V0SGlnaFJlc0luTXMoZS50aW1lc3RhbXApIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLnRpbWUgLSBiLnRpbWUpO1xuXG4gIGNvbnN0IHJ1bkRhdGEgPSBhdHRyaWJ1dGVzPy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBydW5TdGF0dXMgPSBydW5EYXRhPy5zdGF0dXMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGhhc1J1bkNyZWF0ZWQgPSBzb3J0ZWQuc29tZSgoZSkgPT4gZS5uYW1lID09PSAncnVuX2NyZWF0ZWQnKTtcblxuICBpZiAoIWhhc1J1bkNyZWF0ZWQpIHtcbiAgICByZXR1cm4gY29tcHV0ZVYxUnVuU2VnbWVudHMoc3RhcnRNcywgZHVyYXRpb24sIGFjdGl2ZVN0YXJ0TXMsIHJ1blN0YXR1cyk7XG4gIH1cblxuICBjb25zdCBmYWlsZWRFdmVudCA9IHNvcnRlZC5maW5kKChlKSA9PiBlLm5hbWUgPT09ICdydW5fZmFpbGVkJyk7XG5cbiAgbGV0IGN1cnNvciA9IDA7XG4gIGlmIChhY3RpdmVTdGFydE1zICE9PSB1bmRlZmluZWQgJiYgYWN0aXZlU3RhcnRNcyA+IHN0YXJ0TXMpIHtcbiAgICBjb25zdCBxdWV1ZWRGcmFjID0gdGltZVRvRnJhY3Rpb24oYWN0aXZlU3RhcnRNcywgc3RhcnRNcywgZHVyYXRpb24pO1xuICAgIGlmIChxdWV1ZWRGcmFjID4gMC4wMDEpIHtcbiAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICBzdGFydEZyYWN0aW9uOiAwLFxuICAgICAgICBlbmRGcmFjdGlvbjogcXVldWVkRnJhYyxcbiAgICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIH0pO1xuICAgICAgY3Vyc29yID0gcXVldWVkRnJhYztcbiAgICB9XG4gIH1cblxuICBzZWdtZW50cy5wdXNoKHtcbiAgICBzdGFydEZyYWN0aW9uOiBjdXJzb3IsXG4gICAgZW5kRnJhY3Rpb246IDEsXG4gICAgc3RhdHVzOiBmYWlsZWRFdmVudCA/ICdmYWlsZWQnIDogcnVuU2VnbWVudFN0YXR1cyhydW5TdGF0dXMpLFxuICB9KTtcblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVWMVJ1blNlZ21lbnRzKFxuICBzdGFydE1zOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGFjdGl2ZVN0YXJ0TXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgcnVuU3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcblxuICBsZXQgY3Vyc29yID0gMDtcbiAgaWYgKGFjdGl2ZVN0YXJ0TXMgIT09IHVuZGVmaW5lZCAmJiBhY3RpdmVTdGFydE1zID4gc3RhcnRNcykge1xuICAgIGNvbnN0IHF1ZXVlZEZyYWMgPSB0aW1lVG9GcmFjdGlvbihhY3RpdmVTdGFydE1zLCBzdGFydE1zLCBkdXJhdGlvbik7XG4gICAgaWYgKHF1ZXVlZEZyYWMgPiAwLjAwMSkge1xuICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICAgIGVuZEZyYWN0aW9uOiBxdWV1ZWRGcmFjLFxuICAgICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgICAgfSk7XG4gICAgICBjdXJzb3IgPSBxdWV1ZWRGcmFjO1xuICAgIH1cbiAgfVxuXG4gIHNlZ21lbnRzLnB1c2goe1xuICAgIHN0YXJ0RnJhY3Rpb246IGN1cnNvcixcbiAgICBlbmRGcmFjdGlvbjogMSxcbiAgICBzdGF0dXM6IHJ1blNlZ21lbnRTdGF0dXMocnVuU3RhdHVzKSxcbiAgfSk7XG5cbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG4vKipcbiAqIENvbXB1dGUgZXZlbnQtYmFzZWQgc2VnbWVudHMgZm9yIGEgc3Bhbi4gRGlzcGF0Y2hlcyBvbiBgc3Bhbi5yZXNvdXJjZWBcbiAqIHRvIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZS10eXBlLXNwZWNpZmljIHNlZ21lbnQgYnVpbGRlci5cbiAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgZm9yIGdlbmVyaWMgKG5vbi13b3JrZmxvdykgc3BhbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3BhblNlZ21lbnRzKHNwYW46IFNwYW4pOiBTZWdtZW50W10ge1xuICBjb25zdCBzdGFydE1zID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5zdGFydFRpbWUpO1xuICBjb25zdCBkdXJhdGlvbiA9IGdldFNwYW5EdXJhdGlvbk1zKHNwYW4pO1xuICBjb25zdCBhY3RpdmVTdGFydE1zID0gc3Bhbi5hY3RpdmVTdGFydFRpbWVcbiAgICA/IGdldEhpZ2hSZXNJbk1zKHNwYW4uYWN0aXZlU3RhcnRUaW1lKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIHN3aXRjaCAoc3Bhbi5yZXNvdXJjZSkge1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgcmV0dXJuIGNvbXB1dGVTdGVwU2VnbWVudHNGcm9tU3BhbihzdGFydE1zLCBkdXJhdGlvbiwgc3Bhbi5ldmVudHMpO1xuICAgIGNhc2UgJ2hvb2snOlxuICAgICAgcmV0dXJuIGNvbXB1dGVIb29rU2VnbWVudHNGcm9tU3BhbihzdGFydE1zLCBkdXJhdGlvbiwgc3Bhbi5ldmVudHMpO1xuICAgIGNhc2UgJ3NsZWVwJzpcbiAgICAgIHJldHVybiBjb21wdXRlU2xlZXBTZWdtZW50c0Zyb21TcGFuKHN0YXJ0TXMsIGR1cmF0aW9uLCBzcGFuLmV2ZW50cyk7XG4gICAgY2FzZSAncnVuJzpcbiAgICAgIHJldHVybiBjb21wdXRlUnVuU2VnbWVudHNGcm9tU3BhbihcbiAgICAgICAgc3RhcnRNcyxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIGFjdGl2ZVN0YXJ0TXMsXG4gICAgICAgIHNwYW4uZXZlbnRzLFxuICAgICAgICBzcGFuLmF0dHJpYnV0ZXNcbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNwYW4gbWFya2VycyDigJQgcG9pbnQtaW4tdGltZSBldmVudHMgcmVuZGVyZWQgYXMgdGlja3Mgb24gdG9wIG9mIGEgYmFyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBTcGFuTWFya2VyIHtcbiAgdGltZU1zOiBudW1iZXI7XG59XG5cbi8vIGBob29rX3JlY2VpdmVkYCA9IGEgcmVzdW1wdGlvbjsgYGF0dHJfc2V0YCA9IGF0dHJpYnV0ZXMgd3JpdHRlbiBtaWQtc3Bhbi5cbmNvbnN0IE1BUktFUl9FVkVOVF9OQU1FUyA9IFsnaG9va19yZWNlaXZlZCcsICdhdHRyX3NldCddO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNwYW5NYXJrZXJzKHNwYW46IFNwYW4pOiBTcGFuTWFya2VyW10ge1xuICByZXR1cm4gc29ydGVkRXZlbnRNYXJrcyhzcGFuLmV2ZW50cywgTUFSS0VSX0VWRU5UX05BTUVTKS5tYXAoKG1hcmspID0+ICh7XG4gICAgdGltZU1zOiBtYXJrLnRpbWUsXG4gIH0pKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPZmZzY3JlZW5TaWRlIHtcbiAgY291bnQ6IG51bWJlcjtcbiAgLyoqIE5lYXJlc3Qgb2ZmLXNjcmVlbiBtYXJrZXIg4oCUIHRoZSBvbmUgYSByZXZlYWwganVtcHMgdG8uICovXG4gIG5lYXJlc3RNczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9mZnNjcmVlbk1hcmtlcnMge1xuICBsZWZ0OiBPZmZzY3JlZW5TaWRlIHwgbnVsbDtcbiAgcmlnaHQ6IE9mZnNjcmVlblNpZGUgfCBudWxsO1xufVxuXG4vKiogUGFydGl0aW9uIG1hcmtlcnMgb3V0c2lkZSBgW3Zpc2libGVTdGFydE1zLCB2aXNpYmxlRW5kTXNdYCBieSBzaWRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPZmZzY3JlZW5NYXJrZXJzKFxuICBtYXJrZXJzOiBTcGFuTWFya2VyW10sXG4gIHZpc2libGVTdGFydE1zOiBudW1iZXIsXG4gIHZpc2libGVFbmRNczogbnVtYmVyXG4pOiBPZmZzY3JlZW5NYXJrZXJzIHtcbiAgbGV0IGxlZnRDb3VudCA9IDA7XG4gIGxldCByaWdodENvdW50ID0gMDtcbiAgbGV0IG5lYXJlc3RMZWZ0ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICBsZXQgbmVhcmVzdFJpZ2h0ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICBmb3IgKGNvbnN0IHsgdGltZU1zIH0gb2YgbWFya2Vycykge1xuICAgIGlmICh0aW1lTXMgPCB2aXNpYmxlU3RhcnRNcykge1xuICAgICAgbGVmdENvdW50Kys7XG4gICAgICBpZiAodGltZU1zID4gbmVhcmVzdExlZnQpIG5lYXJlc3RMZWZ0ID0gdGltZU1zO1xuICAgIH0gZWxzZSBpZiAodGltZU1zID4gdmlzaWJsZUVuZE1zKSB7XG4gICAgICByaWdodENvdW50Kys7XG4gICAgICBpZiAodGltZU1zIDwgbmVhcmVzdFJpZ2h0KSBuZWFyZXN0UmlnaHQgPSB0aW1lTXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgbGVmdDogbGVmdENvdW50ID4gMCA/IHsgY291bnQ6IGxlZnRDb3VudCwgbmVhcmVzdE1zOiBuZWFyZXN0TGVmdCB9IDogbnVsbCxcbiAgICByaWdodDpcbiAgICAgIHJpZ2h0Q291bnQgPiAwID8geyBjb3VudDogcmlnaHRDb3VudCwgbmVhcmVzdE1zOiBuZWFyZXN0UmlnaHQgfSA6IG51bGwsXG4gIH07XG59XG4iXX0=
|
|
430
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uZXctdHJhY2Utdmlld2VyL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLGNBQWMsR0FDZixNQUFNLDZCQUE2QixDQUFDO0FBYXJDLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUN4QyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFFdEMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEdBQUcsUUFBUTtZQUFFLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsTUFBTTtZQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFB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RUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUN6RSxLQUFLLEVBQ0gsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtLQUN6RSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGZvcm1hdER1cmF0aW9uLFxuICBmb3JtYXREdXJhdGlvblByZWNpc2UsXG4gIGdldEhpZ2hSZXNJbk1zLFxufSBmcm9tICcuLi90cmFjZS12aWV3ZXIvdXRpbC90aW1pbmcnO1xuaW1wb3J0IHR5cGUgeyBTcGFuLCBTcGFuRXZlbnQgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSb290IGJvdW5kc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdEJvdW5kcyB7XG4gIHN0YXJ0VGltZTogbnVtYmVyO1xuICBlbmRUaW1lOiBudW1iZXI7XG4gIGR1cmF0aW9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUm9vdEJvdW5kcyhzcGFuczogU3BhbltdKTogUm9vdEJvdW5kcyB7XG4gIGxldCBtaW5TdGFydCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgbGV0IG1heEVuZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICBmb3IgKGNvbnN0IHNwYW4gb2Ygc3BhbnMpIHtcbiAgICBjb25zdCBzID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5zdGFydFRpbWUpO1xuICAgIGNvbnN0IGUgPSBnZXRIaWdoUmVzSW5NcyhzcGFuLmVuZFRpbWUpO1xuICAgIGlmIChzIDwgbWluU3RhcnQpIG1pblN0YXJ0ID0gcztcbiAgICBpZiAoZSA+IG1heEVuZCkgbWF4RW5kID0gZTtcbiAgfVxuXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG1pblN0YXJ0KSB8fCAhTnVtYmVyLmlzRmluaXRlKG1heEVuZCkpIHtcbiAgICByZXR1cm4geyBzdGFydFRpbWU6IDAsIGVuZFRpbWU6IDEsIGR1cmF0aW9uOiAxIH07XG4gIH1cblxuICBjb25zdCBkdXJhdGlvbiA9IE1hdGgubWF4KG1heEVuZCAtIG1pblN0YXJ0LCAxKTtcbiAgcmV0dXJuIHsgc3RhcnRUaW1lOiBtaW5TdGFydCwgZW5kVGltZTogbWF4RW5kLCBkdXJhdGlvbiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BhbkR1cmF0aW9uTXMoc3BhbjogU3Bhbik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChcbiAgICAwLFxuICAgIGdldEhpZ2hSZXNJbk1zKHNwYW4uZW5kVGltZSkgLSBnZXRIaWdoUmVzSW5NcyhzcGFuLnN0YXJ0VGltZSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3BhbkVycm9yZWQoc3BhbjogU3Bhbik6IGJvb2xlYW4ge1xuICBjb25zdCB3b3JrZmxvd1N0YXR1cyA9IChzcGFuLmF0dHJpYnV0ZXMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICA/LnN0YXR1cyBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJldHVybiBzcGFuLnN0YXR1cy5jb2RlID09PSAyIHx8IHdvcmtmbG93U3RhdHVzID09PSAnZmFpbGVkJztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBWaWV3cG9ydFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlld3BvcnRSYW5nZSB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENsYW1wIGEgY2FuZGlkYXRlIHZpZXdwb3J0IHRvIHRoZSByb290IGV4dGVudC4gVGhlIHJlcXVlc3RlZCBkdXJhdGlvbiBpc1xuICogcHJlc2VydmVkIHdoZXJlIHBvc3NpYmxlIChjbGFtcGVkIHRvIFttaW5EdXJhdGlvbk1zLCByb290IGR1cmF0aW9uXSksIHRoZW5cbiAqIHRoZSB3aW5kb3cgaXMgc2hpZnRlZCBiYWNrIGluc2lkZSB0aGUgcm9vdCBib3VuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcFZpZXdwb3J0VG9Sb290KFxuICBuZXh0OiBWaWV3cG9ydFJhbmdlLFxuICByb290U3RhcnQ6IG51bWJlcixcbiAgcm9vdEVuZDogbnVtYmVyLFxuICBtaW5EdXJhdGlvbk1zOiBudW1iZXJcbik6IFZpZXdwb3J0UmFuZ2Uge1xuICBjb25zdCByb290RHVyYXRpb24gPSBNYXRoLm1heChyb290RW5kIC0gcm9vdFN0YXJ0LCBtaW5EdXJhdGlvbk1zKTtcbiAgY29uc3QgZHVyYXRpb24gPSBNYXRoLm1pbihcbiAgICByb290RHVyYXRpb24sXG4gICAgTWF0aC5tYXgobWluRHVyYXRpb25NcywgbmV4dC5lbmQgLSBuZXh0LnN0YXJ0KVxuICApO1xuICBjb25zdCBtYXhTdGFydCA9IHJvb3RFbmQgLSBkdXJhdGlvbjtcbiAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihNYXRoLm1heChuZXh0LnN0YXJ0LCByb290U3RhcnQpLCBtYXhTdGFydCk7XG4gIHJldHVybiB7IHN0YXJ0LCBlbmQ6IHN0YXJ0ICsgZHVyYXRpb24gfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXaGVlbCBnZXN0dXJlcyDigJQgc2hhcmVkIGJldHdlZW4gdGhlIHRpbWVsaW5lIGFuZCB0aGUgbWluaW1hcFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDb252ZXJ0IGEgd2hlZWwgZGVsdGEgdG8gcGl4ZWwgdW5pdHMgKGxpbmUtbW9kZSBkZWx0YXMgYXJyaXZlIGluIGxpbmVzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGVlbERlbHRhVG9QaXhlbHMoZGVsdGE6IG51bWJlciwgZGVsdGFNb2RlOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gZGVsdGFNb2RlID09PSAxID8gZGVsdGEgKiAxNiA6IGRlbHRhO1xufVxuXG4vKipcbiAqIEV4cG9uZW50aWFsIHpvb20gZmFjdG9yIGZvciBhIHdoZWVsIGdlc3R1cmUuIENvYXJzZSBtb3VzZS13aGVlbCBzdGVwcyBhcmVcbiAqIGRhbXBlZCBoYXJkZXIgdGhhbiB0cmFja3BhZCBwaW5jaGVzIHNvIGJvdGggZmVlbCBzaW1pbGFyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2hlZWxab29tU2NhbGVGYWN0b3IoZXZlbnQ6IHtcbiAgZGVsdGFZOiBudW1iZXI7XG4gIGRlbHRhTW9kZTogbnVtYmVyO1xufSk6IG51bWJlciB7XG4gIGNvbnN0IGR5ID0gd2hlZWxEZWx0YVRvUGl4ZWxzKGV2ZW50LmRlbHRhWSwgZXZlbnQuZGVsdGFNb2RlKTtcbiAgY29uc3QgaXNNb3VzZVdoZWVsID0gZXZlbnQuZGVsdGFNb2RlID09PSAxIHx8IE1hdGguYWJzKGV2ZW50LmRlbHRhWSkgPj0gNTA7XG4gIHJldHVybiAyICoqIChkeSAvIChpc01vdXNlV2hlZWwgPyAyMDAgOiA2MCkpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRpbWUgbWFya2Vyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZU1hcmtlciB7XG4gIHBvc2l0aW9uOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBudW1iZXI7XG59XG5cbmNvbnN0IE5JQ0VfSU5URVJWQUxTID0gW1xuICAxLCAyLCA1LCAxMCwgMjAsIDUwLCAxMDAsIDIwMCwgNTAwLCAxXzAwMCwgMl8wMDAsIDVfMDAwLCAxMF8wMDAsIDIwXzAwMCxcbiAgNTBfMDAwLCAxMDBfMDAwLCAyMDBfMDAwLCA1MDBfMDAwLCAxXzAwMF8wMDAsIDJfMDAwXzAwMCwgNV8wMDBfMDAwLFxuICAxMF8wMDBfMDAwLCAyMF8wMDBfMDAwLCA1MF8wMDBfMDAwLCAxMDBfMDAwXzAwMCwgMjAwXzAwMF8wMDAsIDUwMF8wMDBfMDAwLFxuICAxXzAwMF8wMDBfMDAwLCAyXzAwMF8wMDBfMDAwLCA1XzAwMF8wMDBfMDAwLFxuXTtcblxuY29uc3QgTUFYX01BUktFUlMgPSA4O1xuXG5jb25zdCBNU19JTl9TRUNPTkQgPSAxMDAwO1xuXG5mdW5jdGlvbiBwaWNrSW50ZXJ2YWwodmlld0R1cmF0aW9uOiBudW1iZXIsIG1heFRpY2tzOiBudW1iZXIpOiBudW1iZXIge1xuICBmb3IgKGNvbnN0IGludGVydmFsIG9mIE5JQ0VfSU5URVJWQUxTKSB7XG4gICAgaWYgKHZpZXdEdXJhdGlvbiAvIGludGVydmFsIDw9IG1heFRpY2tzKSByZXR1cm4gaW50ZXJ2YWw7XG4gIH1cbiAgcmV0dXJuIE5JQ0VfSU5URVJWQUxTW05JQ0VfSU5URVJWQUxTLmxlbmd0aCAtIDFdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVRpbWVNYXJrZXJzKFxuICB2aWV3RHVyYXRpb246IG51bWJlcixcbiAgb2Zmc2V0OiBudW1iZXJcbik6IFRpbWVNYXJrZXJbXSB7XG4gIGlmICh2aWV3RHVyYXRpb24gPD0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IG1heFRpY2tzID0gNjtcbiAgY29uc3QgaW50ZXJ2YWwgPSBwaWNrSW50ZXJ2YWwodmlld0R1cmF0aW9uLCBtYXhUaWNrcyk7XG5cbiAgLy8gU3ViLXNlY29uZCBzdGVwcyBuZWVkIGZyYWN0aW9uYWwgbGFiZWxzLCBvciB0aWNrcyBwYXN0IDFzIGNvbGxpZGUgYXNcbiAgLy8gZHVwbGljYXRlIHdob2xlIHNlY29uZHMgKFwi4oCmMXMsIDJzLCAycywgM3NcIikuIFNjYWxlIGRlY2ltYWxzIHRvIHRoZSBzdGVwLlxuICBjb25zdCBmcmFjdGlvbkRpZ2l0cyA9XG4gICAgaW50ZXJ2YWwgPj0gTVNfSU5fU0VDT05EXG4gICAgICA/IDBcbiAgICAgIDogTWF0aC5jZWlsKC1NYXRoLmxvZzEwKGludGVydmFsIC8gTVNfSU5fU0VDT05EKSk7XG5cbiAgY29uc3QgZmlyc3RUaWNrID0gTWF0aC5jZWlsKG9mZnNldCAvIGludGVydmFsKSAqIGludGVydmFsO1xuICBjb25zdCBtYXJrZXJzOiBUaW1lTWFya2VyW10gPSBbXTtcblxuICBmb3IgKGxldCB0ID0gZmlyc3RUaWNrOyB0IDw9IG9mZnNldCArIHZpZXdEdXJhdGlvbjsgdCArPSBpbnRlcnZhbCkge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gKHQgLSBvZmZzZXQpIC8gdmlld0R1cmF0aW9uO1xuICAgIGlmIChwb3NpdGlvbiA8IC0wLjAxIHx8IHBvc2l0aW9uID4gMS4wMSkgY29udGludWU7XG4gICAgbWFya2Vycy5wdXNoKHtcbiAgICAgIHBvc2l0aW9uOiBNYXRoLm1pbihNYXRoLm1heChwb3NpdGlvbiwgMCksIDEpLFxuICAgICAgbGFiZWw6XG4gICAgICAgIGZyYWN0aW9uRGlnaXRzID09PSAwXG4gICAgICAgICAgPyBmb3JtYXREdXJhdGlvbihNYXRoLmFicyh0KSwgdHJ1ZSlcbiAgICAgICAgICA6IGZvcm1hdER1cmF0aW9uUHJlY2lzZShNYXRoLmFicyh0KSwgZnJhY3Rpb25EaWdpdHMpLFxuICAgICAgdmFsdWU6IHQsXG4gICAgfSk7XG4gICAgaWYgKG1hcmtlcnMubGVuZ3RoID49IE1BWF9NQVJLRVJTKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBtYXJrZXJzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNwYW4gZ2FwcyDigJQgdGltZSBkZWx0YXMgYmV0d2VlbiBjb25zZWN1dGl2ZSBzcGFucyAoQWx0LWtleSBvdmVybGF5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BhbkdhcCB7XG4gIGdhcE1zOiBudW1iZXI7XG4gIGxlZnRGcmFjOiBudW1iZXI7XG4gIHJpZ2h0RnJhYzogbnVtYmVyO1xuICByb3dJbmRleDogbnVtYmVyO1xufVxuXG4vKiogUHJvamVjdCBhbiBhYnNvbHV0ZSB0aW1lIG9udG8gdGhlIHZpZXdwb3J0IGFzIGEgY2xhbXBlZCBbMCwgMV0gZnJhY3Rpb24uICovXG5mdW5jdGlvbiB0b1ZpZXdwb3J0RnJhYyhtczogbnVtYmVyLCB2aWV3U3RhcnQ6IG51bWJlciwgcmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCgobXMgLSB2aWV3U3RhcnQpIC8gcmFuZ2UsIDApLCAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTcGFuR2FwcyhcbiAgc3BhbnM6IFNwYW5bXSxcbiAgdmlld1N0YXJ0OiBudW1iZXIsXG4gIHZpZXdFbmQ6IG51bWJlclxuKTogU3BhbkdhcFtdIHtcbiAgY29uc3QgcmFuZ2UgPSB2aWV3RW5kIC0gdmlld1N0YXJ0O1xuICBpZiAocmFuZ2UgPD0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGdhcHM6IFNwYW5HYXBbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGVuZFRpbWUgPSBnZXRIaWdoUmVzSW5NcyhzcGFuc1tpXS5lbmRUaW1lKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBnZXRIaWdoUmVzSW5NcyhzcGFuc1tpICsgMV0uc3RhcnRUaW1lKTtcbiAgICBjb25zdCBnYXBNcyA9IHN0YXJ0VGltZSAtIGVuZFRpbWU7XG4gICAgaWYgKGdhcE1zIDw9IDApIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbGVmdEZyYWMgPSB0b1ZpZXdwb3J0RnJhYyhlbmRUaW1lLCB2aWV3U3RhcnQsIHJhbmdlKTtcbiAgICBjb25zdCByaWdodEZyYWMgPSB0b1ZpZXdwb3J0RnJhYyhzdGFydFRpbWUsIHZpZXdTdGFydCwgcmFuZ2UpO1xuICAgIGlmIChyaWdodEZyYWMgLSBsZWZ0RnJhYyA8IDAuMDAxKSBjb250aW51ZTtcblxuICAgIGdhcHMucHVzaCh7IGdhcE1zLCBsZWZ0RnJhYywgcmlnaHRGcmFjLCByb3dJbmRleDogaSB9KTtcbiAgfVxuICByZXR1cm4gZ2Fwcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTcGFuRGVsdGEge1xuICAvKiogVHJ1ZSBtZWFzdXJlZCB0aW1lIGJldHdlZW4gdGhlIHR3byBzcGFucywgdW5hZmZlY3RlZCBieSBjbGFtcGluZy4gKi9cbiAgZGVsdGFNczogbnVtYmVyO1xuICAvKiogVmlld3BvcnQtY2xhbXBlZCBmcmFjdGlvbiBvZiB0aGUgYW5jaG9yIHNwYW4ncyBtZWFzdXJlZCBlZGdlLiAqL1xuICBhbmNob3JGcmFjOiBudW1iZXI7XG4gIC8qKiBWaWV3cG9ydC1jbGFtcGVkIGZyYWN0aW9uIG9mIHRoZSBob3ZlcmVkIHNwYW4ncyBtZWFzdXJlZCBlZGdlLiAqL1xuICBob3ZlcmVkRnJhYzogbnVtYmVyO1xuICAvKipcbiAgICogV2hpY2ggZWRnZSBvZiB0aGUgYW5jaG9yIHNwYW4gdGhlIG1lYXN1cmVtZW50IHJ1bnMgZnJvbTogaXRzIGVuZCB3aGVuIHRoZVxuICAgKiBzcGFucyBhcmUgZGlzam9pbnQgYW5kIHRoZSBhbmNob3IgY29tZXMgZmlyc3QsIG90aGVyd2lzZSBpdHMgc3RhcnQuXG4gICAqL1xuICBhbmNob3JFZGdlOiAnc3RhcnQnIHwgJ2VuZCc7XG4gIC8qKlxuICAgKiBTZXQgd2hlbiB0aGUgaG92ZXJlZCBzcGFuIGxpZXMgZW50aXJlbHkgb3V0c2lkZSB0aGUgdmlld3BvcnQgb24gb25lIHNpZGUsXG4gICAqIGkuZS4gaXRzIHJvdyByZW5kZXJzIGFuIG9mZi1zY3JlZW4gYXJyb3cgdGhlIGxpbmUgc2hvdWxkIHN0b3Agc2hvcnQgb2YuXG4gICAqL1xuICBob3ZlcmVkT2Zmc2NyZWVuOiAnbGVmdCcgfCAncmlnaHQnIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBNZWFzdXJlIHRoZSB0ZW1wb3JhbCBkZWx0YSBiZXR3ZWVuIGFuIGFuY2hvciAoc2VsZWN0ZWQpIHNwYW4gYW5kIGEgaG92ZXJlZFxuICogc3BhbiBmb3IgdGhlIEFsdCtob3ZlciBtZWFzdXJlbWVudCBvdmVybGF5LiBPcmRlcmluZyB0aGUgdHdvIHNwYW5zIGJ5IHN0YXJ0XG4gKiB0aW1lIChFID0gZWFybGllci1zdGFydGluZywgTCA9IGxhdGVyLXN0YXJ0aW5nKSwgdGhlIG1lYXN1cmVtZW50IHJ1bnMgdG9cbiAqIEwncyBzdGFydCBmcm9tIEUncyBlbmQgd2hlbiB0aGUgc3BhbnMgYXJlIGRpc2pvaW50IChcImhvdyBsb25nIGFmdGVyIEUgZW5kZWRcbiAqIGRpZCBMIHN0YXJ0XCIpLCBvciBmcm9tIEUncyBzdGFydCB3aGVuIHRoZXkgb3ZlcmxhcCAoXCJob3cgbG9uZyBhZnRlciBFXG4gKiBzdGFydGVkIGRpZCBMIHN0YXJ0XCIpLiBGcmFjdGlvbnMgYXJlIGNsYW1wZWQgdG8gdGhlIHZpZXdwb3J0IGxpa2VcbiAqIGBjb21wdXRlU3BhbkdhcHNgOyBgZGVsdGFNc2AgaXMgYWx3YXlzIHRoZSB0cnVlIGR1cmF0aW9uLiBSZXR1cm5zIG51bGwgd2hlblxuICogdGhlIG1lYXN1cmVtZW50IGxpZXMgZW50aXJlbHkgb3V0c2lkZSB0aGUgdmlld3BvcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3BhbkRlbHRhKFxuICBhbmNob3I6IFNwYW4sXG4gIGhvdmVyZWQ6IFNwYW4sXG4gIHZpZXdTdGFydDogbnVtYmVyLFxuICB2aWV3RW5kOiBudW1iZXJcbik6IFNwYW5EZWx0YSB8IG51bGwge1xuICBjb25zdCByYW5nZSA9IHZpZXdFbmQgLSB2aWV3U3RhcnQ7XG4gIGlmIChyYW5nZSA8PSAwKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBhbmNob3JTdGFydCA9IGdldEhpZ2hSZXNJbk1zKGFuY2hvci5zdGFydFRpbWUpO1xuICBjb25zdCBob3ZlcmVkU3RhcnQgPSBnZXRIaWdoUmVzSW5Ncyhob3ZlcmVkLnN0YXJ0VGltZSk7XG4gIGNvbnN0IGFuY2hvcklzRWFybGllciA9IGFuY2hvclN0YXJ0IDw9IGhvdmVyZWRTdGFydDtcbiAgY29uc3QgZWFybGllclN0YXJ0ID0gYW5jaG9ySXNFYXJsaWVyID8gYW5jaG9yU3RhcnQgOiBob3ZlcmVkU3RhcnQ7XG4gIGNvbnN0IGVhcmxpZXJFbmQgPSBnZXRIaWdoUmVzSW5NcyhcbiAgICBhbmNob3JJc0VhcmxpZXIgPyBhbmNob3IuZW5kVGltZSA6IGhvdmVyZWQuZW5kVGltZVxuICApO1xuICBjb25zdCBsYXRlclN0YXJ0ID0gYW5jaG9ySXNFYXJsaWVyID8gaG92ZXJlZFN0YXJ0IDogYW5jaG9yU3RhcnQ7XG5cbiAgY29uc3Qgb3JpZ2luTXMgPSBlYXJsaWVyRW5kIDw9IGxhdGVyU3RhcnQgPyBlYXJsaWVyRW5kIDogZWFybGllclN0YXJ0O1xuICBjb25zdCBkZWx0YU1zID0gbGF0ZXJTdGFydCAtIG9yaWdpbk1zO1xuXG4gIC8vIEVudGlyZWx5IG91dHNpZGUgdGhlIHZpZXdwb3J0LiBDb21wYXJlZCBpbiB0aW1lLXNwYWNlIChub3QgY2xhbXBlZFxuICAvLyBmcmFjdGlvbnMpIHNvIGEgemVyby1kZWx0YSBwb2ludCBzaXR0aW5nIGV4YWN0bHkgb24gYSB2aWV3cG9ydCBlZGdlIOKAlFxuICAvLyBlLmcuIHRoZSByb290IHNwYW4gc2VsZWN0ZWQgYXQgZGVmYXVsdCB6b29tIOKAlCBzdGlsbCByZW5kZXJzLlxuICBpZiAobGF0ZXJTdGFydCA8IHZpZXdTdGFydCB8fCBvcmlnaW5NcyA+IHZpZXdFbmQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbkZyYWMgPSB0b1ZpZXdwb3J0RnJhYyhvcmlnaW5Ncywgdmlld1N0YXJ0LCByYW5nZSk7XG4gIGNvbnN0IGxhdGVyRnJhYyA9IHRvVmlld3BvcnRGcmFjKGxhdGVyU3RhcnQsIHZpZXdTdGFydCwgcmFuZ2UpO1xuXG4gIGNvbnN0IGhvdmVyZWRFbmQgPSBnZXRIaWdoUmVzSW5Ncyhob3ZlcmVkLmVuZFRpbWUpO1xuXG4gIHJldHVybiB7XG4gICAgZGVsdGFNcyxcbiAgICBhbmNob3JGcmFjOiBhbmNob3JJc0VhcmxpZXIgPyBvcmlnaW5GcmFjIDogbGF0ZXJGcmFjLFxuICAgIGhvdmVyZWRGcmFjOiBhbmNob3JJc0VhcmxpZXIgPyBsYXRlckZyYWMgOiBvcmlnaW5GcmFjLFxuICAgIGFuY2hvckVkZ2U6IGFuY2hvcklzRWFybGllciAmJiBlYXJsaWVyRW5kIDw9IGxhdGVyU3RhcnQgPyAnZW5kJyA6ICdzdGFydCcsXG4gICAgaG92ZXJlZE9mZnNjcmVlbjpcbiAgICAgIGhvdmVyZWRTdGFydCA+IHZpZXdFbmQgPyAncmlnaHQnIDogaG92ZXJlZEVuZCA8IHZpZXdTdGFydCA/ICdsZWZ0JyA6IG51bGwsXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVzb3VyY2UgY29sb3JzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IFJFU09VUkNFX0NPTE9SUzogUmVjb3JkPFxuICBzdHJpbmcsXG4gIHtcbiAgICBiZzogc3RyaW5nO1xuICAgIGJvcmRlcjogc3RyaW5nO1xuICAgIGVycm9yQmc/OiBzdHJpbmc7XG4gICAgZXJyb3JCb3JkZXI/OiBzdHJpbmc7XG4gIH1cbj4gPSB7XG4gIHJ1bjoge1xuICAgIGJnOiAndmFyKC0tZHMtYmx1ZS0yMDApJyxcbiAgICBib3JkZXI6ICd2YXIoLS1kcy1ibHVlLTUwMCknLFxuICAgIGVycm9yQmc6ICd2YXIoLS1kcy1yZWQtMjAwKScsXG4gICAgZXJyb3JCb3JkZXI6ICd2YXIoLS1kcy1yZWQtNTAwKScsXG4gIH0sXG4gIHN0ZXA6IHtcbiAgICBiZzogJ3ZhcigtLWRzLWdyZWVuLTIwMCknLFxuICAgIGJvcmRlcjogJ3ZhcigtLWRzLWdyZWVuLTUwMCknLFxuICAgIGVycm9yQmc6ICd2YXIoLS1kcy1yZWQtMjAwKScsXG4gICAgZXJyb3JCb3JkZXI6ICd2YXIoLS1kcy1yZWQtNTAwKScsXG4gIH0sXG4gIC8vIFBhc3NpdmUgc3BhbnMgKGhvb2tzKSBzdGF5IGdyYXkg4oCUIG1hdGNoZXMgZXZlbnQtbGlzdCBpY29ucyBhbmQgdGhlIG1pbmltYXAuXG4gIGhvb2s6IHtcbiAgICBiZzogJ3ZhcigtLWRzLWdyYXktMjAwKScsXG4gICAgYm9yZGVyOiAndmFyKC0tZHMtZ3JheS01MDApJyxcbiAgICBlcnJvckJnOiAndmFyKC0tZHMtcmVkLTIwMCknLFxuICAgIGVycm9yQm9yZGVyOiAndmFyKC0tZHMtcmVkLTUwMCknLFxuICB9LFxuICBzbGVlcDoge1xuICAgIGJnOiAndmFyKC0tZHMtcHVycGxlLTIwMCknLFxuICAgIGJvcmRlcjogJ3ZhcigtLWRzLXB1cnBsZS01MDApJyxcbiAgICBlcnJvckJnOiAndmFyKC0tZHMtcmVkLTIwMCknLFxuICAgIGVycm9yQm9yZGVyOiAndmFyKC0tZHMtcmVkLTUwMCknLFxuICB9LFxuICBkZWZhdWx0OiB7XG4gICAgYmc6ICd2YXIoLS1kcy1ncmF5LTIwMCknLFxuICAgIGJvcmRlcjogJ3ZhcigtLWRzLWdyYXktNTAwKScsXG4gICAgZXJyb3JCZzogJ3ZhcigtLWRzLXJlZC0yMDApJyxcbiAgICBlcnJvckJvcmRlcjogJ3ZhcigtLWRzLXJlZC01MDApJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNvdXJjZUNvbG9yKHJlc291cmNlOiBzdHJpbmcpOiB7XG4gIGJnOiBzdHJpbmc7XG4gIGJvcmRlcjogc3RyaW5nO1xuICBlcnJvckJnPzogc3RyaW5nO1xuICBlcnJvckJvcmRlcj86IHN0cmluZztcbn0ge1xuICByZXR1cm4gUkVTT1VSQ0VfQ09MT1JTW3Jlc291cmNlXSA/PyBSRVNPVVJDRV9DT0xPUlMuZGVmYXVsdDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTcGFuIHNlZ21lbnRzIOKAlCBzcGxpdCBhIHRpbWVsaW5lIGJhciBpbnRvIGNvbG9yZWQgc2VjdGlvbnMgYnkgZXZlbnQgc3RhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBTZWdtZW50U3RhdHVzID1cbiAgfCAncXVldWVkJ1xuICB8ICdwZW5kaW5nJ1xuICB8ICdydW5uaW5nJ1xuICB8ICdjb21wbGV0ZWQnXG4gIHwgJ2ZhaWxlZCdcbiAgfCAncmV0cnlpbmcnXG4gIHwgJ3N1Y2NlZWRlZCdcbiAgfCAnd2FpdGluZydcbiAgfCAnc2xlZXBpbmcnXG4gIHwgJ3JlY2VpdmVkJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWdtZW50IHtcbiAgc3RhcnRGcmFjdGlvbjogbnVtYmVyO1xuICBlbmRGcmFjdGlvbjogbnVtYmVyO1xuICBzdGF0dXM6IFNlZ21lbnRTdGF0dXM7XG59XG5cbmZ1bmN0aW9uIGNsYW1wRnJhY3Rpb24odmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiB0aW1lVG9GcmFjdGlvbihcbiAgdGltZTogbnVtYmVyLFxuICBzcGFuU3RhcnQ6IG51bWJlcixcbiAgc3BhbkR1cmF0aW9uOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGlmIChzcGFuRHVyYXRpb24gPD0gMCkgcmV0dXJuIDA7XG4gIHJldHVybiBjbGFtcEZyYWN0aW9uKCh0aW1lIC0gc3BhblN0YXJ0KSAvIHNwYW5EdXJhdGlvbik7XG59XG5cbmludGVyZmFjZSBFdmVudE1hcmsge1xuICB0aW1lOiBudW1iZXI7XG4gIHR5cGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gc29ydGVkRXZlbnRNYXJrcyhcbiAgZXZlbnRzOiBTcGFuRXZlbnRbXSxcbiAgcmVsZXZhbnROYW1lczogc3RyaW5nW11cbik6IEV2ZW50TWFya1tdIHtcbiAgcmV0dXJuIGV2ZW50c1xuICAgIC5maWx0ZXIoKGUpID0+IHJlbGV2YW50TmFtZXMuaW5jbHVkZXMoZS5uYW1lKSlcbiAgICAubWFwKChlKSA9PiAoeyB0aW1lOiBnZXRIaWdoUmVzSW5NcyhlLnRpbWVzdGFtcCksIHR5cGU6IGUubmFtZSB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gYS50aW1lIC0gYi50aW1lKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0ZXBTZWdtZW50c0Zyb21TcGFuKFxuICBzdGFydE1zOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGV2ZW50czogU3BhbkV2ZW50W11cbik6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcbiAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybiBzZWdtZW50cztcblxuICBjb25zdCBtYXJrcyA9IHNvcnRlZEV2ZW50TWFya3MoZXZlbnRzLCBbXG4gICAgJ3N0ZXBfc3RhcnRlZCcsXG4gICAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAgICdzdGVwX2ZhaWxlZCcsXG4gICAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgXSk7XG5cbiAgaWYgKG1hcmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHNlZ21lbnRzLnB1c2goeyBzdGFydEZyYWN0aW9uOiAwLCBlbmRGcmFjdGlvbjogMSwgc3RhdHVzOiAncXVldWVkJyB9KTtcbiAgICByZXR1cm4gc2VnbWVudHM7XG4gIH1cblxuICBjb25zdCBmaXJzdEZyYWN0aW9uID0gdGltZVRvRnJhY3Rpb24obWFya3NbMF0udGltZSwgc3RhcnRNcywgZHVyYXRpb24pO1xuICBpZiAoZmlyc3RGcmFjdGlvbiA+IDAuMDAxKSB7XG4gICAgc2VnbWVudHMucHVzaCh7XG4gICAgICBzdGFydEZyYWN0aW9uOiAwLFxuICAgICAgZW5kRnJhY3Rpb246IGZpcnN0RnJhY3Rpb24sXG4gICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1hcmsgPSBtYXJrc1tpXTtcbiAgICBjb25zdCBtYXJrRnJhYyA9IHRpbWVUb0ZyYWN0aW9uKG1hcmsudGltZSwgc3RhcnRNcywgZHVyYXRpb24pO1xuICAgIGNvbnN0IG5leHRNYXJrID0gbWFya3NbaSArIDFdO1xuICAgIGNvbnN0IG5leHRGcmFjID0gbmV4dE1hcmtcbiAgICAgID8gdGltZVRvRnJhY3Rpb24obmV4dE1hcmsudGltZSwgc3RhcnRNcywgZHVyYXRpb24pXG4gICAgICA6IDE7XG5cbiAgICBpZiAobWFyay50eXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgaWYgKGkgPT09IG1hcmtzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgICAgc3RhcnRGcmFjdGlvbjogbWFya0ZyYWMsXG4gICAgICAgICAgZW5kRnJhY3Rpb246IDEsXG4gICAgICAgICAgc3RhdHVzOiAnc3VjY2VlZGVkJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXh0VHlwZSA9IG5leHRNYXJrLnR5cGU7XG4gICAgICAgIGNvbnN0IGF0dGVtcHRTdGF0dXM6IFNlZ21lbnRTdGF0dXMgPVxuICAgICAgICAgIG5leHRUeXBlID09PSAnc3RlcF9yZXRyeWluZycgfHwgbmV4dFR5cGUgPT09ICdzdGVwX2ZhaWxlZCdcbiAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgIDogbmV4dFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCdcbiAgICAgICAgICAgICAgPyAnc3VjY2VlZGVkJ1xuICAgICAgICAgICAgICA6ICdyZXRyeWluZyc7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0RnJhY3Rpb246IG1hcmtGcmFjLFxuICAgICAgICAgIGVuZEZyYWN0aW9uOiBuZXh0RnJhYyxcbiAgICAgICAgICBzdGF0dXM6IGF0dGVtcHRTdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWFyay50eXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICBzdGFydEZyYWN0aW9uOiBtYXJrRnJhYyxcbiAgICAgICAgZW5kRnJhY3Rpb246IG5leHRGcmFjLFxuICAgICAgICBzdGF0dXM6ICdyZXRyeWluZycsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hcmsudHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJykge1xuICAgICAgaWYgKG1hcmtGcmFjIDwgMC45OTkpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgICAgc3RhcnRGcmFjdGlvbjogbWFya0ZyYWMsXG4gICAgICAgICAgZW5kRnJhY3Rpb246IDEsXG4gICAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlSG9va1NlZ21lbnRzRnJvbVNwYW4oXG4gIHN0YXJ0TXM6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlcixcbiAgZXZlbnRzOiBTcGFuRXZlbnRbXVxuKTogU2VnbWVudFtdIHtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuICBpZiAoZHVyYXRpb24gPD0gMCkgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIGNvbnN0IGRpc3Bvc2VkID0gc29ydGVkRXZlbnRNYXJrcyhldmVudHMsIFsnaG9va19kaXNwb3NlZCddKVswXTtcbiAgY29uc3QgZGlzcG9zZWRGcmFjID0gZGlzcG9zZWRcbiAgICA/IHRpbWVUb0ZyYWN0aW9uKGRpc3Bvc2VkLnRpbWUsIHN0YXJ0TXMsIGR1cmF0aW9uKVxuICAgIDogbnVsbDtcblxuICBjb25zdCB3YWl0aW5nRW5kID0gZGlzcG9zZWRGcmFjID8/IDE7XG4gIGlmICh3YWl0aW5nRW5kID4gMC4wMDEpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICBlbmRGcmFjdGlvbjogd2FpdGluZ0VuZCxcbiAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRpc3Bvc2VkRnJhYyAhPT0gbnVsbCAmJiBkaXNwb3NlZEZyYWMgPCAwLjk5OSkge1xuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogZGlzcG9zZWRGcmFjLFxuICAgICAgZW5kRnJhY3Rpb246IDEsXG4gICAgICBzdGF0dXM6ICdzdWNjZWVkZWQnLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU2xlZXBTZWdtZW50c0Zyb21TcGFuKFxuICBfc3RhcnRNczogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICBfZXZlbnRzOiBTcGFuRXZlbnRbXVxuKTogU2VnbWVudFtdIHtcbiAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybiBbXTtcbiAgcmV0dXJuIFt7IHN0YXJ0RnJhY3Rpb246IDAsIGVuZEZyYWN0aW9uOiAxLCBzdGF0dXM6ICdzbGVlcGluZycgfV07XG59XG5cbmZ1bmN0aW9uIHJ1blNlZ21lbnRTdGF0dXMocnVuU3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBTZWdtZW50U3RhdHVzIHtcbiAgaWYgKHJ1blN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHJldHVybiAnZmFpbGVkJztcbiAgaWYgKHJ1blN0YXR1cyA9PT0gJ3BlbmRpbmcnKSByZXR1cm4gJ3BlbmRpbmcnO1xuICBpZiAocnVuU3RhdHVzID09PSAncnVubmluZycpIHJldHVybiAncnVubmluZyc7XG4gIHJldHVybiAnY29tcGxldGVkJztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVJ1blNlZ21lbnRzRnJvbVNwYW4oXG4gIHN0YXJ0TXM6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlcixcbiAgYWN0aXZlU3RhcnRNczogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBldmVudHM6IFNwYW5FdmVudFtdLFxuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogU2VnbWVudFtdIHtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuICBpZiAoZHVyYXRpb24gPD0gMCkgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5ldmVudHNdXG4gICAgLm1hcCgoZSkgPT4gKHsgbmFtZTogZS5uYW1lLCB0aW1lOiBnZXRIaWdoUmVzSW5NcyhlLnRpbWVzdGFtcCkgfSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEudGltZSAtIGIudGltZSk7XG5cbiAgY29uc3QgcnVuRGF0YSA9IGF0dHJpYnV0ZXM/LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHJ1blN0YXR1cyA9IHJ1bkRhdGE/LnN0YXR1cyBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3QgaGFzUnVuQ3JlYXRlZCA9IHNvcnRlZC5zb21lKChlKSA9PiBlLm5hbWUgPT09ICdydW5fY3JlYXRlZCcpO1xuXG4gIGlmICghaGFzUnVuQ3JlYXRlZCkge1xuICAgIHJldHVybiBjb21wdXRlVjFSdW5TZWdtZW50cyhzdGFydE1zLCBkdXJhdGlvbiwgYWN0aXZlU3RhcnRNcywgcnVuU3RhdHVzKTtcbiAgfVxuXG4gIGNvbnN0IGZhaWxlZEV2ZW50ID0gc29ydGVkLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gJ3J1bl9mYWlsZWQnKTtcblxuICBsZXQgY3Vyc29yID0gMDtcbiAgaWYgKGFjdGl2ZVN0YXJ0TXMgIT09IHVuZGVmaW5lZCAmJiBhY3RpdmVTdGFydE1zID4gc3RhcnRNcykge1xuICAgIGNvbnN0IHF1ZXVlZEZyYWMgPSB0aW1lVG9GcmFjdGlvbihhY3RpdmVTdGFydE1zLCBzdGFydE1zLCBkdXJhdGlvbik7XG4gICAgaWYgKHF1ZXVlZEZyYWMgPiAwLjAwMSkge1xuICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICAgIGVuZEZyYWN0aW9uOiBxdWV1ZWRGcmFjLFxuICAgICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgICAgfSk7XG4gICAgICBjdXJzb3IgPSBxdWV1ZWRGcmFjO1xuICAgIH1cbiAgfVxuXG4gIHNlZ21lbnRzLnB1c2goe1xuICAgIHN0YXJ0RnJhY3Rpb246IGN1cnNvcixcbiAgICBlbmRGcmFjdGlvbjogMSxcbiAgICBzdGF0dXM6IGZhaWxlZEV2ZW50ID8gJ2ZhaWxlZCcgOiBydW5TZWdtZW50U3RhdHVzKHJ1blN0YXR1cyksXG4gIH0pO1xuXG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVYxUnVuU2VnbWVudHMoXG4gIHN0YXJ0TXM6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlcixcbiAgYWN0aXZlU3RhcnRNczogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBydW5TdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogU2VnbWVudFtdIHtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuXG4gIGxldCBjdXJzb3IgPSAwO1xuICBpZiAoYWN0aXZlU3RhcnRNcyAhPT0gdW5kZWZpbmVkICYmIGFjdGl2ZVN0YXJ0TXMgPiBzdGFydE1zKSB7XG4gICAgY29uc3QgcXVldWVkRnJhYyA9IHRpbWVUb0ZyYWN0aW9uKGFjdGl2ZVN0YXJ0TXMsIHN0YXJ0TXMsIGR1cmF0aW9uKTtcbiAgICBpZiAocXVldWVkRnJhYyA+IDAuMDAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgc3RhcnRGcmFjdGlvbjogMCxcbiAgICAgICAgZW5kRnJhY3Rpb246IHF1ZXVlZEZyYWMsXG4gICAgICAgIHN0YXR1czogJ3F1ZXVlZCcsXG4gICAgICB9KTtcbiAgICAgIGN1cnNvciA9IHF1ZXVlZEZyYWM7XG4gICAgfVxuICB9XG5cbiAgc2VnbWVudHMucHVzaCh7XG4gICAgc3RhcnRGcmFjdGlvbjogY3Vyc29yLFxuICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgIHN0YXR1czogcnVuU2VnbWVudFN0YXR1cyhydW5TdGF0dXMpLFxuICB9KTtcblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8qKlxuICogQ29tcHV0ZSBldmVudC1iYXNlZCBzZWdtZW50cyBmb3IgYSBzcGFuLiBEaXNwYXRjaGVzIG9uIGBzcGFuLnJlc291cmNlYFxuICogdG8gdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlLXR5cGUtc3BlY2lmaWMgc2VnbWVudCBidWlsZGVyLlxuICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBmb3IgZ2VuZXJpYyAobm9uLXdvcmtmbG93KSBzcGFucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTcGFuU2VnbWVudHMoc3BhbjogU3Bhbik6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IHN0YXJ0TXMgPSBnZXRIaWdoUmVzSW5NcyhzcGFuLnN0YXJ0VGltZSk7XG4gIGNvbnN0IGR1cmF0aW9uID0gZ2V0U3BhbkR1cmF0aW9uTXMoc3Bhbik7XG4gIGNvbnN0IGFjdGl2ZVN0YXJ0TXMgPSBzcGFuLmFjdGl2ZVN0YXJ0VGltZVxuICAgID8gZ2V0SGlnaFJlc0luTXMoc3Bhbi5hY3RpdmVTdGFydFRpbWUpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgc3dpdGNoIChzcGFuLnJlc291cmNlKSB7XG4gICAgY2FzZSAnc3RlcCc6XG4gICAgICByZXR1cm4gY29tcHV0ZVN0ZXBTZWdtZW50c0Zyb21TcGFuKHN0YXJ0TXMsIGR1cmF0aW9uLCBzcGFuLmV2ZW50cyk7XG4gICAgY2FzZSAnaG9vayc6XG4gICAgICByZXR1cm4gY29tcHV0ZUhvb2tTZWdtZW50c0Zyb21TcGFuKHN0YXJ0TXMsIGR1cmF0aW9uLCBzcGFuLmV2ZW50cyk7XG4gICAgY2FzZSAnc2xlZXAnOlxuICAgICAgcmV0dXJuIGNvbXB1dGVTbGVlcFNlZ21lbnRzRnJvbVNwYW4oc3RhcnRNcywgZHVyYXRpb24sIHNwYW4uZXZlbnRzKTtcbiAgICBjYXNlICdydW4nOlxuICAgICAgcmV0dXJuIGNvbXB1dGVSdW5TZWdtZW50c0Zyb21TcGFuKFxuICAgICAgICBzdGFydE1zLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgYWN0aXZlU3RhcnRNcyxcbiAgICAgICAgc3Bhbi5ldmVudHMsXG4gICAgICAgIHNwYW4uYXR0cmlidXRlc1xuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3BhbiBtYXJrZXJzIOKAlCBwb2ludC1pbi10aW1lIGV2ZW50cyByZW5kZXJlZCBhcyB0aWNrcyBvbiB0b3Agb2YgYSBiYXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwYW5NYXJrZXIge1xuICB0aW1lTXM6IG51bWJlcjtcbn1cblxuLy8gYGhvb2tfcmVjZWl2ZWRgID0gYSByZXN1bXB0aW9uOyBgYXR0cl9zZXRgID0gYXR0cmlidXRlcyB3cml0dGVuIG1pZC1zcGFuLlxuY29uc3QgTUFSS0VSX0VWRU5UX05BTUVTID0gWydob29rX3JlY2VpdmVkJywgJ2F0dHJfc2V0J107XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3Bhbk1hcmtlcnMoc3BhbjogU3Bhbik6IFNwYW5NYXJrZXJbXSB7XG4gIHJldHVybiBzb3J0ZWRFdmVudE1hcmtzKHNwYW4uZXZlbnRzLCBNQVJLRVJfRVZFTlRfTkFNRVMpLm1hcCgobWFyaykgPT4gKHtcbiAgICB0aW1lTXM6IG1hcmsudGltZSxcbiAgfSkpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9mZnNjcmVlblNpZGUge1xuICBjb3VudDogbnVtYmVyO1xuICAvKiogTmVhcmVzdCBvZmYtc2NyZWVuIG1hcmtlciDigJQgdGhlIG9uZSBhIHJldmVhbCBqdW1wcyB0by4gKi9cbiAgbmVhcmVzdE1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2Zmc2NyZWVuTWFya2VycyB7XG4gIGxlZnQ6IE9mZnNjcmVlblNpZGUgfCBudWxsO1xuICByaWdodDogT2Zmc2NyZWVuU2lkZSB8IG51bGw7XG59XG5cbi8qKiBQYXJ0aXRpb24gbWFya2VycyBvdXRzaWRlIGBbdmlzaWJsZVN0YXJ0TXMsIHZpc2libGVFbmRNc11gIGJ5IHNpZGUuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU9mZnNjcmVlbk1hcmtlcnMoXG4gIG1hcmtlcnM6IFNwYW5NYXJrZXJbXSxcbiAgdmlzaWJsZVN0YXJ0TXM6IG51bWJlcixcbiAgdmlzaWJsZUVuZE1zOiBudW1iZXJcbik6IE9mZnNjcmVlbk1hcmtlcnMge1xuICBsZXQgbGVmdENvdW50ID0gMDtcbiAgbGV0IHJpZ2h0Q291bnQgPSAwO1xuICBsZXQgbmVhcmVzdExlZnQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIGxldCBuZWFyZXN0UmlnaHQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgeyB0aW1lTXMgfSBvZiBtYXJrZXJzKSB7XG4gICAgaWYgKHRpbWVNcyA8IHZpc2libGVTdGFydE1zKSB7XG4gICAgICBsZWZ0Q291bnQrKztcbiAgICAgIGlmICh0aW1lTXMgPiBuZWFyZXN0TGVmdCkgbmVhcmVzdExlZnQgPSB0aW1lTXM7XG4gICAgfSBlbHNlIGlmICh0aW1lTXMgPiB2aXNpYmxlRW5kTXMpIHtcbiAgICAgIHJpZ2h0Q291bnQrKztcbiAgICAgIGlmICh0aW1lTXMgPCBuZWFyZXN0UmlnaHQpIG5lYXJlc3RSaWdodCA9IHRpbWVNcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiBsZWZ0Q291bnQgPiAwID8geyBjb3VudDogbGVmdENvdW50LCBuZWFyZXN0TXM6IG5lYXJlc3RMZWZ0IH0gOiBudWxsLFxuICAgIHJpZ2h0OlxuICAgICAgcmlnaHRDb3VudCA+IDAgPyB7IGNvdW50OiByaWdodENvdW50LCBuZWFyZXN0TXM6IG5lYXJlc3RSaWdodCB9IDogbnVsbCxcbiAgfTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/web-shared",
|
|
3
3
|
"description": "Shared components for Workflow Observability UI",
|
|
4
|
-
"version": "5.0.0-beta.
|
|
4
|
+
"version": "5.0.0-beta.36",
|
|
5
5
|
"private": false,
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
"streamdown": "2.3.0",
|
|
56
56
|
"tailwind-merge": "3.5.0",
|
|
57
57
|
"tailwindcss": "4",
|
|
58
|
-
"@workflow/core": "5.0.0-beta.
|
|
58
|
+
"@workflow/core": "5.0.0-beta.36",
|
|
59
59
|
"@workflow/utils": "5.0.0-beta.6",
|
|
60
|
-
"@workflow/world": "5.0.0-beta.
|
|
60
|
+
"@workflow/world": "5.0.0-beta.22"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@biomejs/biome": "^2.4.4",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"ai": "6.0.116",
|
|
68
68
|
"typescript": "^6.0.3",
|
|
69
69
|
"vitest": "^4.1.10",
|
|
70
|
-
"@workflow/errors": "5.0.0-beta.
|
|
70
|
+
"@workflow/errors": "5.0.0-beta.12",
|
|
71
71
|
"@workflow/tsconfig": "5.0.0-beta.0"
|
|
72
72
|
},
|
|
73
73
|
"scripts": {
|
|
@@ -2,6 +2,7 @@ import { Circle } from 'lucide-react';
|
|
|
2
2
|
import { useRef } from 'react';
|
|
3
3
|
import { cn } from '../../../lib/cn';
|
|
4
4
|
import { formatDurationPrecise } from '../../trace-viewer/util/timing';
|
|
5
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from '../../ui/tooltip';
|
|
5
6
|
import {
|
|
6
7
|
SleepIcon,
|
|
7
8
|
StepForwardIcon,
|
|
@@ -17,18 +18,20 @@ import { ROW_HEIGHT_PX, useRowWindow } from './use-row-window';
|
|
|
17
18
|
interface EventStyle {
|
|
18
19
|
icon: React.ComponentType<{ className?: string }>;
|
|
19
20
|
className: string;
|
|
21
|
+
label: string;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
const eventStyles: Record<string, EventStyle> = {
|
|
23
|
-
run: { icon: WorkflowIcon, className: 'text-blue-900' },
|
|
24
|
-
step: { icon: StepForwardIcon, className: 'text-green-900' },
|
|
25
|
-
hook: { icon: WebhookIcon, className: 'text-gray-900' },
|
|
26
|
-
sleep: { icon: SleepIcon, className: 'text-gray-900' },
|
|
25
|
+
run: { icon: WorkflowIcon, className: 'text-blue-900', label: 'Workflow' },
|
|
26
|
+
step: { icon: StepForwardIcon, className: 'text-green-900', label: 'Step' },
|
|
27
|
+
hook: { icon: WebhookIcon, className: 'text-gray-900', label: 'Hook' },
|
|
28
|
+
sleep: { icon: SleepIcon, className: 'text-gray-900', label: 'Sleep' },
|
|
27
29
|
};
|
|
28
30
|
|
|
29
31
|
const defaultStyle: EventStyle = {
|
|
30
32
|
icon: Circle,
|
|
31
33
|
className: 'text-gray-900',
|
|
34
|
+
label: 'Event',
|
|
32
35
|
};
|
|
33
36
|
|
|
34
37
|
const ROW_HEIGHT_CLASS = 'h-10';
|
|
@@ -38,6 +41,7 @@ function getEventStyle(resource: string, isErrored: boolean): EventStyle {
|
|
|
38
41
|
return {
|
|
39
42
|
icon: style.icon,
|
|
40
43
|
className: cn(isErrored ? 'text-red-900' : style.className),
|
|
44
|
+
label: style.label,
|
|
41
45
|
};
|
|
42
46
|
}
|
|
43
47
|
|
|
@@ -54,10 +58,11 @@ const EventRow = ({
|
|
|
54
58
|
}) => {
|
|
55
59
|
const durationMs = getSpanDurationMs(span);
|
|
56
60
|
const isErrored = isSpanErrored(span);
|
|
57
|
-
const {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
const {
|
|
62
|
+
icon: Icon,
|
|
63
|
+
className: tagClassName,
|
|
64
|
+
label: iconLabel,
|
|
65
|
+
} = getEventStyle(span.resource, isErrored);
|
|
61
66
|
|
|
62
67
|
return (
|
|
63
68
|
<li
|
|
@@ -75,9 +80,14 @@ const EventRow = ({
|
|
|
75
80
|
<div className="h-full hover:bg-gray-100 group-aria-selected:bg-gray-100 group-aria-selected:hover:bg-gray-200">
|
|
76
81
|
<div className="flex h-full min-w-0 items-center pl-4 pr-2">
|
|
77
82
|
<div className="flex min-w-0 flex-1 items-center gap-2">
|
|
78
|
-
<
|
|
79
|
-
<
|
|
80
|
-
|
|
83
|
+
<Tooltip delayDuration={500}>
|
|
84
|
+
<TooltipTrigger asChild>
|
|
85
|
+
<span className={cn('shrink-0', tagClassName)}>
|
|
86
|
+
<Icon className="w-4 h-4" />
|
|
87
|
+
</span>
|
|
88
|
+
</TooltipTrigger>
|
|
89
|
+
<TooltipContent side="top">{iconLabel}</TooltipContent>
|
|
90
|
+
</Tooltip>
|
|
81
91
|
<span className="min-w-0 text-label-14">
|
|
82
92
|
<MiddleTruncate value={span.name} />
|
|
83
93
|
</span>
|
|
@@ -36,10 +36,10 @@ export function SplitPane({
|
|
|
36
36
|
scrollContainerRef,
|
|
37
37
|
}: SplitPaneProps) {
|
|
38
38
|
const parts = Children.toArray(children);
|
|
39
|
-
if (parts.length !==
|
|
40
|
-
throw new Error('SplitPane expects exactly
|
|
39
|
+
if (parts.length !== 3) {
|
|
40
|
+
throw new Error('SplitPane expects exactly three children');
|
|
41
41
|
}
|
|
42
|
-
const [start, end] = parts;
|
|
42
|
+
const [start, end, endOverlay] = parts;
|
|
43
43
|
|
|
44
44
|
const [startPx, setStartPx] = useState(DEFAULT_START_PX);
|
|
45
45
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
@@ -85,7 +85,7 @@ export function SplitPane({
|
|
|
85
85
|
);
|
|
86
86
|
|
|
87
87
|
return (
|
|
88
|
-
<div className={cn('flex flex-col h-full min-h-0', className)}>
|
|
88
|
+
<div className={cn('relative flex flex-col h-full min-h-0', className)}>
|
|
89
89
|
<div
|
|
90
90
|
className="shrink-0 grid"
|
|
91
91
|
style={{ gridTemplateColumns: colTemplate }}
|
|
@@ -126,6 +126,16 @@ export function SplitPane({
|
|
|
126
126
|
</div>
|
|
127
127
|
{end}
|
|
128
128
|
</div>
|
|
129
|
+
<div
|
|
130
|
+
className="pointer-events-none absolute inset-x-0 bottom-3 z-[5] grid"
|
|
131
|
+
style={{ gridTemplateColumns: colTemplate }}
|
|
132
|
+
>
|
|
133
|
+
<div />
|
|
134
|
+
<div />
|
|
135
|
+
<div className="flex min-w-0 items-center justify-between gap-3 pl-4 pr-3">
|
|
136
|
+
{endOverlay}
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
129
139
|
</div>
|
|
130
140
|
);
|
|
131
141
|
}
|