inspector-ng 0.0.4 → 0.0.5
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.
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, HostListener, Inject, Input, PLATFORM_ID, computed, effect, signal, viewChild, } from
|
|
2
|
-
import { isPlatformBrowser } from
|
|
3
|
-
import { GUIDE_HITBOX_SIZE, GUIDE_SNAP_DISTANCE, inspector_STATE_VERSION, inspector_STORAGE_KEY, } from
|
|
4
|
-
import { getInspectMeasurement, getRectFromDom, getTargetElement, getVisibleTextBlocks, } from
|
|
5
|
-
import { getDistanceOverlay } from
|
|
6
|
-
import { clamp, getViewportSize, rectsEqual } from
|
|
7
|
-
import { createId, formatValue } from
|
|
1
|
+
import { ChangeDetectionStrategy, Component, HostListener, Inject, Input, PLATFORM_ID, computed, effect, signal, viewChild, } from "@angular/core";
|
|
2
|
+
import { isPlatformBrowser } from "@angular/common";
|
|
3
|
+
import { GUIDE_HITBOX_SIZE, GUIDE_SNAP_DISTANCE, inspector_STATE_VERSION, inspector_STORAGE_KEY, } from "./constants";
|
|
4
|
+
import { getInspectMeasurement, getRectFromDom, getTargetElement, getVisibleTextBlocks, } from "./dom";
|
|
5
|
+
import { getDistanceOverlay } from "./distances";
|
|
6
|
+
import { clamp, getViewportSize, rectsEqual } from "./geometry";
|
|
7
|
+
import { createId, formatValue } from "./utils";
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
export class inspectorComponent {
|
|
10
10
|
constructor(platformId) {
|
|
11
11
|
this.Math = Math;
|
|
12
12
|
this.formatValue = formatValue;
|
|
13
13
|
this.guideHitboxSize = GUIDE_HITBOX_SIZE;
|
|
14
|
-
this.overlayRoot = viewChild(
|
|
15
|
-
this.highlightColor =
|
|
16
|
-
this.guideColor =
|
|
14
|
+
this.overlayRoot = viewChild("overlayRoot");
|
|
15
|
+
this.highlightColor = "#4f8cff";
|
|
16
|
+
this.guideColor = "#ff7a00";
|
|
17
17
|
this.hoverHighlightEnabled = true;
|
|
18
18
|
this.persistOnReload = false;
|
|
19
19
|
this.enabled = signal(false);
|
|
20
|
-
this.toolMode = signal(
|
|
21
|
-
this.guideOrientation = signal(
|
|
20
|
+
this.toolMode = signal("none");
|
|
21
|
+
this.guideOrientation = signal("vertical");
|
|
22
22
|
this.guides = signal([]);
|
|
23
23
|
this.hoverRect = signal(null);
|
|
24
24
|
this.selectedGuideId = signal(null);
|
|
@@ -32,7 +32,7 @@ export class inspectorComponent {
|
|
|
32
32
|
this.selectedMetaLine = computed(() => {
|
|
33
33
|
const selected = this.selectedMeasurement();
|
|
34
34
|
if (!selected) {
|
|
35
|
-
return
|
|
35
|
+
return "";
|
|
36
36
|
}
|
|
37
37
|
return `${selected.label} · ${formatValue(selected.rect.width)} x ${formatValue(selected.rect.height)} · ${selected.styles.fontSize} / ${selected.styles.lineHeight} / ${selected.styles.color}`;
|
|
38
38
|
});
|
|
@@ -95,7 +95,7 @@ export class inspectorComponent {
|
|
|
95
95
|
if (!this.enabled()) {
|
|
96
96
|
this.enabled.set(true);
|
|
97
97
|
}
|
|
98
|
-
this.toolMode.set(this.toolMode() === mode ?
|
|
98
|
+
this.toolMode.set(this.toolMode() === mode ? "none" : mode);
|
|
99
99
|
this.hoverRect.set(null);
|
|
100
100
|
this.guidePreview.set(null);
|
|
101
101
|
this.distanceOverlay.set(null);
|
|
@@ -131,11 +131,11 @@ export class inspectorComponent {
|
|
|
131
131
|
}
|
|
132
132
|
handleKeydown(event) {
|
|
133
133
|
const key = event.key.toLowerCase();
|
|
134
|
-
if (key ===
|
|
134
|
+
if (key === "m") {
|
|
135
135
|
event.preventDefault();
|
|
136
136
|
this.enabled.update((value) => !value);
|
|
137
137
|
if (!this.enabled()) {
|
|
138
|
-
this.toolMode.set(
|
|
138
|
+
this.toolMode.set("none");
|
|
139
139
|
this.hoverRect.set(null);
|
|
140
140
|
this.selectedGuideId.set(null);
|
|
141
141
|
this.distanceOverlay.set(null);
|
|
@@ -148,37 +148,37 @@ export class inspectorComponent {
|
|
|
148
148
|
if (!this.enabled()) {
|
|
149
149
|
return;
|
|
150
150
|
}
|
|
151
|
-
if ((event.metaKey || event.ctrlKey) && key ===
|
|
151
|
+
if ((event.metaKey || event.ctrlKey) && key === "z") {
|
|
152
152
|
event.preventDefault();
|
|
153
153
|
event.shiftKey ? this.redo() : this.undo();
|
|
154
154
|
return;
|
|
155
155
|
}
|
|
156
|
-
if (key ===
|
|
156
|
+
if (key === "s") {
|
|
157
157
|
event.preventDefault();
|
|
158
|
-
this.setToolMode(
|
|
158
|
+
this.setToolMode("select");
|
|
159
159
|
return;
|
|
160
160
|
}
|
|
161
|
-
if (key ===
|
|
161
|
+
if (key === "g") {
|
|
162
162
|
event.preventDefault();
|
|
163
|
-
this.setToolMode(
|
|
163
|
+
this.setToolMode("guides");
|
|
164
164
|
return;
|
|
165
165
|
}
|
|
166
|
-
if (key ===
|
|
166
|
+
if (key === "h") {
|
|
167
167
|
event.preventDefault();
|
|
168
|
-
this.setGuideOrientation(
|
|
168
|
+
this.setGuideOrientation("horizontal");
|
|
169
169
|
return;
|
|
170
170
|
}
|
|
171
|
-
if (key ===
|
|
171
|
+
if (key === "v") {
|
|
172
172
|
event.preventDefault();
|
|
173
|
-
this.setGuideOrientation(
|
|
173
|
+
this.setGuideOrientation("vertical");
|
|
174
174
|
return;
|
|
175
175
|
}
|
|
176
|
-
if (event.key ===
|
|
176
|
+
if (event.key === "Alt") {
|
|
177
177
|
this.altPressed.set(true);
|
|
178
178
|
this.updateDistanceOverlay();
|
|
179
179
|
return;
|
|
180
180
|
}
|
|
181
|
-
if (key ===
|
|
181
|
+
if (key === "escape") {
|
|
182
182
|
event.preventDefault();
|
|
183
183
|
this.selectedMeasurement.set(null);
|
|
184
184
|
this.selectedGuideId.set(null);
|
|
@@ -191,7 +191,7 @@ export class inspectorComponent {
|
|
|
191
191
|
this.refreshTypographyBlocks();
|
|
192
192
|
return;
|
|
193
193
|
}
|
|
194
|
-
if ((key ===
|
|
194
|
+
if ((key === "backspace" || key === "delete") && this.selectedGuideId()) {
|
|
195
195
|
event.preventDefault();
|
|
196
196
|
const nextGuides = this.guides().filter((guide) => guide.id !== this.selectedGuideId());
|
|
197
197
|
this.guides.set(nextGuides);
|
|
@@ -200,7 +200,7 @@ export class inspectorComponent {
|
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
handleKeyup(event) {
|
|
203
|
-
if (event.key ===
|
|
203
|
+
if (event.key === "Alt") {
|
|
204
204
|
this.altPressed.set(false);
|
|
205
205
|
this.distanceOverlay.set(null);
|
|
206
206
|
}
|
|
@@ -216,13 +216,13 @@ export class inspectorComponent {
|
|
|
216
216
|
if (guide.id !== this.draggingGuideId) {
|
|
217
217
|
return guide;
|
|
218
218
|
}
|
|
219
|
-
const rawPosition = guide.orientation ===
|
|
220
|
-
const max = guide.orientation ===
|
|
219
|
+
const rawPosition = guide.orientation === "vertical" ? event.clientX : event.clientY;
|
|
220
|
+
const max = guide.orientation === "vertical" ? viewport.width : viewport.height;
|
|
221
221
|
return { ...guide, position: clamp(rawPosition, 0, max) };
|
|
222
222
|
}));
|
|
223
223
|
return;
|
|
224
224
|
}
|
|
225
|
-
if (this.toolMode() ===
|
|
225
|
+
if (this.toolMode() === "guides") {
|
|
226
226
|
this.hoverRect.set(null);
|
|
227
227
|
this.hoverElement = null;
|
|
228
228
|
this.distanceOverlay.set(null);
|
|
@@ -235,7 +235,7 @@ export class inspectorComponent {
|
|
|
235
235
|
return;
|
|
236
236
|
}
|
|
237
237
|
this.guidePreview.set(null);
|
|
238
|
-
if (this.toolMode() !==
|
|
238
|
+
if (this.toolMode() !== "select" || !this.hoverHighlightEnabled) {
|
|
239
239
|
this.hoverRect.set(null);
|
|
240
240
|
this.hoverElement = null;
|
|
241
241
|
if (!this.altPressed()) {
|
|
@@ -269,7 +269,7 @@ export class inspectorComponent {
|
|
|
269
269
|
return;
|
|
270
270
|
}
|
|
271
271
|
const overlay = this.overlayRoot()?.nativeElement ?? null;
|
|
272
|
-
if (this.toolMode() ===
|
|
272
|
+
if (this.toolMode() === "guides") {
|
|
273
273
|
if (overlay && overlay.contains(event.target)) {
|
|
274
274
|
return;
|
|
275
275
|
}
|
|
@@ -278,7 +278,7 @@ export class inspectorComponent {
|
|
|
278
278
|
this.guidePreview.set(guide);
|
|
279
279
|
return;
|
|
280
280
|
}
|
|
281
|
-
if (this.toolMode() !==
|
|
281
|
+
if (this.toolMode() !== "select") {
|
|
282
282
|
return;
|
|
283
283
|
}
|
|
284
284
|
const target = getTargetElement({ x: event.clientX, y: event.clientY }, overlay);
|
|
@@ -289,6 +289,19 @@ export class inspectorComponent {
|
|
|
289
289
|
this.refreshTypographyBlocks();
|
|
290
290
|
return;
|
|
291
291
|
}
|
|
292
|
+
// Ctrl+click: select the minimum common parent of current selection and clicked element
|
|
293
|
+
if ((event.ctrlKey || event.metaKey) && this.selectedElement) {
|
|
294
|
+
const commonParent = this.findMinimumCommonParent(this.selectedElement, target);
|
|
295
|
+
if (commonParent &&
|
|
296
|
+
commonParent !== document.body &&
|
|
297
|
+
commonParent !== document.documentElement) {
|
|
298
|
+
this.selectedMeasurement.set(getInspectMeasurement(commonParent));
|
|
299
|
+
this.selectedElement = commonParent;
|
|
300
|
+
this.updateDistanceOverlay();
|
|
301
|
+
this.refreshTypographyBlocks();
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
292
305
|
this.selectedMeasurement.set(getInspectMeasurement(target));
|
|
293
306
|
this.selectedElement = target;
|
|
294
307
|
this.selectedGuideId.set(this.findGuideAtPoint(event.clientX, event.clientY));
|
|
@@ -343,10 +356,10 @@ export class inspectorComponent {
|
|
|
343
356
|
getGuidePreview(event) {
|
|
344
357
|
const viewport = getViewportSize();
|
|
345
358
|
const orientation = this.guideOrientation();
|
|
346
|
-
const rawPosition = orientation ===
|
|
347
|
-
const max = orientation ===
|
|
359
|
+
const rawPosition = orientation === "vertical" ? event.clientX : event.clientY;
|
|
360
|
+
const max = orientation === "vertical" ? viewport.width : viewport.height;
|
|
348
361
|
return {
|
|
349
|
-
id:
|
|
362
|
+
id: "preview",
|
|
350
363
|
orientation,
|
|
351
364
|
position: this.snapGuide(clamp(rawPosition, 0, max)),
|
|
352
365
|
};
|
|
@@ -361,11 +374,11 @@ export class inspectorComponent {
|
|
|
361
374
|
}
|
|
362
375
|
findGuideAtPoint(x, y) {
|
|
363
376
|
for (const guide of this.guides()) {
|
|
364
|
-
if (guide.orientation ===
|
|
377
|
+
if (guide.orientation === "vertical" &&
|
|
365
378
|
Math.abs(guide.position - x) <= GUIDE_HITBOX_SIZE) {
|
|
366
379
|
return guide.id;
|
|
367
380
|
}
|
|
368
|
-
if (guide.orientation ===
|
|
381
|
+
if (guide.orientation === "horizontal" &&
|
|
369
382
|
Math.abs(guide.position - y) <= GUIDE_HITBOX_SIZE) {
|
|
370
383
|
return guide.id;
|
|
371
384
|
}
|
|
@@ -397,12 +410,30 @@ export class inspectorComponent {
|
|
|
397
410
|
cloneGuides(guides) {
|
|
398
411
|
return guides.map((guide) => ({ ...guide }));
|
|
399
412
|
}
|
|
413
|
+
findMinimumCommonParent(elementA, elementB) {
|
|
414
|
+
// Build ancestor chain for element A
|
|
415
|
+
const ancestorsA = new Set();
|
|
416
|
+
let current = elementA;
|
|
417
|
+
while (current) {
|
|
418
|
+
ancestorsA.add(current);
|
|
419
|
+
current = current.parentElement;
|
|
420
|
+
}
|
|
421
|
+
// Walk up from elementB until we find a common ancestor
|
|
422
|
+
current = elementB;
|
|
423
|
+
while (current) {
|
|
424
|
+
if (ancestorsA.has(current)) {
|
|
425
|
+
return current;
|
|
426
|
+
}
|
|
427
|
+
current = current.parentElement;
|
|
428
|
+
}
|
|
429
|
+
return null;
|
|
430
|
+
}
|
|
400
431
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: inspectorComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
401
432
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: inspectorComponent, isStandalone: true, selector: "inspector-overlay", inputs: { highlightColor: "highlightColor", guideColor: "guideColor", hoverHighlightEnabled: "hoverHighlightEnabled", persistOnReload: "persistOnReload" }, host: { listeners: { "window:keydown": "handleKeydown($event)", "window:keyup": "handleKeyup($event)", "window:pointermove": "handlePointerMove($event)", "window:pointerup": "handlePointerUp()", "window:click": "handleClick($event)", "window:resize": "handleViewportChange()", "window:scroll": "handleViewportChange()" } }, viewQueries: [{ propertyName: "overlayRoot", first: true, predicate: ["overlayRoot"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"inspector-root\" #overlayRoot>\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n title=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n title=\"Typography mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n </button>\n <div class=\"inspector-guide-group\">\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--guide-main\"\n [class.is-active]=\"toolMode() === 'guides'\"\n (click)=\"setToolMode('guides')\"\n title=\"Guides mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 2h1v12H4zM11 2h1v12h-1zM2 4h12v1H2zM2 11h12v1H2z\" />\n </svg>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--ghost inspector-icon-button--guide-menu\"\n [class.is-active]=\"guideMenuOpen()\"\n (click)=\"toggleGuideMenu()\"\n title=\"Guide options\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4.47 6.97L8 10.5l3.53-3.53-.94-.94L8 8.62 5.41 6.03z\" />\n </svg>\n </button>\n\n @if (guideMenuOpen()) {\n <div class=\"inspector-guide-menu\">\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'vertical'\"\n (click)=\"setGuideOrientation('vertical')\"\n >\n Vertical\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'horizontal'\"\n (click)=\"setGuideOrientation('horizontal')\"\n >\n Horizontal\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment inspector-segment--danger\"\n (click)=\"clearGuides()\"\n >\n Clear\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: rgba(27, 29, 36, .94);--inspector-panel-edge: rgba(255, 255, 255, .08);--inspector-text: #f3f4f6;--inspector-muted: #9ca3af;--inspector-blue: #4f8cff;--inspector-orange: #f59e0b;--inspector-green: #22c55e;--inspector-violet: #a855f7;position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:SF Pro Display,Segoe UI,sans-serif}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-toolbar{position:fixed;top:18px;right:18px;display:block;pointer-events:auto;z-index:10000}.inspector-toolbar__rail,.inspector-guide-menu{display:flex;gap:4px;padding:4px;border-radius:8px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.inspector-toolbar__rail{align-items:center}.inspector-guide-group{position:relative;display:flex;gap:0;align-items:center;border-radius:6px}.inspector-guide-menu{position:absolute;top:calc(100% + 8px);right:0;min-width:max-content;flex-direction:column;align-items:stretch}.inspector-guide-menu .inspector-segment{justify-content:flex-start;width:100%}.inspector-icon-button,.inspector-segment{display:inline-flex;align-items:center;justify-content:center;height:26px;border:0;border-radius:6px;background:transparent;color:var(--inspector-muted);cursor:pointer;transition:background .12s ease,color .12s ease;font:inherit;font-size:11px;letter-spacing:.02em}.inspector-icon-button{width:26px}.inspector-icon-button svg{width:14px;height:14px;fill:currentColor}.inspector-icon-button:hover,.inspector-segment:hover{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button.is-active,.inspector-segment.is-active{background:#4f8cff2e;color:#dbeafe}.inspector-icon-button--ghost.is-active{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button--guide-main{border-radius:6px 0 0 6px}.inspector-icon-button--guide-menu{width:20px;border-radius:0 6px 6px 0}.inspector-icon-button--guide-menu svg{width:12px;height:12px}.inspector-segment{padding:0 8px;white-space:nowrap}.inspector-segment--danger:hover{background:#ef444429;color:#fecaca}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f59e0bd1;background:#f59e0b14}.inspector-box--padding{border-color:#22c55ed1;background:#22c55e14}.inspector-box--gap{border-color:#a855f7b8;background:#a855f70a}.inspector-box--distance{border-style:dashed;border-color:#4f8cffb3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 8px));max-width:min(420px,calc(100vw - 24px));padding:6px 9px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:0 18px 40px #00000042;font-size:11px;line-height:1;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:var(--inspector-text);box-shadow:0 12px 24px #0003;font-size:10px;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#fbbf24}.inspector-box-tag--padding{color:#86efac;transform:translateY(0)}.inspector-box-tag--gap{color:#d8b4fe}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:6px;align-items:center;padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:#e5e7eb;box-shadow:0 12px 24px #00000038;font-size:10px;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:8px;height:8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#4f8cffb8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:5px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f2;color:var(--inspector-text);font-size:10px;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
402
433
|
}
|
|
403
434
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: inspectorComponent, decorators: [{
|
|
404
435
|
type: Component,
|
|
405
|
-
args: [{ selector: 'inspector-overlay', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inspector-root\" #overlayRoot>\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n title=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n title=\"Typography mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n </button>\n <div class=\"inspector-guide-group\">\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--guide-main\"\n [class.is-active]=\"toolMode() === 'guides'\"\n (click)=\"setToolMode('guides')\"\n title=\"Guides mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 2h1v12H4zM11 2h1v12h-1zM2 4h12v1H2zM2 11h12v1H2z\" />\n </svg>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--ghost inspector-icon-button--guide-menu\"\n [class.is-active]=\"guideMenuOpen()\"\n (click)=\"toggleGuideMenu()\"\n title=\"Guide options\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4.47 6.97L8 10.5l3.53-3.53-.94-.94L8 8.62 5.41 6.03z\" />\n </svg>\n </button>\n\n @if (guideMenuOpen()) {\n <div class=\"inspector-guide-menu\">\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'vertical'\"\n (click)=\"setGuideOrientation('vertical')\"\n >\n Vertical\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'horizontal'\"\n (click)=\"setGuideOrientation('horizontal')\"\n >\n Horizontal\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment inspector-segment--danger\"\n (click)=\"clearGuides()\"\n >\n Clear\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: rgba(27, 29, 36, .94);--inspector-panel-edge: rgba(255, 255, 255, .08);--inspector-text: #f3f4f6;--inspector-muted: #9ca3af;--inspector-blue: #4f8cff;--inspector-orange: #f59e0b;--inspector-green: #22c55e;--inspector-violet: #a855f7;position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:SF Pro Display,Segoe UI,sans-serif}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-toolbar{position:fixed;top:18px;right:18px;display:block;pointer-events:auto;z-index:10000}.inspector-toolbar__rail,.inspector-guide-menu{display:flex;gap:4px;padding:4px;border-radius:8px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.inspector-toolbar__rail{align-items:center}.inspector-guide-group{position:relative;display:flex;gap:0;align-items:center;border-radius:6px}.inspector-guide-menu{position:absolute;top:calc(100% + 8px);right:0;min-width:max-content;flex-direction:column;align-items:stretch}.inspector-guide-menu .inspector-segment{justify-content:flex-start;width:100%}.inspector-icon-button,.inspector-segment{display:inline-flex;align-items:center;justify-content:center;height:26px;border:0;border-radius:6px;background:transparent;color:var(--inspector-muted);cursor:pointer;transition:background .12s ease,color .12s ease;font:inherit;font-size:11px;letter-spacing:.02em}.inspector-icon-button{width:26px}.inspector-icon-button svg{width:14px;height:14px;fill:currentColor}.inspector-icon-button:hover,.inspector-segment:hover{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button.is-active,.inspector-segment.is-active{background:#4f8cff2e;color:#dbeafe}.inspector-icon-button--ghost.is-active{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button--guide-main{border-radius:6px 0 0 6px}.inspector-icon-button--guide-menu{width:20px;border-radius:0 6px 6px 0}.inspector-icon-button--guide-menu svg{width:12px;height:12px}.inspector-segment{padding:0 8px;white-space:nowrap}.inspector-segment--danger:hover{background:#ef444429;color:#fecaca}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f59e0bd1;background:#f59e0b14}.inspector-box--padding{border-color:#22c55ed1;background:#22c55e14}.inspector-box--gap{border-color:#a855f7b8;background:#a855f70a}.inspector-box--distance{border-style:dashed;border-color:#4f8cffb3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 8px));max-width:min(420px,calc(100vw - 24px));padding:6px 9px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:0 18px 40px #00000042;font-size:11px;line-height:1;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:var(--inspector-text);box-shadow:0 12px 24px #0003;font-size:10px;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#fbbf24}.inspector-box-tag--padding{color:#86efac;transform:translateY(0)}.inspector-box-tag--gap{color:#d8b4fe}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:6px;align-items:center;padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:#e5e7eb;box-shadow:0 12px 24px #00000038;font-size:10px;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:8px;height:8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#4f8cffb8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:5px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f2;color:var(--inspector-text);font-size:10px;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}\n"] }]
|
|
436
|
+
args: [{ selector: "inspector-overlay", standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inspector-root\" #overlayRoot>\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n title=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n title=\"Typography mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n </button>\n <div class=\"inspector-guide-group\">\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--guide-main\"\n [class.is-active]=\"toolMode() === 'guides'\"\n (click)=\"setToolMode('guides')\"\n title=\"Guides mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4 2h1v12H4zM11 2h1v12h-1zM2 4h12v1H2zM2 11h12v1H2z\" />\n </svg>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--ghost inspector-icon-button--guide-menu\"\n [class.is-active]=\"guideMenuOpen()\"\n (click)=\"toggleGuideMenu()\"\n title=\"Guide options\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M4.47 6.97L8 10.5l3.53-3.53-.94-.94L8 8.62 5.41 6.03z\" />\n </svg>\n </button>\n\n @if (guideMenuOpen()) {\n <div class=\"inspector-guide-menu\">\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'vertical'\"\n (click)=\"setGuideOrientation('vertical')\"\n >\n Vertical\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment\"\n [class.is-active]=\"guideOrientation() === 'horizontal'\"\n (click)=\"setGuideOrientation('horizontal')\"\n >\n Horizontal\n </button>\n <button\n type=\"button\"\n class=\"inspector-segment inspector-segment--danger\"\n (click)=\"clearGuides()\"\n >\n Clear\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n", styles: [":host{--inspector-panel: rgba(27, 29, 36, .94);--inspector-panel-edge: rgba(255, 255, 255, .08);--inspector-text: #f3f4f6;--inspector-muted: #9ca3af;--inspector-blue: #4f8cff;--inspector-orange: #f59e0b;--inspector-green: #22c55e;--inspector-violet: #a855f7;position:fixed;inset:0;z-index:2147;pointer-events:none;font-family:SF Pro Display,Segoe UI,sans-serif}.inspector-root{position:fixed;inset:0;pointer-events:none}.inspector-toolbar{position:fixed;top:18px;right:18px;display:block;pointer-events:auto;z-index:10000}.inspector-toolbar__rail,.inspector-guide-menu{display:flex;gap:4px;padding:4px;border-radius:8px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);box-shadow:0 18px 40px #00000052;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.inspector-toolbar__rail{align-items:center}.inspector-guide-group{position:relative;display:flex;gap:0;align-items:center;border-radius:6px}.inspector-guide-menu{position:absolute;top:calc(100% + 8px);right:0;min-width:max-content;flex-direction:column;align-items:stretch}.inspector-guide-menu .inspector-segment{justify-content:flex-start;width:100%}.inspector-icon-button,.inspector-segment{display:inline-flex;align-items:center;justify-content:center;height:26px;border:0;border-radius:6px;background:transparent;color:var(--inspector-muted);cursor:pointer;transition:background .12s ease,color .12s ease;font:inherit;font-size:11px;letter-spacing:.02em}.inspector-icon-button{width:26px}.inspector-icon-button svg{width:14px;height:14px;fill:currentColor}.inspector-icon-button:hover,.inspector-segment:hover{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button.is-active,.inspector-segment.is-active{background:#4f8cff2e;color:#dbeafe}.inspector-icon-button--ghost.is-active{background:#ffffff14;color:var(--inspector-text)}.inspector-icon-button--guide-main{border-radius:6px 0 0 6px}.inspector-icon-button--guide-menu{width:20px;border-radius:0 6px 6px 0}.inspector-icon-button--guide-menu svg{width:12px;height:12px}.inspector-segment{padding:0 8px;white-space:nowrap}.inspector-segment--danger:hover{background:#ef444429;color:#fecaca}.inspector-box{position:fixed;box-sizing:border-box;pointer-events:none;border:1px solid var(--inspector-accent, var(--inspector-blue));background:color-mix(in srgb,var(--inspector-accent, var(--inspector-blue)) 8%,transparent)}.inspector-box--hover{opacity:.55}.inspector-box--selected{border-width:1.5px}.inspector-box--margin{border-color:#f59e0bd1;background:#f59e0b14}.inspector-box--padding{border-color:#22c55ed1;background:#22c55e14}.inspector-box--gap{border-color:#a855f7b8;background:#a855f70a}.inspector-box--distance{border-style:dashed;border-color:#4f8cffb3;background:transparent}.inspector-label,.inspector-box-tag,.inspector-text-chip,.inspector-distance-tag{font-variant-numeric:tabular-nums}.inspector-label{position:absolute;left:0;top:0;transform:translateY(calc(-100% - 8px));max-width:min(420px,calc(100vw - 24px));padding:6px 9px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:var(--inspector-panel);color:var(--inspector-text);box-shadow:0 18px 40px #00000042;font-size:11px;line-height:1;white-space:nowrap}.inspector-box-tag{position:fixed;transform:translateY(-100%);padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:var(--inspector-text);box-shadow:0 12px 24px #0003;font-size:10px;line-height:1;pointer-events:none}.inspector-box-tag--margin{color:#fbbf24}.inspector-box-tag--padding{color:#86efac;transform:translateY(0)}.inspector-box-tag--gap{color:#d8b4fe}.inspector-text-chip{position:fixed;transform:translateY(-100%);display:inline-flex;gap:6px;align-items:center;padding:4px 6px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f0;color:#e5e7eb;box-shadow:0 12px 24px #00000038;font-size:10px;line-height:1;white-space:nowrap;pointer-events:none}.inspector-text-chip__swatch{width:8px;height:8px;border-radius:999px;border:1px solid rgba(255,255,255,.18);flex:0 0 auto}.inspector-connector{position:fixed;border-color:#4f8cffb8;border-style:dashed;pointer-events:none}.inspector-connector--vertical{border-left-width:1px;width:0}.inspector-connector--horizontal{border-top-width:1px;height:0}.inspector-distance-line{position:fixed;background:var(--inspector-blue);pointer-events:none}.inspector-distance-line--horizontal{height:1px}.inspector-distance-line--vertical{width:1px}.inspector-distance-tag{position:fixed;transform:translate(-50%);padding:5px 7px;border-radius:999px;border:1px solid var(--inspector-panel-edge);background:#111827f2;color:var(--inspector-text);font-size:10px;line-height:1;pointer-events:none}.inspector-distance-tag--vertical{transform:translateY(-50%)}.inspector-guide{position:fixed;margin:0;padding:0;border:0;background:transparent;pointer-events:auto;cursor:grab}.inspector-guide--vertical{top:0;width:14px;height:100vh;transform:translate(-50%)}.inspector-guide--horizontal{left:0;width:100vw;height:14px;transform:translateY(-50%)}.inspector-guide--preview{opacity:.55;pointer-events:none;cursor:default}.inspector-guide--preview .inspector-guide-line{background:color-mix(in srgb,var(--inspector-guide, #ff7a00) 72%,transparent)}.inspector-guide-line{position:absolute;inset:0;pointer-events:none}.inspector-guide--vertical .inspector-guide-line{left:calc(50% - .5px);width:1px;height:100%;background:var(--inspector-guide, #ff7a00)}.inspector-guide--horizontal .inspector-guide-line{top:calc(50% - .5px);width:100%;height:1px;background:var(--inspector-guide, #ff7a00)}.inspector-guide--selected .inspector-guide-line{box-shadow:0 0 0 1px #ffffff80}\n"] }]
|
|
406
437
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
407
438
|
type: Inject,
|
|
408
439
|
args: [PLATFORM_ID]
|
|
@@ -416,24 +447,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
416
447
|
type: Input
|
|
417
448
|
}], handleKeydown: [{
|
|
418
449
|
type: HostListener,
|
|
419
|
-
args: [
|
|
450
|
+
args: ["window:keydown", ["$event"]]
|
|
420
451
|
}], handleKeyup: [{
|
|
421
452
|
type: HostListener,
|
|
422
|
-
args: [
|
|
453
|
+
args: ["window:keyup", ["$event"]]
|
|
423
454
|
}], handlePointerMove: [{
|
|
424
455
|
type: HostListener,
|
|
425
|
-
args: [
|
|
456
|
+
args: ["window:pointermove", ["$event"]]
|
|
426
457
|
}], handlePointerUp: [{
|
|
427
458
|
type: HostListener,
|
|
428
|
-
args: [
|
|
459
|
+
args: ["window:pointerup"]
|
|
429
460
|
}], handleClick: [{
|
|
430
461
|
type: HostListener,
|
|
431
|
-
args: [
|
|
462
|
+
args: ["window:click", ["$event"]]
|
|
432
463
|
}], handleViewportChange: [{
|
|
433
464
|
type: HostListener,
|
|
434
|
-
args: [
|
|
465
|
+
args: ["window:resize"]
|
|
435
466
|
}, {
|
|
436
467
|
type: HostListener,
|
|
437
|
-
args: [
|
|
468
|
+
args: ["window:scroll"]
|
|
438
469
|
}] } });
|
|
439
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BlY3Rvci1uZy9zcmMvbGliL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQix1QkFBdUIsRUFDdkIscUJBQXFCLEdBQ3RCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixvQkFBb0IsR0FDckIsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBV2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQVVoRCxNQUFNLE9BQU8sa0JBQWtCO0lBZ0Q3QixZQUFpQyxVQUFrQjtRQS9DMUMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLGdCQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzFCLG9CQUFlLEdBQUcsaUJBQWlCLENBQUM7UUFDcEMsZ0JBQVcsR0FBRyxTQUFTLENBQTBCLGFBQWEsQ0FBQyxDQUFDO1FBRWhF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bEMsTUFBTTsyQkFBQyxXQUFXO3lDQTFDdEIsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQW9KTixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBcUYxQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVN4QyxpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBd0U5QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCO2dCQVVoQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTZDeEMsb0JBQW9CO3NCQUZuQixZQUFZO3VCQUFDLGVBQWU7O3NCQUM1QixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIFBMQVRGT1JNX0lELFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBHVUlERV9ISVRCT1hfU0laRSxcbiAgR1VJREVfU05BUF9ESVNUQU5DRSxcbiAgaW5zcGVjdG9yX1NUQVRFX1ZFUlNJT04sXG4gIGluc3BlY3Rvcl9TVE9SQUdFX0tFWSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5zcGVjdE1lYXN1cmVtZW50LFxuICBnZXRSZWN0RnJvbURvbSxcbiAgZ2V0VGFyZ2V0RWxlbWVudCxcbiAgZ2V0VmlzaWJsZVRleHRCbG9ja3MsXG59IGZyb20gJy4vZG9tJztcbmltcG9ydCB7IGdldERpc3RhbmNlT3ZlcmxheSB9IGZyb20gJy4vZGlzdGFuY2VzJztcbmltcG9ydCB7IGNsYW1wLCBnZXRWaWV3cG9ydFNpemUsIHJlY3RzRXF1YWwgfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7XG4gIERpc3RhbmNlT3ZlcmxheSxcbiAgR3VpZGUsXG4gIEd1aWRlT3JpZW50YXRpb24sXG4gIEluc3BlY3RNZWFzdXJlbWVudCxcbiAgaW5zcGVjdG9yUGVyc2lzdGVkU3RhdGUsXG4gIFJlY3QsXG4gIFRleHRCbG9ja0Fubm90YXRpb24sXG4gIFRvb2xNb2RlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUlkLCBmb3JtYXRWYWx1ZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpbnNwZWN0b3Itb3ZlcmxheScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5zcGVjdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2luc3BlY3Rvci5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIGluc3BlY3RvckNvbXBvbmVudCB7XG4gIHJlYWRvbmx5IE1hdGggPSBNYXRoO1xuICByZWFkb25seSBmb3JtYXRWYWx1ZSA9IGZvcm1hdFZhbHVlO1xuICByZWFkb25seSBndWlkZUhpdGJveFNpemUgPSBHVUlERV9ISVRCT1hfU0laRTtcbiAgcmVhZG9ubHkgb3ZlcmxheVJvb3QgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdvdmVybGF5Um9vdCcpO1xuXG4gIEBJbnB1dCgpIGhpZ2hsaWdodENvbG9yID0gJyM0ZjhjZmYnO1xuICBASW5wdXQoKSBndWlkZUNvbG9yID0gJyNmZjdhMDAnO1xuICBASW5wdXQoKSBob3ZlckhpZ2hsaWdodEVuYWJsZWQgPSB0cnVlO1xuICBASW5wdXQoKSBwZXJzaXN0T25SZWxvYWQgPSBmYWxzZTtcblxuICByZWFkb25seSBlbmFibGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgdG9vbE1vZGUgPSBzaWduYWw8VG9vbE1vZGU+KCdub25lJyk7XG4gIHJlYWRvbmx5IGd1aWRlT3JpZW50YXRpb24gPSBzaWduYWw8R3VpZGVPcmllbnRhdGlvbj4oJ3ZlcnRpY2FsJyk7XG4gIHJlYWRvbmx5IGd1aWRlcyA9IHNpZ25hbDxHdWlkZVtdPihbXSk7XG4gIHJlYWRvbmx5IGhvdmVyUmVjdCA9IHNpZ25hbDxSZWN0IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkR3VpZGVJZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRNZWFzdXJlbWVudCA9IHNpZ25hbDxJbnNwZWN0TWVhc3VyZW1lbnQgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2hvd1R5cG9ncmFwaHkgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IGFsdFByZXNzZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBkaXN0YW5jZU92ZXJsYXkgPSBzaWduYWw8RGlzdGFuY2VPdmVybGF5IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHRleHRCbG9ja3MgPSBzaWduYWw8VGV4dEJsb2NrQW5ub3RhdGlvbltdPihbXSk7XG4gIHJlYWRvbmx5IGd1aWRlTWVudU9wZW4gPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBndWlkZVByZXZpZXcgPSBzaWduYWw8R3VpZGUgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBzZWxlY3RlZE1ldGFMaW5lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50KCk7XG4gICAgaWYgKCFzZWxlY3RlZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7c2VsZWN0ZWQubGFiZWx9IMK3ICR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQucmVjdC53aWR0aCl9IHggJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5yZWN0LmhlaWdodCl9IMK3ICR7c2VsZWN0ZWQuc3R5bGVzLmZvbnRTaXplfSAvICR7c2VsZWN0ZWQuc3R5bGVzLmxpbmVIZWlnaHR9IC8gJHtzZWxlY3RlZC5zdHlsZXMuY29sb3J9YDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0Jyb3dzZXI6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgaHlkcmF0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RvcnkgPSBzaWduYWw8R3VpZGVbXVtdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeUluZGV4ID0gc2lnbmFsKC0xKTtcbiAgcHJpdmF0ZSBkcmFnZ2luZ0d1aWRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcmVhZG9ubHkgY2FuVW5kbyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlzdG9yeUluZGV4KCkgPiAwKTtcbiAgcmVhZG9ubHkgY2FuUmVkbyA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICB0aGlzLmhpc3RvcnlJbmRleCgpID49IDAgJiZcbiAgICAgIHRoaXMuaGlzdG9yeUluZGV4KCkgPCB0aGlzLmhpc3RvcnkoKS5sZW5ndGggLSAxLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IG9iamVjdCkge1xuICAgIHRoaXMuaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnBlcnNpc3RPblJlbG9hZCB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgIXRoaXMuaHlkcmF0ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWQ6IGluc3BlY3RvclBlcnNpc3RlZFN0YXRlID0ge1xuICAgICAgICB2ZXJzaW9uOiBpbnNwZWN0b3JfU1RBVEVfVkVSU0lPTixcbiAgICAgICAgZW5hYmxlZDogdGhpcy5lbmFibGVkKCksXG4gICAgICAgIHRvb2xNb2RlOiB0aGlzLnRvb2xNb2RlKCksXG4gICAgICAgIGd1aWRlT3JpZW50YXRpb246IHRoaXMuZ3VpZGVPcmllbnRhdGlvbigpLFxuICAgICAgICBndWlkZXM6IHRoaXMuZ3VpZGVzKCksXG4gICAgICAgIHNob3dUeXBvZ3JhcGh5OiB0aGlzLnNob3dUeXBvZ3JhcGh5KCksXG4gICAgICB9O1xuXG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgIGluc3BlY3Rvcl9TVE9SQUdFX0tFWSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3NlciB8fCAhdGhpcy5wZXJzaXN0T25SZWxvYWQpIHtcbiAgICAgIHRoaXMuaHlkcmF0ZWQuc2V0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShpbnNwZWN0b3JfU1RPUkFHRV9LRVkpO1xuICAgIGlmICghc3RvcmVkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdG9yZWQpIGFzIGluc3BlY3RvclBlcnNpc3RlZFN0YXRlO1xuICAgICAgaWYgKHBhcnNlZC52ZXJzaW9uID09PSBpbnNwZWN0b3JfU1RBVEVfVkVSU0lPTikge1xuICAgICAgICB0aGlzLmVuYWJsZWQuc2V0KHBhcnNlZC5lbmFibGVkKTtcbiAgICAgICAgdGhpcy50b29sTW9kZS5zZXQocGFyc2VkLnRvb2xNb2RlKTtcbiAgICAgICAgdGhpcy5ndWlkZU9yaWVudGF0aW9uLnNldChwYXJzZWQuZ3VpZGVPcmllbnRhdGlvbik7XG4gICAgICAgIHRoaXMuZ3VpZGVzLnNldChwYXJzZWQuZ3VpZGVzID8/IFtdKTtcbiAgICAgICAgdGhpcy5zaG93VHlwb2dyYXBoeS5zZXQocGFyc2VkLnNob3dUeXBvZ3JhcGh5ID8/IHRydWUpO1xuICAgICAgICB0aGlzLnJlY29yZEhpc3RvcnkocGFyc2VkLmd1aWRlcyA/PyBbXSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgbWFsZm9ybWVkIHN0YXRlXG4gICAgfVxuXG4gICAgdGhpcy5oeWRyYXRlZC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgc2V0VG9vbE1vZGUobW9kZTogVG9vbE1vZGUpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmVuYWJsZWQuc2V0KHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMudG9vbE1vZGUuc2V0KHRoaXMudG9vbE1vZGUoKSA9PT0gbW9kZSA/ICdub25lJyA6IG1vZGUpO1xuICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHNldEd1aWRlT3JpZW50YXRpb24ob3JpZW50YXRpb246IEd1aWRlT3JpZW50YXRpb24pIHtcbiAgICB0aGlzLmd1aWRlT3JpZW50YXRpb24uc2V0KG9yaWVudGF0aW9uKTtcbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gIH1cblxuICB0b2dnbGVUeXBvZ3JhcGh5KCkge1xuICAgIHRoaXMuc2hvd1R5cG9ncmFwaHkudXBkYXRlKCh2YWx1ZSkgPT4gIXZhbHVlKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICB0b2dnbGVHdWlkZU1lbnUoKSB7XG4gICAgdGhpcy5ndWlkZU1lbnVPcGVuLnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gIH1cblxuICBjbGVhckd1aWRlcygpIHtcbiAgICB0aGlzLmd1aWRlcy5zZXQoW10pO1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICB0aGlzLnJlY29yZEhpc3RvcnkoW10pO1xuICB9XG5cbiAgdHJhY2tHdWlkZSA9IChfaW5kZXg6IG51bWJlciwgZ3VpZGU6IEd1aWRlKSA9PiBndWlkZS5pZDtcbiAgdHJhY2tUZXh0QmxvY2sgPSAoX2luZGV4OiBudW1iZXIsIGJsb2NrOiBUZXh0QmxvY2tBbm5vdGF0aW9uKSA9PiBibG9jay5pZDtcbiAgdHJhY2tDb25uZWN0b3IgPSAoXG4gICAgX2luZGV4OiBudW1iZXIsXG4gICAgY29ubmVjdG9yOiBEaXN0YW5jZU92ZXJsYXlbJ2Nvbm5lY3RvcnMnXVtudW1iZXJdLFxuICApID0+IGAke2Nvbm5lY3Rvci54MX06JHtjb25uZWN0b3IueTF9OiR7Y29ubmVjdG9yLngyfToke2Nvbm5lY3Rvci55Mn1gO1xuXG4gIHN0YXJ0R3VpZGVEcmFnKGV2ZW50OiBQb2ludGVyRXZlbnQsIGd1aWRlOiBHdWlkZSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgPSBndWlkZS5pZDtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQoZ3VpZGUuaWQpO1xuICB9XG5cbiAgZm9ybWF0RWRnZXMoZWRnZXM6IEluc3BlY3RNZWFzdXJlbWVudFsncGFkZGluZyddKSB7XG4gICAgcmV0dXJuIGAke2Zvcm1hdFZhbHVlKGVkZ2VzLnRvcCl9ICR7Zm9ybWF0VmFsdWUoZWRnZXMucmlnaHQpfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLmJvdHRvbSl9ICR7Zm9ybWF0VmFsdWUoZWRnZXMubGVmdCl9YDtcbiAgfVxuXG4gIGZvcm1hdEdhcChzZWxlY3RlZDogSW5zcGVjdE1lYXN1cmVtZW50KSB7XG4gICAgcmV0dXJuIGAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLmdhcC5yb3cpfSAvICR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQuZ2FwLmNvbHVtbil9YDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGtleSA9PT0gJ20nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5lbmFibGVkLnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7XG4gICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KCdub25lJyk7XG4gICAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoW10pO1xuICAgICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJiBrZXkgPT09ICd6Jykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy5yZWRvKCkgOiB0aGlzLnVuZG8oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAncycpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFRvb2xNb2RlKCdzZWxlY3QnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnZycpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFRvb2xNb2RlKCdndWlkZXMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnaCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEd1aWRlT3JpZW50YXRpb24oJ2hvcml6b250YWwnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAndicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEd1aWRlT3JpZW50YXRpb24oJ3ZlcnRpY2FsJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0FsdCcpIHtcbiAgICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdlc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgIHRoaXMuY2xlYXJHdWlkZXMoKTtcbiAgICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoKGtleSA9PT0gJ2JhY2tzcGFjZScgfHwga2V5ID09PSAnZGVsZXRlJykgJiYgdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IG5leHRHdWlkZXMgPSB0aGlzLmd1aWRlcygpLmZpbHRlcihcbiAgICAgICAgKGd1aWRlKSA9PiBndWlkZS5pZCAhPT0gdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmd1aWRlcy5zZXQobmV4dEd1aWRlcyk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnJlY29yZEhpc3RvcnkobmV4dEd1aWRlcyk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5dXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQWx0Jykge1xuICAgICAgdGhpcy5hbHRQcmVzc2VkLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJtb3ZlJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlUG9pbnRlck1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgICAgdGhpcy5ndWlkZXMuc2V0KFxuICAgICAgICB0aGlzLmd1aWRlcygpLm1hcCgoZ3VpZGUpID0+IHtcbiAgICAgICAgICBpZiAoZ3VpZGUuaWQgIT09IHRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3VpZGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJhd1Bvc2l0aW9uID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgICAgICAgY29uc3QgbWF4ID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gdmlld3BvcnQud2lkdGggOiB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uZ3VpZGUsIHBvc2l0aW9uOiBjbGFtcChyYXdQb3NpdGlvbiwgMCwgbWF4KSB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpID8/XG4gICAgICAgIGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldCh0aGlzLmdldEd1aWRlUHJldmlldyhldmVudCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgIT09ICdzZWxlY3QnIHx8ICF0aGlzLmhvdmVySGlnaGxpZ2h0RW5hYmxlZCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLmFsdFByZXNzZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGwsXG4gICAgKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSBnZXRSZWN0RnJvbURvbSh0YXJnZXQpO1xuICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gdGFyZ2V0O1xuICAgIGlmICghcmVjdHNFcXVhbChyZWN0LCB0aGlzLmhvdmVyUmVjdCgpKSkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KHJlY3QpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVydXAnKVxuICBoYW5kbGVQb2ludGVyVXAoKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlY29yZEhpc3RvcnkodGhpcy5ndWlkZXMoKSk7XG4gICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgPSBudWxsO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdndWlkZXMnKSB7XG4gICAgICBpZiAob3ZlcmxheSAmJiBvdmVybGF5LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBndWlkZSA9IHRoaXMuZ2V0R3VpZGVQcmV2aWV3KGV2ZW50KTtcbiAgICAgIHRoaXMuYWRkR3VpZGUoeyAuLi5ndWlkZSwgaWQ6IGNyZWF0ZUlkKCkgfSk7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQoZ3VpZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgIT09ICdzZWxlY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgb3ZlcmxheSxcbiAgICApO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQoZ2V0SW5zcGVjdE1lYXN1cmVtZW50KHRhcmdldCkpO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChcbiAgICAgIHRoaXMuZmluZEd1aWRlQXRQb2ludChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSxcbiAgICApO1xuICAgIHRoaXMudXBkYXRlRGlzdGFuY2VPdmVybGF5KCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBoYW5kbGVWaWV3cG9ydENoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQgJiYgZG9jdW1lbnQuY29udGFpbnModGhpcy5zZWxlY3RlZEVsZW1lbnQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCkpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzdGFuY2VPdmVybGF5KCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFsdFByZXNzZWQoKSB8fFxuICAgICAgIXRoaXMuc2VsZWN0ZWRFbGVtZW50IHx8XG4gICAgICAhdGhpcy5ob3ZlckVsZW1lbnQgfHxcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID09PSB0aGlzLmhvdmVyRWxlbWVudCB8fFxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuY29udGFpbnModGhpcy5ob3ZlckVsZW1lbnQpIHx8XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudC5jb250YWlucyh0aGlzLnNlbGVjdGVkRWxlbWVudClcbiAgICApIHtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQoXG4gICAgICBnZXREaXN0YW5jZU92ZXJsYXkoXG4gICAgICAgIGdldFJlY3RGcm9tRG9tKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSxcbiAgICAgICAgZ2V0UmVjdEZyb21Eb20odGhpcy5ob3ZlckVsZW1lbnQpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyIHx8ICF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5zaG93VHlwb2dyYXBoeSgpKSB7XG4gICAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFtdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoXG4gICAgICBnZXRWaXNpYmxlVGV4dEJsb2Nrcyh0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbClcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoYmxvY2spID0+XG4gICAgICAgICAgICBibG9jay5yZWN0LnRvcCA+PSAwICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LnRvcCA8PSB2aWV3cG9ydC5oZWlnaHQgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QubGVmdCA+PSAwICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LmxlZnQgPD0gdmlld3BvcnQud2lkdGgsXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoYmxvY2spID0+ICh7XG4gICAgICAgICAgLi4uYmxvY2ssXG4gICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgLi4uYmxvY2sucmVjdCxcbiAgICAgICAgICAgIGxlZnQ6IGNsYW1wKGJsb2NrLnJlY3QubGVmdCwgMCwgdmlld3BvcnQud2lkdGggLSAxMiksXG4gICAgICAgICAgICB0b3A6IGNsYW1wKGJsb2NrLnJlY3QudG9wLCAxNCwgdmlld3BvcnQuaGVpZ2h0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkR3VpZGUoZ3VpZGU6IEd1aWRlKSB7XG4gICAgY29uc3QgbmV4dEd1aWRlcyA9IFsuLi50aGlzLmd1aWRlcygpLCBndWlkZV07XG4gICAgdGhpcy5ndWlkZXMuc2V0KG5leHRHdWlkZXMpO1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChndWlkZS5pZCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KG5leHRHdWlkZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRHdWlkZVByZXZpZXcoZXZlbnQ6IFBvaW50ZXJFdmVudCB8IE1vdXNlRXZlbnQpOiBHdWlkZSB7XG4gICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IHRoaXMuZ3VpZGVPcmllbnRhdGlvbigpO1xuICAgIGNvbnN0IHJhd1Bvc2l0aW9uID1cbiAgICAgIG9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgY29uc3QgbWF4ID0gb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyB2aWV3cG9ydC53aWR0aCA6IHZpZXdwb3J0LmhlaWdodDtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3ByZXZpZXcnLFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgICBwb3NpdGlvbjogdGhpcy5zbmFwR3VpZGUoY2xhbXAocmF3UG9zaXRpb24sIDAsIG1heCkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNuYXBHdWlkZShwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBndWlkZSBvZiB0aGlzLmd1aWRlcygpKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoZ3VpZGUucG9zaXRpb24gLSBwb3NpdGlvbikgPD0gR1VJREVfU05BUF9ESVNUQU5DRSkge1xuICAgICAgICByZXR1cm4gZ3VpZGUucG9zaXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEd1aWRlQXRQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGZvciAoY29uc3QgZ3VpZGUgb2YgdGhpcy5ndWlkZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJlxuICAgICAgICBNYXRoLmFicyhndWlkZS5wb3NpdGlvbiAtIHgpIDw9IEdVSURFX0hJVEJPWF9TSVpFXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGd1aWRlLmlkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnICYmXG4gICAgICAgIE1hdGguYWJzKGd1aWRlLnBvc2l0aW9uIC0geSkgPD0gR1VJREVfSElUQk9YX1NJWkVcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZ3VpZGUuaWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmRvKCkge1xuICAgIGlmICghdGhpcy5jYW5VbmRvKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSAtIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgdGhpcy5ndWlkZXMuc2V0KHRoaXMuY2xvbmVHdWlkZXModGhpcy5oaXN0b3J5KClbbmV4dEluZGV4XSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRvKCkge1xuICAgIGlmICghdGhpcy5jYW5SZWRvKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSArIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgdGhpcy5ndWlkZXMuc2V0KHRoaXMuY2xvbmVHdWlkZXModGhpcy5oaXN0b3J5KClbbmV4dEluZGV4XSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvcmRIaXN0b3J5KGd1aWRlczogR3VpZGVbXSkge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmhpc3RvcnkoKS5zbGljZSgwLCB0aGlzLmhpc3RvcnlJbmRleCgpICsgMSk7XG4gICAgYmFzZS5wdXNoKHRoaXMuY2xvbmVHdWlkZXMoZ3VpZGVzKSk7XG4gICAgdGhpcy5oaXN0b3J5LnNldChiYXNlKTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQoYmFzZS5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVHdWlkZXMoZ3VpZGVzOiBHdWlkZVtdKSB7XG4gICAgcmV0dXJuIGd1aWRlcy5tYXAoKGd1aWRlKSA9PiAoeyAuLi5ndWlkZSB9KSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJpbnNwZWN0b3Itcm9vdFwiICNvdmVybGF5Um9vdD5cbiAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19yYWlsXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidG9vbE1vZGUoKSA9PT0gJ3NlbGVjdCdcIlxuICAgICAgICAoY2xpY2spPVwic2V0VG9vbE1vZGUoJ3NlbGVjdCcpXCJcbiAgICAgICAgdGl0bGU9XCJTZWxlY3QgbW9kZVwiXG4gICAgICA+XG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMyAybDggOC0zIC43TDYuNyAxMyA2IDEwIDMgMnpcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItaWNvbi1idXR0b25cIlxuICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInNob3dUeXBvZ3JhcGh5KClcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlVHlwb2dyYXBoeSgpXCJcbiAgICAgICAgdGl0bGU9XCJUeXBvZ3JhcGh5IG1vZGVcIlxuICAgICAgPlxuICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTMgNFYyaDEwdjJoLTR2MTBIN1Y0elwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWdyb3VwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvbiBpbnNwZWN0b3ItaWNvbi1idXR0b24tLWd1aWRlLW1haW5cIlxuICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidG9vbE1vZGUoKSA9PT0gJ2d1aWRlcydcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRUb29sTW9kZSgnZ3VpZGVzJylcIlxuICAgICAgICAgIHRpdGxlPVwiR3VpZGVzIG1vZGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQgMmgxdjEySDR6TTExIDJoMXYxMmgtMXpNMiA0aDEydjFIMnpNMiAxMWgxMnYxSDJ6XCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uIGluc3BlY3Rvci1pY29uLWJ1dHRvbi0tZ2hvc3QgaW5zcGVjdG9yLWljb24tYnV0dG9uLS1ndWlkZS1tZW51XCJcbiAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cImd1aWRlTWVudU9wZW4oKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUd1aWRlTWVudSgpXCJcbiAgICAgICAgICB0aXRsZT1cIkd1aWRlIG9wdGlvbnNcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQuNDcgNi45N0w4IDEwLjVsMy41My0zLjUzLS45NC0uOTRMOCA4LjYyIDUuNDEgNi4wM3pcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICBAaWYgKGd1aWRlTWVudU9wZW4oKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGUtbWVudVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3Itc2VnbWVudFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiZ3VpZGVPcmllbnRhdGlvbigpID09PSAndmVydGljYWwnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldEd1aWRlT3JpZW50YXRpb24oJ3ZlcnRpY2FsJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBWZXJ0aWNhbFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1zZWdtZW50XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJndWlkZU9yaWVudGF0aW9uKCkgPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZXRHdWlkZU9yaWVudGF0aW9uKCdob3Jpem9udGFsJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBIb3Jpem9udGFsXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXNlZ21lbnQgaW5zcGVjdG9yLXNlZ21lbnQtLWRhbmdlclwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckd1aWRlcygpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQ2xlYXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgdG9vbE1vZGUoKSA9PT0gXCJzZWxlY3RcIikge1xuICAgIEBpZiAoaG92ZXJSZWN0KCkgJiYgaG92ZXJIaWdobGlnaHRFbmFibGVkKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1ob3ZlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImhvdmVyUmVjdCgpIS5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJob3ZlclJlY3QoKSEudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhvdmVyUmVjdCgpIS53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiaG92ZXJSZWN0KCkhLmhlaWdodFwiXG4gICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1hY2NlbnRdPVwiaGlnaGxpZ2h0Q29sb3JcIlxuICAgICAgPjwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoc2VsZWN0ZWRNZWFzdXJlbWVudCgpOyBhcyBzZWxlY3RlZCkge1xuICAgICAgQGlmIChzZWxlY3RlZC5nYXAuYWN0aXZlICYmIHNlbGVjdGVkLnBhcmVudFJlY3QpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1nYXBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LnRvcFwiXG4gICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3Qud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC5oZWlnaHRcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnIGluc3BlY3Rvci1ib3gtdGFnLS1nYXBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LnRvcCAtIDhcIlxuICAgICAgICA+XG4gICAgICAgICAgRyB7eyBmb3JtYXRHYXAoc2VsZWN0ZWQpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1tYXJnaW5cIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tbWFyZ2luXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LnRvcCAtIDhcIlxuICAgICAgPlxuICAgICAgICBNIHt7IGZvcm1hdEVkZ2VzKHNlbGVjdGVkLm1hcmdpbikgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1zZWxlY3RlZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucmVjdC53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucmVjdC5oZWlnaHRcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItYWNjZW50XT1cImhpZ2hsaWdodENvbG9yXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci1sYWJlbFwiPnt7IHNlbGVjdGVkTWV0YUxpbmUoKSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLXBhZGRpbmdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LmhlaWdodFwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveC10YWcgaW5zcGVjdG9yLWJveC10YWctLXBhZGRpbmdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJcbiAgICAgICAgICBzZWxlY3RlZC5wYWRkaW5nUmVjdC50b3AgKyBzZWxlY3RlZC5wYWRkaW5nUmVjdC5oZWlnaHQgKyA4XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIFAge3sgZm9ybWF0RWRnZXMoc2VsZWN0ZWQucGFkZGluZykgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIHNob3dUeXBvZ3JhcGh5KCkpIHtcbiAgICBAZm9yIChibG9jayBvZiB0ZXh0QmxvY2tzKCk7IHRyYWNrIGJsb2NrLmlkKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXRleHQtY2hpcFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImJsb2NrLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiYmxvY2sucmVjdC50b3AgLSA4XCJcbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci10ZXh0LWNoaXBfX3N3YXRjaFwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiYmxvY2suc3R5bGVzLmNvbG9yXCJcbiAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmZvbnRTaXplIH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBibG9jay5zdHlsZXMubGluZUhlaWdodCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmNvbG9yIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgYWx0UHJlc3NlZCgpICYmIGRpc3RhbmNlT3ZlcmxheSgpOyBhcyBkaXN0YW5jZSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1kaXN0YW5jZVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5yZWN0QS5sZWZ0XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UucmVjdEEudG9wXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5yZWN0QS53aWR0aFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRpc3RhbmNlLnJlY3RBLmhlaWdodFwiXG4gICAgPjwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1kaXN0YW5jZVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5yZWN0Qi5sZWZ0XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UucmVjdEIudG9wXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5yZWN0Qi53aWR0aFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRpc3RhbmNlLnJlY3RCLmhlaWdodFwiXG4gICAgPjwvZGl2PlxuXG4gICAgQGZvciAoXG4gICAgICBjb25uZWN0b3Igb2YgZGlzdGFuY2UuY29ubmVjdG9ycztcbiAgICAgIHRyYWNrIHRyYWNrQ29ubmVjdG9yKCRpbmRleCwgY29ubmVjdG9yKVxuICAgICkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb25uZWN0b3JcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWNvbm5lY3Rvci0tdmVydGljYWxdPVwiY29ubmVjdG9yLngxID09PSBjb25uZWN0b3IueDJcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWNvbm5lY3Rvci0taG9yaXpvbnRhbF09XCJjb25uZWN0b3IueTEgPT09IGNvbm5lY3Rvci55MlwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIk1hdGgubWluKGNvbm5lY3Rvci54MSwgY29ubmVjdG9yLngyKVwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiTWF0aC5taW4oY29ubmVjdG9yLnkxLCBjb25uZWN0b3IueTIpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIk1hdGgubWF4KDEsIE1hdGguYWJzKGNvbm5lY3Rvci54MiAtIGNvbm5lY3Rvci54MSkpXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJNYXRoLm1heCgxLCBNYXRoLmFicyhjb25uZWN0b3IueTIgLSBjb25uZWN0b3IueTEpKVwiXG4gICAgICA+PC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChkaXN0YW5jZS5ob3Jpem9udGFsICYmIGRpc3RhbmNlLmhvcml6b250YWwudmFsdWUgPiAwKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUgaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUtLWhvcml6b250YWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICBNYXRoLm1pbihkaXN0YW5jZS5ob3Jpem9udGFsLngxISwgZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEpXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UuaG9yaXpvbnRhbC55IVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJcbiAgICAgICAgICBNYXRoLmFicyhkaXN0YW5jZS5ob3Jpem9udGFsLngyISAtIGRpc3RhbmNlLmhvcml6b250YWwueDEhKVxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICAoZGlzdGFuY2UuaG9yaXpvbnRhbC54MSEgKyBkaXN0YW5jZS5ob3Jpem9udGFsLngyISkgLyAyXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UuaG9yaXpvbnRhbC55ISArIDEwXCJcbiAgICAgID5cbiAgICAgICAge3sgZm9ybWF0VmFsdWUoZGlzdGFuY2UuaG9yaXpvbnRhbC52YWx1ZSkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoZGlzdGFuY2UudmVydGljYWwgJiYgZGlzdGFuY2UudmVydGljYWwudmFsdWUgPiAwKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUgaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUtLXZlcnRpY2FsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UudmVydGljYWwueCFcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIk1hdGgubWluKGRpc3RhbmNlLnZlcnRpY2FsLnkxISwgZGlzdGFuY2UudmVydGljYWwueTIhKVwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UudmVydGljYWwueTIhIC0gZGlzdGFuY2UudmVydGljYWwueTEhKVxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWcgaW5zcGVjdG9yLWRpc3RhbmNlLXRhZy0tdmVydGljYWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS52ZXJ0aWNhbC54ISArIDEwXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCIoZGlzdGFuY2UudmVydGljYWwueTEhICsgZGlzdGFuY2UudmVydGljYWwueTIhKSAvIDJcIlxuICAgICAgPlxuICAgICAgICB7eyBmb3JtYXRWYWx1ZShkaXN0YW5jZS52ZXJ0aWNhbC52YWx1ZSkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpKSB7XG4gICAgQGlmICh0b29sTW9kZSgpID09PSBcImd1aWRlc1wiKSB7XG4gICAgICBAaWYgKGd1aWRlUHJldmlldygpOyBhcyBwcmV2aWV3KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ndWlkZSBpbnNwZWN0b3ItZ3VpZGUtLXByZXZpZXdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXZlcnRpY2FsXT1cInByZXZpZXcub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiXG4gICAgICAgICAgICBwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHByZXZpZXcucG9zaXRpb24gOiBudWxsXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gcHJldmlldy5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1ndWlkZV09XCJndWlkZUNvbG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cblxuICAgIEBmb3IgKGd1aWRlIG9mIGd1aWRlcygpOyB0cmFjayBndWlkZS5pZCkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGVcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS12ZXJ0aWNhbF09XCJndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXNlbGVjdGVkXT1cInNlbGVjdGVkR3VpZGVJZCgpID09PSBndWlkZS5pZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZ3VpZGUucG9zaXRpb24gOiBudWxsXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiXG4gICAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGd1aWRlLnBvc2l0aW9uIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItZ3VpZGVdPVwiZ3VpZGVDb2xvclwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJzdGFydEd1aWRlRHJhZygkZXZlbnQsIGd1aWRlKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIH1cbjwvZGl2PlxuIl19
|
|
470
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BlY3Rvci1uZy9zcmMvbGliL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQix1QkFBdUIsRUFDdkIscUJBQXFCLEdBQ3RCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixvQkFBb0IsR0FDckIsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBV2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQVVoRCxNQUFNLE9BQU8sa0JBQWtCO0lBZ0Q3QixZQUFpQyxVQUFrQjtRQS9DMUMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLGdCQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzFCLG9CQUFlLEdBQUcsaUJBQWlCLENBQUM7UUFDcEMsZ0JBQVcsR0FBRyxTQUFTLENBQTBCLGFBQWEsQ0FBQyxDQUFDO1FBRWhF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RUFBRSxtQkFHTSx1QkFBdUIsQ0FBQyxNQUFNOzswQkFrRGxDLE1BQU07MkJBQUMsV0FBVzt5Q0ExQ3RCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFvSk4sYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXFGMUMsV0FBVztzQkFEVixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFTeEMsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXdFOUMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGtCQUFrQjtnQkFVaEMsV0FBVztzQkFEVixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFnRXhDLG9CQUFvQjtzQkFGbkIsWUFBWTt1QkFBQyxlQUFlOztzQkFDNUIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBQTEFURk9STV9JRCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIEdVSURFX0hJVEJPWF9TSVpFLFxuICBHVUlERV9TTkFQX0RJU1RBTkNFLFxuICBpbnNwZWN0b3JfU1RBVEVfVkVSU0lPTixcbiAgaW5zcGVjdG9yX1NUT1JBR0VfS0VZLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGdldEluc3BlY3RNZWFzdXJlbWVudCxcbiAgZ2V0UmVjdEZyb21Eb20sXG4gIGdldFRhcmdldEVsZW1lbnQsXG4gIGdldFZpc2libGVUZXh0QmxvY2tzLFxufSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCB7IGdldERpc3RhbmNlT3ZlcmxheSB9IGZyb20gXCIuL2Rpc3RhbmNlc1wiO1xuaW1wb3J0IHsgY2xhbXAsIGdldFZpZXdwb3J0U2l6ZSwgcmVjdHNFcXVhbCB9IGZyb20gXCIuL2dlb21ldHJ5XCI7XG5pbXBvcnQge1xuICBEaXN0YW5jZU92ZXJsYXksXG4gIEd1aWRlLFxuICBHdWlkZU9yaWVudGF0aW9uLFxuICBJbnNwZWN0TWVhc3VyZW1lbnQsXG4gIGluc3BlY3RvclBlcnNpc3RlZFN0YXRlLFxuICBSZWN0LFxuICBUZXh0QmxvY2tBbm5vdGF0aW9uLFxuICBUb29sTW9kZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUlkLCBmb3JtYXRWYWx1ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJpbnNwZWN0b3Itb3ZlcmxheVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXSxcbiAgdGVtcGxhdGVVcmw6IFwiLi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmw6IFwiLi9pbnNwZWN0b3IuY29tcG9uZW50LmNzc1wiLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgaW5zcGVjdG9yQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgTWF0aCA9IE1hdGg7XG4gIHJlYWRvbmx5IGZvcm1hdFZhbHVlID0gZm9ybWF0VmFsdWU7XG4gIHJlYWRvbmx5IGd1aWRlSGl0Ym94U2l6ZSA9IEdVSURFX0hJVEJPWF9TSVpFO1xuICByZWFkb25seSBvdmVybGF5Um9vdCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oXCJvdmVybGF5Um9vdFwiKTtcblxuICBASW5wdXQoKSBoaWdobGlnaHRDb2xvciA9IFwiIzRmOGNmZlwiO1xuICBASW5wdXQoKSBndWlkZUNvbG9yID0gXCIjZmY3YTAwXCI7XG4gIEBJbnB1dCgpIGhvdmVySGlnaGxpZ2h0RW5hYmxlZCA9IHRydWU7XG4gIEBJbnB1dCgpIHBlcnNpc3RPblJlbG9hZCA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IGVuYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB0b29sTW9kZSA9IHNpZ25hbDxUb29sTW9kZT4oXCJub25lXCIpO1xuICByZWFkb25seSBndWlkZU9yaWVudGF0aW9uID0gc2lnbmFsPEd1aWRlT3JpZW50YXRpb24+KFwidmVydGljYWxcIik7XG4gIHJlYWRvbmx5IGd1aWRlcyA9IHNpZ25hbDxHdWlkZVtdPihbXSk7XG4gIHJlYWRvbmx5IGhvdmVyUmVjdCA9IHNpZ25hbDxSZWN0IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkR3VpZGVJZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRNZWFzdXJlbWVudCA9IHNpZ25hbDxJbnNwZWN0TWVhc3VyZW1lbnQgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgc2hvd1R5cG9ncmFwaHkgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IGFsdFByZXNzZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBkaXN0YW5jZU92ZXJsYXkgPSBzaWduYWw8RGlzdGFuY2VPdmVybGF5IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHRleHRCbG9ja3MgPSBzaWduYWw8VGV4dEJsb2NrQW5ub3RhdGlvbltdPihbXSk7XG4gIHJlYWRvbmx5IGd1aWRlTWVudU9wZW4gPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBndWlkZVByZXZpZXcgPSBzaWduYWw8R3VpZGUgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBzZWxlY3RlZE1ldGFMaW5lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50KCk7XG4gICAgaWYgKCFzZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHJldHVybiBgJHtzZWxlY3RlZC5sYWJlbH0gwrcgJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5yZWN0LndpZHRoKX0geCAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLnJlY3QuaGVpZ2h0KX0gwrcgJHtzZWxlY3RlZC5zdHlsZXMuZm9udFNpemV9IC8gJHtzZWxlY3RlZC5zdHlsZXMubGluZUhlaWdodH0gLyAke3NlbGVjdGVkLnN0eWxlcy5jb2xvcn1gO1xuICB9KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlzQnJvd3NlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBoeWRyYXRlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeSA9IHNpZ25hbDxHdWlkZVtdW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3J5SW5kZXggPSBzaWduYWwoLTEpO1xuICBwcml2YXRlIGRyYWdnaW5nR3VpZGVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VsZWN0ZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICByZWFkb25seSBjYW5VbmRvID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oaXN0b3J5SW5kZXgoKSA+IDApO1xuICByZWFkb25seSBjYW5SZWRvID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgIHRoaXMuaGlzdG9yeUluZGV4KCkgPj0gMCAmJlxuICAgICAgdGhpcy5oaXN0b3J5SW5kZXgoKSA8IHRoaXMuaGlzdG9yeSgpLmxlbmd0aCAtIDEsXG4gICk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogb2JqZWN0KSB7XG4gICAgdGhpcy5pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucGVyc2lzdE9uUmVsb2FkIHx8ICF0aGlzLmlzQnJvd3NlciB8fCAhdGhpcy5oeWRyYXRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZDogaW5zcGVjdG9yUGVyc2lzdGVkU3RhdGUgPSB7XG4gICAgICAgIHZlcnNpb246IGluc3BlY3Rvcl9TVEFURV9WRVJTSU9OLFxuICAgICAgICBlbmFibGVkOiB0aGlzLmVuYWJsZWQoKSxcbiAgICAgICAgdG9vbE1vZGU6IHRoaXMudG9vbE1vZGUoKSxcbiAgICAgICAgZ3VpZGVPcmllbnRhdGlvbjogdGhpcy5ndWlkZU9yaWVudGF0aW9uKCksXG4gICAgICAgIGd1aWRlczogdGhpcy5ndWlkZXMoKSxcbiAgICAgICAgc2hvd1R5cG9ncmFwaHk6IHRoaXMuc2hvd1R5cG9ncmFwaHkoKSxcbiAgICAgIH07XG5cbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgaW5zcGVjdG9yX1NUT1JBR0VfS0VZLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyIHx8ICF0aGlzLnBlcnNpc3RPblJlbG9hZCkge1xuICAgICAgdGhpcy5oeWRyYXRlZC5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGluc3BlY3Rvcl9TVE9SQUdFX0tFWSk7XG4gICAgaWYgKCFzdG9yZWQpIHtcbiAgICAgIHRoaXMuaHlkcmF0ZWQuc2V0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0b3JlZCkgYXMgaW5zcGVjdG9yUGVyc2lzdGVkU3RhdGU7XG4gICAgICBpZiAocGFyc2VkLnZlcnNpb24gPT09IGluc3BlY3Rvcl9TVEFURV9WRVJTSU9OKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZC5zZXQocGFyc2VkLmVuYWJsZWQpO1xuICAgICAgICB0aGlzLnRvb2xNb2RlLnNldChwYXJzZWQudG9vbE1vZGUpO1xuICAgICAgICB0aGlzLmd1aWRlT3JpZW50YXRpb24uc2V0KHBhcnNlZC5ndWlkZU9yaWVudGF0aW9uKTtcbiAgICAgICAgdGhpcy5ndWlkZXMuc2V0KHBhcnNlZC5ndWlkZXMgPz8gW10pO1xuICAgICAgICB0aGlzLnNob3dUeXBvZ3JhcGh5LnNldChwYXJzZWQuc2hvd1R5cG9ncmFwaHkgPz8gdHJ1ZSk7XG4gICAgICAgIHRoaXMucmVjb3JkSGlzdG9yeShwYXJzZWQuZ3VpZGVzID8/IFtdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSBtYWxmb3JtZWQgc3RhdGVcbiAgICB9XG5cbiAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBzZXRUb29sTW9kZShtb2RlOiBUb29sTW9kZSkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZW5hYmxlZC5zZXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy50b29sTW9kZS5zZXQodGhpcy50b29sTW9kZSgpID09PSBtb2RlID8gXCJub25lXCIgOiBtb2RlKTtcbiAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBzZXRHdWlkZU9yaWVudGF0aW9uKG9yaWVudGF0aW9uOiBHdWlkZU9yaWVudGF0aW9uKSB7XG4gICAgdGhpcy5ndWlkZU9yaWVudGF0aW9uLnNldChvcmllbnRhdGlvbik7XG4gICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICB9XG5cbiAgdG9nZ2xlVHlwb2dyYXBoeSgpIHtcbiAgICB0aGlzLnNob3dUeXBvZ3JhcGh5LnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgdG9nZ2xlR3VpZGVNZW51KCkge1xuICAgIHRoaXMuZ3VpZGVNZW51T3Blbi51cGRhdGUoKHZhbHVlKSA9PiAhdmFsdWUpO1xuICB9XG5cbiAgY2xlYXJHdWlkZXMoKSB7XG4gICAgdGhpcy5ndWlkZXMuc2V0KFtdKTtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KFtdKTtcbiAgfVxuXG4gIHRyYWNrR3VpZGUgPSAoX2luZGV4OiBudW1iZXIsIGd1aWRlOiBHdWlkZSkgPT4gZ3VpZGUuaWQ7XG4gIHRyYWNrVGV4dEJsb2NrID0gKF9pbmRleDogbnVtYmVyLCBibG9jazogVGV4dEJsb2NrQW5ub3RhdGlvbikgPT4gYmxvY2suaWQ7XG4gIHRyYWNrQ29ubmVjdG9yID0gKFxuICAgIF9pbmRleDogbnVtYmVyLFxuICAgIGNvbm5lY3RvcjogRGlzdGFuY2VPdmVybGF5W1wiY29ubmVjdG9yc1wiXVtudW1iZXJdLFxuICApID0+IGAke2Nvbm5lY3Rvci54MX06JHtjb25uZWN0b3IueTF9OiR7Y29ubmVjdG9yLngyfToke2Nvbm5lY3Rvci55Mn1gO1xuXG4gIHN0YXJ0R3VpZGVEcmFnKGV2ZW50OiBQb2ludGVyRXZlbnQsIGd1aWRlOiBHdWlkZSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgPSBndWlkZS5pZDtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQoZ3VpZGUuaWQpO1xuICB9XG5cbiAgZm9ybWF0RWRnZXMoZWRnZXM6IEluc3BlY3RNZWFzdXJlbWVudFtcInBhZGRpbmdcIl0pIHtcbiAgICByZXR1cm4gYCR7Zm9ybWF0VmFsdWUoZWRnZXMudG9wKX0gJHtmb3JtYXRWYWx1ZShlZGdlcy5yaWdodCl9ICR7Zm9ybWF0VmFsdWUoZWRnZXMuYm90dG9tKX0gJHtmb3JtYXRWYWx1ZShlZGdlcy5sZWZ0KX1gO1xuICB9XG5cbiAgZm9ybWF0R2FwKHNlbGVjdGVkOiBJbnNwZWN0TWVhc3VyZW1lbnQpIHtcbiAgICByZXR1cm4gYCR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQuZ2FwLnJvdyl9IC8gJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5nYXAuY29sdW1uKX1gO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzprZXlkb3duXCIsIFtcIiRldmVudFwiXSlcbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGtleSA9PT0gXCJtXCIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmVuYWJsZWQudXBkYXRlKCh2YWx1ZSkgPT4gIXZhbHVlKTtcbiAgICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcbiAgICAgICAgdGhpcy50b29sTW9kZS5zZXQoXCJub25lXCIpO1xuICAgICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFtdKTtcbiAgICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiYga2V5ID09PSBcInpcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy5yZWRvKCkgOiB0aGlzLnVuZG8oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSBcInNcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0VG9vbE1vZGUoXCJzZWxlY3RcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gXCJnXCIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFRvb2xNb2RlKFwiZ3VpZGVzXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09IFwiaFwiKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRHdWlkZU9yaWVudGF0aW9uKFwiaG9yaXpvbnRhbFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSBcInZcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0R3VpZGVPcmllbnRhdGlvbihcInZlcnRpY2FsXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09IFwiQWx0XCIpIHtcbiAgICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09IFwiZXNjYXBlXCIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgdGhpcy5jbGVhckd1aWRlcygpO1xuICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgoa2V5ID09PSBcImJhY2tzcGFjZVwiIHx8IGtleSA9PT0gXCJkZWxldGVcIikgJiYgdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IG5leHRHdWlkZXMgPSB0aGlzLmd1aWRlcygpLmZpbHRlcihcbiAgICAgICAgKGd1aWRlKSA9PiBndWlkZS5pZCAhPT0gdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmd1aWRlcy5zZXQobmV4dEd1aWRlcyk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnJlY29yZEhpc3RvcnkobmV4dEd1aWRlcyk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzprZXl1cFwiLCBbXCIkZXZlbnRcIl0pXG4gIGhhbmRsZUtleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBbHRcIikge1xuICAgICAgdGhpcy5hbHRQcmVzc2VkLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpwb2ludGVybW92ZVwiLCBbXCIkZXZlbnRcIl0pXG4gIGhhbmRsZVBvaW50ZXJNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICAgIHRoaXMuZ3VpZGVzLnNldChcbiAgICAgICAgdGhpcy5ndWlkZXMoKS5tYXAoKGd1aWRlKSA9PiB7XG4gICAgICAgICAgaWYgKGd1aWRlLmlkICE9PSB0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGd1aWRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByYXdQb3NpdGlvbiA9XG4gICAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgICAgICAgY29uc3QgbWF4ID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIgPyB2aWV3cG9ydC53aWR0aCA6IHZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgICByZXR1cm4geyAuLi5ndWlkZSwgcG9zaXRpb246IGNsYW1wKHJhd1Bvc2l0aW9uLCAwLCBtYXgpIH07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50b29sTW9kZSgpID09PSBcImd1aWRlc1wiKSB7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSA/P1xuICAgICAgICBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQodGhpcy5nZXRHdWlkZVByZXZpZXcoZXZlbnQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG5cbiAgICBpZiAodGhpcy50b29sTW9kZSgpICE9PSBcInNlbGVjdFwiIHx8ICF0aGlzLmhvdmVySGlnaGxpZ2h0RW5hYmxlZCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLmFsdFByZXNzZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGwsXG4gICAgKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSBnZXRSZWN0RnJvbURvbSh0YXJnZXQpO1xuICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gdGFyZ2V0O1xuICAgIGlmICghcmVjdHNFcXVhbChyZWN0LCB0aGlzLmhvdmVyUmVjdCgpKSkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KHJlY3QpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cG9pbnRlcnVwXCIpXG4gIGhhbmRsZVBvaW50ZXJVcCgpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVjb3JkSGlzdG9yeSh0aGlzLmd1aWRlcygpKTtcbiAgICB0aGlzLmRyYWdnaW5nR3VpZGVJZCA9IG51bGw7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwid2luZG93OmNsaWNrXCIsIFtcIiRldmVudFwiXSlcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09IFwiZ3VpZGVzXCIpIHtcbiAgICAgIGlmIChvdmVybGF5ICYmIG92ZXJsYXkuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGd1aWRlID0gdGhpcy5nZXRHdWlkZVByZXZpZXcoZXZlbnQpO1xuICAgICAgdGhpcy5hZGRHdWlkZSh7IC4uLmd1aWRlLCBpZDogY3JlYXRlSWQoKSB9KTtcbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChndWlkZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9vbE1vZGUoKSAhPT0gXCJzZWxlY3RcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldEVsZW1lbnQoXG4gICAgICB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgIG92ZXJsYXksXG4gICAgKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDdHJsK2NsaWNrOiBzZWxlY3QgdGhlIG1pbmltdW0gY29tbW9uIHBhcmVudCBvZiBjdXJyZW50IHNlbGVjdGlvbiBhbmQgY2xpY2tlZCBlbGVtZW50XG4gICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIHRoaXMuc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBjb21tb25QYXJlbnQgPSB0aGlzLmZpbmRNaW5pbXVtQ29tbW9uUGFyZW50KFxuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgY29tbW9uUGFyZW50ICYmXG4gICAgICAgIGNvbW1vblBhcmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJlxuICAgICAgICBjb21tb25QYXJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQoZ2V0SW5zcGVjdE1lYXN1cmVtZW50KGNvbW1vblBhcmVudCkpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IGNvbW1vblBhcmVudDtcbiAgICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChnZXRJbnNwZWN0TWVhc3VyZW1lbnQodGFyZ2V0KSk7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSB0YXJnZXQ7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KFxuICAgICAgdGhpcy5maW5kR3VpZGVBdFBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpLFxuICAgICk7XG4gICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnNjcm9sbFwiKVxuICBoYW5kbGVWaWV3cG9ydENoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQgJiYgZG9jdW1lbnQuY29udGFpbnModGhpcy5zZWxlY3RlZEVsZW1lbnQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCkpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzdGFuY2VPdmVybGF5KCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFsdFByZXNzZWQoKSB8fFxuICAgICAgIXRoaXMuc2VsZWN0ZWRFbGVtZW50IHx8XG4gICAgICAhdGhpcy5ob3ZlckVsZW1lbnQgfHxcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID09PSB0aGlzLmhvdmVyRWxlbWVudCB8fFxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuY29udGFpbnModGhpcy5ob3ZlckVsZW1lbnQpIHx8XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudC5jb250YWlucyh0aGlzLnNlbGVjdGVkRWxlbWVudClcbiAgICApIHtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQoXG4gICAgICBnZXREaXN0YW5jZU92ZXJsYXkoXG4gICAgICAgIGdldFJlY3RGcm9tRG9tKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSxcbiAgICAgICAgZ2V0UmVjdEZyb21Eb20odGhpcy5ob3ZlckVsZW1lbnQpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyIHx8ICF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5zaG93VHlwb2dyYXBoeSgpKSB7XG4gICAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFtdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoXG4gICAgICBnZXRWaXNpYmxlVGV4dEJsb2Nrcyh0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbClcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoYmxvY2spID0+XG4gICAgICAgICAgICBibG9jay5yZWN0LnRvcCA+PSAwICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LnRvcCA8PSB2aWV3cG9ydC5oZWlnaHQgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QubGVmdCA+PSAwICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LmxlZnQgPD0gdmlld3BvcnQud2lkdGgsXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoYmxvY2spID0+ICh7XG4gICAgICAgICAgLi4uYmxvY2ssXG4gICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgLi4uYmxvY2sucmVjdCxcbiAgICAgICAgICAgIGxlZnQ6IGNsYW1wKGJsb2NrLnJlY3QubGVmdCwgMCwgdmlld3BvcnQud2lkdGggLSAxMiksXG4gICAgICAgICAgICB0b3A6IGNsYW1wKGJsb2NrLnJlY3QudG9wLCAxNCwgdmlld3BvcnQuaGVpZ2h0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkR3VpZGUoZ3VpZGU6IEd1aWRlKSB7XG4gICAgY29uc3QgbmV4dEd1aWRlcyA9IFsuLi50aGlzLmd1aWRlcygpLCBndWlkZV07XG4gICAgdGhpcy5ndWlkZXMuc2V0KG5leHRHdWlkZXMpO1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChndWlkZS5pZCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KG5leHRHdWlkZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRHdWlkZVByZXZpZXcoZXZlbnQ6IFBvaW50ZXJFdmVudCB8IE1vdXNlRXZlbnQpOiBHdWlkZSB7XG4gICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IHRoaXMuZ3VpZGVPcmllbnRhdGlvbigpO1xuICAgIGNvbnN0IHJhd1Bvc2l0aW9uID1cbiAgICAgIG9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIgPyBldmVudC5jbGllbnRYIDogZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBtYXggPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gdmlld3BvcnQud2lkdGggOiB2aWV3cG9ydC5oZWlnaHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IFwicHJldmlld1wiLFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgICBwb3NpdGlvbjogdGhpcy5zbmFwR3VpZGUoY2xhbXAocmF3UG9zaXRpb24sIDAsIG1heCkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNuYXBHdWlkZShwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBndWlkZSBvZiB0aGlzLmd1aWRlcygpKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoZ3VpZGUucG9zaXRpb24gLSBwb3NpdGlvbikgPD0gR1VJREVfU05BUF9ESVNUQU5DRSkge1xuICAgICAgICByZXR1cm4gZ3VpZGUucG9zaXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEd1aWRlQXRQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGZvciAoY29uc3QgZ3VpZGUgb2YgdGhpcy5ndWlkZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiICYmXG4gICAgICAgIE1hdGguYWJzKGd1aWRlLnBvc2l0aW9uIC0geCkgPD0gR1VJREVfSElUQk9YX1NJWkVcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZ3VpZGUuaWQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiAmJlxuICAgICAgICBNYXRoLmFicyhndWlkZS5wb3NpdGlvbiAtIHkpIDw9IEdVSURFX0hJVEJPWF9TSVpFXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGd1aWRlLmlkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdW5kbygpIHtcbiAgICBpZiAoIXRoaXMuY2FuVW5kbygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuaGlzdG9yeUluZGV4KCkgLSAxO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgIHRoaXMuZ3VpZGVzLnNldCh0aGlzLmNsb25lR3VpZGVzKHRoaXMuaGlzdG9yeSgpW25leHRJbmRleF0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVkbygpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVkbygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuaGlzdG9yeUluZGV4KCkgKyAxO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgIHRoaXMuZ3VpZGVzLnNldCh0aGlzLmNsb25lR3VpZGVzKHRoaXMuaGlzdG9yeSgpW25leHRJbmRleF0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb3JkSGlzdG9yeShndWlkZXM6IEd1aWRlW10pIHtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5oaXN0b3J5KCkuc2xpY2UoMCwgdGhpcy5oaXN0b3J5SW5kZXgoKSArIDEpO1xuICAgIGJhc2UucHVzaCh0aGlzLmNsb25lR3VpZGVzKGd1aWRlcykpO1xuICAgIHRoaXMuaGlzdG9yeS5zZXQoYmFzZSk7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KGJhc2UubGVuZ3RoIC0gMSk7XG4gIH1cblxuICBwcml2YXRlIGNsb25lR3VpZGVzKGd1aWRlczogR3VpZGVbXSkge1xuICAgIHJldHVybiBndWlkZXMubWFwKChndWlkZSkgPT4gKHsgLi4uZ3VpZGUgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWluaW11bUNvbW1vblBhcmVudChcbiAgICBlbGVtZW50QTogSFRNTEVsZW1lbnQsXG4gICAgZWxlbWVudEI6IEhUTUxFbGVtZW50LFxuICApOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIC8vIEJ1aWxkIGFuY2VzdG9yIGNoYWluIGZvciBlbGVtZW50IEFcbiAgICBjb25zdCBhbmNlc3RvcnNBID0gbmV3IFNldDxFbGVtZW50PigpO1xuICAgIGxldCBjdXJyZW50OiBFbGVtZW50IHwgbnVsbCA9IGVsZW1lbnRBO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBhbmNlc3RvcnNBLmFkZChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gV2FsayB1cCBmcm9tIGVsZW1lbnRCIHVudGlsIHdlIGZpbmQgYSBjb21tb24gYW5jZXN0b3JcbiAgICBjdXJyZW50ID0gZWxlbWVudEI7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGlmIChhbmNlc3RvcnNBLmhhcyhjdXJyZW50KSkge1xuICAgICAgICByZXR1cm4gY3VycmVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJpbnNwZWN0b3Itcm9vdFwiICNvdmVybGF5Um9vdD5cbiAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19yYWlsXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidG9vbE1vZGUoKSA9PT0gJ3NlbGVjdCdcIlxuICAgICAgICAoY2xpY2spPVwic2V0VG9vbE1vZGUoJ3NlbGVjdCcpXCJcbiAgICAgICAgdGl0bGU9XCJTZWxlY3QgbW9kZVwiXG4gICAgICA+XG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMyAybDggOC0zIC43TDYuNyAxMyA2IDEwIDMgMnpcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItaWNvbi1idXR0b25cIlxuICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInNob3dUeXBvZ3JhcGh5KClcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlVHlwb2dyYXBoeSgpXCJcbiAgICAgICAgdGl0bGU9XCJUeXBvZ3JhcGh5IG1vZGVcIlxuICAgICAgPlxuICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTMgNFYyaDEwdjJoLTR2MTBIN1Y0elwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWdyb3VwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvbiBpbnNwZWN0b3ItaWNvbi1idXR0b24tLWd1aWRlLW1haW5cIlxuICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidG9vbE1vZGUoKSA9PT0gJ2d1aWRlcydcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRUb29sTW9kZSgnZ3VpZGVzJylcIlxuICAgICAgICAgIHRpdGxlPVwiR3VpZGVzIG1vZGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQgMmgxdjEySDR6TTExIDJoMXYxMmgtMXpNMiA0aDEydjFIMnpNMiAxMWgxMnYxSDJ6XCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uIGluc3BlY3Rvci1pY29uLWJ1dHRvbi0tZ2hvc3QgaW5zcGVjdG9yLWljb24tYnV0dG9uLS1ndWlkZS1tZW51XCJcbiAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cImd1aWRlTWVudU9wZW4oKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUd1aWRlTWVudSgpXCJcbiAgICAgICAgICB0aXRsZT1cIkd1aWRlIG9wdGlvbnNcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQuNDcgNi45N0w4IDEwLjVsMy41My0zLjUzLS45NC0uOTRMOCA4LjYyIDUuNDEgNi4wM3pcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICBAaWYgKGd1aWRlTWVudU9wZW4oKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGUtbWVudVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3Itc2VnbWVudFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiZ3VpZGVPcmllbnRhdGlvbigpID09PSAndmVydGljYWwnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldEd1aWRlT3JpZW50YXRpb24oJ3ZlcnRpY2FsJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBWZXJ0aWNhbFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1zZWdtZW50XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJndWlkZU9yaWVudGF0aW9uKCkgPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZXRHdWlkZU9yaWVudGF0aW9uKCdob3Jpem9udGFsJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBIb3Jpem9udGFsXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXNlZ21lbnQgaW5zcGVjdG9yLXNlZ21lbnQtLWRhbmdlclwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckd1aWRlcygpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQ2xlYXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgdG9vbE1vZGUoKSA9PT0gXCJzZWxlY3RcIikge1xuICAgIEBpZiAoaG92ZXJSZWN0KCkgJiYgaG92ZXJIaWdobGlnaHRFbmFibGVkKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1ob3ZlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImhvdmVyUmVjdCgpIS5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJob3ZlclJlY3QoKSEudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhvdmVyUmVjdCgpIS53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiaG92ZXJSZWN0KCkhLmhlaWdodFwiXG4gICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1hY2NlbnRdPVwiaGlnaGxpZ2h0Q29sb3JcIlxuICAgICAgPjwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoc2VsZWN0ZWRNZWFzdXJlbWVudCgpOyBhcyBzZWxlY3RlZCkge1xuICAgICAgQGlmIChzZWxlY3RlZC5nYXAuYWN0aXZlICYmIHNlbGVjdGVkLnBhcmVudFJlY3QpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1nYXBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LnRvcFwiXG4gICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3Qud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC5oZWlnaHRcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnIGluc3BlY3Rvci1ib3gtdGFnLS1nYXBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LnRvcCAtIDhcIlxuICAgICAgICA+XG4gICAgICAgICAgRyB7eyBmb3JtYXRHYXAoc2VsZWN0ZWQpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1tYXJnaW5cIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tbWFyZ2luXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LnRvcCAtIDhcIlxuICAgICAgPlxuICAgICAgICBNIHt7IGZvcm1hdEVkZ2VzKHNlbGVjdGVkLm1hcmdpbikgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1zZWxlY3RlZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucmVjdC53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucmVjdC5oZWlnaHRcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItYWNjZW50XT1cImhpZ2hsaWdodENvbG9yXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci1sYWJlbFwiPnt7IHNlbGVjdGVkTWV0YUxpbmUoKSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLXBhZGRpbmdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LmhlaWdodFwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveC10YWcgaW5zcGVjdG9yLWJveC10YWctLXBhZGRpbmdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJcbiAgICAgICAgICBzZWxlY3RlZC5wYWRkaW5nUmVjdC50b3AgKyBzZWxlY3RlZC5wYWRkaW5nUmVjdC5oZWlnaHQgKyA4XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIFAge3sgZm9ybWF0RWRnZXMoc2VsZWN0ZWQucGFkZGluZykgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIHNob3dUeXBvZ3JhcGh5KCkpIHtcbiAgICBAZm9yIChibG9jayBvZiB0ZXh0QmxvY2tzKCk7IHRyYWNrIGJsb2NrLmlkKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXRleHQtY2hpcFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImJsb2NrLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiYmxvY2sucmVjdC50b3AgLSA4XCJcbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci10ZXh0LWNoaXBfX3N3YXRjaFwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiYmxvY2suc3R5bGVzLmNvbG9yXCJcbiAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmZvbnRTaXplIH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBibG9jay5zdHlsZXMubGluZUhlaWdodCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmNvbG9yIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgYWx0UHJlc3NlZCgpICYmIGRpc3RhbmNlT3ZlcmxheSgpOyBhcyBkaXN0YW5jZSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1kaXN0YW5jZVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5yZWN0QS5sZWZ0XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UucmVjdEEudG9wXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5yZWN0QS53aWR0aFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRpc3RhbmNlLnJlY3RBLmhlaWdodFwiXG4gICAgPjwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1kaXN0YW5jZVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5yZWN0Qi5sZWZ0XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UucmVjdEIudG9wXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5yZWN0Qi53aWR0aFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRpc3RhbmNlLnJlY3RCLmhlaWdodFwiXG4gICAgPjwvZGl2PlxuXG4gICAgQGZvciAoXG4gICAgICBjb25uZWN0b3Igb2YgZGlzdGFuY2UuY29ubmVjdG9ycztcbiAgICAgIHRyYWNrIHRyYWNrQ29ubmVjdG9yKCRpbmRleCwgY29ubmVjdG9yKVxuICAgICkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb25uZWN0b3JcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWNvbm5lY3Rvci0tdmVydGljYWxdPVwiY29ubmVjdG9yLngxID09PSBjb25uZWN0b3IueDJcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWNvbm5lY3Rvci0taG9yaXpvbnRhbF09XCJjb25uZWN0b3IueTEgPT09IGNvbm5lY3Rvci55MlwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIk1hdGgubWluKGNvbm5lY3Rvci54MSwgY29ubmVjdG9yLngyKVwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiTWF0aC5taW4oY29ubmVjdG9yLnkxLCBjb25uZWN0b3IueTIpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIk1hdGgubWF4KDEsIE1hdGguYWJzKGNvbm5lY3Rvci54MiAtIGNvbm5lY3Rvci54MSkpXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJNYXRoLm1heCgxLCBNYXRoLmFicyhjb25uZWN0b3IueTIgLSBjb25uZWN0b3IueTEpKVwiXG4gICAgICA+PC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChkaXN0YW5jZS5ob3Jpem9udGFsICYmIGRpc3RhbmNlLmhvcml6b250YWwudmFsdWUgPiAwKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUgaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUtLWhvcml6b250YWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICBNYXRoLm1pbihkaXN0YW5jZS5ob3Jpem9udGFsLngxISwgZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEpXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UuaG9yaXpvbnRhbC55IVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJcbiAgICAgICAgICBNYXRoLmFicyhkaXN0YW5jZS5ob3Jpem9udGFsLngyISAtIGRpc3RhbmNlLmhvcml6b250YWwueDEhKVxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICAoZGlzdGFuY2UuaG9yaXpvbnRhbC54MSEgKyBkaXN0YW5jZS5ob3Jpem9udGFsLngyISkgLyAyXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UuaG9yaXpvbnRhbC55ISArIDEwXCJcbiAgICAgID5cbiAgICAgICAge3sgZm9ybWF0VmFsdWUoZGlzdGFuY2UuaG9yaXpvbnRhbC52YWx1ZSkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoZGlzdGFuY2UudmVydGljYWwgJiYgZGlzdGFuY2UudmVydGljYWwudmFsdWUgPiAwKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUgaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUtLXZlcnRpY2FsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UudmVydGljYWwueCFcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIk1hdGgubWluKGRpc3RhbmNlLnZlcnRpY2FsLnkxISwgZGlzdGFuY2UudmVydGljYWwueTIhKVwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UudmVydGljYWwueTIhIC0gZGlzdGFuY2UudmVydGljYWwueTEhKVxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWcgaW5zcGVjdG9yLWRpc3RhbmNlLXRhZy0tdmVydGljYWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS52ZXJ0aWNhbC54ISArIDEwXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCIoZGlzdGFuY2UudmVydGljYWwueTEhICsgZGlzdGFuY2UudmVydGljYWwueTIhKSAvIDJcIlxuICAgICAgPlxuICAgICAgICB7eyBmb3JtYXRWYWx1ZShkaXN0YW5jZS52ZXJ0aWNhbC52YWx1ZSkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpKSB7XG4gICAgQGlmICh0b29sTW9kZSgpID09PSBcImd1aWRlc1wiKSB7XG4gICAgICBAaWYgKGd1aWRlUHJldmlldygpOyBhcyBwcmV2aWV3KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ndWlkZSBpbnNwZWN0b3ItZ3VpZGUtLXByZXZpZXdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXZlcnRpY2FsXT1cInByZXZpZXcub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiXG4gICAgICAgICAgICBwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHByZXZpZXcucG9zaXRpb24gOiBudWxsXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gcHJldmlldy5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1ndWlkZV09XCJndWlkZUNvbG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cblxuICAgIEBmb3IgKGd1aWRlIG9mIGd1aWRlcygpOyB0cmFjayBndWlkZS5pZCkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGVcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS12ZXJ0aWNhbF09XCJndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXNlbGVjdGVkXT1cInNlbGVjdGVkR3VpZGVJZCgpID09PSBndWlkZS5pZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZ3VpZGUucG9zaXRpb24gOiBudWxsXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiXG4gICAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGd1aWRlLnBvc2l0aW9uIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItZ3VpZGVdPVwiZ3VpZGVDb2xvclwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJzdGFydEd1aWRlRHJhZygkZXZlbnQsIGd1aWRlKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIH1cbjwvZGl2PlxuIl19
|