@jax-data-science/sci-image-visualizer 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
- package/esm2022/lib/visualizer.component.mjs +188 -146
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +195 -145
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/lib/visualizer.component.d.ts +7 -0
- package/package.json +1 -1
|
@@ -139,6 +139,13 @@ export class VisualizerComponent {
|
|
|
139
139
|
// the user doesn't mistake it for the final preview.
|
|
140
140
|
this.sharpening = false;
|
|
141
141
|
this.running = false;
|
|
142
|
+
/**
|
|
143
|
+
* Monotonic render generation. Bumped when a render starts, so a render that
|
|
144
|
+
* has been superseded by a newer image can be recognised and made inert: its
|
|
145
|
+
* callbacks return early instead of painting, clearing `running`, releasing
|
|
146
|
+
* the newer render's overlay, or applying its ROIs.
|
|
147
|
+
*/
|
|
148
|
+
this.renderToken = 0;
|
|
142
149
|
this.zIndex = 0;
|
|
143
150
|
this.maxIndex = 0;
|
|
144
151
|
this.contextMenuItems = [];
|
|
@@ -461,163 +468,198 @@ export class VisualizerComponent {
|
|
|
461
468
|
this.loadedFileName = imgInfo.fileName;
|
|
462
469
|
this.plotService.setImageMeta(this.imageInfo.imageMeta);
|
|
463
470
|
const urls = imgInfo.urls;
|
|
464
|
-
|
|
471
|
+
// A newer image ALWAYS preempts an in-flight render. This was
|
|
472
|
+
// `if (!this.running)`, which DROPPED the new image while the old one
|
|
473
|
+
// finished: identity above had already flipped to the new file, so the
|
|
474
|
+
// app reported image B as loaded while image A stayed on screen. Worse,
|
|
475
|
+
// a cold image holds the slot for its whole server-side cache fill, so
|
|
476
|
+
// every click for 1-2 minutes was discarded against a blank viewport
|
|
477
|
+
// and a "Loading image..." overlay that never resolved.
|
|
478
|
+
if (urls) {
|
|
479
|
+
const token = ++this.renderToken;
|
|
480
|
+
const isCurrent = () => this.renderToken === token;
|
|
481
|
+
if (this.running) {
|
|
482
|
+
// Stop the previous render's frame streaming (napari volume/surface
|
|
483
|
+
// preload keeps fetching otherwise) and clear its sharpen flag. Its
|
|
484
|
+
// callbacks are already inert via the token, so it can neither paint
|
|
485
|
+
// nor release the overlay this render now owns.
|
|
486
|
+
this.plotService.cancelLoading?.();
|
|
487
|
+
this.sharpening = false;
|
|
488
|
+
}
|
|
465
489
|
// image size — measure the plot div directly so the toolbar height is excluded
|
|
466
490
|
const plotDiv = document.getElementById(this.plotDivName);
|
|
467
491
|
const screenHeight = plotDiv?.offsetHeight || 500;
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
492
|
+
this.plotService.reset();
|
|
493
|
+
this.stackLoading = imgInfo.isStack && imgInfo.showStack;
|
|
494
|
+
// set max index of stack — computed before updateZIndex so a
|
|
495
|
+
// fresh stack (shorter or longer than whatever was previously
|
|
496
|
+
// loaded) clamps against ITS bounds, not the stale ones.
|
|
497
|
+
// One URL per slice (0-indexed), so the last reachable index is
|
|
498
|
+
// length-1 — earlier `length-2` dropped the final slice.
|
|
499
|
+
this.maxIndex = urls.length > 1 ? urls.length - 1 : 0;
|
|
500
|
+
// One-shot hint: jump straight to a specific slice (e.g. the
|
|
501
|
+
// file the user actually clicked within a numbered series).
|
|
502
|
+
// Consumed immediately so redelivering the same ImageInfo later
|
|
503
|
+
// (a plot-type switch, reloadAndPlot) doesn't reset the user's
|
|
504
|
+
// current scrub position back to it.
|
|
505
|
+
if (imgInfo.initialZIndex !== undefined) {
|
|
506
|
+
this.zIndex = imgInfo.initialZIndex;
|
|
507
|
+
imgInfo.initialZIndex = undefined;
|
|
508
|
+
}
|
|
509
|
+
// make sure the zindex is within bounds
|
|
510
|
+
this.updateZIndex(urls);
|
|
511
|
+
this.running = true;
|
|
512
|
+
// Multi-tier rendering (small blurry tier first, then sharpen in
|
|
513
|
+
// place) — sequencing lives in RenderOrchestrator; this component
|
|
514
|
+
// supplies the phase render and owns the UI flags via callbacks.
|
|
515
|
+
// 3D plot types render single-pass: the in-place large pass doesn't
|
|
516
|
+
// rebuild a 3D gl-mesh isosurface, so the sharpen step blanked it.
|
|
517
|
+
const hasSmallTier = this.isHeatmap &&
|
|
518
|
+
(imgInfo.smallUrls?.length ?? 0) === urls.length &&
|
|
519
|
+
(imgInfo.smallUrls?.length ?? 0) > 0;
|
|
520
|
+
const smallImgInfo = hasSmallTier ? { ...imgInfo, urls: imgInfo.smallUrls } : null;
|
|
521
|
+
// Enter per-slice stack mode with the given slice→regions map and
|
|
522
|
+
// seed the "previous shapes" from the now-live slice. enterStackMode
|
|
523
|
+
// makes zIndex's slice live and resets undo (jit-ui#93).
|
|
524
|
+
const enterStack = (slices, layout) => {
|
|
525
|
+
this.plotService.enterStackMode(slices, this.zIndex, layout);
|
|
526
|
+
const shapes = this.plotService
|
|
527
|
+
.getRegions()
|
|
528
|
+
.map((region) => region.getShape(this.plotService.getShowShapeLabel()));
|
|
529
|
+
this.plotService.setPreviousShapes(shapes);
|
|
530
|
+
};
|
|
531
|
+
const applyRoi = () => {
|
|
532
|
+
// Folder stack: a stack of self-contained per-slice files
|
|
533
|
+
// (tiled === false; see loadSeriesAsStack). Each slice-file may
|
|
534
|
+
// carry its own sibling "<stem>.geojson" (roiJsonStrs[z]), but a
|
|
535
|
+
// fresh folder with none yet leaves roiJsonStrs undefined — key
|
|
536
|
+
// off `tiled === false`, NOT roiJsonStrs, so an unannotated
|
|
537
|
+
// folder stack still enters the per-slice-file layout (and saves
|
|
538
|
+
// back one geojson per slice-file) rather than falling through to
|
|
539
|
+
// the single-file combined path (jit-ui#93).
|
|
540
|
+
if (imgInfo.isStack && imgInfo.tiled === false) {
|
|
541
|
+
const perSlice = imgInfo.roiJsonStrs;
|
|
542
|
+
const sliceCount = imgInfo.urls?.length ?? perSlice?.length ?? 0;
|
|
543
|
+
const slices = new Map();
|
|
544
|
+
for (let z = 0; z < sliceCount; z++) {
|
|
545
|
+
const json = perSlice?.[z] ?? null;
|
|
546
|
+
slices.set(z, json ? this.plotService.importRegions(json) : []);
|
|
547
|
+
}
|
|
548
|
+
enterStack(slices, 'per-slice-file');
|
|
549
|
+
return;
|
|
485
550
|
}
|
|
486
|
-
//
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
//
|
|
490
|
-
//
|
|
491
|
-
//
|
|
492
|
-
//
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
(
|
|
497
|
-
|
|
498
|
-
// Enter per-slice stack mode with the given slice→regions map and
|
|
499
|
-
// seed the "previous shapes" from the now-live slice. enterStackMode
|
|
500
|
-
// makes zIndex's slice live and resets undo (jit-ui#93).
|
|
501
|
-
const enterStack = (slices, layout) => {
|
|
502
|
-
this.plotService.enterStackMode(slices, this.zIndex, layout);
|
|
503
|
-
const shapes = this.plotService
|
|
504
|
-
.getRegions()
|
|
505
|
-
.map((region) => region.getShape(this.plotService.getShowShapeLabel()));
|
|
506
|
-
this.plotService.setPreviousShapes(shapes);
|
|
507
|
-
};
|
|
508
|
-
const applyRoi = () => {
|
|
509
|
-
// Folder stack: a stack of self-contained per-slice files
|
|
510
|
-
// (tiled === false; see loadSeriesAsStack). Each slice-file may
|
|
511
|
-
// carry its own sibling "<stem>.geojson" (roiJsonStrs[z]), but a
|
|
512
|
-
// fresh folder with none yet leaves roiJsonStrs undefined — key
|
|
513
|
-
// off `tiled === false`, NOT roiJsonStrs, so an unannotated
|
|
514
|
-
// folder stack still enters the per-slice-file layout (and saves
|
|
515
|
-
// back one geojson per slice-file) rather than falling through to
|
|
516
|
-
// the single-file combined path (jit-ui#93).
|
|
517
|
-
if (imgInfo.isStack && imgInfo.tiled === false) {
|
|
518
|
-
const perSlice = imgInfo.roiJsonStrs;
|
|
519
|
-
const sliceCount = imgInfo.urls?.length ?? perSlice?.length ?? 0;
|
|
551
|
+
// Single-file z-stack: one sibling geojson holding every slice's
|
|
552
|
+
// regions indexed by QuPath's geometry.plane.z. Enter per-slice
|
|
553
|
+
// mode (saving back one combined z-indexed geojson) when the
|
|
554
|
+
// geojson actually carries slice indices, or when there's nothing
|
|
555
|
+
// yet to author against. A legacy geojson whose regions are all on
|
|
556
|
+
// the default plane stays global (shown on every slice) so
|
|
557
|
+
// existing single-plane annotations aren't confined to slice 0.
|
|
558
|
+
const roiJson = imgInfo.roiJsonStr;
|
|
559
|
+
if (imgInfo.isStack) {
|
|
560
|
+
const regions = roiJson ? this.plotService.importRegions(roiJson) : [];
|
|
561
|
+
const hasSliceInfo = regions.some((r) => (r.z ?? 0) !== 0);
|
|
562
|
+
if (!roiJson || hasSliceInfo) {
|
|
520
563
|
const slices = new Map();
|
|
521
|
-
for (
|
|
522
|
-
const
|
|
523
|
-
|
|
564
|
+
for (const r of regions) {
|
|
565
|
+
const z = r.z ?? 0;
|
|
566
|
+
const bucket = slices.get(z);
|
|
567
|
+
if (bucket)
|
|
568
|
+
bucket.push(r);
|
|
569
|
+
else
|
|
570
|
+
slices.set(z, [r]);
|
|
524
571
|
}
|
|
525
|
-
enterStack(slices, '
|
|
572
|
+
enterStack(slices, 'combined');
|
|
526
573
|
return;
|
|
527
574
|
}
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
//
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
let overlayReleased = false;
|
|
566
|
-
const releaseOverlay = () => {
|
|
567
|
-
if (overlayReleased)
|
|
568
|
-
return;
|
|
569
|
-
overlayReleased = true;
|
|
570
|
-
if (imgInfo.isStack && imgInfo.showStack)
|
|
571
|
-
this.stackLoading = false;
|
|
572
|
-
this.state.setImageLoading(false);
|
|
573
|
-
};
|
|
574
|
-
new RenderOrchestrator({
|
|
575
|
-
// inPlace=true updates the existing render instead of rebuilding
|
|
576
|
-
// it, so the canvas doesn't blank during the small→large swap.
|
|
577
|
-
renderPhase: (phaseInfo, inPlace) => this.plotService.load(phaseInfo, this.zIndex).then((loadedImage) => {
|
|
575
|
+
}
|
|
576
|
+
// Single-plane image (or a legacy global z-stack geojson): one
|
|
577
|
+
// region set for the whole image.
|
|
578
|
+
if (roiJson) {
|
|
579
|
+
const regions = this.plotService.importRegions(roiJson);
|
|
580
|
+
this.plotService.setRegions(regions);
|
|
581
|
+
const shapes = regions.map((region) => region.getShape(this.plotService.getShowShapeLabel()));
|
|
582
|
+
this.plotService.setPreviousShapes(shapes);
|
|
583
|
+
}
|
|
584
|
+
// Loading an image's saved ROIs is not a user edit — start the
|
|
585
|
+
// undo history fresh so the first undo can't wipe them (jit-ui#85).
|
|
586
|
+
this.plotService.resetUndoHistory();
|
|
587
|
+
};
|
|
588
|
+
let overlayReleased = false;
|
|
589
|
+
const releaseOverlay = () => {
|
|
590
|
+
if (overlayReleased)
|
|
591
|
+
return;
|
|
592
|
+
overlayReleased = true;
|
|
593
|
+
if (imgInfo.isStack && imgInfo.showStack)
|
|
594
|
+
this.stackLoading = false;
|
|
595
|
+
this.state.setImageLoading(false);
|
|
596
|
+
};
|
|
597
|
+
new RenderOrchestrator({
|
|
598
|
+
// inPlace=true updates the existing render instead of rebuilding
|
|
599
|
+
// it, so the canvas doesn't blank during the small→large swap.
|
|
600
|
+
renderPhase: (phaseInfo, inPlace) => {
|
|
601
|
+
// Superseded BEFORE this phase started — don't even issue the load.
|
|
602
|
+
// RenderOrchestrator calls renderPhase once per tier and retries the
|
|
603
|
+
// sharpen pass on failure, so checking only after the load resolves
|
|
604
|
+
// would let a preempted render keep fetching slices/tiles for an
|
|
605
|
+
// image nobody is looking at.
|
|
606
|
+
if (!isCurrent())
|
|
607
|
+
return Promise.resolve(null);
|
|
608
|
+
return this.plotService.load(phaseInfo, this.zIndex).then((loadedImage) => {
|
|
609
|
+
// Preempted while this phase was loading — drop it on the floor.
|
|
610
|
+
if (!isCurrent())
|
|
611
|
+
return null;
|
|
578
612
|
// Guard against a newer click reaching us mid-render.
|
|
579
613
|
if (phaseInfo.fileName !== loadedImage.filename)
|
|
580
614
|
return null;
|
|
581
615
|
return this.plotService.plot(this.plotDivName, loadedImage, phaseInfo, screenHeight, this.plotType, inPlace);
|
|
582
|
-
})
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
//
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
616
|
+
});
|
|
617
|
+
},
|
|
618
|
+
smallShown: () => {
|
|
619
|
+
if (!isCurrent())
|
|
620
|
+
return; // superseded by a newer image
|
|
621
|
+
// If the file is still being cached/prepared server-side, keep the full
|
|
622
|
+
// cache-progress overlay up instead of dropping to the translucent "Sharpening
|
|
623
|
+
// preview..." spinner over a blank canvas (a large uncached image renders its
|
|
624
|
+
// small preview before its tiles exist). finished() releases the overlay once
|
|
625
|
+
// the real render lands.
|
|
626
|
+
if (this.isCaching)
|
|
627
|
+
return;
|
|
628
|
+
// Small tier on screen — drop the full overlay but keep a translucent spinner so
|
|
629
|
+
// the blurry render isn't mistaken for the final image.
|
|
630
|
+
releaseOverlay();
|
|
631
|
+
this.sharpening = true;
|
|
632
|
+
},
|
|
633
|
+
sharpenSettled: () => {
|
|
634
|
+
if (!isCurrent())
|
|
635
|
+
return; // superseded by a newer image
|
|
636
|
+
this.sharpening = false;
|
|
637
|
+
},
|
|
638
|
+
finished: (_viaSmall, logTag) => {
|
|
639
|
+
if (!isCurrent())
|
|
640
|
+
return; // superseded by a newer image
|
|
641
|
+
// Idempotent — releases now if smallShown deferred it (caching) or was skipped.
|
|
642
|
+
releaseOverlay();
|
|
643
|
+
this.running = false;
|
|
644
|
+
applyRoi();
|
|
645
|
+
console.log(logTag);
|
|
646
|
+
},
|
|
647
|
+
sharpenFailed: (err) => {
|
|
648
|
+
if (!isCurrent())
|
|
649
|
+
return; // superseded by a newer image
|
|
650
|
+
// The small tier stays on screen as the fallback — tell the
|
|
651
|
+
// user the sharper version isn't coming.
|
|
652
|
+
const msg = err?.error?.message || err?.message || err?.statusText || String(err);
|
|
653
|
+
this.messageService.add({
|
|
654
|
+
key: this.vizAlertToastKey,
|
|
655
|
+
severity: 'warn',
|
|
656
|
+
summary: 'Preview not sharpened',
|
|
657
|
+
detail: `The full-resolution preview did not load (${msg}). The low-resolution preview is still shown. Try clicking the image again.`,
|
|
658
|
+
});
|
|
659
|
+
this.running = false;
|
|
660
|
+
applyRoi();
|
|
661
|
+
},
|
|
662
|
+
}).render(imgInfo, smallImgInfo);
|
|
621
663
|
}
|
|
622
664
|
}
|
|
623
665
|
},
|
|
@@ -1656,4 +1698,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
1656
1698
|
type: HostListener,
|
|
1657
1699
|
args: ['window:keydown', ['$event']]
|
|
1658
1700
|
}] } });
|
|
1659
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi92aXN1YWxpemVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQWlCLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWdDLFFBQVEsRUFBRSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6TSxPQUFPLEVBQW1CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBWSxjQUFjLEVBQVksTUFBTSxhQUFhLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsUUFBUSxFQUVSLFVBQVUsRUFDVix1QkFBdUIsR0FDeEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1B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QUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs4R0F4cURVLG1CQUFtQixrQkFvUHBCLGdCQUFnQixhQUNoQixVQUFVLHdRQVNFLFVBQVU7a0dBOVByQixtQkFBbUIsMlhDM0NoQyw2aFVBOExBOzsyRkRuSmEsbUJBQW1CO2tCQVAvQixTQUFTOytCQUdFLFlBQVk7OzBCQXdQbkIsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQUN2QixNQUFNOzJCQUFDLFVBQVU7OzBCQVNqQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFVBQVU7eUNBek5oQyxZQUFZO3NCQURYLE1BQU07Z0JBR1AsZ0JBQWdCO3NCQURmLE1BQU07Z0JBTUgsWUFBWTtzQkFEZixLQUFLO2dCQWNOLFFBQVE7c0JBRFAsS0FBSztnQkFxQ1csV0FBVztzQkFBM0IsU0FBUzt1QkFBQyxJQUFJO2dCQSs2QmYsU0FBUztzQkFEUixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQWZ0ZXJWaWV3SW5pdCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSwgVHJlZU5vZGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJ3ByaW1lbmcvY29udGV4dG1lbnUnO1xuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IEltYWdlU3RhdGVQb3J0LCBJTUFHRV9TVEFURV9QT1JUIH0gZnJvbSAnLi9jb250cmFjdHMvcG9ydHMvaW1hZ2Utc3RhdGUucG9ydCc7XG5pbXBvcnQgeyBQb2x5Z29uLCBSZWN0YW5nbGUsIE11bHRpUG9seWdvbiwgUmVnaW9uIH0gZnJvbSAnLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFJlZ2lvbk9wc1NlcnZpY2UgfSBmcm9tICcuL3JlZ2lvbi1vcHMuc2VydmljZSc7XG5pbXBvcnQgeyBWSVpfVE9BU1RfS0VZLCBWSVpfQUxFUlRfVE9BU1RfS0VZIH0gZnJvbSAnLi90b2FzdC1vdXRsZXRzJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlbmRlck9yY2hlc3RyYXRvciwgU2xpY2VTY3J1YmJlciB9IGZyb20gJy4vcmVuZGVyLW9yY2hlc3RyYXRvcic7XG5pbXBvcnQge1xuICBQbG90VHlwZSxcbiAgUGxvdFR5cGVEZXNjcmlwdG9yLFxuICBpc05hcGFyaTNkLFxuICBOQVBBUklfREVGQVVMVF9ERUNJTUFURSxcbn0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZW5zaXR5UHJvZmlsZSwgSVZpc3VhbGl6ZXIsIFZJU1VBTElaRVIgfSBmcm9tICcuL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFNBTV9NT0RFTFMsIGdldERlZmF1bHRTYW1Nb2RlbElkLCBpc1NhbU1vZGVsUmVhZHkgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVnaW9uVG9vbE1vZGUgfSBmcm9tICcuL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBUb29sYmFyVG9vbFZpc2liaWxpdHksIEFMTF9UT09MQkFSX1RPT0xTIH0gZnJvbSAnLi9jb250cmFjdHMvdG9vbGJhci1jb25maWcnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5cbi8qKiBQZXItaW5zdGFuY2UgcGxvdC1kaXYgaWQgc291cmNlLiBUaGUgbW91bnQgZWxlbWVudCdzIGlkIG11c3QgYmUgdW5pcXVlIHNvIHR3b1xuICogIGxpdmUgdmlld2VycyAoZS5nLiB0aGUgbWFpbiBkaWFncmFtICsgYSBtb2RhbCBwcmV2aWV3KSBkb24ndCBjb2xsaWRlIG9uIHRoZVxuICogIHNhbWUgRE9NIGlkIOKAlCBgZ2V0RWxlbWVudEJ5SWRgIHdvdWxkIG90aGVyd2lzZSByZXR1cm4gd2hpY2hldmVyIGNhbWUgZmlyc3QuXG4gKiAgU3R5bGluZyBoYW5ncyBvZmYgdGhlIGAudml6LXBsb3RgIGNsYXNzIGluc3RlYWQgb2YgdGhlIGlkLiAqL1xubGV0IHBsb3RJbnN0YW5jZVNlcSA9IDA7XG5cbkBDb21wb25lbnQoe1xuICAvLyBDYW5vbmljYWwgcHJlZml4ZWQgc2VsZWN0b3IgZmlyc3Q7IHRoZSB1bnByZWZpeGVkIG9yaWdpbmFsIGlzIGtlcHQgYXMgYW5cbiAgLy8gYWxpYXMgZm9yIG9uZSByZWxlYXNlIChwcmUtcHVibGljYXRpb24gYmFjay1jb21wYXQpLlxuICBzZWxlY3RvcjogJ3Zpc3VhbGl6ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdmlzdWFsaXplci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVmlzdWFsaXplckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogUGVyLWluc3RhbmNlIHRvYXN0IGtleS4gTWVzc2FnZVNlcnZpY2UgaXMgYSBnbG9iYWwgc2luZ2xldG9uLCBzbyB0d28gbGl2ZVxuICAgKiAgYDx2aXN1YWxpemVyPmAgaW5zdGFuY2VzIChtYWluIHZpZXdlciArIHBpcGVsaW5lLWRpYWxvZyBwcmV2aWV3KSBzaGFyaW5nXG4gICAqICBvbmUga2V5IHdvdWxkIGVhY2ggcmVuZGVyIHRoZSBzYW1lIG1lc3NhZ2Ug4oCUIGEgZHVwbGljYXRlIHRvYXN0LiBBIHVuaXF1ZVxuICAgKiAga2V5IHBlciBpbnN0YW5jZSBzY29wZXMgdGhlIHRvYXN0IHRvIHRoZSBjb21wb25lbnQgdGhhdCByYWlzZWQgaXQuICovXG4gIHByaXZhdGUgc3RhdGljIG5leHRUb2FzdElkID0gMDtcblxuICAvKipcbiAgICogVGhlIGxpYnJhcnkgYWxzbyByYWlzZXMgbm90aWNlcyBmcm9tIHBsYWNlcyB0aGF0IGhhdmUgbm8gaW5zdGFuY2Ugb2YgdGhlaXJcbiAgICogb3duIHRvIGtleSBhZ2FpbnN0OiB7QGxpbmsgUGxvdGx5U2VydmljZX0gaXMgYHByb3ZpZGVkSW46ICdyb290J2AsIGFuZCB0aGVcbiAgICogcmVnaW9uIGVkaXRvciBpcyBhIGNoaWxkIGRpYWxvZy4gVGhvc2UgdXNlIHRoZSBmaXhlZFxuICAgKiB7QGxpbmsgVklaX1RPQVNUX0tFWX0gLyB7QGxpbmsgVklaX0FMRVJUX1RPQVNUX0tFWX0gb3V0bGV0cy5cbiAgICpcbiAgICogRm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgcGVyLWluc3RhbmNlIGtleSBhYm92ZSBleGlzdHMsIGV4YWN0bHkgT05FIG1vdW50ZWRcbiAgICogdmlzdWFsaXplciBtYXkgcmVuZGVyIHRob3NlIHNoYXJlZCBvdXRsZXRzIOKAlCBvdGhlcndpc2UgYSBtZXNzYWdlIGZyb20gdGhlXG4gICAqIHJvb3Qgc2VydmljZSB3b3VsZCBiZSBzaG93biBvbmNlIHBlciBsaXZlIHZpZXdlciAoaml0LXVpIHJ1bnMgYSBtYWluIHZpZXdcbiAgICogYW5kIGEgcGlwZWxpbmUtcHJldmlldyBhdCB0aGUgc2FtZSB0aW1lKS4gVGhlIGZpcnN0IHRvIGluaXQgY2xhaW1zIHRoZW0gYW5kXG4gICAqIHJlbGVhc2VzIG9uIGRlc3Ryb3ksIHNvIHRoZSBzdXJ2aXZpbmcgdmlld2VyIHBpY2tzIHRoZW0gdXAuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsaXZlSW5zdGFuY2VzID0gbmV3IFNldDxWaXN1YWxpemVyQ29tcG9uZW50PigpO1xuICByZWFkb25seSB2aXpUb2FzdEtleSA9IFZJWl9UT0FTVF9LRVk7XG4gIHJlYWRvbmx5IHZpekFsZXJ0VG9hc3RLZXkgPSBWSVpfQUxFUlRfVE9BU1RfS0VZO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGluc3RhbmNlIHJlbmRlcnMgdGhlIHNoYXJlZCBvdXRsZXRzLiBUaGUgb3duZXIgaXMgc2ltcGx5IHRoZVxuICAgKiBvbGRlc3QgbGl2ZSB2aXN1YWxpemVyIOKAlCBhIGBTZXRgIGl0ZXJhdGVzIGluIGluc2VydGlvbiBvcmRlciwgc28gd2hlbiB0aGVcbiAgICogb3duZXIgaXMgZGVzdHJveWVkIHRoZSBuZXh0IG9uZSB0YWtlcyBvdmVyIG9uIGl0cyBmb2xsb3dpbmcgY2hhbmdlLWRldGVjdGlvblxuICAgKiBwYXNzLiBUcmFja2luZyBhIHNldCByYXRoZXIgdGhhbiBhIHNpbmdsZSBvd25lciBtYXR0ZXJzOiB3aXRoIGEgbG9uZVxuICAgKiBgb3duZXJgIHJlZmVyZW5jZSwgdGVhcmluZyBkb3duIHRoZSBvd25lciB3aGlsZSBhIHNpYmxpbmcgd2FzIGFscmVhZHlcbiAgICogaW5pdGlhbGlzZWQgd291bGQgbGVhdmUgbm9ib2R5IHJlbmRlcmluZyB0aGUgb3V0bGV0cywgYW5kIGV2ZXJ5IG5vdGljZSBmcm9tXG4gICAqIHRoZSByb290IHNlcnZpY2Ugd291bGQgc2lsZW50bHkgdmFuaXNoIGFnYWluLlxuICAgKi9cbiAgZ2V0IG93bnNTaGFyZWRUb2FzdHMoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb2xkZXN0ID0gVmlzdWFsaXplckNvbXBvbmVudC5saXZlSW5zdGFuY2VzLnZhbHVlcygpLm5leHQoKTtcbiAgICByZXR1cm4gIW9sZGVzdC5kb25lICYmIG9sZGVzdC52YWx1ZSA9PT0gdGhpcztcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBpc1N0YWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcbiAgQE91dHB1dCgpXG4gIGlzR3JheXNjYWxlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcblxuICAvKiogV2hpY2ggdG9vbGJhciBncm91cHMgdG8gc2hvdy4gQSBwYXJ0aWFsIG92ZXJyaWRlIG1lcmdlcyBvdmVyIHRoZSBmdWxsIHNldCxcbiAgICogIHNvIGB7IHNwZWNpYWxUb29sczogZmFsc2UgfWAgaGlkZXMgb25seSB0aGF0IGdyb3VwLiBEZWZhdWx0cyB0byBldmVyeXRoaW5nLiAqL1xuICBASW5wdXQoKVxuICBzZXQgdG9vbGJhclRvb2xzKHY6IFRvb2xiYXJUb29sVmlzaWJpbGl0eSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3Rvb2xiYXJUb29scyA9IHsgLi4uQUxMX1RPT0xCQVJfVE9PTFMsIC4uLih2ID8/IHt9KSB9O1xuICB9XG5cbiAgZ2V0IHRvb2xiYXJUb29scygpOiBSZXF1aXJlZDxUb29sYmFyVG9vbFZpc2liaWxpdHk+IHtcbiAgICByZXR1cm4gdGhpcy5fdG9vbGJhclRvb2xzO1xuICB9XG4gIHByaXZhdGUgX3Rvb2xiYXJUb29sczogUmVxdWlyZWQ8VG9vbGJhclRvb2xWaXNpYmlsaXR5PiA9IEFMTF9UT09MQkFSX1RPT0xTO1xuXG4gIC8qKiBFeHBvc2UgdGVzdC1vbmx5IHBsb3QgbW9kZXMgaW4gdGhlIHNlbGVjdG9yIChlLmcuIHRoZSBuYXBhcmkgYEltYWdlYFxuICAgKiAgbW9kZSwgb3RoZXJ3aXNlIGhpZGRlbikuIFRoZSBob3N0IGFwcCBzZXRzIHRoaXMgZnJvbSBhIGA/dGVzdD0xYCBVUkxcbiAgICogIHRvZ2dsZS4gT2ZmIGJ5IGRlZmF1bHQsIHNvIHByb2R1Y3Rpb24gdXNlcnMgbmV2ZXIgc2VlIHRoZW0uICovXG4gIEBJbnB1dCgpXG4gIHRlc3RNb2RlID0gZmFsc2U7XG5cbiAgLyoqIEltYWdlLXNtb290aGluZyBzdGF0ZSBmb3IgdGhlIHRvb2xiYXIncyBTbW9vdGhlbiB0b2dnbGUgKE9TRCBvbmx5KS5cbiAgICogIERlZmF1bHRzIHRvIGBmYWxzZWAgc28gT1NEIHNob3dzIHJhdyBwaXhlbHMgKG5lYXJlc3QtbmVpZ2hib3VyKS4gKi9cbiAgaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gIGxvYWRpbmdNZXNzYWdlID0gJ0xvYWRpbmcgaW1hZ2UuLi4nO1xuICB6b29tID0gZmFsc2U7XG4gIGZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbG9hZGVkRmlsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgdW5zdWIgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHByZXZpZXdTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHVibGljIHN0YWNrTG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgaW1nTG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgbG9hZGluZ1BlcmNlbnRhZ2UgPSAwO1xuICAvLyBOb24tbnVsbCAoMC4uMTAwKSB3aGlsZSBqaXQtc2VydmljZSBpcyBjb3B5aW5nIHRoZSBzb3VyY2UgZmlsZSBpbnRvIHRoZVxuICAvLyBsb2NhbCBjYWNoZSBQVkMgb24gZmlyc3QgY2xpY2suIFdoZW4gc2V0LCB0aGUgbG9hZGluZyBvdmVybGF5IHN3YXBzIHRoZVxuICAvLyBzcGlubmVyIGZvciBhIGRldGVybWluYXRlIHByb2dyZXNzIGJhciB3aXRoIGEgXCJDYWNoaW5nIGltYWdlXCIgbWVzc2FnZS5cbiAgcHVibGljIGNhY2hlUHJvZ3Jlc3M6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvLyBUcnVlIGJldHdlZW4gdGhlIHNtYWxsLXRpZXIgcmVuZGVyIGxhbmRpbmcgYW5kIHRoZSBsYXJnZS10aWVyIHJlbmRlclxuICAvLyBsYW5kaW5nIGluIHRoZSBtdWx0aS10aWVyIHJlbmRlcmluZyBwYXRoLiBUaGUgdGVtcGxhdGUgdXNlcyB0aGlzIHRvXG4gIC8vIG92ZXJsYXkgYSB0cmFuc2x1Y2VudCBzcGlubmVyIG9uIHRvcCBvZiB0aGUgYmx1cnJ5IHNtYWxsLXRpZXIgaW1hZ2Ugc29cbiAgLy8gdGhlIHVzZXIgZG9lc24ndCBtaXN0YWtlIGl0IGZvciB0aGUgZmluYWwgcHJldmlldy5cbiAgcHVibGljIHNoYXJwZW5pbmcgPSBmYWxzZTtcbiAgLyoqIEEgaml0LXNlcnZpY2UgY2FjaGUgY29weSBpcyBhY3RpdmVseSBpbiBwcm9ncmVzcyAoZGV0ZXJtaW5hdGUgMC4uOTkpLiBEcml2ZXMgdGhlIGNhY2hlXG4gICAqICBwcm9ncmVzcyBiYXIgaW5kZXBlbmRlbnRseSBvZiBgaW1nTG9hZGluZ2Agc28gdGhlIGJhciBjYW4ndCBiZSBkcm9wcGVkIOKAlCBvciBtYXNrZWQgYnkgdGhlXG4gICAqICBcIlNoYXJwZW5pbmcgcHJldmlldy4uLlwiIG92ZXJsYXkg4oCUIG1pZC1kb3dubG9hZCBpZiB0aGUgbG9hZGluZyBmbGFnIGZsaXBzIGVhcmx5LiAqL1xuICBnZXQgaXNDYWNoaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhY2hlUHJvZ3Jlc3MgIT09IG51bGwgJiYgdGhpcy5jYWNoZVByb2dyZXNzIDwgMTAwO1xuICB9XG4gIHByaXZhdGUgcnVubmluZyA9IGZhbHNlO1xuICBwdWJsaWMgekluZGV4ID0gMDtcbiAgcHVibGljIG1heEluZGV4ID0gMDtcblxuICBAVmlld0NoaWxkKCdjbScpIGNvbnRleHRNZW51ITogQ29udGV4dE1lbnU7XG4gIGNvbnRleHRNZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcblxuICBhY3RpdmVEcmFnTW9kZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFdoZXRoZXIgYSByZWdpb24gYWN0aW9uIGlzIGF2YWlsYWJsZSB0byB1bmRvIChqaXQtdWkjODUpLiBNaXJyb3JzIHRoZVxuICAgKiAgc2hhcmVkIFJlZ2lvblN0b3JlJ3MgaGlzdG9yeSBkZXB0aDsgZHJpdmVzIHRoZSB0b29sYmFyIFVuZG8gYnV0dG9uLiAqL1xuICBjYW5VbmRvUmVnaW9uID0gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIGFuIHVuZG9uZSByZWdpb24gYWN0aW9uIGlzIGF2YWlsYWJsZSB0byByZWRvIChqaXQtdWkjODUpLiAqL1xuICBjYW5SZWRvUmVnaW9uID0gZmFsc2U7XG5cbiAgLyoqIEN1c3RvbS10aHJlc2hvbGQgU2ltcGxpZnkgZGlhbG9nIChqaXQtdWkjODUpLiAqL1xuICBkaXNwbGF5U2ltcGxpZnlEaWFsb2cgPSBmYWxzZTtcbiAgc2ltcGxpZnlUaHJlc2hvbGQgPSAzO1xuICAvKiogQ3VycmVudCByZWdpb24gc2VsZWN0aW9uIChhcnJheSBpbmRpY2VzKSDigJQgbWlycm9yZWQgZnJvbSB0aGUgc3RvcmUgc28gdGhlXG4gICAqICBjb250ZXh0LW1lbnUgcmVnaW9uIGFjdGlvbnMgY2FuIHJlYWQgaXQgc3luY2hyb25vdXNseSAoaml0LXVpIzg1KS4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZEluZGljZXM6IG51bWJlcltdID0gW107XG5cbiAgLyoqIFdhbmQgc2Vuc2l0aXZpdHkg4oCUIGhpZ2hlciA9IHN0cmljdGVyIChzbWFsbGVyIHNlbGVjdGlvbikuIE1hdGNoZXMgUXVQYXRoIGRlZmF1bHQuICovXG4gIHdhbmRTZW5zaXRpdml0eSA9IDIuMDtcbiAgLyoqIEJydXNoIGRpYW1ldGVyIGluIGltYWdlLXBpeGVsIGNvb3JkaW5hdGVzIChkcml2ZXMgdGhlIHBhaW50ZWQgZGlzYyBzaXplKS4gKi9cbiAgYnJ1c2hTaXplID0gNDA7XG4gIC8qKiBTQU0gbW9kZWwgcGlja2VyIG9wdGlvbnMgKyBjdXJyZW50IHNlbGVjdGlvbiAoaml0LXVpIzkwIFAxKS4gT25seSBtb2RlbHNcbiAgICogIHdpdGggYSBob3N0ZWQgT05OWCBwYWlyIChjb25maWd1cmVkIHZpYSBzZXRTYW1Nb2RlbFVybHMgYXQgYXBwIGluaXQpIGFyZVxuICAgKiAgb2ZmZXJlZCwgc28gdGhlIHBpY2tlciBjYW4ndCBzZWxlY3QgYSBtb2RlbCB0aGF0IGNhbid0IHJ1bi4gKi9cbiAgc2FtTW9kZWxzID0gU0FNX01PREVMUy5maWx0ZXIoaXNTYW1Nb2RlbFJlYWR5KS5tYXAoKG0pID0+ICh7IGlkOiBtLmlkLCBsYWJlbDogbS5sYWJlbCB9KSk7XG4gIHNhbU1vZGVsSWQgPSBnZXREZWZhdWx0U2FtTW9kZWxJZCgpO1xuICAvKiogU0FNIGRvd25sb2FkL3NlZ21lbnQgdG9hc3Qgc3RhdGUgKGJvdW5kIGJ5IHRoZSBgc2FtYCBwLXRvYXN0IHRlbXBsYXRlKS4gKi9cbiAgc2FtU3RhdHVzID0gJyc7XG4gIHNhbVByb2dyZXNzID0gMDsgLy8gMC4uMTAwLCBlbmNvZGVyIGRvd25sb2FkXG4gIHNhbURvd25sb2FkaW5nID0gZmFsc2U7XG4gIHNhbUJ1c3kgPSBmYWxzZTsgLy8gYW55IFNBTSB3b3JrIGluIGZsaWdodCAoZHJpdmVzIHRoZSBpbmRldGVybWluYXRlIHNwaW5uZXIpXG4gIC8qKiBXaGV0aGVyIHRoZSBzaGFyZWQgYHNhbWAgdG9hc3QgaXMgY3VycmVudGx5IHNob3duIChhdm9pZHMgc3RhY2tpbmcgaXQgb25cbiAgICogIGV2ZXJ5IHBvaW50IGNsaWNrLCB3aGljaCByZS1ydW5zIGluZmVyZW5jZSkuICovXG4gIHByaXZhdGUgc2FtVG9hc3RTaG93biA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IHNhbVRvYXN0S2V5ID0gYHNhbS0ke1Zpc3VhbGl6ZXJDb21wb25lbnQubmV4dFRvYXN0SWQrK31gO1xuICAvKipcbiAgICogT3V0bGV0IGZvciB0aGUgbGlicmFyeSdzIG93biByZXN1bHQvZXJyb3Igbm90aWNlcy5cbiAgICpcbiAgICogUHJpbWVORyByb3V0ZXMgYSBtZXNzYWdlIHRvIGEgYDxwLXRvYXN0PmAgb25seSB3aGVuIHRoZSBrZXlzIG1hdGNoIOKAlCBhXG4gICAqIGtleWxlc3MgbWVzc2FnZSByZWFjaGVzIGEga2V5bGVzcyB0b2FzdCBhbmQgbm90aGluZyBlbHNlLiBUaGVzZSBub3RpY2VzIHVzZWRcbiAgICogdG8gYmUgZW1pdHRlZCB3aXRoIG5vIGtleSwgc28gdGhleSByZW5kZXJlZCBvbmx5IGluIGhvc3RzIHRoYXQgaGFwcGVuIHRvXG4gICAqIG1vdW50IGEgYmFyZSBgPHAtdG9hc3Q+YCAoaml0LXVpIGRvZXMsIGluIGl0cyBmaWxlLXRyZWUgY29tcG9uZW50KS4gRXZlcnlcbiAgICogb3RoZXIgaG9zdCDigJQgaW5jbHVkaW5nIHRoaXMgcmVwbydzIG93biBicm93c2VyIGV4YW1wbGUg4oCUIGRyb3BwZWQgdGhlbVxuICAgKiBzaWxlbnRseSwgd2hpY2ggbWFkZSBhIGZhaWxlZCBvciBuby1vcCBzZWdtZW50YXRpb24gbG9vayBsaWtlIGEgZGVhZCBidXR0b246XG4gICAqIHRoZSBzdGlja3kgcHJvZ3Jlc3MgdG9hc3QgaXMgY2xlYXJlZCBpbiB0aGUgc2FtZSB0aWNrIGJ5IGhpZGVTYW1Ub2FzdCwgYW5kXG4gICAqIHRoZSBtZXNzYWdlIGV4cGxhaW5pbmcgd2h5IG5ldmVyIGFwcGVhcmVkIGFueXdoZXJlLlxuICAgKlxuICAgKiBLZXllZCB0byB0aGlzIGNvbXBvbmVudCBpbnN0YW5jZSBzbyB0aGUgbGlicmFyeSByZW5kZXJzIGl0cyBvd24gb3V0bGV0IGFuZFxuICAgKiBpcyBub3QgZGVwZW5kZW50IG9uIGhvc3QgbWFya3VwLiBEZWxpYmVyYXRlbHkgTk9UIHRoZSBzdGlja3kgdG9hc3QncyBrZXk6XG4gICAqIHtAbGluayBoaWRlU2FtVG9hc3R9IGNsZWFycyB0aGF0IGtleSBpbiB0aGUgYGZpbmFsbHlgLCB3aGljaCB3b3VsZCB3aXBlIHRoZVxuICAgKiByZXN1bHQgdGhlIG1vbWVudCBpdCB3YXMgcG9zdGVkLCBhbmQgdGhlIHN0aWNreSB0b2FzdCdzIGN1c3RvbSB0ZW1wbGF0ZSBpc1xuICAgKiBidWlsdCBmb3IgdGhlIGxpdmUgc3RhdHVzICsgcHJvZ3Jlc3MgYmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdWx0VG9hc3RLZXkgPSBgJHt0aGlzLnNhbVRvYXN0S2V5fS1yZXN1bHRgO1xuICAvKiogU3Vic2NyaXB0aW9ucyB0byB0aGUgcG9pbnQgdG9vbCdzIGxpdmUgZmVlZHMgKHN0YXR1cy9idXN5L2Rvd25sb2FkKS4gKi9cbiAgcHJpdmF0ZSBzYW1Qb2ludFN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgLyoqIFZlcnRleCBlcmFzZXIgcmFkaXVzIGluIGltYWdlLXBpeGVsIGNvb3JkaW5hdGVzLiAqL1xuICB2ZXJ0ZXhFcmFzZXJSYWRpdXMgPSAyMDtcblxuICBjb2xvcm1hcHNPcHRpb25zITogYW55O1xuICByZXZlcnNlc2NhbGUgPSBmYWxzZTtcbiAgc2VsZWN0ZWRDb2xvcm1hcCE6IGFueTtcbiAgLyoqIENoYW5uZWxzICYgSGlzdG9ncmFtIGRpYWxvZyB2aXNpYmlsaXR5IChvcGVuZWQgZnJvbSB0aGUgdG9vbGJhcikuICovXG4gIHNob3dDaGFubmVsSGlzdG9ncmFtID0gZmFsc2U7XG4gIC8qKiBSZWdpb24gRWRpdG9yIGRpYWxvZyB2aXNpYmlsaXR5IChvcGVuZWQgZnJvbSB0aGUgdG9vbGJhcikuICovXG4gIHNob3dSZWdpb25FZGl0b3IgPSBmYWxzZTtcbiAgLyoqIFJlZ2lvbiBFZGl0b3IgZGlhbG9nIHdpZHRoLiBPbiBvcGVuIGl0IGlzIHNldCB0byB0aGUgY29uZmlndXJlZCBob3N0XG4gICAqICBlbGVtZW50J3MgY3VycmVudCB3aWR0aCwgb3Ig4oCUIHdoZW4gbm8gc2VsZWN0b3IgaXMgY29uZmlndXJlZCAvIHRoZSBlbGVtZW50XG4gICAqICBpc24ndCBmb3VuZCDigJQgdG8gYSBxdWFydGVyIG9mIHRoZSBwYWdlIChzZWUgb3BlblJlZ2lvbkVkaXRvcikuICovXG4gIHJlZ2lvbkVkaXRvcldpZHRoID0gJzI1dncnO1xuICBzdGFja09wdGlvbnMgPSBbXG4gICAgeyBuYW1lOiAnU2luZ2xlIGltYWdlJywgdmFsOiAnZmFsc2UnIH0sXG4gICAgeyBuYW1lOiAnU3RhY2snLCB2YWw6ICd0cnVlJyB9LFxuICBdO1xuICBzZWxlY3RlZFN0YWNrT3B0aW9uOiB7IG5hbWU6IHN0cmluZzsgdmFsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCA9IHRoaXMuc3RhY2tPcHRpb25zWzBdO1xuICByZWFkb25seSBwbG90RGl2TmFtZSA9IGB2aXotcGxvdC0ke3Bsb3RJbnN0YW5jZVNlcSsrfWA7XG4gIHBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gIGlzSGVhdG1hcCA9IHRydWU7XG4gIGFjdGl2ZVN1cmZhY2UzZE1vZGUgPSAndHVybnRhYmxlJztcbiAgLyoqIFdoZXRoZXIgdGhlIG5hcGFyaSAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyBpcyBzaG93biAodm9sdW1lL2lzb3N1cmZhY2UpLiAqL1xuICBheGVzVmlzaWJsZSA9IHRydWU7XG4gIHdpcmVmcmFtZUFjdGl2ZSA9IGZhbHNlO1xuICAvKiogbmFwYXJpIDNEIGRlY2ltYXRlIGZhY3RvciAoMSA9IEZ1bGwg4oCmIDggPSDihZs7IGRlZmF1bHQgwr0pOyBjaGFuZ2luZyBpdCByZS1wbG90cy4gKi9cbiAgcmVzb2x1dGlvblNjYWxlID0gTkFQQVJJX0RFRkFVTFRfREVDSU1BVEU7XG5cbiAgLyoqIFBsb3QgdHlwZXMgdGhlIGFjdGl2ZSBiYWNrZW5kIGFkdmVydGlzZXMgKDNEIGdhdGVkIGJ5IGNhcGFiaWxpdHkpLiAqL1xuICBwbG90VHlwZU9wdGlvbnM6IFBsb3RUeXBlRGVzY3JpcHRvcltdID0gW107XG4gIHNlbGVjdGVkUGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG5cbiAgLyoqIEZsb2F0aW5nIGludGVuc2l0eS1wcm9maWxlIGluc2V0IChMSU5FIG1vZGUpLiAqL1xuICByZWFkb25seSBpbnRlbnNpdHlJbnNldERpdiA9ICdpbnRlbnNpdHktaW5zZXQtcGxvdCc7XG4gIHByb2ZpbGVQYW5lbFBvcyA9IHsgeDogMjAsIHk6IDcwIH07XG4gIHByaXZhdGUgcHJvZmlsZVBhbmVsRHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwcm9maWxlUGFuZWxTdGFydCA9IHsgbXg6IDAsIG15OiAwLCB4OiAwLCB5OiAwIH07XG5cbiAgLyoqIFRvb2xiYXIgZG9ja2luZzogZG9ja2VkIGFjcm9zcyB0aGUgdG9wIGJ5IGRlZmF1bHQ7IGRyYWdnaW5nIGl0cyBoYW5kbGVcbiAgICogIGRldGFjaGVzIGl0IGludG8gYSBmbG9hdGluZywgbW92YWJsZSB3aW5kb3cgKGZyZWVzIHRoZSB0b3Agcm93IGZvciB0aGVcbiAgICogIHZpc3VhbGl6YXRpb24pLiAqL1xuICB0b29sYmFyRmxvYXRpbmcgPSBmYWxzZTtcbiAgdG9vbGJhclBvcyA9IHsgeDogOCwgeTogOCB9O1xuICBwcml2YXRlIHRvb2xiYXJEcmFnZ2luZyA9IGZhbHNlO1xuICBwcml2YXRlIHRvb2xiYXJTdGFydCA9IHsgbXg6IDAsIG15OiAwLCB4OiAwLCB5OiAwIH07XG4gIHByaXZhdGUgbGF0ZXN0UHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSA9IFtdO1xuICAvKiogRHJpdmVzIHRoZSBpbnRlbnNpdHkgaW5zZXQgcGFuZWwncyB2aXNpYmlsaXR5IOKAlCB0cnVlIHdoZW5ldmVyIGFueVxuICAgKiAgaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBleGlzdHMgKGluZGVwZW5kZW50IG9mIHRoZSBjdXJyZW50IHBsb3QgdHlwZSkuICovXG4gIGhhc1Byb2ZpbGVzID0gZmFsc2U7XG4gIHByaXZhdGUgaW50ZW5zaXR5UHJvZmlsZVN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSB2aWV3cG9ydENoYW5nZVN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBwcm9maWxlRHJhZ01vdmVMaXN0ZW5lcj86IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIHByb2ZpbGVEcmFnVXBMaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcHJvZmlsZVJlc2l6ZUxpc3RlbmVyPzogKCkgPT4gdm9pZDtcblxuICAvKiogTElORSBwbG90IHR5cGUgc2hvd3MgdGhlIGltYWdlICsgZHJhZ2dhYmxlIGxpbmUgUk9JICsgaW50ZW5zaXR5IGluc2V0LiAqL1xuICBnZXQgaXNQcm9maWxlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFBsb3RUeXBlID09PSBQbG90VHlwZS5MSU5FO1xuICB9XG5cbiAgLyoqIFRydWUgZm9yIHRoZSBJbWFnZSBwbG90IHR5cGUsIHdoaWNoIHJlbmRlcnMgYXMgYSBuYXRpdmVseSBwYW4vem9vbS1hYmxlXG4gICAqICByYXN0ZXIg4oCUIHNvIHRoZSBiYWNrZW5kLWFnbm9zdGljIHpvb20vcGFuIHRvb2xiYXIgdG9vbHMgYXJlIGhpZGRlbi4gVGhlXG4gICAqICBjb21wb25lbnQgZHJpdmVzIHRoaXMgb2ZmIHRoZSBwbG90IHR5cGUsIG5vdCB0aGUgYWN0aXZlIGJhY2tlbmQuICovXG4gIGdldCBpc0ltYWdlVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFBsb3RUeXBlID09PSBQbG90VHlwZS5JTUFHRTtcbiAgfVxuXG4gIC8qKiBJc29zdXJmYWNlIGJhbmQgYXMgYSAw4oCTMjU1IHNsaWRlciBwb3NpdGlvbiwgbWFwcGVkIG9udG8gdGhlIHZvbHVtZSdzIHJlYWxcbiAgICogIGludGVuc2l0eSByYW5nZSBieSB0aGUgcmVuZGVyZXIuIERlZmF1bHRzIHRvIHRoZSBmdWxsIHJhbmdlLiAqL1xuICBpc29SYW5nZTogbnVtYmVyW10gPSBbMCwgMjU1XTtcblxuICBwbG90V2lkdGhTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGltYWdlTG9hZGluZ1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgaW1nTG9hZGluZ01lc3NhZ2VTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGlzWm9vbVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgZmlsZW5hbWVTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGF1dG9zY2FsZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIHBsb3RDb250ZXh0TWVudUxpc3RlbmVyPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUga2V5ZG93bkxpc3RlbmVyPzogKGU6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgd2hlZWxMaXN0ZW5lcj86IChlOiBXaGVlbEV2ZW50KSA9PiB2b2lkO1xuXG4gIC8qKiBEZWJvdW5jZWQgei1zbGljZSBzY3J1YmJpbmcgKHNlZSBTbGljZVNjcnViYmVyIOKAlCByZWZhY3RvcmluZyBwbGFuIFN0ZXAgNykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2NydWJiZXIgPSBuZXcgU2xpY2VTY3J1YmJlcigoeikgPT4ge1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0WkluZGV4KHopO1xuICAgIC8vIEluIGEgcGVyLXNsaWNlIHotc3RhY2sgc2Vzc2lvbiB0aGUgc3RvcmUgc3dhcHMgdGhlIGxpdmUgcmVnaW9uIHNldCB0byB0aGlzXG4gICAgLy8gc2xpY2UgKHByZXNlcnZpbmcgZWRpdHMgbWFkZSBvbiB0aGUgcHJldmlvdXMgb25lKTsgb3V0c2lkZSBzdGFjayBtb2RlIHRoaXNcbiAgICAvLyBqdXN0IHJlY29yZHMgdGhlIHNsaWNlLCBsZWF2aW5nIHNpbmdsZS1wbGFuZSByZWdpb25zIHVudG91Y2hlZCAoaml0LXVpIzkzKS5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldERpc3BsYXlTbGljZSh6KTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChJTUFHRV9TVEFURV9QT1JUKSBwcml2YXRlIHN0YXRlOiBJbWFnZVN0YXRlUG9ydCxcbiAgICBASW5qZWN0KFZJU1VBTElaRVIpIHB1YmxpYyBwbG90U2VydmljZTogSVZpc3VhbGl6ZXIsXG4gICAgcHVibGljIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHNlc3Npb246IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICBwcml2YXRlIHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVnaW9uT3BzOiBSZWdpb25PcHNTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVklaX0NPTkZJRykgcHJpdmF0ZSB2aXpDb25maWc/OiBWaXpDb25maWcsXG4gICkge1xuICAgIHRoaXMuY29sb3JtYXBzT3B0aW9ucyA9IHBsb3RTZXJ2aWNlLmdldENvbG9ybWFwT3B0aW9ucygpO1xuICAgIHRoaXMuY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsb3QgdHlwZXMgb2ZmZXJlZCBpbiB0aGUgc2VsZWN0b3IgZm9yIHRoZSBjdXJyZW50IGltYWdlOlxuICAgKiAgLSBPdXRzaWRlICoqdGVzdCBtb2RlKiosIG9ubHkgdGhlIGN1cmF0ZWQgZGVmYXVsdCBzZXQgKGRlc2NyaXB0b3JzIHdpdGggYVxuICAgKiAgICBgcHJvZHVjdGlvbkxhYmVsYCkgaXMgb2ZmZXJlZCwgc2hvd24gdW5kZXIgc3VmZml4LWZyZWUgbmFtZXMg4oCUIEltYWdlLFxuICAgKiAgICBIZWF0bWFwLCBDb250b3VyIGFuZCB0aGUgbmFwYXJpIFN1cmZhY2UgLyBWb2x1bWUgLyBJc29zdXJmYWNlLiBUZXN0IG1vZGVcbiAgICogICAgZXhwb3NlcyBldmVyeSBiYWNrZW5kJ3MgdHlwZSB1bmRlciBpdHMgZnVsbCAoYmFja2VuZC1zdWZmaXhlZCkgbGFiZWwuXG4gICAqICAtIDNEIHR5cGVzIGhpZGRlbiB3aGVuIHRoZSBiYWNrZW5kIGNhbid0IHJlbmRlciBhIDNEIHNjZW5lLlxuICAgKiAgLSBzdGFjay1vbmx5IHR5cGVzICh2b2x1bWUsIGlzb3N1cmZhY2UpIGhpZGRlbiB1bmxlc3MgdGhlIGZpbGUgaXMgYSBzdGFjayDigJRcbiAgICogICAgYSB2b2x1bWUgbmVlZHMgbXVsdGlwbGUgei1zbGljZXMuXG4gICAqICAtIHNjYWxhci1pbnRlbnNpdHkgdHlwZXMgKGNvbnRvdXIsIHN1cmZhY2UsIGlzb3N1cmZhY2UpIGhpZGRlbiBmb3IgUkdCXG4gICAqICAgIGltYWdlcyDigJQgdGhleSBtYXAgYSBzaW5nbGUgaW50ZW5zaXR5IHBlciBwaXhlbC4gSW1hZ2UgYW5kIEhlYXRtYXAgcmVuZGVyXG4gICAqICAgIGFueSBpbWFnZS5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpIHtcbiAgICBjb25zdCBjYXBzID0gdGhpcy5wbG90U2VydmljZS5jYXBhYmlsaXRpZXM7XG4gICAgY29uc3QgaXNTdGFjayA9ICEhdGhpcy5pbWFnZUluZm8/LmlzU3RhY2s7XG4gICAgY29uc3QgaXNHcmF5c2NhbGUgPSAhIXRoaXMuaW1hZ2VJbmZvPy5pc0dyYXlzY2FsZTtcbiAgICAvLyBBIG11bHRpY2hhbm5lbCBpbWFnZSdzIGJhbmRzIGFyZSBlYWNoIHNpbmdsZS1iYW5kIChzY2FsYXIpLCBzbyB0aGUgc2NhbGFyXG4gICAgLy8gcGxvdCBtb2RlcyAoSGVhdG1hcCAvIFN1cmZhY2UgLyBWb2x1bWUgLyBJc29zdXJmYWNlKSBhcHBseSBwZXIgY2hhbm5lbCBldmVuXG4gICAgLy8gdGhvdWdoIHRoZSBSR0IgY29tcG9zaXRlIGlzbid0IGdyYXlzY2FsZSDigJQgZG9uJ3QgZ2F0ZSB0aGVtIG91dC5cbiAgICBjb25zdCBtMCA9IHRoaXMuaW1hZ2VJbmZvPy5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBpc011bHRpY2hhbm5lbCA9IChtMD8uY2hhbm5lbENvdW50ID8/IDEpID4gMSAmJiAobTA/LnJnYkNoYW5uZWxzID8/IDEpIDwgMztcbiAgICB0aGlzLnBsb3RUeXBlT3B0aW9ucyA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpXG4gICAgICAuZmlsdGVyKChkKSA9PiB7XG4gICAgICAgIC8vIE91dHNpZGUgdGVzdCBtb2RlLCBvbmx5IHRoZSBjdXJhdGVkIHNldCAodGhvc2Ugd2l0aCBhIHByb2R1Y3Rpb25MYWJlbClcbiAgICAgICAgLy8gaXMgb2ZmZXJlZDsgdGVzdCBtb2RlIGV4cG9zZXMgZXZlcnkgYmFja2VuZCdzIHR5cGUuXG4gICAgICAgIGlmICghdGhpcy50ZXN0TW9kZSAmJiAhZC5wcm9kdWN0aW9uTGFiZWwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGQuZGltZW5zaW9ucyA9PT0gJzNkJyAmJiAhY2Fwcy5oYXMoVmlld2VyRmVhdHVyZS5TdXJmYWNlM0QpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkLnJlcXVpcmVzU3RhY2sgJiYgIWlzU3RhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGQucmVxdWlyZXNHcmF5c2NhbGUgJiYgIWlzR3JheXNjYWxlICYmICFpc011bHRpY2hhbm5lbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAvLyBEZWZhdWx0IHNlbGVjdG9yIHNob3dzIHRoZSBzdWZmaXgtZnJlZSBwcm9kdWN0aW9uTGFiZWw7IHRlc3QgbW9kZSBrZWVwc1xuICAgICAgLy8gdGhlIGZ1bGwgYmFja2VuZC1zdWZmaXhlZCBsYWJlbCBzbyBzYW1lLW5hbWVkIG1vZGVzIHN0YXkgZGlzdGluZ3Vpc2hhYmxlLlxuICAgICAgLm1hcCgoZCkgPT4gKHRoaXMudGVzdE1vZGUgPyBkIDogeyAuLi5kLCBsYWJlbDogZC5wcm9kdWN0aW9uTGFiZWwhIH0pKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBUaGUgY29uc3RydWN0b3IgY29tcHV0ZXMgdGhlIG9wdGlvbnMgd2l0aCB0ZXN0TW9kZSBzdGlsbCBhdCBpdHMgZGVmYXVsdDtcbiAgICAvLyByZWNvbXB1dGUgb25jZSB0aGUgaG9zdCBiaW5kcyBpdCAoYW5kIG9uIGFueSBsYXRlciBjaGFuZ2UpIHNvIHRoZSBzZWxlY3RvclxuICAgIC8vIHJlZmxlY3RzIHRlc3QgbW9kZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbiBpbWFnZSB0byAocmUpbG9hZC5cbiAgICBpZiAoY2hhbmdlc1sndGVzdE1vZGUnXSkge1xuICAgICAgdGhpcy5jb21wdXRlUGxvdFR5cGVPcHRpb25zKCk7XG4gICAgICAvLyBJZiB0ZXN0IG1vZGUgaXMgdHVybmVkIG9mZiB3aGlsZSBhIHRlc3Qtb25seSB0eXBlIChlLmcuIE5BUEFSSV9JTUFHRSkgaXNcbiAgICAgIC8vIGFjdGl2ZSwgdGhhdCB0eXBlIGlzIG5vIGxvbmdlciBvZmZlcmVkIOKAlCBmYWxsIGJhY2sgdG8gSW1hZ2UuXG4gICAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTtcbiAgICB9XG4gIH1cblxuICAvKiogSWYgdGhlIGFjdGl2ZSBwbG90IHR5cGUgaXMgbm8gbG9uZ2VyIGluIHRoZSBvZmZlcmVkIG9wdGlvbnMgKGUuZy4gdGVzdCBtb2RlXG4gICAqICB0dXJuZWQgb2ZmIHdoaWxlIGEgdGVzdC1vbmx5IHR5cGUgd2FzIGFjdGl2ZSwgb3IgYSBzY2FsYXIgdHlwZSBjYXJyaWVkIG9udG9cbiAgICogIGFuIFJHQiBpbWFnZSksIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCAyRCBJbWFnZSB2aWV3LiAqL1xuICBwcml2YXRlIHJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsb3RUeXBlT3B0aW9ucy5zb21lKChkKSA9PiBkLnR5cGUgPT09IHRoaXMuc2VsZWN0ZWRQbG90VHlwZSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgdGhpcy5wbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgdGhpcy5pc0hlYXRtYXAgPSB0cnVlO1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZShQbG90VHlwZS5JTUFHRSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gSm9pbiB0aGUgbGl2ZSBzZXQ7IHRoZSBvbGRlc3QgbWVtYmVyIHJlbmRlcnMgdGhlIHNoYXJlZCBub3RpY2Ugb3V0bGV0cy5cbiAgICBWaXN1YWxpemVyQ29tcG9uZW50LmxpdmVJbnN0YW5jZXMuYWRkKHRoaXMpO1xuICAgIHRoaXMuc3RhdGUuc2V0RGlhZ3JhbSh0aGlzKTtcbiAgICB0aGlzLnNlbGVjdGVkQ29sb3JtYXAgPVxuICAgICAgdGhpcy5jb2xvcm1hcHNPcHRpb25zWzBdLmNoaWxkcmVuLmZpbmQoKGM6IGFueSkgPT4gYy5sYWJlbCA9PT0gJ0dyZXlzIEludicpID8/XG4gICAgICB0aGlzLmNvbG9ybWFwc09wdGlvbnNbMF0uY2hpbGRyZW5bMF07XG4gICAgdGhpcy5zdGFja09wdGlvbnMgPSBbXG4gICAgICB7IG5hbWU6ICdTaW5nbGUgaW1hZ2UnLCB2YWw6ICdmYWxzZScgfSxcbiAgICAgIHsgbmFtZTogJ1N0YWNrJywgdmFsOiAndHJ1ZScgfSxcbiAgICBdO1xuICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHRoaXMuc3RhY2tPcHRpb25zWzBdO1xuICAgIHRoaXMuYXV0b3NjYWxlU3Vic2NyaXB0aW9uID0gdGhpcy5wbG90U2VydmljZS5nZXRBdXRvc2NhbGVFdmVudCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyByZXNldCB0aGUgaW1hZ2UgbW9kZSB0byBzaW5nbGUgaW1hZ2VcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHsgbmFtZTogJ1NpbmdsZSBpbWFnZScsIHZhbDogJ2ZhbHNlJyB9O1xuICAgICAgdGhpcy5hY3RpdmVEcmFnTW9kZSA9IG51bGw7XG4gICAgICB0aGlzLnNlc3Npb24uc2V0QWN0aXZlVG9vbChudWxsKTtcbiAgICB9KTtcbiAgICB0aGlzLmltYWdlTG9hZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuaXNJbWFnZUxvYWRpbmckKCkuc3Vic2NyaWJlKChpc0ltYWdlTG9hZGluZykgPT4ge1xuICAgICAgdGhpcy5pbWdMb2FkaW5nID0gaXNJbWFnZUxvYWRpbmc7XG4gICAgfSk7XG4gICAgLy8gVW5kbyBhdmFpbGFiaWxpdHkgKGppdC11aSM4NSk6IHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgZW1pdHMgd2hlbmV2ZXIgaXRzXG4gICAgLy8gaGlzdG9yeSBkZXB0aCBjaGFuZ2VzOyBncmV5cyBvdXQgdGhlIHRvb2xiYXIgVW5kbyBidXR0b24gYWNjb3JkaW5nbHkuXG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldENhblVuZG8kKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNhblVuZG8pID0+IHtcbiAgICAgICAgdGhpcy5jYW5VbmRvUmVnaW9uID0gY2FuVW5kbztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldENhblJlZG8kKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNhblJlZG8pID0+IHtcbiAgICAgICAgdGhpcy5jYW5SZWRvUmVnaW9uID0gY2FuUmVkbztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgLy8gTWlycm9yIHRoZSByZWdpb24gc2VsZWN0aW9uIHNvIHRoZSByaWdodC1jbGljayBhY3Rpb24gZ3JvdXAgKGppdC11aSM4NSlcbiAgICAvLyBjYW4gcmVhZCBpdCBzeW5jaHJvbm91c2x5IHdoZW4gdGhlIG1lbnUgaXMgYnVpbHQuXG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YikpXG4gICAgICAuc3Vic2NyaWJlKChpbmRpY2VzKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRpY2VzID0gaW5kaWNlcyB8fCBbXTtcbiAgICAgIH0pO1xuICAgIC8vIEludGVyYWN0aXZlIHBvaW50LXByb21wdCBzZWdtZW50YXRpb24gcnVucyBpbnNpZGUgdGhlIHJlbmRlcmVyIG9uIGVhY2hcbiAgICAvLyBjbGljazsgc3VyZmFjZSBpdHMgbGl2ZSBzdGF0dXMgKyBkb3dubG9hZCBwcm9ncmVzcyBpbiB0aGUgc2hhcmVkIGBzYW1gXG4gICAgLy8gdG9hc3Qgc28gdGhlIHVzZXIgc2VlcyBpdCB3b3JraW5nICh0aGUgZmlyc3QgY2xpY2sgcHVsbHMgdGhlIGVuY29kZXIpLlxuICAgIHRoaXMuc2FtUG9pbnRTdWIuYWRkKFxuICAgICAgdGhpcy5zYW1Qb2ludFRvb2wucHJvZ3Jlc3MkLnN1YnNjcmliZSgoZikgPT4ge1xuICAgICAgICB0aGlzLnNhbURvd25sb2FkaW5nID0gZiA+PSAwICYmIGYgPCAxO1xuICAgICAgICBpZiAoZiA+PSAwKSB0aGlzLnNhbVByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKGYgKiAxMDApKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnNhbVBvaW50U3ViLmFkZChcbiAgICAgIHRoaXMuc2FtUG9pbnRUb29sLnN0YXR1cyQuc3Vic2NyaWJlKChtKSA9PiB7XG4gICAgICAgIHRoaXMuc2FtU3RhdHVzID0gbTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnNhbVBvaW50U3ViLmFkZChcbiAgICAgIHRoaXMuc2FtUG9pbnRUb29sLmJ1c3kkLnN1YnNjcmliZSgoYnVzeSkgPT4ge1xuICAgICAgICB0aGlzLnNhbUJ1c3kgPSBidXN5O1xuICAgICAgICBpZiAoYnVzeSkgdGhpcy5zaG93U2FtVG9hc3QoJ1NBTSBwb2ludCBzZWdtZW50YXRpb24nKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCkuc3Vic2NyaWJlKChsb2FkaW5nUHJvZ3Jlc3MpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZ1BlcmNlbnRhZ2UgPSBsb2FkaW5nUHJvZ3Jlc3M7XG4gICAgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5pc1N0YWNrTG9hZGluZygpLnN1YnNjcmliZSgoc3RhY2tMb2FkaW5nKSA9PiB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyA9IHN0YWNrTG9hZGluZztcbiAgICB9KTtcbiAgICB0aGlzLnBsb3RXaWR0aFN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZ2V0UGFuZWxXaWR0aCQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5yZWxheW91dCgpO1xuICAgICAgLy8gVGhlIGludGVuc2l0eSBpbnNldCBpcyBhIHNlcGFyYXRlIFBsb3RseSBjaGFydCBpbiBhIGZsb2F0aW5nIHBhbmVsOyByZWZsb3dcbiAgICAgIC8vIGl0IHRvIGl0cyBjdXJyZW50IHNpemUgd2hlbiB0aGUgY2FudmFzIHJlc2l6ZXMsIGVsc2UgaXQga2VlcHMgdGhlIHN0YWxlXG4gICAgICAvLyBzaXplIGFuZCBibGFua3Mgb3V0LiBEZWZlciBhIHRpY2sgc28gdGhlIHBhbmVsIGxheW91dCBoYXMgc2V0dGxlZC5cbiAgICAgIGlmICh0aGlzLmhhc1Byb2ZpbGVzKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZW5kZXJJbnRlbnNpdHlJbnNldCgpLCAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRJbWFnZUxvYWRpbmdNZXNzYWdlJCgpLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZVxuICAgICAgLmdldENhY2hlUHJvZ3Jlc3MkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKHByb2dyZXNzKSA9PiB7XG4gICAgICAgIHRoaXMuY2FjaGVQcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgfSk7XG4gICAgdGhpcy5pc1pvb21TdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmlzWm9vbSQoKS5zdWJzY3JpYmUoKHpvb20pID0+IHtcbiAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgfSk7XG4gICAgdGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZ2V0RmlsZW5hbWUkKCkuc3Vic2NyaWJlKChmaWxlbmFtZSkgPT4ge1xuICAgICAgaWYgKGZpbGVuYW1lKSB7XG4gICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlbmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldENvbG9ybWFwKCkuc3Vic2NyaWJlKChjb2xvcm1hcCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbG9ybWFwID0gY29sb3JtYXA7XG4gICAgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZXZlcnNlU2NhbGUoKS5zdWJzY3JpYmUoKHJldmVyc2VzY2FsZSkgPT4ge1xuICAgICAgdGhpcy5yZXZlcnNlc2NhbGUgPSByZXZlcnNlc2NhbGU7XG4gICAgfSk7XG4gICAgdGhpcy5pbnRlbnNpdHlQcm9maWxlU3ViID0gdGhpcy5wbG90U2VydmljZS5nZXRJbnRlbnNpdHlQcm9maWxlJCgpLnN1YnNjcmliZSgocHJvZmlsZXMpID0+IHtcbiAgICAgIHRoaXMubGF0ZXN0UHJvZmlsZXMgPSBwcm9maWxlcztcbiAgICAgIHRoaXMuaGFzUHJvZmlsZXMgPSBwcm9maWxlcy5sZW5ndGggPiAwO1xuICAgICAgLy8gVGhlIHBhbmVsIGRpdiBpcyBiZWhpbmQgKm5nSWY9XCJoYXNQcm9maWxlc1wiLiBkZXRlY3RDaGFuZ2VzKCkgbWF0ZXJpYWxpemVzXG4gICAgICAvLyBpdCBzeW5jaHJvbm91c2x5ICh0aGUgc3Vic2NyaXB0aW9uIG1heSBmaXJlIG91dHNpZGUgQW5ndWxhcidzIHpvbmUg4oCUIGUuZy5cbiAgICAgIC8vIGZyb20gYW4gT1NEIGRyYWcg4oCUIHNvIENEIHdvdWxkbid0IHJ1biBvbiBpdHMgb3duKS4gVGhlbiByZW5kZXIgb24gdGhlIG5leHRcbiAgICAgIC8vIGFuaW1hdGlvbiBmcmFtZSwgQUZURVIgdGhlIGJyb3dzZXIgbGF5cyB0aGUgcGFuZWwgb3V0OiBhIHN5bmNocm9ub3VzIGRyYXdcbiAgICAgIC8vIGhpdHMgYSB6ZXJvLXNpemUgY29udGFpbmVyIG9uIGZpcnN0IGNyZWF0ZSBhbmQgUGxvdGx5IGtlZXBzIHRoYXQgc2l6ZSwgc29cbiAgICAgIC8vIHRoZSBpbnNldCBzdGF5cyBibGFuayBhbmQgbGl2ZSB1cGRhdGVzIHJlZHJhdyBpbnRvIHRoZSBzYW1lIHplcm8gYm94LlxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucmVuZGVySW50ZW5zaXR5SW5zZXQoKSk7XG4gICAgfSk7XG4gICAgLy8gV2hlbiB0aGUgT1NEIHZpZXcgc2V0dGxlcyBhdCBhIG5ldyB6b29tL3BhbiwgcmUtc2FtcGxlIHRoZSBpbnRlbnNpdHkgbGluZXNcbiAgICAvLyBmcm9tIGEgY3JvcCBvZiB0aGUgdmlzaWJsZSByZWdpb24gc28gdGhlIGluc2V0IHJlZmxlY3RzIHRoZSB6b29tLWxldmVsXG4gICAgLy8gcmVzb2x1dGlvbiAoUGxvdGx5J3Mgb3duIGhpZ2gtZGVmIHpvb20gdXBkYXRlcyB0aGUgc2FtcGxpbmcgY2FjaGUgaW5saW5lKS5cbiAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlU3ViID0gdGhpcy5wbG90U2VydmljZS5nZXRWaWV3cG9ydENoYW5nZSQoKS5zdWJzY3JpYmUoKHJvaSkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMgJiYgdGhpcy5pc0ltYWdlVmlldykge1xuICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaShyb2kueCwgcm9pLnksIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgdGhpcy56SW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucHJldmlld1N1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZ2V0SW1hZ2VJbmZvJCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoaW1nSW5mbykgPT4ge1xuICAgICAgICBpZiAoaW1nSW5mbykge1xuICAgICAgICAgIHRoaXMuaW1hZ2VJbmZvID0gaW1nSW5mbztcbiAgICAgICAgICAvLyBTdGFjay1vbmx5IHBsb3QgdHlwZXMgKGlzb3N1cmZhY2UsIHNjYXR0ZXIzZCkgZGVwZW5kIG9uIHdoZXRoZXIgdGhpc1xuICAgICAgICAgIC8vIGZpbGUgaXMgYSBzdGFjayDigJQgcmVjb21wdXRlIHRoZSBzZWxlY3RvciBvcHRpb25zLlxuICAgICAgICAgIHRoaXMuY29tcHV0ZVBsb3RUeXBlT3B0aW9ucygpO1xuICAgICAgICAgIC8vIElmIHRoZSBhY3RpdmUgcGxvdCB0eXBlIGlzbid0IHZhbGlkIGZvciB0aGlzIGltYWdlIChlLmcuIGEgc2NhbGFyXG4gICAgICAgICAgLy8gdHlwZSBsaWtlIENvbnRvdXIgY2FycmllZCBvdmVyIHRvIGFuIFJHQiBpbWFnZSksIGZhbGwgYmFjayB0byBJbWFnZS5cbiAgICAgICAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGVkUGxvdFR5cGUoKTtcbiAgICAgICAgICAvLyByZXNldCBzdGFjayBvcHRpb25zIHNlbGVjdGlvblxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IGltZ0luZm8uc2hvd1N0YWNrID8gdGhpcy5zdGFja09wdGlvbnNbMV0gOiB0aGlzLnN0YWNrT3B0aW9uc1swXTtcblxuICAgICAgICAgIHRoaXMuaXNHcmF5c2NhbGVFdmVudC5lbWl0KHRoaXMuaW1hZ2VJbmZvLmlzR3JheXNjYWxlKTtcbiAgICAgICAgICB0aGlzLmlzU3RhY2tFdmVudC5lbWl0KHRoaXMuaW1hZ2VJbmZvLmlzU3RhY2spO1xuICAgICAgICAgIC8vIFJlc2V0IHRvIHRoZSBkZWZhdWx0IDJEIEltYWdlIHZpZXcgd2hlbiBhIGRpZmZlcmVudCBpbWFnZSBpc1xuICAgICAgICAgIC8vIHNlbGVjdGVkIHdoaWxlIGEgM0QgdHlwZSBpcyBhY3RpdmUuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzSGVhdG1hcCAmJiBpbWdJbmZvLmZpbGVOYW1lICE9PSB0aGlzLmxvYWRlZEZpbGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmlzSGVhdG1hcCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UGxvdFR5cGUodGhpcy5wbG90VHlwZSk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1cmZhY2UzZE1vZGUgPSAndHVybnRhYmxlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2FkZWRGaWxlTmFtZSA9IGltZ0luZm8uZmlsZU5hbWU7XG4gICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRJbWFnZU1ldGEodGhpcy5pbWFnZUluZm8uaW1hZ2VNZXRhKTtcbiAgICAgICAgICBjb25zdCB1cmxzID0gaW1nSW5mby51cmxzO1xuICAgICAgICAgIGlmICghdGhpcy5ydW5uaW5nKSB7XG4gICAgICAgICAgICAvLyBpbWFnZSBzaXplIOKAlCBtZWFzdXJlIHRoZSBwbG90IGRpdiBkaXJlY3RseSBzbyB0aGUgdG9vbGJhciBoZWlnaHQgaXMgZXhjbHVkZWRcbiAgICAgICAgICAgIGNvbnN0IHBsb3REaXY6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdk5hbWUpO1xuICAgICAgICAgICAgY29uc3Qgc2NyZWVuSGVpZ2h0ID0gcGxvdERpdj8ub2Zmc2V0SGVpZ2h0IHx8IDUwMDtcbiAgICAgICAgICAgIGlmICh1cmxzKSB7XG4gICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVzZXQoKTtcbiAgICAgICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmcgPSBpbWdJbmZvLmlzU3RhY2sgJiYgaW1nSW5mby5zaG93U3RhY2s7XG4gICAgICAgICAgICAgIC8vIHNldCBtYXggaW5kZXggb2Ygc3RhY2sg4oCUIGNvbXB1dGVkIGJlZm9yZSB1cGRhdGVaSW5kZXggc28gYVxuICAgICAgICAgICAgICAvLyBmcmVzaCBzdGFjayAoc2hvcnRlciBvciBsb25nZXIgdGhhbiB3aGF0ZXZlciB3YXMgcHJldmlvdXNseVxuICAgICAgICAgICAgICAvLyBsb2FkZWQpIGNsYW1wcyBhZ2FpbnN0IElUUyBib3VuZHMsIG5vdCB0aGUgc3RhbGUgb25lcy5cbiAgICAgICAgICAgICAgLy8gT25lIFVSTCBwZXIgc2xpY2UgKDAtaW5kZXhlZCksIHNvIHRoZSBsYXN0IHJlYWNoYWJsZSBpbmRleCBpc1xuICAgICAgICAgICAgICAvLyBsZW5ndGgtMSDigJQgZWFybGllciBgbGVuZ3RoLTJgIGRyb3BwZWQgdGhlIGZpbmFsIHNsaWNlLlxuICAgICAgICAgICAgICB0aGlzLm1heEluZGV4ID0gdXJscy5sZW5ndGggPiAxID8gdXJscy5sZW5ndGggLSAxIDogMDtcbiAgICAgICAgICAgICAgLy8gT25lLXNob3QgaGludDoganVtcCBzdHJhaWdodCB0byBhIHNwZWNpZmljIHNsaWNlIChlLmcuIHRoZVxuICAgICAgICAgICAgICAvLyBmaWxlIHRoZSB1c2VyIGFjdHVhbGx5IGNsaWNrZWQgd2l0aGluIGEgbnVtYmVyZWQgc2VyaWVzKS5cbiAgICAgICAgICAgICAgLy8gQ29uc3VtZWQgaW1tZWRpYXRlbHkgc28gcmVkZWxpdmVyaW5nIHRoZSBzYW1lIEltYWdlSW5mbyBsYXRlclxuICAgICAgICAgICAgICAvLyAoYSBwbG90LXR5cGUgc3dpdGNoLCByZWxvYWRBbmRQbG90KSBkb2Vzbid0IHJlc2V0IHRoZSB1c2VyJ3NcbiAgICAgICAgICAgICAgLy8gY3VycmVudCBzY3J1YiBwb3NpdGlvbiBiYWNrIHRvIGl0LlxuICAgICAgICAgICAgICBpZiAoaW1nSW5mby5pbml0aWFsWkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnpJbmRleCA9IGltZ0luZm8uaW5pdGlhbFpJbmRleDtcbiAgICAgICAgICAgICAgICBpbWdJbmZvLmluaXRpYWxaSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB6aW5kZXggaXMgd2l0aGluIGJvdW5kc1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVpJbmRleCh1cmxzKTtcbiAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gTXVsdGktdGllciByZW5kZXJpbmcgKHNtYWxsIGJsdXJyeSB0aWVyIGZpcnN0LCB0aGVuIHNoYXJwZW4gaW5cbiAgICAgICAgICAgICAgLy8gcGxhY2UpIOKAlCBzZXF1ZW5jaW5nIGxpdmVzIGluIFJlbmRlck9yY2hlc3RyYXRvcjsgdGhpcyBjb21wb25lbnRcbiAgICAgICAgICAgICAgLy8gc3VwcGxpZXMgdGhlIHBoYXNlIHJlbmRlciBhbmQgb3ducyB0aGUgVUkgZmxhZ3MgdmlhIGNhbGxiYWNrcy5cbiAgICAgICAgICAgICAgLy8gM0QgcGxvdCB0eXBlcyByZW5kZXIgc2luZ2xlLXBhc3M6IHRoZSBpbi1wbGFjZSBsYXJnZSBwYXNzIGRvZXNuJ3RcbiAgICAgICAgICAgICAgLy8gcmVidWlsZCBhIDNEIGdsLW1lc2ggaXNvc3VyZmFjZSwgc28gdGhlIHNoYXJwZW4gc3RlcCBibGFua2VkIGl0LlxuICAgICAgICAgICAgICBjb25zdCBoYXNTbWFsbFRpZXIgPVxuICAgICAgICAgICAgICAgIHRoaXMuaXNIZWF0bWFwICYmXG4gICAgICAgICAgICAgICAgKGltZ0luZm8uc21hbGxVcmxzPy5sZW5ndGggPz8gMCkgPT09IHVybHMubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgKGltZ0luZm8uc21hbGxVcmxzPy5sZW5ndGggPz8gMCkgPiAwO1xuICAgICAgICAgICAgICBjb25zdCBzbWFsbEltZ0luZm8gPSBoYXNTbWFsbFRpZXIgPyB7IC4uLmltZ0luZm8sIHVybHM6IGltZ0luZm8uc21hbGxVcmxzIGFzIHN0cmluZ1tdIH0gOiBudWxsO1xuXG4gICAgICAgICAgICAgIC8vIEVudGVyIHBlci1zbGljZSBzdGFjayBtb2RlIHdpdGggdGhlIGdpdmVuIHNsaWNl4oaScmVnaW9ucyBtYXAgYW5kXG4gICAgICAgICAgICAgIC8vIHNlZWQgdGhlIFwicHJldmlvdXMgc2hhcGVzXCIgZnJvbSB0aGUgbm93LWxpdmUgc2xpY2UuIGVudGVyU3RhY2tNb2RlXG4gICAgICAgICAgICAgIC8vIG1ha2VzIHpJbmRleCdzIHNsaWNlIGxpdmUgYW5kIHJlc2V0cyB1bmRvIChqaXQtdWkjOTMpLlxuICAgICAgICAgICAgICBjb25zdCBlbnRlclN0YWNrID0gKFxuICAgICAgICAgICAgICAgIHNsaWNlczogTWFwPG51bWJlciwgUmVnaW9uW10+LFxuICAgICAgICAgICAgICAgIGxheW91dDogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScsXG4gICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2UuZW50ZXJTdGFja01vZGUoc2xpY2VzLCB0aGlzLnpJbmRleCwgbGF5b3V0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnBsb3RTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAuZ2V0UmVnaW9ucygpXG4gICAgICAgICAgICAgICAgICAubWFwKChyZWdpb24pID0+IHJlZ2lvbi5nZXRTaGFwZSh0aGlzLnBsb3RTZXJ2aWNlLmdldFNob3dTaGFwZUxhYmVsKCkpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFByZXZpb3VzU2hhcGVzKHNoYXBlcyk7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgY29uc3QgYXBwbHlSb2kgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRm9sZGVyIHN0YWNrOiBhIHN0YWNrIG9mIHNlbGYtY29udGFpbmVkIHBlci1zbGljZSBmaWxlc1xuICAgICAgICAgICAgICAgIC8vICh0aWxlZCA9PT0gZmFsc2U7IHNlZSBsb2FkU2VyaWVzQXNTdGFjaykuIEVhY2ggc2xpY2UtZmlsZSBtYXlcbiAgICAgICAgICAgICAgICAvLyBjYXJyeSBpdHMgb3duIHNpYmxpbmcgXCI8c3RlbT4uZ2VvanNvblwiIChyb2lKc29uU3Ryc1t6XSksIGJ1dCBhXG4gICAgICAgICAgICAgICAgLy8gZnJlc2ggZm9sZGVyIHdpdGggbm9uZSB5ZXQgbGVhdmVzIHJvaUpzb25TdHJzIHVuZGVmaW5lZCDigJQga2V5XG4gICAgICAgICAgICAgICAgLy8gb2ZmIGB0aWxlZCA9PT0gZmFsc2VgLCBOT1Qgcm9pSnNvblN0cnMsIHNvIGFuIHVuYW5ub3RhdGVkXG4gICAgICAgICAgICAgICAgLy8gZm9sZGVyIHN0YWNrIHN0aWxsIGVudGVycyB0aGUgcGVyLXNsaWNlLWZpbGUgbGF5b3V0IChhbmQgc2F2ZXNcbiAgICAgICAgICAgICAgICAvLyBiYWNrIG9uZSBnZW9qc29uIHBlciBzbGljZS1maWxlKSByYXRoZXIgdGhhbiBmYWxsaW5nIHRocm91Z2ggdG9cbiAgICAgICAgICAgICAgICAvLyB0aGUgc2luZ2xlLWZpbGUgY29tYmluZWQgcGF0aCAoaml0LXVpIzkzKS5cbiAgICAgICAgICAgICAgICBpZiAoaW1nSW5mby5pc1N0YWNrICYmIGltZ0luZm8udGlsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwZXJTbGljZSA9IGltZ0luZm8ucm9pSnNvblN0cnM7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzbGljZUNvdW50ID0gaW1nSW5mby51cmxzPy5sZW5ndGggPz8gcGVyU2xpY2U/Lmxlbmd0aCA/PyAwO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2xpY2VzID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IDA7IHogPCBzbGljZUNvdW50OyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IHBlclNsaWNlPy5bel0gPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc2xpY2VzLnNldCh6LCBqc29uID8gdGhpcy5wbG90U2VydmljZS5pbXBvcnRSZWdpb25zKGpzb24pIDogW10pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZW50ZXJTdGFjayhzbGljZXMsICdwZXItc2xpY2UtZmlsZScpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUtZmlsZSB6LXN0YWNrOiBvbmUgc2libGluZyBnZW9qc29uIGhvbGRpbmcgZXZlcnkgc2xpY2Unc1xuICAgICAgICAgICAgICAgIC8vIHJlZ2lvbnMgaW5kZXhlZCBieSBRdVBhdGgncyBnZW9tZXRyeS5wbGFuZS56LiBFbnRlciBwZXItc2xpY2VcbiAgICAgICAgICAgICAgICAvLyBtb2RlIChzYXZpbmcgYmFjayBvbmUgY29tYmluZWQgei1pbmRleGVkIGdlb2pzb24pIHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gZ2VvanNvbiBhY3R1YWxseSBjYXJyaWVzIHNsaWNlIGluZGljZXMsIG9yIHdoZW4gdGhlcmUncyBub3RoaW5nXG4gICAgICAgICAgICAgICAgLy8geWV0IHRvIGF1dGhvciBhZ2FpbnN0LiBBIGxlZ2FjeSBnZW9qc29uIHdob3NlIHJlZ2lvbnMgYXJlIGFsbCBvblxuICAgICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHBsYW5lIHN0YXlzIGdsb2JhbCAoc2hvd24gb24gZXZlcnkgc2xpY2UpIHNvXG4gICAgICAgICAgICAgICAgLy8gZXhpc3Rpbmcgc2luZ2xlLXBsYW5lIGFubm90YXRpb25zIGFyZW4ndCBjb25maW5lZCB0byBzbGljZSAwLlxuICAgICAgICAgICAgICAgIGNvbnN0IHJvaUpzb24gPSBpbWdJbmZvLnJvaUpzb25TdHI7XG4gICAgICAgICAgICAgICAgaWYgKGltZ0luZm8uaXNTdGFjaykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVnaW9ucyA9IHJvaUpzb24gPyB0aGlzLnBsb3RTZXJ2aWNlLmltcG9ydFJlZ2lvbnMocm9pSnNvbikgOiBbXTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc1NsaWNlSW5mbyA9IHJlZ2lvbnMuc29tZSgocikgPT4gKHIueiA/PyAwKSAhPT0gMCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIXJvaUpzb24gfHwgaGFzU2xpY2VJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNsaWNlcyA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6ID0gci56ID8/IDA7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gc2xpY2VzLmdldCh6KTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0KSBidWNrZXQucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIHNsaWNlcy5zZXQoeiwgW3JdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbnRlclN0YWNrKHNsaWNlcywgJ2NvbWJpbmVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2luZ2xlLXBsYW5lIGltYWdlIChvciBhIGxlZ2FjeSBnbG9iYWwgei1zdGFjayBnZW9qc29uKTogb25lXG4gICAgICAgICAgICAgICAgLy8gcmVnaW9uIHNldCBmb3IgdGhlIHdob2xlIGltYWdlLlxuICAgICAgICAgICAgICAgIGlmIChyb2lKc29uKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZWdpb25zID0gdGhpcy5wbG90U2VydmljZS5pbXBvcnRSZWdpb25zKHJvaUpzb24pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRSZWdpb25zKHJlZ2lvbnMpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5tYXAoKHJlZ2lvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uLmdldFNoYXBlKHRoaXMucGxvdFNlcnZpY2UuZ2V0U2hvd1NoYXBlTGFiZWwoKSksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQcmV2aW91c1NoYXBlcyhzaGFwZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBMb2FkaW5nIGFuIGltYWdlJ3Mgc2F2ZWQgUk9JcyBpcyBub3QgYSB1c2VyIGVkaXQg4oCUIHN0YXJ0IHRoZVxuICAgICAgICAgICAgICAgIC8vIHVuZG8gaGlzdG9yeSBmcmVzaCBzbyB0aGUgZmlyc3QgdW5kbyBjYW4ndCB3aXBlIHRoZW0gKGppdC11aSM4NSkuXG4gICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGxldCBvdmVybGF5UmVsZWFzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc3QgcmVsZWFzZU92ZXJsYXkgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG92ZXJsYXlSZWxlYXNlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWxlYXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGltZ0luZm8uaXNTdGFjayAmJiBpbWdJbmZvLnNob3dTdGFjaykgdGhpcy5zdGFja0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgbmV3IFJlbmRlck9yY2hlc3RyYXRvcih7XG4gICAgICAgICAgICAgICAgLy8gaW5QbGFjZT10cnVlIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIHJlbmRlciBpbnN0ZWFkIG9mIHJlYnVpbGRpbmdcbiAgICAgICAgICAgICAgICAvLyBpdCwgc28gdGhlIGNhbnZhcyBkb2Vzbid0IGJsYW5rIGR1cmluZyB0aGUgc21hbGzihpJsYXJnZSBzd2FwLlxuICAgICAgICAgICAgICAgIHJlbmRlclBoYXNlOiAocGhhc2VJbmZvLCBpblBsYWNlKSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5sb2FkKHBoYXNlSW5mbywgdGhpcy56SW5kZXgpLnRoZW4oKGxvYWRlZEltYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgYSBuZXdlciBjbGljayByZWFjaGluZyB1cyBtaWQtcmVuZGVyLlxuICAgICAgICAgICAgICAgICAgICBpZiAocGhhc2VJbmZvLmZpbGVOYW1lICE9PSBsb2FkZWRJbWFnZS5maWxlbmFtZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBsb3RTZXJ2aWNlLnBsb3QoXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbG90RGl2TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICBwaGFzZUluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxvdFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgaW5QbGFjZSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNtYWxsU2hvd246ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlIGlzIHN0aWxsIGJlaW5nIGNhY2hlZC9wcmVwYXJlZCBzZXJ2ZXItc2lkZSwga2VlcCB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgLy8gY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheSB1cCBpbnN0ZWFkIG9mIGRyb3BwaW5nIHRvIHRoZSB0cmFuc2x1Y2VudCBcIlNoYXJwZW5pbmdcbiAgICAgICAgICAgICAgICAgIC8vIHByZXZpZXcuLi5cIiBzcGlubmVyIG92ZXIgYSBibGFuayBjYW52YXMgKGEgbGFyZ2UgdW5jYWNoZWQgaW1hZ2UgcmVuZGVycyBpdHNcbiAgICAgICAgICAgICAgICAgIC8vIHNtYWxsIHByZXZpZXcgYmVmb3JlIGl0cyB0aWxlcyBleGlzdCkuIGZpbmlzaGVkKCkgcmVsZWFzZXMgdGhlIG92ZXJsYXkgb25jZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgcmVuZGVyIGxhbmRzLlxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYWNoaW5nKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAvLyBTbWFsbCB0aWVyIG9uIHNjcmVlbiDigJQgZHJvcCB0aGUgZnVsbCBvdmVybGF5IGJ1dCBrZWVwIGEgdHJhbnNsdWNlbnQgc3Bpbm5lciBzb1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIGJsdXJyeSByZW5kZXIgaXNuJ3QgbWlzdGFrZW4gZm9yIHRoZSBmaW5hbCBpbWFnZS5cbiAgICAgICAgICAgICAgICAgIHJlbGVhc2VPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNoYXJwZW5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2hhcnBlblNldHRsZWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hhcnBlbmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IChfdmlhU21hbGwsIGxvZ1RhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gSWRlbXBvdGVudCDigJQgcmVsZWFzZXMgbm93IGlmIHNtYWxsU2hvd24gZGVmZXJyZWQgaXQgKGNhY2hpbmcpIG9yIHdhcyBza2lwcGVkLlxuICAgICAgICAgICAgICAgICAgcmVsZWFzZU92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgYXBwbHlSb2koKTtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvZ1RhZyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaGFycGVuRmFpbGVkOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGUgZmFsbGJhY2sg4oCUIHRlbGwgdGhlXG4gICAgICAgICAgICAgICAgICAvLyB1c2VyIHRoZSBzaGFycGVyIHZlcnNpb24gaXNuJ3QgY29taW5nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgZXJyPy5zdGF0dXNUZXh0IHx8IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMudml6QWxlcnRUb2FzdEtleSxcbiAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogJ1ByZXZpZXcgbm90IHNoYXJwZW5lZCcsXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDogYFRoZSBmdWxsLXJlc29sdXRpb24gcHJldmlldyBkaWQgbm90IGxvYWQgKCR7bXNnfSkuIFRoZSBsb3ctcmVzb2x1dGlvbiBwcmV2aWV3IGlzIHN0aWxsIHNob3duLiBUcnkgY2xpY2tpbmcgdGhlIGltYWdlIGFnYWluLmAsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgYXBwbHlSb2koKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KS5yZW5kZXIoaW1nSW5mbywgc21hbGxJbWdJbmZvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCBlcnI/LnN0YXR1c1RleHQgfHwgU3RyaW5nKGVycik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VyZWQgd2hlbiBnZXR0aW5nIGltYWdlIGluZm8nLCBlcnIpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAga2V5OiB0aGlzLnZpekFsZXJ0VG9hc3RLZXksXG4gICAgICAgICAgc3RpY2t5OiB0cnVlLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIHN1bW1hcnk6ICdBbiBlcnJvciBvY2N1cmVkJyxcbiAgICAgICAgICBkZXRhaWw6IGBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VyZWQgd2hpbGUgZ2V0dGluZyBpbWFnZSBpbmZvOiAke21zZ30uXG4gICAgICAgICAgICAgICAgICAgUGxlYXNlIHRyeSB0byBvcGVuIHRoZSBpbWFnZSBhZ2FpbiB0aHJvdWdoIHRoZSBmaWxlIG5hdmlnYXRvci5gLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdGFja0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZXNldCgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnBsb3RDb250ZXh0TWVudUxpc3RlbmVyID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBwbG90RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXZOYW1lKTtcbiAgICAgIGlmICghcGxvdEVsPy5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnVJdGVtcyA9IHRoaXMuYnVpbGRDb250ZXh0TWVudUl0ZW1zKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lciwgdHJ1ZSk7XG5cbiAgICB0aGlzLmtleWRvd25MaXN0ZW5lciA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkgcmV0dXJuO1xuICAgICAgLy8gU0FNIHBvaW50IG1vZGU6IEVudGVyIGNvbW1pdHMgdGhlIG9iamVjdCwgRXNjIGNsZWFycyB0aGUgcHJvbXB0LlxuICAgICAgaWYgKHRoaXMuYWN0aXZlRHJhZ01vZGUgPT09ICdzYW1Qb2ludCcgJiYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICdFc2NhcGUnKSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHRoaXMucGxvdFNlcnZpY2UuY29tbWl0U2FtUG9pbnRzKCk7XG4gICAgICAgICAgZWxzZSB0aGlzLnBsb3RTZXJ2aWNlLmNsZWFyU2FtUG9pbnRzKCk7XG4gICAgICAgICAgdGhpcy5oaWRlU2FtVG9hc3QoKTsgLy8gcHJvbXB0IHJlc29sdmVkIOKGkiBkaXNtaXNzIHRoZSBzdGF0dXMgdG9hc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lvbiBoaXN0b3J5IChqaXQtdWkjODUpOiBDdHJsL0NtZCtaIHVuZG9lczsgQ3RybC9DbWQrU2hpZnQrWiBvclxuICAgICAgLy8gQ3RybC9DbWQrWSByZWRvZXMuXG4gICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XG4gICAgICAgIGNvbnN0IGsgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGsgPT09ICd6JyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnVuZG9SZWdpb24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoayA9PT0gJ3onICYmIGV2ZW50LnNoaWZ0S2V5KSB8fCBrID09PSAneScpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnJlZG9SZWdpb24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRGVsZXRlJyB8fCBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGV2ZW50LmtleSA9PT0gJ2QnIHx8IGV2ZW50LmtleSA9PT0gJ0QnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmRlbGV0ZVJlZ2lvbigpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnKycgfHwgZXZlbnQua2V5ID09PSAnPScpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuem9vbUluKCkpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICctJyB8fCBldmVudC5rZXkgPT09ICdfJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy56b29tT3V0KCkpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdwJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgncGFuJykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdiJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnem9vbVRvQm94JykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdyJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd3JlY3QnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ2YnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3Y2xvc2VkcGF0aCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAndycpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3dhbmQnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ2UnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdlcmFzZVZlcnRleCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAncycpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3NlbGVjdCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnbCcpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdvcGVucGF0aCcpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuXG4gICAgdGhpcy53aGVlbExpc3RlbmVyID0gKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBwbG90RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXZOYW1lKTtcbiAgICAgIGlmICghcGxvdEVsPy5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHJldHVybjtcbiAgICAgIC8vIFRoZSBJbWFnZSB2aWV3IGhhbmRsZXMgc2Nyb2xsLXpvb20gbmF0aXZlbHkgKGl0IHJlc3BlY3RzIHRoZSBzY3JvbGxcbiAgICAgIC8vIGRlbHRhKS4gSW50ZXJjZXB0aW5nIGhlcmUgd291bGQgZmlyZSBhIGZpeGVkIHpvb20gc3RlcCBwZXIgd2hlZWxcbiAgICAgIC8vIGV2ZW50IOKAlCBmYXIgdG9vIHNlbnNpdGl2ZSDigJQgc28gbGV0IHRoZSByZW5kZXJlciBvd24gaXQuXG4gICAgICBpZiAodGhpcy5pc0ltYWdlVmlldykgcmV0dXJuO1xuICAgICAgLy8gM0QgcGxvdCB0eXBlcyAoc3VyZmFjZSwgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSByZW5kZXIgaW4gYSBQbG90bHkgc2NlbmVcbiAgICAgIC8vIHRoYXQgb3JiaXRzL3pvb21zIG5hdGl2ZWx5IG9uIHNjcm9sbC4gVGhlIDJEIHN0ZXAtem9vbSBkb2Vzbid0IGFwcGx5IGFuZFxuICAgICAgLy8gd291bGQgdGhyb3cgKG5vIHhheGlzIG9uIGEgc2NlbmUpLCBzbyBsZXQgUGxvdGx5IGhhbmRsZSB0aGUgd2hlZWwuXG4gICAgICBpZiAoIXRoaXMuaXNIZWF0bWFwKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoZXZlbnQuZGVsdGFZIDwgMCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy56b29tSW4oKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuem9vbU91dCgpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMud2hlZWxMaXN0ZW5lciwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiBmYWxzZSB9KTtcblxuICAgIC8vIERyYWcgaGFuZGxpbmcgZm9yIHRoZSBmbG9hdGluZyBpbnRlbnNpdHktcHJvZmlsZSBwYW5lbC5cbiAgICB0aGlzLnByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLnByb2ZpbGVQYW5lbERyYWdnaW5nKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9maWxlUGFuZWxQb3MgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnByb2ZpbGVQYW5lbFN0YXJ0LnggKyAoZS5jbGllbnRYIC0gdGhpcy5wcm9maWxlUGFuZWxTdGFydC5teCksXG4gICAgICAgICAgICB5OiB0aGlzLnByb2ZpbGVQYW5lbFN0YXJ0LnkgKyAoZS5jbGllbnRZIC0gdGhpcy5wcm9maWxlUGFuZWxTdGFydC5teSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudG9vbGJhckRyYWdnaW5nKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy50b29sYmFyUG9zID0ge1xuICAgICAgICAgICAgeDogdGhpcy50b29sYmFyU3RhcnQueCArIChlLmNsaWVudFggLSB0aGlzLnRvb2xiYXJTdGFydC5teCksXG4gICAgICAgICAgICB5OiB0aGlzLnRvb2xiYXJTdGFydC55ICsgKGUuY2xpZW50WSAtIHRoaXMudG9vbGJhclN0YXJ0Lm15KSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMucHJvZmlsZURyYWdVcExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9maWxlUGFuZWxEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy50b29sYmFyRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLnByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucHJvZmlsZURyYWdVcExpc3RlbmVyKTtcblxuICAgIC8vIE9uIGFueSB3aW5kb3cgcmVzaXplLCByZWZsb3cgdGhlIGludGVuc2l0eSBpbnNldCB0byBpdHMgKGZpeGVkKSBwYW5lbCBzaXplXG4gICAgLy8gb24gdGhlIG5leHQgZnJhbWUsIG9uY2UgbGF5b3V0IGhhcyBzZXR0bGVkLiBXaXRob3V0IHRoaXMgdGhlIGluc2V0IGNhbiBiZVxuICAgIC8vIGxlZnQgYXQgYSBzdGFsZS96ZXJvIHNpemUgYnkgYSBtaWQtcmVmbG93IHJlc2l6ZSBhbmQgc3RvcCBzaG93aW5nLlxuICAgIHRoaXMucHJvZmlsZVJlc2l6ZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmhhc1Byb2ZpbGVzKSByZXR1cm47XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5yZW5kZXJJbnRlbnNpdHlJbnNldCgpKTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnByb2ZpbGVSZXNpemVMaXN0ZW5lcik7XG4gIH1cblxuICBvblByb2ZpbGVQYW5lbERyYWdTdGFydChlOiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5wcm9maWxlUGFuZWxEcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy5wcm9maWxlUGFuZWxTdGFydCA9IHtcbiAgICAgIG14OiBlLmNsaWVudFgsXG4gICAgICBteTogZS5jbGllbnRZLFxuICAgICAgeDogdGhpcy5wcm9maWxlUGFuZWxQb3MueCxcbiAgICAgIHk6IHRoaXMucHJvZmlsZVBhbmVsUG9zLnksXG4gICAgfTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKiogR3JhYiB0aGUgdG9vbGJhciBoYW5kbGU6IGRldGFjaCBpdCBpbnRvIGEgZmxvYXRpbmcgd2luZG93IChpZiBzdGlsbCBkb2NrZWQpXG4gICAqICBhbmQgc3RhcnQgZHJhZ2dpbmcuICovXG4gIG9uVG9vbGJhckRyYWdTdGFydChlOiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnRvb2xiYXJGbG9hdGluZykge1xuICAgICAgdGhpcy50b29sYmFyRmxvYXRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy50b29sYmFyUG9zID0geyB4OiA4LCB5OiA4IH07XG4gICAgfVxuICAgIHRoaXMudG9vbGJhckRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnRvb2xiYXJTdGFydCA9IHtcbiAgICAgIG14OiBlLmNsaWVudFgsXG4gICAgICBteTogZS5jbGllbnRZLFxuICAgICAgeDogdGhpcy50b29sYmFyUG9zLngsXG4gICAgICB5OiB0aGlzLnRvb2xiYXJQb3MueSxcbiAgICB9O1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8qKiBTbmFwIHRoZSBmbG9hdGluZyB0b29sYmFyIGJhY2sgdG8gaXRzIGRvY2tlZCBwb3NpdGlvbiBhY3Jvc3MgdGhlIHRvcC4gKi9cbiAgZG9ja1Rvb2xiYXIoKSB7XG4gICAgdGhpcy50b29sYmFyRmxvYXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIGludGVuc2l0eSBpbnNldCBjaGFydCBmcm9tIHRoZSBsYXRlc3QgcHJvZmlsZSBkYXRhLiBUaGUgYWN0dWFsXG4gICAqICBjaGFydGluZyBpcyBvd25lZCBieSB0aGUgdmlzdWFsaXplciBzZXJ2aWNlIOKAlCB0aGUgY29tcG9uZW50IGp1c3QgZGVjaWRlc1xuICAgKiAgd2hlbiAocHJvZmlsZSBtb2RlICsgYSBmcmVzaCBwcm9maWxlKS4gKi9cbiAgcHJpdmF0ZSByZW5kZXJJbnRlbnNpdHlJbnNldCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzUHJvZmlsZXMpIHJldHVybjtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlbmRlckludGVuc2l0eUluc2V0KHRoaXMuaW50ZW5zaXR5SW5zZXREaXYsIHRoaXMubGF0ZXN0UHJvZmlsZXMpO1xuICB9XG5cbiAgLyoqIFRvb2xiYXIgXCJJbnRlbnNpdHlcIiBncm91cDogYWRkIGFub3RoZXIgbGluZSBST0kgKG5leHQgYnJpZ2h0IGNvbG91cikuICovXG4gIGFzeW5jIGFkZFByb2ZpbGVMaW5lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFBhcmsgdGhlIGZsb2F0aW5nIGluc2V0IG5lYXIgdGhlIHBsb3QncyB0b3AtcmlnaHQgd2hlbiB0aGUgZmlyc3QgbGluZSBpc1xuICAgIC8vIGFkZGVkIChpdCdzIHBvc2l0aW9uOmZpeGVkLCBzbyB1c2Ugdmlld3BvcnQgY29vcmRzIGZyb20gdGhlIHBsb3QgcmVjdCkuXG4gICAgaWYgKCF0aGlzLmhhc1Byb2ZpbGVzKSB7XG4gICAgICBjb25zdCByZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2TmFtZSk/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5wcm9maWxlUGFuZWxQb3MgPSByZWN0XG4gICAgICAgID8geyB4OiBNYXRoLm1heCgxMCwgcmVjdC5yaWdodCAtIDMwMCksIHk6IHJlY3QudG9wICsgMTAgfVxuICAgICAgICA6IHsgeDogMjAsIHk6IDcwIH07XG4gICAgfVxuICAgIC8vIEltYWdlIChPU0QpIG1vZGU6IFBsb3RseSBuZXZlciByZW5kZXJlZCwgc28gaXQgaGFzIG5vIHBpeGVsIGNhY2hlIC8gZXh0ZW50LlxuICAgIC8vIExvYWQgdGhlIGN1cnJlbnQgc2xpY2UncyBmcmFtZXMgZm9yIHNhbXBsaW5nICsgbGluZSBwbGFjZW1lbnQgZmlyc3QuXG4gICAgaWYgKHRoaXMuaXNJbWFnZVZpZXcgJiYgdGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIGF3YWl0IHRoaXMucGxvdFNlcnZpY2UuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcodGhpcy5pbWFnZUluZm8sIHRoaXMuekluZGV4KTtcbiAgICB9XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5wbG90U2VydmljZS5nZXRJbnRlbnNpdHlDb250cm9scygpPy5hZGRQcm9maWxlTGluZSgpO1xuICAgIC8vIEF1dG8tc2VsZWN0IHRoZSBuZXcgbGluZSBvbiB0aGUgYWN0aXZlIGJhY2tlbmQgKFBsb3RseSBoYW5kbGVzIC8gT1NEXG4gICAgLy8gaGlnaGxpZ2h0KSBzbyBpdCdzIHJlYWR5IHRvIG1vdmUgb3IgZGVsZXRlIGltbWVkaWF0ZWx5LlxuICAgIGlmIChyZWdpb24pIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2VsZWN0UmVnaW9uKHJlZ2lvbik7XG4gICAgICAvLyBPU0Qgb25seSBkcmF3cyBhIHNlbGVjdGVkIHJlZ2lvbidzIGhhbmRsZXMgaW4gYW4gZWRpdCBtb2RlLCBzbyBhIGxpbmUgaW5cbiAgICAgIC8vICdub25lJyBtb2RlIGxvb2tzIHVuc2VsZWN0ZWQuIFN3aXRjaCB0byAnc2VsZWN0JyBzbyB0aGUgbmV3IGxpbmUgc2hvd3NcbiAgICAgIC8vIGl0cyBlbmRwb2ludCBoYW5kbGVzIGFuZCBjYW4gYmUgZHJhZ2dlZC9kZWxldGVkIHJpZ2h0IGF3YXkuXG4gICAgICBpZiAodGhpcy5pc0ltYWdlVmlldyAmJiB0aGlzLmFjdGl2ZURyYWdNb2RlICE9PSAnc2VsZWN0Jykge1xuICAgICAgICB0aGlzLnRvZ2dsZURyYWdNb2RlKCdzZWxlY3QnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBMZWF2ZSB0aGUgbGl2ZSBzZXQgc28gdGhlIG5leHQtb2xkZXN0IHZpc3VhbGl6ZXIgcGlja3MgdXAgdGhlIG91dGxldHMuXG4gICAgVmlzdWFsaXplckNvbXBvbmVudC5saXZlSW5zdGFuY2VzLmRlbGV0ZSh0aGlzKTtcbiAgICB0aGlzLnNjcnViYmVyLmNhbmNlbCgpO1xuICAgIHRoaXMuc2FtUG9pbnRTdWIudW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmtleWRvd25MaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLndoZWVsTGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMud2hlZWxMaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5wcm9maWxlRHJhZ01vdmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2ZpbGVEcmFnVXBMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnByb2ZpbGVEcmFnVXBMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2ZpbGVSZXNpemVMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucHJvZmlsZVJlc2l6ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW50ZW5zaXR5UHJvZmlsZVN1Yikge1xuICAgICAgdGhpcy5pbnRlbnNpdHlQcm9maWxlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdwb3J0Q2hhbmdlU3ViKSB7XG4gICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMudW5zdWIubmV4dCgpO1xuICAgIHRoaXMudW5zdWIuY29tcGxldGUoKTtcbiAgICBpZiAodGhpcy5wcmV2aWV3U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnByZXZpZXdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGxvdFdpZHRoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnBsb3RXaWR0aFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZUxvYWRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuaW1hZ2VMb2FkaW5nU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzWm9vbVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5pc1pvb21TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXV0b3NjYWxlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmF1dG9zY2FsZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgaGFzUmVnaW9ucygpOiBib29sZWFuIHtcbiAgICAvLyBVc2UgdGhlIGNvbnRyYWN0J3MgZnJhbWV3b3JrLW5ldXRyYWwgcmVnaW9uIGFjY2Vzc29yLCBub3QgdGhlIHJhd1xuICAgIC8vIFBsb3RseS1zaGFwZWQgZ2V0U2hhcGVzKCkg4oCUIHRoZSBjb21wb25lbnQgb25seSBuZWVkcyB0byBrbm93IHdoZXRoZXIgYW55XG4gICAgLy8gcmVnaW9uIGV4aXN0cywgYW5kIG11c3Qgbm90IGRlcGVuZCBvbiBhIGJhY2tlbmQncyB3aXJlIGZvcm1hdC5cbiAgICByZXR1cm4gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gbWFpbkZhY2FkZS5jb25maWdSZXF1ZXN0KCkgLSBETyBOT1QgREVMRVRFXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdIHtcbiAgICByZXR1cm4gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25Qb2x5Z29ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgY29sb3Igc2NhbGUgdHlwZTogY2FsbGVkIGJ5IHRoZSBjb2xvciBzY2FsZSBzZWxlY3QgYnV0dG9uXG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgdG9nZ2xlUmV2ZXJzZVNjYWxlKCkge1xuICAgIHRoaXMucmV2ZXJzZXNjYWxlID0gIXRoaXMucmV2ZXJzZXNjYWxlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UmV2ZXJzZVNjYWxlKHRoaXMucmV2ZXJzZXNjYWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYSBjb2xvciBtYXA6IGNhbGxlZCBieSB0aGUgY29sb3IgbWFwIGRyb3Bkb3duIGJ1dHRvblxuICAgKiBAcGFyYW0gY29sb3JtYXBOb2RlXG4gICAqL1xuICBzZWxlY3RDb2xvcm1hcChjb2xvcm1hcE5vZGU6IFRyZWVOb2RlKSB7XG4gICAgaWYgKCFjb2xvcm1hcE5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0Q29sb3JtYXAoY29sb3JtYXBOb2RlKTtcbiAgICB9XG4gIH1cblxuICAvKiogT3BlbiB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gZGlhbG9nICh0b29sYmFyIGJ1dHRvbikuICovXG4gIG9wZW5DaGFubmVsSGlzdG9ncmFtKCkge1xuICAgIHRoaXMuc2hvd0NoYW5uZWxIaXN0b2dyYW0gPSB0cnVlO1xuICB9XG5cbiAgLyoqIE9wZW4gdGhlIFJlZ2lvbiBFZGl0b3IgZGlhbG9nICh0b29sYmFyIGJ1dHRvbikuIFRoZSBlZGl0b3Igc3RheXMgbGlua2VkIHRvXG4gICAqICB0aGlzIHBsb3R0aW5nIGluc3RhbmNlIHRocm91Z2ggdGhlIHJvb3QgUmVnaW9uU3RvcmUgc2luZ2xldG9uLCBzbyBpdCB3b3Jrc1xuICAgKiAgdGhlIHNhbWUgYXMgdGhlIGZvcm1lciByaWdodC1wYW5lbCBSZWdpb25zIHRhYi4gKi9cbiAgb3BlblJlZ2lvbkVkaXRvcigpIHtcbiAgICAvLyBTaXplIHRoZSBkaWFsb2cgdG8gbWF0Y2ggdGhlIGhvc3QncyBjb25maWd1cmVkIGVsZW1lbnQgKGUuZy4gdGhlIGFwcCdzXG4gICAgLy8gcmlnaHQgcGFuZWwpIGF0IG9wZW4gdGltZS4gTWVhc3VyZWQgb25jZSDigJQgaXQgaW50ZW50aW9uYWxseSBkb2VzIG5vdFxuICAgIC8vIHRyYWNrIGxhdGVyIGJyb3dzZXIvc3BsaXQgcmVzaXplcy4gRmFsbHMgYmFjayB0byBhIHF1YXJ0ZXIgb2YgdGhlIHBhZ2VcbiAgICAvLyB3aGVuIG5vIHNlbGVjdG9yIGlzIGNvbmZpZ3VyZWQgb3IgdGhlIGVsZW1lbnQgaXNuJ3QgcHJlc2VudC5cbiAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMudml6Q29uZmlnPy5yZWdpb25FZGl0b3JXaWR0aFNlbGVjdG9yO1xuICAgIGNvbnN0IHdpZHRoID0gc2VsZWN0b3JcbiAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oc2VsZWN0b3IpPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aFxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZWdpb25FZGl0b3JXaWR0aCA9IHdpZHRoICYmIHdpZHRoID4gMCA/IGAke01hdGgucm91bmQod2lkdGgpfXB4YCA6ICcyNXZ3JztcbiAgICB0aGlzLnNob3dSZWdpb25FZGl0b3IgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgc3RhY2svc2luZ2xlIGltYWdlIGRyb3Bkb3duIGJ1dHRvblxuICAgKiBAcGFyYW0gc2hvd3N0YWNrXG4gICAqL1xuICBzZWxlY3RTdGFja09wdGlvbihzZWxlY3RlZFN0YWNrT3B0aW9uOiBhbnkpIHtcbiAgICBjb25zdCBzaG93c3RhY2sgPSBzZWxlY3RlZFN0YWNrT3B0aW9uLnZhbCA9PT0gJ3RydWUnO1xuICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHNlbGVjdGVkU3RhY2tPcHRpb247XG4gICAgY29uc29sZS5sb2coJ3NlbGVjdGVkIHN0YWNrIG9wdGlvbicgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkU3RhY2tPcHRpb24pKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyA9IHNob3dzdGFjaztcbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyghc2hvd3N0YWNrKTtcbiAgICAvLyBTdGFjayBtb2RlIGlzIGFsd2F5cyBhIDJEIGhlYXRtYXAg4oCUIHJlc2V0IHN1cmZhY2UgbW9kZSBpZiBhY3RpdmVcbiAgICBpZiAoIXRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICB0aGlzLmlzSGVhdG1hcCA9IHRydWU7XG4gICAgICB0aGlzLnBsb3RUeXBlID0gUGxvdFR5cGUuSEVBVE1BUDtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9IFBsb3RUeXBlLkhFQVRNQVA7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKHRoaXMucGxvdFR5cGUpO1xuICAgIH1cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNob3dTdGFjayhzaG93c3RhY2spO1xuICB9XG5cbiAgdXBkYXRlWkluZGV4KHVybHM/OiBzdHJpbmdbXSkge1xuICAgIGlmICh0aGlzLnpJbmRleCA+IHRoaXMubWF4SW5kZXgpIHtcbiAgICAgIHRoaXMuekluZGV4ID0gdGhpcy5tYXhJbmRleDtcbiAgICB9XG4gICAgaWYgKHRoaXMuekluZGV4IDwgMCkge1xuICAgICAgdGhpcy56SW5kZXggPSAwO1xuICAgIH1cbiAgICBpZiAodXJscykge1xuICAgICAgaWYgKHRoaXMuekluZGV4ID4gdXJscz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5tYXhJbmRleCA9IHVybHMubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRaSW5kZXgodGhpcy56SW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpdmUgei1zbGljZSBzY3J1YiBmb3IgdGhlIEltYWdlIHZpZXc6IHRoZSByZW5kZXJlciBzd2FwcyB0aGUgZGlzcGxheWVkXG4gICAqIHNsaWNlIGluIHBsYWNlIChubyByZS1tb3VudCksIHNvIGRyYWdnaW5nIHRoZSBzbGlkZXIgc3RlcHMgdGhyb3VnaCB0aGVcbiAgICogc3RhY2sgdGhlIHNhbWUgd2F5IHRoZSBoZWF0bWFwIGZyYW1lIHNsaWRlciBkb2VzLlxuICAgKi9cbiAgb25aU2xpZGUoejogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHogPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuekluZGV4ID0gejtcbiAgICB0aGlzLnNjcnViYmVyLmNvbW1pdCh6KTtcbiAgICAvLyBLZWVwIHRoZSBpbnRlbnNpdHkgaW5zZXQgaW4gc3luYyB3aXRoIHRoZSBkaXNwbGF5ZWQgc2xpY2UgKEltYWdlL09TRCBtb2RlLFxuICAgIC8vIHdoZXJlIHRoZSBwcm9maWxlIHNhbXBsZXIgaXMgZmVkIGZyb20gdGhlIGxvYWRlZCBwcmV2aWV3IGZyYW1lcykuXG4gICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMgJiYgdGhpcy5pc0ltYWdlVmlldyAmJiB0aGlzLmltYWdlSW5mbykge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyh0aGlzLmltYWdlSW5mbywgeik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpdmUgKGRlYm91bmNlZCkgc2NydWIgd2hpbGUgZHJhZ2dpbmcgdGhlIEltYWdlLXZpZXcgei1zbGlkZXI6IHVwZGF0ZSB0aGVcbiAgICogc2xpY2UgYXMgdGhlIHVzZXIgZHJhZ3MsIGJ1dCBjb2FsZXNjZSByYXBpZCBjaGFuZ2VzIHNvIHdlIGRvbid0IGZpcmUgYVxuICAgKiBzbGljZSBzd2FwIG9uIGV2ZXJ5IHBpeGVsLiBUaGUgZmluYWwgdmFsdWUgYWxzbyBsYW5kcyB2aWEgb25aU2xpZGUgKG9uU2xpZGVFbmQpLlxuICAgKi9cbiAgb25aU2NydWIoejogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHogPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuekluZGV4ID0gejtcbiAgICB0aGlzLnNjcnViYmVyLnNjcnViKHopO1xuICB9XG5cbiAgLyoqXG4gICAqIEtleWJvYXJkIHN0YWNrIG5hdmlnYXRpb246IOKGkC/ihpIgc3RlcCB0aGUgei1zbGljZSBpbiB0aGUgSW1hZ2UgdmlldywgdGhlIHNhbWVcbiAgICogd2F5IHRoZSBzbGlkZXIgZG9lcy4gT25seSBhY3RpdmUgZm9yIGEgbG9hZGVkIHN0YWNrIGluIEltYWdlIHZpZXcsIGFuZFxuICAgKiBpZ25vcmVkIHdoaWxlIGEgZm9ybSBmaWVsZCBpcyBmb2N1c2VkIHNvIHR5cGluZyBpc24ndCBoaWphY2tlZC4gVXAvRG93biBhcmVcbiAgICogbGVmdCB0byBPcGVuU2VhZHJhZ29uIChwYW5uaW5nKS5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZS5rZXkgIT09ICdBcnJvd0xlZnQnICYmIGUua2V5ICE9PSAnQXJyb3dSaWdodCcpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuaW1hZ2VJbmZvPy5pc1N0YWNrIHx8ICF0aGlzLmlzSW1hZ2VWaWV3KSByZXR1cm47XG4gICAgY29uc3QgdCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAodCAmJiAoL14oSU5QVVR8VEVYVEFSRUF8U0VMRUNUKSQvLnRlc3QodC50YWdOYW1lKSB8fCB0LmlzQ29udGVudEVkaXRhYmxlKSkgcmV0dXJuO1xuICAgIC8vIFRoZSBzbGljZSBzbGlkZXIgaGFuZGxlcyBhcnJvd3MgbmF0aXZlbHkgd2hlbiBmb2N1c2VkIChhbHNvIGEgKzEgc3RlcCkg4oCUXG4gICAgLy8gc2tpcCBoZXJlIHNvIHdlIGRvbid0IGRvdWJsZS1zdGVwIGl0LlxuICAgIGlmICh0ICYmICh0LmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnc2xpZGVyJyB8fCB0LmNsb3Nlc3QoJy5wLXNsaWRlcicpKSkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnN0ZXBTbGljZShlLmtleSA9PT0gJ0Fycm93UmlnaHQnID8gMSA6IC0xKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIHRoZSBkaXNwbGF5ZWQgc2xpY2UgYnkgYGRlbHRhYCwgY2xhbXBlZCB0byB0aGUgc3RhY2sgYm91bmRzLiAqL1xuICBzdGVwU2xpY2UoZGVsdGE6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBNYXRoLm1pbih0aGlzLm1heEluZGV4LCBNYXRoLm1heCgwLCB0aGlzLnpJbmRleCArIGRlbHRhKSk7XG4gICAgaWYgKG5leHQgPT09IHRoaXMuekluZGV4KSByZXR1cm47XG4gICAgdGhpcy5vblpTbGlkZShuZXh0KTtcbiAgfVxuXG4gIHJlbG9hZEFuZFBsb3QoKSB7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcodHJ1ZSk7XG4gICAgLy8gUmUtZHJpdmUgdGhlIHJlbmRlciBwaXBlbGluZSBmcm9tIHRoZSBjdXJyZW50IGltYWdlIGluZm8gKHRoZSBzb3VyY2Ugb2ZcbiAgICAvLyB0cnV0aCwgd2l0aCByZWFsIHVybHMvZmlsZU5hbWUpLiBEb24ndCB1c2UgcGxvdFNlcnZpY2UucmVsb2FkQW5kUGxvdCgpOlxuICAgIC8vIHRoYXQgcmVidWlsZHMgdGhlIGluZm8gZnJvbSB0aGUgcmVuZGVyZXIncyBpbnRlcm5hbCBzdGF0ZSwgd2hpY2ggY2FuIGJlXG4gICAgLy8gc3RhbGUgKGUuZy4gYWZ0ZXIgc3dpdGNoaW5nIHBsb3QgdHlwZSBJbWFnZSAtPiBIZWF0bWFwKSBhbmQgcmUtZW1pdFxuICAgIC8vIGVtcHR5L29sZCB1cmxzLCBmYWlsaW5nIHRvIGhhbmQgdGhlIGRpdiBvdmVyIHRvIHRoZSBuZXcgcmVuZGVyZXIuXG4gICAgaWYgKHRoaXMuaW1hZ2VJbmZvKSB7XG4gICAgICB0aGlzLnN0YXRlLnNldEltYWdlSW5mbyh0aGlzLmltYWdlSW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVsb2FkQW5kUGxvdCgpO1xuICAgIH1cbiAgfVxuICBjYW5jZWxMb2FkaW5nKCkge1xuICAgIC8vIFN0b3AgYW55IGluLWZsaWdodCBmcmFtZSBzdHJlYW1pbmcgKG5hcGFyaS1qcyB2b2x1bWUvc3VyZmFjZSBwcmVsb2FkKSBzbyB0aGUgZmV0Y2ggbG9vcHNcbiAgICAvLyBhY3R1YWxseSBhYm9ydCDigJQgY2xlYXJpbmcgdGhlIGZsYWcgYWxvbmUgb25seSByb3V0ZWQgdG8gUGxvdGx5IGFuZCBsZWZ0IG5hcGFyaSBmZXRjaGluZy5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmNhbmNlbExvYWRpbmc/LigpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pbWdMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpJbmRleCh0aGlzLnpJbmRleCk7XG4gICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTdGFja0xvYWRpbmcoZmFsc2UpO1xuICB9XG5cbiAgZG93bmxvYWRJbWFnZSgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmRvd25sb2FkSW1hZ2UoKTtcbiAgfVxuXG4gIGF1dG9zY2FsZUltYWdlKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuYXV0b3NjYWxlKCk7XG4gIH1cblxuICAvKiogVG9vbGJhciBwaXhlbC9zbW9vdGggdG9nZ2xlOiBmbGlwIHNtb290aGluZyBhbmQgYXBwbHkgdG8gdGhlIGFjdGl2ZSBiYWNrZW5kLiAqL1xuICBvblRvZ2dsZUltYWdlU21vb3RoaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gIXRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkKTtcbiAgfVxuXG4gIHJlc2V0QXhlcygpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0QXhlcygpO1xuICB9XG5cbiAgdG9nZ2xlRHJhZ01vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgLy8gVG9nZ2xlIG9mZiBpZiB0aGUgc2FtZSBtb2RlIGlzIHJlLXNlbGVjdGVkLlxuICAgIHRoaXMuYWN0aXZlRHJhZ01vZGUgPSB0aGlzLmFjdGl2ZURyYWdNb2RlID09PSBtb2RlID8gbnVsbCA6IG1vZGU7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5hY3RpdmVEcmFnTW9kZTtcbiAgICAvLyBSZWNvcmQgdGhlIGFybWVkIHRvb2wgaW4gdGhlIHNoYXJlZCBzZXNzaW9uIHN0b3JlLlxuICAgIHRoaXMuc2Vzc2lvbi5zZXRBY3RpdmVUb29sKGFjdGl2ZSk7XG5cbiAgICAvLyBSZWdpb24gZHJhdy9zZWxlY3QgcnVuIHRocm91Z2ggdGhlIHJlbmRlcmVyJ3MgcmVnaW9uIG92ZXJsYXkuXG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldFJlZ2lvbk92ZXJsYXkoKVxuICAgICAgPy5zZXRNb2RlKHRoaXMuaXNSZWdpb25Nb2RlKGFjdGl2ZSkgPyAoYWN0aXZlIGFzIFJlZ2lvblRvb2xNb2RlKSA6ICdub25lJyk7XG5cbiAgICAvLyBWaWV3cG9ydCBkcmFnIG1vZGVzIChwYW4vYm94LXpvb20pLiBSZWdpb24gbW9kZXMgb3duIHRoZSBkcmFnIG1vZGUgdmlhXG4gICAgLy8gdGhlIG92ZXJsYXksIHNvIGRvbid0IGFsc28gc2V0IG9uZSBoZXJlLlxuICAgIGlmICghdGhpcy5pc1JlZ2lvbk1vZGUoYWN0aXZlKSkge1xuICAgICAgY29uc3Qgdmlld3BvcnREcmFnID0gYWN0aXZlID09PSAncGFuJyB8fCBhY3RpdmUgPT09ICd6b29tJztcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0RHJhZ01vZGUodmlld3BvcnREcmFnID8gYWN0aXZlIDogZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIE9uLWNhbnZhcyB0b29sIG92ZXJsYXlzLlxuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0Wm9vbVRvQm94TW9kZShhY3RpdmUgPT09ICd6b29tVG9Cb3gnKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFdhbmRNb2RlKGFjdGl2ZSA9PT0gJ3dhbmQnLCB7IHNlbnNpdGl2aXR5OiB0aGlzLndhbmRTZW5zaXRpdml0eSB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldEJydXNoTW9kZShhY3RpdmUgPT09ICdicnVzaCcsIHsgc2l6ZTogdGhpcy5icnVzaFNpemUgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTYW1Qb2ludE1vZGUoYWN0aXZlID09PSAnc2FtUG9pbnQnKTtcbiAgICAvLyBMZWF2aW5nIHBvaW50IG1vZGUgZGlzbWlzc2VzIGFueSBsaW5nZXJpbmcgc3RhdHVzIHRvYXN0LlxuICAgIGlmIChhY3RpdmUgIT09ICdzYW1Qb2ludCcpIHRoaXMuaGlkZVNhbVRvYXN0KCk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZSA9PT0gJ2VyYXNlVmVydGV4Jyk7XG4gICAgaWYgKGFjdGl2ZSA9PT0gJ2VyYXNlVmVydGV4Jykge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRWZXJ0ZXhFcmFzZXJSYWRpdXModGhpcy52ZXJ0ZXhFcmFzZXJSYWRpdXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWdpb24gZHJhdy9zZWxlY3QvZWRpdCBtb2RlcyByb3V0ZWQgdGhyb3VnaCB0aGUgcmVnaW9uIG92ZXJsYXkuIFRoZVxuICAgKiAgVGhlIHZlcnRleCB0b29scyAoZHJhd3BvbHlnb24vYWRkcG9pbnQvZGVsZXRlcG9pbnQvbW92ZSkgYXJlXG4gICAqICBoYW5kbGVkIGJ5IHRoZSBPcGVuU2VhZHJhZ29uIG92ZXJsYXk7IFBsb3RseSdzIG92ZXJsYXkgbWFwcyB0aGVtIHRvIG5vLW9wLiAqL1xuICBwcml2YXRlIGlzUmVnaW9uTW9kZShtb2RlOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIG1vZGUgPT09ICdkcmF3cmVjdCcgfHxcbiAgICAgIG1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCcgfHxcbiAgICAgIG1vZGUgPT09ICdkcmF3b3BlbnBhdGgnIHx8XG4gICAgICBtb2RlID09PSAnc2VsZWN0JyB8fFxuICAgICAgbW9kZSA9PT0gJ2RyYXdwb2x5Z29uJyB8fFxuICAgICAgbW9kZSA9PT0gJ2FkZHBvaW50JyB8fFxuICAgICAgbW9kZSA9PT0gJ2RlbGV0ZXBvaW50JyB8fFxuICAgICAgbW9kZSA9PT0gJ21vdmUnXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBMaXZlLXVwZGF0ZSB0aGUgaXNvc3VyZmFjZSBhcyB0aGUgcmFuZ2Ugc2xpZGVyIG1vdmVzLiBUaGUgY29udHJvbCBpcyBvbmx5XG4gICAqICBhdmFpbGFibGUgd2hlbiB0aGUgYWN0aXZlIGJhY2tlbmQgcmVuZGVycyBpc29zdXJmYWNlcyAoSVNPU1VSRkFDRSBtb2RlKS4gKi9cbiAgb25Jc29SYW5nZUNoYW5nZSh2YWx1ZXM6IG51bWJlcltdIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF2YWx1ZXMgfHwgdmFsdWVzLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICB0aGlzLmlzb1JhbmdlID0gdmFsdWVzO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk/LnNldElzb1JhbmdlKHZhbHVlc1swXSwgdmFsdWVzWzFdKTtcbiAgfVxuXG4gIG9uV2FuZFNlbnNpdGl2aXR5Q2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMud2FuZFNlbnNpdGl2aXR5ID0gdmFsdWU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRXYW5kT3B0aW9ucyh7IHNlbnNpdGl2aXR5OiB2YWx1ZSB9KTtcbiAgfVxuXG4gIG9uQnJ1c2hTaXplQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMuYnJ1c2hTaXplID0gdmFsdWU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRCcnVzaE9wdGlvbnMoeyBzaXplOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIG9uVmVydGV4RXJhc2VyUmFkaXVzQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMudmVydGV4RXJhc2VyUmFkaXVzID0gdmFsdWU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRWZXJ0ZXhFcmFzZXJSYWRpdXModmFsdWUpO1xuICB9XG5cbiAgem9vbUluKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuem9vbUluKCk7XG4gIH1cblxuICB6b29tT3V0KCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuem9vbU91dCgpO1xuICB9XG5cbiAgZGVsZXRlUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZGVsZXRlQWN0aXZlU2hhcGUoKTtcbiAgfVxuXG4gIC8qKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiBVcCB0byAxMCBzdGVwcyBiYWNrLiAqL1xuICB1bmRvUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UudW5kbygpO1xuICB9XG5cbiAgLyoqIFJlZG8gdGhlIG1vc3QgcmVjZW50bHkgdW5kb25lIHJlZ2lvbiBhY3Rpb24gKGppdC11aSM4NSkuICovXG4gIHJlZG9SZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5yZWRvKCk7XG4gIH1cblxuICAvLyDilIDilIAgUmVnaW9uIHNldC1vcGVyYXRpb25zIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoaml0LXVpIzg1KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhlIGN1cnJlbnRseS1zZWxlY3RlZCByZWdpb25zIChsaXZlIHN0b3JlIGluc3RhbmNlcykuICovXG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJbmRpY2VzXG4gICAgICAubWFwKChpKSA9PiBhbGxbaV0pXG4gICAgICAuZmlsdGVyKChyKTogciBpcyBSZWdpb24gPT4gISFyKTtcbiAgfVxuXG4gIC8qKiBSZWdpb25zIGVsaWdpYmxlIGZvciBzZXQtb3BzOiBjbG9zZWQgYXJlYXMgKHJlY3QgLyBjbG9zZWQgcG9seWdvbiAvXG4gICAqICBtdWx0aS1wb2x5Z29uKSwgZXhjbHVkaW5nIGludGVuc2l0eS1wcm9maWxlIGxpbmVzLiAqL1xuICBwcml2YXRlIG9wRWxpZ2libGUocmVnaW9uczogUmVnaW9uW10pOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHJlZ2lvbnMuZmlsdGVyKChyKSA9PiByLmtpbmQgIT09ICdwcm9maWxlJyAmJiAoXG4gICAgICByLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fFxuICAgICAgci5ib3VuZHMgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24gfHxcbiAgICAgIChyLmJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24gJiYgci5ib3VuZHMuY2xvc2VkICE9PSBmYWxzZSlcbiAgICApKTtcbiAgfVxuXG4gIC8qKiBJbWFnZSBwaXhlbCBkaW1lbnNpb25zIGZvciB0aGUgcmFzdGVyIG9wczsgZmFsbHMgYmFjayB0byB0aGUgc2VsZWN0aW9uJ3NcbiAgICogIGV4dGVudCB3aGVuIHRoZSBpbWFnZSBzaXplIGlzbid0IGtub3duIChrZWVwcyBjbGFtcGluZyBzYW5lKS4gKi9cbiAgcHJpdmF0ZSBvcEltYWdlRGltcyhyZWdpb25zOiBSZWdpb25bXSk6IHsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB7XG4gICAgbGV0IFt3LCBoXSA9IHRoaXMuaW1hZ2VJbmZvPy50cnVlSW1hZ2VTaXplID8/IFswLCAwXTtcbiAgICBpZiAoISh3ID4gMCkgfHwgIShoID4gMCkpIHtcbiAgICAgIGxldCBtYXhYID0gMCwgbWF4WSA9IDA7XG4gICAgICBjb25zdCBzY2FuID0gKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeCBvZiB4cykgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgICAgICBmb3IgKGNvbnN0IHkgb2YgeXMpIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTtcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgICAgICBjb25zdCBiID0gci5ib3VuZHM7XG4gICAgICAgIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSBzY2FuKFtiLnggKyBiLndpZHRoXSwgW2IueSArIGIuaGVpZ2h0XSk7XG4gICAgICAgIGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uKSBzY2FuKGIueHBvaW50cywgYi55cG9pbnRzKTtcbiAgICAgICAgZWxzZSBpZiAoYiBpbnN0YW5jZW9mIE11bHRpUG9seWdvbikgZm9yIChjb25zdCBwIG9mIGIucG9seWdvbnMpIHNjYW4ocC54cG9pbnRzLCBwLnlwb2ludHMpO1xuICAgICAgfVxuICAgICAgdyA9IE1hdGgubWF4KHcsIE1hdGguY2VpbChtYXhYKSArIDIpO1xuICAgICAgaCA9IE1hdGgubWF4KGgsIE1hdGguY2VpbChtYXhZKSArIDIpO1xuICAgIH1cbiAgICByZXR1cm4geyB3LCBoIH07XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIOKJpTIgZWxpZ2libGUgcmVnaW9ucyBhcmUgc2VsZWN0ZWQgKE1lcmdlIGF2YWlsYWJsZSkuICovXG4gIGdldCBjYW5NZXJnZVJlZ2lvbnMoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpLmxlbmd0aCA+PSAyOyB9XG4gIC8qKiBUcnVlIHdoZW4gYW55IHNlbGVjdGVkIHJlZ2lvbiBpcyBtdWx0aS1wYXJ0IChVbmdyb3VwIGF2YWlsYWJsZSkuICovXG4gIGdldCBjYW5Vbmdyb3VwUmVnaW9ucygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSZWdpb25zLnNvbWUoKHIpID0+IHRoaXMucmVnaW9uT3BzLmNhblVuZ3JvdXAocikpOyB9XG4gIC8qKiBUcnVlIHdoZW4g4omlMSBlbGlnaWJsZSByZWdpb24gaXMgc2VsZWN0ZWQgKEludmVyc2UgLyBTaW1wbGlmeSBhdmFpbGFibGUpLiAqL1xuICBnZXQgaGFzRWxpZ2libGVTZWxlY3Rpb24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpLmxlbmd0aCA+PSAxOyB9XG5cbiAgLyoqIFNlbGVjdCBldmVyeSByZWdpb24gb24gdGhlIGltYWdlIChleGNsdWRlcyBpbnRlbnNpdHktcHJvZmlsZSBsaW5lcykuICovXG4gIHNlbGVjdEFsbFJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBhbGwuZm9yRWFjaCgociwgaSkgPT4geyBpZiAoci5raW5kICE9PSAncHJvZmlsZScpIGluZGljZXMucHVzaChpKTsgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzKTtcbiAgfVxuXG4gIC8qKiBNZXJnZSB0aGUgc2VsZWN0ZWQgcmVnaW9ucyBpbnRvIGEgc2luZ2xlIChwb3NzaWJseSBtdWx0aS1wYXJ0KSByZWdpb24uICovXG4gIG1lcmdlUmVnaW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpO1xuICAgIGlmIChzZWwubGVuZ3RoIDwgMikgcmV0dXJuO1xuICAgIGNvbnN0IHsgdywgaCB9ID0gdGhpcy5vcEltYWdlRGltcyhzZWwpO1xuICAgIGNvbnN0IG1lcmdlZCA9IHRoaXMucmVnaW9uT3BzLm1lcmdlKHNlbCwgdywgaCk7XG4gICAgaWYgKG1lcmdlZCkgdGhpcy5yZXBsYWNlUmVnaW9ucyhzZWwsIFttZXJnZWRdKTtcbiAgfVxuXG4gIC8qKiBTcGxpdCBlYWNoIHNlbGVjdGVkIG11bHRpLXBhcnQgcmVnaW9uIGludG8gb25lIHJlZ2lvbiBwZXIgcGFydC4gKi9cbiAgdW5ncm91cFJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbnMuZmlsdGVyKChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5jYW5Vbmdyb3VwKHIpKTtcbiAgICBpZiAoc2VsLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlc3VsdHM6IFJlZ2lvbltdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHNlbCkgcmVzdWx0cy5wdXNoKC4uLnRoaXMucmVnaW9uT3BzLnVuZ3JvdXAocikpO1xuICAgIHRoaXMucmVwbGFjZVJlZ2lvbnMoc2VsLCByZXN1bHRzKTtcbiAgfVxuXG4gIC8qKiBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCBpdHMgaW52ZXJzZSBpbnNpZGUgdGhlIGltYWdlIHJlY3RhbmdsZS4gKi9cbiAgaW52ZXJzZVJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKTtcbiAgICBpZiAoc2VsLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgdywgaCB9ID0gdGhpcy5vcEltYWdlRGltcyhzZWwpO1xuICAgIGNvbnN0IGludiA9IHRoaXMucmVnaW9uT3BzLmludmVyc2Uoc2VsLCB3LCBoKTtcbiAgICBpZiAoIWludikge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICBrZXk6IHRoaXMucmVzdWx0VG9hc3RLZXksXG4gICAgICAgIHNldmVyaXR5OiAnd2FybicsIHN1bW1hcnk6ICdJbnZlcnNlJyxcbiAgICAgICAgZGV0YWlsOiAnTm90aGluZyB0byBpbnZlcnQg4oCUIHNlbGVjdCBvbmUgb3IgbW9yZSBjbG9zZWQgcmVnaW9ucyBmaXJzdC4nLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVwbGFjZVJlZ2lvbnMoc2VsLCBbaW52XSk7XG4gIH1cblxuICAvKiogRG91Z2xhc+KAk1BldWNrZXIgc2ltcGxpZnkgZWFjaCBzZWxlY3RlZCByZWdpb24gYnkgYHRocmVzaG9sZFB4YC4gKi9cbiAgc2ltcGxpZnlSZWdpb25zKHRocmVzaG9sZFB4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpO1xuICAgIGlmIChzZWwubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5yZXBsYWNlUmVnaW9ucyhzZWwsIHNlbC5tYXAoKHIpID0+IHRoaXMucmVnaW9uT3BzLnNpbXBsaWZ5KHIsIHRocmVzaG9sZFB4KSkpO1xuICAgIHRoaXMuZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gZmFsc2U7XG4gIH1cblxuICAvKiogT3BlbiB0aGUgY3VzdG9tLXRocmVzaG9sZCBzaW1wbGlmeSBkaWFsb2cuICovXG4gIG9wZW5TaW1wbGlmeURpYWxvZygpOiB2b2lkIHsgdGhpcy5kaXNwbGF5U2ltcGxpZnlEaWFsb2cgPSB0cnVlOyB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCBhIHNldC1vcDogZHJvcCB0aGUgYHJlbW92ZWAgcmVnaW9ucywgYXBwZW5kIGBhZGRgLCBhbmQgc2VsZWN0IHRoZVxuICAgKiByZXN1bHRzLiBHb2VzIHRocm91Z2ggc2V0UmVnaW9ucyBzbyBpdCdzIHVuZG8tdHJhY2tlZCBhbmQgcmUtcmVuZGVyZWQ7XG4gICAqIHByb2ZpbGUgbGluZXMgYW5kIHVuc2VsZWN0ZWQgcmVnaW9ucyBhcmUgcHJlc2VydmVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZXBsYWNlUmVnaW9ucyhyZW1vdmU6IFJlZ2lvbltdLCBhZGQ6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgaWYgKGFkZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByZW1vdmVTZXQgPSBuZXcgU2V0KHJlbW92ZSk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gIXJlbW92ZVNldC5oYXMocikpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UmVnaW9ucyhbLi4ua2VwdCwgLi4uYWRkXSk7IC8vIG1pbnRzIGlkcyBvbiBgYWRkYCwgcmVjb3JkcyB1bmRvXG4gICAgY29uc3Qgc3RvcmVkID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3Qgc2VsID0gYWRkLm1hcCgocikgPT4gc3RvcmVkLmluZGV4T2YocikpLmZpbHRlcigoaSkgPT4gaSA+PSAwKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKHNlbCk7XG4gIH1cblxuICAvKiogQm94LXByb21wdGVkIFNBTSBzZWdtZW50YXRpb24gb2YgdGhlIGRyYXduIHJlY3RhbmdsZXMgKGppdC11aSM5MCkuIEEgc3RpY2t5XG4gICAqICBgc2FtYCB0b2FzdCBzaG93cyBsaXZlIHN0YXR1cyArIGEgZG93bmxvYWQgcHJvZ3Jlc3MgYmFyIChmaXJzdCBydW4gcHVsbHMgdGhlXG4gICAqICBlbmNvZGVyLCB+MTcwIE1CKTsgaXQgc3RheXMgb3BlbiB1bnRpbCB0aGUgcnVuIGZpbmlzaGVzIChiYXIgaGl0cyAxMDAlKS4gKi9cbiAgYXN5bmMgc2VnbWVudFJlZ2lvbnMoKSB7XG4gICAgYXdhaXQgdGhpcy5ydW5TZWdtZW50V2l0aFRvYXN0KCdTQU0nLCB0aGlzLnNhbVRvb2wsICgpID0+IHRoaXMucGxvdFNlcnZpY2Uuc2VnbWVudFJlY3RhbmdsZXMoKSk7XG4gIH1cblxuICAvKiogQXV0by1zZWdtZW50IGNlbGxzIGluc2lkZSBlYWNoIGRyYXduIHJlY3RhbmdsZSB3aXRoIGNlbGxwb3NlLVNBTSwgY2xpZW50LXNpZGVcbiAgICogIChqaXQtdWkjOTApLiBFYWNoIGJveCBpcyBjcm9wcGVkIChicm93c2VyIHNsaWRlLWNyb3ApIHRoZW4gcnVuIHRocm91Z2ggdGhlXG4gICAqICBjZWxscG9zZS1qcyBtb2RlbDsgdGhlIHNhbWUgc3RpY2t5IGBzYW1gIHRvYXN0ICsgcHJvZ3Jlc3MgYmFyIGlzIHJldXNlZC4gKi9cbiAgYXN5bmMgc2VnbWVudENlbGxwb3NlKCkge1xuICAgIGF3YWl0IHRoaXMucnVuU2VnbWVudFdpdGhUb2FzdCgnQ2VsbHBvc2UnLCB0aGlzLmNlbGxTZWdtZW50VG9vbCwgKCkgPT5cbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpLFxuICAgICk7XG4gIH1cblxuICAvKiogU2hhcmVkIGRyaXZlciBmb3IgdGhlIGJveC1wcm9tcHQgc2VnbWVudCB0b29sczogd2lyZXMgdGhlIHRvb2wncyBzdGF0dXMgK1xuICAgKiAgZG93bmxvYWQgcHJvZ3Jlc3MgaW50byB0aGUgc3RpY2t5IGBzYW1gIHRvYXN0LCBydW5zIGBvcGAsIGFuZCByZXBvcnRzIHRoZVxuICAgKiAgcmVnaW9uIGNvdW50LiBLZWVwcyB0aGUgdG9hc3Qgb3BlbiB1bnRpbCB0aGUgcnVuIHNldHRsZXMgKGJhciBoaXRzIDEwMCUpLiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blNlZ21lbnRXaXRoVG9hc3QoXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICB0b29sOiB7IHN0YXR1cyQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+OyBwcm9ncmVzcyQ6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+IH0sXG4gICAgb3A6ICgpID0+IFByb21pc2U8bnVtYmVyPixcbiAgKSB7XG4gICAgdGhpcy5zYW1TdGF0dXMgPSAnU3RhcnRpbmfigKYnO1xuICAgIHRoaXMuc2FtUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuc2FtRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNhbUJ1c3kgPSB0cnVlO1xuICAgIGNvbnN0IHBzdWIgPSB0b29sLnByb2dyZXNzJC5zdWJzY3JpYmUoKGYpID0+IHtcbiAgICAgIHRoaXMuc2FtRG93bmxvYWRpbmcgPSBmID49IDAgJiYgZiA8IDE7XG4gICAgICBpZiAoZiA+PSAwKSB0aGlzLnNhbVByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKGYgKiAxMDApKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgICBjb25zdCBzc3ViID0gdG9vbC5zdGF0dXMkLnN1YnNjcmliZSgobSkgPT4ge1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgdGhpcy5zYW1TdGF0dXMgPSBtO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zaG93U2FtVG9hc3QobGFiZWwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBuID0gYXdhaXQgb3AoKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAga2V5OiB0aGlzLnJlc3VsdFRvYXN0S2V5LFxuICAgICAgICBzZXZlcml0eTogbiA+IDAgPyAnc3VjY2VzcycgOiAnd2FybicsXG4gICAgICAgIHN1bW1hcnk6IGxhYmVsLFxuICAgICAgICBkZXRhaWw6IHRvb2wuc3RhdHVzJC52YWx1ZSB8fCAobiA+IDAgPyBgQWRkZWQgJHtufSByZWdpb24ocykuYCA6ICdObyByZWdpb25zIGFkZGVkLicpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICBrZXk6IHRoaXMucmVzdWx0VG9hc3RLZXksXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiBgJHtsYWJlbH0gZmFpbGVkYCwgZGV0YWlsOiBTdHJpbmcoZSksXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgc3N1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5oaWRlU2FtVG9hc3QoKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2hvdyB0aGUgc2hhcmVkIHN0aWNreSBgc2FtYCB0b2FzdCBvbmNlIChpZGVtcG90ZW50IOKAlCByZS1hZGRpbmcgd291bGQgc3RhY2tcbiAgICogIGEgbmV3IHRvYXN0IG9uIGV2ZXJ5IHBvaW50IGNsaWNrKS4gKi9cbiAgcHJpdmF0ZSBzaG93U2FtVG9hc3Qoc3VtbWFyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2FtVG9hc3RTaG93bikgcmV0dXJuO1xuICAgIHRoaXMuc2FtVG9hc3RTaG93biA9IHRydWU7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IHRoaXMuc2FtVG9hc3RLZXksIHN0aWNreTogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeSB9KTtcbiAgfVxuXG4gIC8qKiBEaXNtaXNzIHRoZSBzaGFyZWQgYHNhbWAgdG9hc3QgYW5kIHJlc2V0IGl0cyBwcm9ncmVzcy9zcGlubmVyIHN0YXRlLiAqL1xuICBwcml2YXRlIGhpZGVTYW1Ub2FzdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNhbVRvYXN0U2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLnNhbUJ1c3kgPSBmYWxzZTtcbiAgICB0aGlzLnNhbURvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zYW1Qcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5jbGVhcih0aGlzLnNhbVRvYXN0S2V5KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogUGljayB0aGUgU0FNIG1vZGVsIHRoZSBzZWdtZW50IHRvb2xzIHVzZSAoaml0LXVpIzkwIFAxKS4gKi9cbiAgb25TYW1Nb2RlbENoYW5nZShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zYW1Nb2RlbElkID0gaWQ7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTYW1Nb2RlbChpZCk7XG4gIH1cblxuICAvKiogQ29udmVydCB0aGUgc2VsZWN0ZWQgcmVnaW9uIHRvIGEgc21vb3RoIGJlemllciBjdXJ2ZS4gKi9cbiAgdG9CZXppZXJSZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25PdmVybGF5KCk/LnNldFNlbGVjdGVkQmV6aWVyKHRydWUpO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgdGhlIHNlbGVjdGVkIHJlZ2lvbiBiYWNrIHRvIGEgc3RyYWlnaHQtZWRnZWQgcG9seWdvbi4gKi9cbiAgdG9Qb2x5Z29uUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9uT3ZlcmxheSgpPy5zZXRTZWxlY3RlZEJlemllcihmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogSW1tZWRpYXRlIHJlZ2lvbiBhY3Rpb25zIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoaml0LXVpIzg1KTogbWVyZ2UsXG4gICAqIHVuZ3JvdXAsIGludmVyc2UsIHNpbXBsaWZ5LCB0aGUgQsOpemllciBjb252ZXJzaW9ucywgYW5kIGRlbGV0ZSDigJQgdGhlXG4gICAqIG9uZS1zaG90IGdlb21ldHJ5IHRyYW5zZm9ybXMsIGdyb3VwZWQgYXBhcnQgZnJvbSB0aGUgdG9vbC9tb2RlIHRvZ2dsZXMgYW5kXG4gICAqIHNob3duIG9ubHkgd2hlbiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQuIEVhY2ggaXRlbSBpcyBnYXRlZCBvbiB3aGF0IHRoZVxuICAgKiBzZWxlY3Rpb24gc3VwcG9ydHMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUmVnaW9uQWN0aW9uSXRlbXMoKTogTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3Qgc2VsZWN0YWJsZSA9IGFsbC5maWx0ZXIoKHIpID0+IHIua2luZCAhPT0gJ3Byb2ZpbGUnKTtcbiAgICBpZiAoc2VsZWN0YWJsZS5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuXG4gICAgLy8gU2VsZWN0IGFsbCDigJQgYXZhaWxhYmxlIHdoZW5ldmVyIHRoZSBpbWFnZSBoYXMgcmVnaW9ucywgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAvLyBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICBpdGVtcy5wdXNoKHtcbiAgICAgIGxhYmVsOiAnU2VsZWN0IGFsbCByZWdpb25zJywgaWNvbjogJ3BpIHBpLWNoZWNrLXNxdWFyZScsXG4gICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnNlbGVjdEFsbFJlZ2lvbnMoKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNlbEFsbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25zO1xuICAgIGlmIChzZWxBbGwubGVuZ3RoID09PSAwKSByZXR1cm4gaXRlbXM7XG4gICAgY29uc3QgZWxpZ2libGUgPSB0aGlzLm9wRWxpZ2libGUoc2VsQWxsKTtcblxuICAgIGlmIChlbGlnaWJsZS5sZW5ndGggPj0gMikge1xuICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnTWVyZ2UgLyBncm91cCcsIGljb246ICdwaSBwaS1saW5rJywgY29tbWFuZDogKCkgPT4gdGhpcy5tZXJnZVJlZ2lvbnMoKSB9KTtcbiAgICB9XG4gICAgaWYgKHNlbEFsbC5zb21lKChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5jYW5Vbmdyb3VwKHIpKSkge1xuICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnVW5ncm91cCcsIGljb246ICdwaSBwaS1zaXRlbWFwJywgY29tbWFuZDogKCkgPT4gdGhpcy51bmdyb3VwUmVnaW9ucygpIH0pO1xuICAgIH1cbiAgICBpZiAoZWxpZ2libGUubGVuZ3RoID49IDEpIHtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdJbnZlcnNlJywgaWNvbjogJ3BpIHBpLWNsb25lJywgY29tbWFuZDogKCkgPT4gdGhpcy5pbnZlcnNlUmVnaW9ucygpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NpbXBsaWZ5JywgaWNvbjogJ3BpIHBpLWNoYXJ0LWxpbmUnLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnTGlnaHQgKDEgcHgpJywgY29tbWFuZDogKCkgPT4gdGhpcy5zaW1wbGlmeVJlZ2lvbnMoMSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdNZWRpdW0gKDMgcHgpJywgY29tbWFuZDogKCkgPT4gdGhpcy5zaW1wbGlmeVJlZ2lvbnMoMykgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTdHJvbmcgKDggcHgpJywgY29tbWFuZDogKCkgPT4gdGhpcy5zaW1wbGlmeVJlZ2lvbnMoOCkgfSxcbiAgICAgICAgICAgIHsgc2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ3VzdG9t4oCmJywgY29tbWFuZDogKCkgPT4gdGhpcy5vcGVuU2ltcGxpZnlEaWFsb2coKSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBCw6l6aWVyIGNvbnZlcnNpb25zIGFyZSB2ZXJ0ZXgtbGV2ZWwgZWRpdHMg4oCUIEltYWdlIChPcGVuU2VhZHJhZ29uKSB2aWV3XG4gICAgLy8gb25seSDigJQgZ2F0ZWQgb24gdGhlIHNlbGVjdGlvbidzIGN1cnJlbnQgZm9ybS5cbiAgICBpZiAodGhpcy5zZWxlY3RlZFBsb3RUeXBlID09PSBQbG90VHlwZS5JTUFHRSkge1xuICAgICAgY29uc3QgaGFzU3RyYWlnaHQgPSBzZWxBbGwuc29tZSgocikgPT5cbiAgICAgICAgKHIuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbiAmJiAhci5ib3VuZHMuYmV6aWVyKSB8fCByLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSk7XG4gICAgICBjb25zdCBoYXNCZXppZXIgPSBzZWxBbGwuc29tZSgocikgPT4gci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uICYmIHIuYm91bmRzLmJlemllcik7XG4gICAgICBpZiAoaGFzU3RyYWlnaHQpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnQ29udmVydCB0byBCw6l6aWVyJywgaWNvbjogJ3RvLWJlemllci1pY29uJywgY29tbWFuZDogKCkgPT4gdGhpcy50b0JlemllclJlZ2lvbigpIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGhhc0Jlemllcikge1xuICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdDb252ZXJ0IHRvIHBvbHlnb24nLCBpY29uOiAndG8tcG9seWdvbi1pY29uJywgY29tbWFuZDogKCkgPT4gdGhpcy50b1BvbHlnb25SZWdpb24oKSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnRGVsZXRlIHJlZ2lvbicsIGljb246ICdwaSBwaS10cmFzaCcsIGNvbW1hbmQ6ICgpID0+IHRoaXMuZGVsZXRlUmVnaW9uKCkgfSk7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbnRleHRNZW51SXRlbXMoKTogTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5hY3RpdmVEcmFnTW9kZTtcbiAgICBjb25zdCBhY3RpdmVDbGFzcyA9ICdjb250ZXh0LW1lbnUtYWN0aXZlJztcbiAgICBjb25zdCBpdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuICAgIC8vIFNlbGVjdGVkLXJlZ2lvbiBhY3Rpb25zIGxlYWQgdGhlIG1lbnUgKHNlcGFyYXRlZCBmcm9tIHRoZSB0b29sIHRvZ2dsZXMpLlxuICAgIGlmICh0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgY29uc3QgYWN0aW9ucyA9IHRoaXMuYnVpbGRSZWdpb25BY3Rpb25JdGVtcygpO1xuICAgICAgaWYgKGFjdGlvbnMubGVuZ3RoKSBpdGVtcy5wdXNoKC4uLmFjdGlvbnMsIHsgc2VwYXJhdG9yOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0hlYXRtYXApIHtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdBdXRvc2NhbGUnLCBpY29uOiAncGkgcGktd2luZG93LW1heGltaXplJywgY29tbWFuZDogKCkgPT4gdGhpcy5hdXRvc2NhbGVJbWFnZSgpIH0sXG4gICAgICAgIHsgc2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgLy8gJ1pvb20gc2VsZWN0aW9uJyBpcyBQbG90bHkncyBydWJiZXItYmFuZCB6b29tOyBpdCBkb2Vzbid0IGFwcGx5IHRvIHRoZVxuICAgICAgLy8gT3BlblNlYWRyYWdvbi1iYWNrZWQgSW1hZ2UgdmlldyAodXNlICdab29tIHRvIGJveCcgdGhlcmUgaW5zdGVhZCkuXG4gICAgICBpZiAoIXRoaXMuaXNJbWFnZVZpZXcpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgbGFiZWw6ICdab29tIHNlbGVjdGlvbicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXNlYXJjaCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnem9vbScgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3pvb20nKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6ICdab29tIHRvIGJveCcsXG4gICAgICAgIGljb246ICd6b29tLWJveC1vZmYtaWNvbicsXG4gICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ3pvb21Ub0JveCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCd6b29tVG9Cb3gnKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0hlYXRtYXApIHtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ1BhbicsXG4gICAgICAgIGljb246ICdwaSBwaS1hcnJvd3MtYWx0JyxcbiAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAncGFuJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3BhbicpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHMzZCA9IHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZTtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1pvb20nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1zZWFyY2gnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IHMzZCA9PT0gJ3pvb20nID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZVN1cmZhY2UzZE1vZGUoJ3pvb20nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnUGFuJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktYXJyb3dzLWFsdCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogczNkID09PSAncGFuJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVTdXJmYWNlM2RNb2RlKCdwYW4nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnT3JiaXRhbCByb3RhdGlvbicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWdsb2JlJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBzM2QgPT09ICdvcmJpdCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlU3VyZmFjZTNkTW9kZSgnb3JiaXQnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnVHVybnRhYmxlIHJvdGF0aW9uJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktc3luYycsXG4gICAgICAgICAgc3R5bGVDbGFzczogczNkID09PSAndHVybnRhYmxlJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVTdXJmYWNlM2RNb2RlKCd0dXJudGFibGUnKSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBzZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Jlc2V0IGNhbWVyYScsIGljb246ICdwaSBwaS1ob21lJywgY29tbWFuZDogKCkgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICBpdGVtcy5wdXNoKFxuICAgICAgICB7IGxhYmVsOiAnWm9vbSBpbicsIGljb246ICdwaSBwaS1zZWFyY2gtcGx1cycsIGNvbW1hbmQ6ICgpID0+IHRoaXMuem9vbUluKCkgfSxcbiAgICAgICAgeyBsYWJlbDogJ1pvb20gb3V0JywgaWNvbjogJ3BpIHBpLXNlYXJjaC1taW51cycsIGNvbW1hbmQ6ICgpID0+IHRoaXMuem9vbU91dCgpIH0sXG4gICAgICAgIHsgc2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCcsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWFycm93LXVwLXJpZ2h0JyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdzZWxlY3QnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdzZWxlY3QnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRnJlZWZvcm0nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1wZW5jaWwnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RyYXdjbG9zZWRwYXRoJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd2Nsb3NlZHBhdGgnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnQnJ1c2gnLFxuICAgICAgICAgIGljb246ICdicnVzaC1pY29uJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdicnVzaCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2JydXNoJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1BvbHlsaW5lJyxcbiAgICAgICAgICBpY29uOiAncG9seWxpbmUtaWNvbicsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZHJhd29wZW5wYXRoJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd29wZW5wYXRoJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1JlY3RhbmdsZScsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXN0b3AnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RyYXdyZWN0JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd3JlY3QnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnV2FuZCcsXG4gICAgICAgICAgaWNvbjogJ3dhbmQtaWNvbicsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnd2FuZCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3dhbmQnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnVmVydGV4IGVyYXNlcicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWVyYXNlcicsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZXJhc2VWZXJ0ZXgnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdlcmFzZVZlcnRleCcpLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIFZlcnRleCBlZGl0aW5nIHJ1bnMgb24gdGhlIE9wZW5TZWFkcmFnb24gb3ZlcmxheSwgd2hpY2hcbiAgICAgIC8vIGJhY2tzIHRoZSBJbWFnZSBwbG90IHR5cGUuIEhpZGRlbiBmb3Igb3RoZXIgMkQgdHlwZXMgKFBsb3RseSksIHdoZXJlXG4gICAgICAvLyB0aGVzZSBtb2RlcyBhcmUgbm8tb3BzLlxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9PT0gUGxvdFR5cGUuSU1BR0UpIHtcbiAgICAgICAgaXRlbXMucHVzaChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1BvbHlnb24gKGNsaWNrIHZlcnRpY2VzKScsXG4gICAgICAgICAgICBpY29uOiAncG9seWdvbi12ZXJ0aWNlcy1pY29uJyxcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RyYXdwb2x5Z29uJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3cG9seWdvbicpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdBZGQgdmVydGV4JyxcbiAgICAgICAgICAgIGljb246ICd2ZXJ0ZXgtYWRkLWljb24nLFxuICAgICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnYWRkcG9pbnQnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2FkZHBvaW50JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ0RlbGV0ZSB2ZXJ0ZXgnLFxuICAgICAgICAgICAgaWNvbjogJ3ZlcnRleC1kZWxldGUtaWNvbicsXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdkZWxldGVwb2ludCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZGVsZXRlcG9pbnQnKSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gQsOpemllciBjb252ZXJzaW9ucyArIERlbGV0ZSBhcmUgaW1tZWRpYXRlIHNlbGVjdGlvbiAqYWN0aW9ucyosIG5vdyBpbiB0aGVcbiAgICAgIC8vIFwiU2VsZWN0ZWQgcmVnaW9uKHMpXCIgZ3JvdXAgYXQgdGhlIHRvcCAoc2VlIGJ1aWxkUmVnaW9uQWN0aW9uSXRlbXMpLlxuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICB0b2dnbGVTdXJmYWNlM2RNb2RlKG1vZGU6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZSA9IG1vZGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSk7XG4gIH1cblxuICByZXNldFN1cmZhY2VDYW1lcmEoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5yZXNldFN1cmZhY2VDYW1lcmEoKTtcbiAgfVxuXG4gIC8qKiBUb2dnbGUgdGhlIG5hcGFyaSAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyAodm9sdW1lL2lzb3N1cmZhY2UpLiBOby1vcCBvbiBiYWNrZW5kc1xuICAgKiAgdGhhdCBkb24ndCByZW5kZXIgb25lICh0aGUgY29udHJvbCBtZXRob2QgaXMgb3B0aW9uYWwpLiAqL1xuICB0b2dnbGVBeGVzKCkge1xuICAgIHRoaXMuYXhlc1Zpc2libGUgPSAhdGhpcy5heGVzVmlzaWJsZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnNldEF4ZXNWaXNpYmxlPy4odGhpcy5heGVzVmlzaWJsZSk7XG4gIH1cblxuICAvKiogVG9nZ2xlIHRoZSBuYXBhcmkgc3VyZmFjZSB3aXJlZnJhbWUgKGVkZ2VzIHZzIGZpbGxlZCkuIE5vLW9wIG9uIGJhY2tlbmRzIHdpdGhvdXQgYSBzdXJmYWNlLiAqL1xuICB0b2dnbGVXaXJlZnJhbWUoKSB7XG4gICAgdGhpcy53aXJlZnJhbWVBY3RpdmUgPSAhdGhpcy53aXJlZnJhbWVBY3RpdmU7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRXaXJlZnJhbWU/Lih0aGlzLndpcmVmcmFtZUFjdGl2ZSk7XG4gIH1cblxuICAvKiogQ2hhbmdlIHRoZSBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yLiBEZWNpbWF0aW9uIGNoYW5nZXMgdGhlIGZldGNoZWQvYXNzZW1ibGVkIGRhdGEsIHNvIHRoaXNcbiAgICogIHJlLXBsb3RzIHRoZSBjdXJyZW50IDNEIHR5cGUgYXQgdGhlIG5ldyByZXNvbHV0aW9uICh1bmxpa2UgYXhlcy93aXJlZnJhbWUsIHdoaWNoIGFyZSBsaXZlKS4gKi9cbiAgc2VsZWN0UmVzb2x1dGlvbihzY2FsZTogbnVtYmVyKSB7XG4gICAgaWYgKHNjYWxlID09PSB0aGlzLnJlc29sdXRpb25TY2FsZSkgcmV0dXJuO1xuICAgIHRoaXMucmVzb2x1dGlvblNjYWxlID0gc2NhbGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRSZXNvbHV0aW9uU2NhbGU/LihzY2FsZSk7XG4gICAgdGhpcy5yZWxvYWRBbmRQbG90KCk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoIHRoZSBhY3RpdmUgcGxvdCB0eXBlIChoZWF0bWFwLCBzdXJmYWNlLCBjb250b3VyLCBzY2F0dGVyLCBsaW5lLFxuICAgKiBzY2F0dGVyM2QsIGlzb3N1cmZhY2UpLiBLZWVwcyBgaXNIZWF0bWFwYCBhcyB0aGUgMkQtdnMtM0QgZmxhZyB0aGUgcmVzdCBvZlxuICAgKiB0aGUgdG9vbGJhci9jb250ZXh0LW1lbnUgbG9naWMgcmVsaWVzIG9uLCBkZWFjdGl2YXRlcyAyRC1vbmx5IHRvb2xzIHdoZW5cbiAgICogbW92aW5nIHRvIGEgM0QgdHlwZSwgdGhlbiByZS1wbG90cy5cbiAgICovXG4gIG9uU2VsZWN0UGxvdFR5cGUodHlwZTogUGxvdFR5cGUpIHtcbiAgICB0aGlzLnBsb3RUeXBlID0gdHlwZTtcbiAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPSB0eXBlO1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLnBsb3RUeXBlT3B0aW9ucy5maW5kKChkKSA9PiBkLnR5cGUgPT09IHR5cGUpO1xuICAgIGNvbnN0IGlzM2QgPSBkZXNjcmlwdG9yPy5kaW1lbnNpb25zID09PSAnM2QnO1xuICAgIHRoaXMuaXNIZWF0bWFwID0gIWlzM2Q7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZSh0eXBlKTtcbiAgICAvLyBTd2l0Y2hpbmcgcGxvdCB0eXBlIGNhbmNlbHMgdGhlIGFjdGl2ZSB0b29sIOKAlCBub3QgZXZlcnkgdHlwZSBzdXBwb3J0cyB0aGVcbiAgICAvLyBzYW1lIHRvb2xzIChsaW5lL3NjYXR0ZXIgY2hhcnRzIGFuZCAzRCBzY2VuZXMgaGF2ZSBubyBib3ggem9vbSBvciByZWdpb25cbiAgICAvLyBkcmF3aW5nKSwgc28gbGVhdmluZyBhIHRvb2wgYXJtZWQgd291bGQgbWlzYmVoYXZlIG9uIHRoZSBuZXcgcGxvdC5cbiAgICB0aGlzLmRlYWN0aXZhdGVBY3RpdmVUb29sKCk7XG4gICAgaWYgKGlzM2QpIHtcbiAgICAgIHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZSA9ICd0dXJudGFibGUnO1xuICAgIH1cbiAgICAvLyBuYXBhcmktanMgdm9sdW1lL2lzb3N1cmZhY2UgYXNzZW1ibGUgdGhlaXIgb3duIDNEIHRleHR1cmUgZnJvbSB0aGUgc2xpY2UgZW5kcG9pbnQsIHNvXG4gICAgLy8gdGhleSB0YWtlIHRoZSBub3JtYWwgcmUtcGxvdCBwYXRoIOKAlCBOT1QgUGxvdGx5J3Mgc3RhY2stZnJhbWUgbG9hZGVyICh3aG9zZSBcIkxvYWRpbmdcbiAgICAvLyBmcmFtZXNcIiBvdmVybGF5IHdvdWxkIG5ldmVyIGNsZWFyLCBzaW5jZSBQbG90bHkgaXNuJ3QgdGhlIGFjdGl2ZSBiYWNrZW5kKSAoaml0LXVpIzEwMikuXG4gICAgY29uc3QgaXNOYXBhcmkgPSB0eXBlID09PSBQbG90VHlwZS5OQVBBUklfSU1BR0UgfHwgaXNOYXBhcmkzZCh0eXBlKTtcbiAgICBpZiAoZGVzY3JpcHRvcj8ucmVxdWlyZXNTdGFjayAmJiAhaXNOYXBhcmkpIHtcbiAgICAgIC8vIFZvbHVtZSB0eXBlcyAoaXNvc3VyZmFjZSwgc2NhdHRlcjNkKSBuZWVkIHRoZSB3aG9sZSB6LXN0YWNrIGxvYWRlZCBhcyBhXG4gICAgICAvLyAzRCBhcnJheSwgYW5kIHRoZXkgYWx3YXlzIHJlbmRlciBvbiBQbG90bHkuIERyaXZlIHRoZSBzdGFjayByZWxvYWRcbiAgICAgIC8vIGRpcmVjdGx5IHRocm91Z2ggdGhlIGltYWdlLWluZm8gc3RyZWFtIHJhdGhlciB0aGFuIHRoZSBhY3RpdmUgcmVuZGVyZXInc1xuICAgICAgLy8gc2V0U2hvd1N0YWNrOiB3aGVuIE9wZW5TZWFkcmFnb24gb3ducyB0aGUgSW1hZ2UgdmlldyBpdHMgc2V0U2hvd1N0YWNrIGlzXG4gICAgICAvLyBhIG5vLW9wLCBzbyB0aGUgcmVsb2FkIG5ldmVyIGZpcmVkIGFuZCB0aGUgbG9hZGVyIHNwdW4gZm9yZXZlci4gV2UgYXJtXG4gICAgICAvLyBQbG90bHkncyBzdGFjay1sb2FkaW5nIGZsYWcgKGtlZXBzIGl0cyBmcmFtZS1mZXRjaCBsb29wIGFsaXZlKSBhbmRcbiAgICAgIC8vIHJlLWVtaXQgdGhlIGltYWdlIGluZm8gd2l0aCBzaG93U3RhY2sgb24gc28gdGhlIHBpcGVsaW5lIHJlbG9hZHMgb25cbiAgICAgIC8vIFBsb3RseSByZWdhcmRsZXNzIG9mIHdoaWNoIGJhY2tlbmQgd2FzIG9uIHNjcmVlbi5cbiAgICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHRoaXMuc3RhY2tPcHRpb25zWzFdO1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRTdGFja0xvYWRpbmcodHJ1ZSk7XG4gICAgICBpZiAodGhpcy5pbWFnZUluZm8pIHtcbiAgICAgICAgdGhpcy5pbWFnZUluZm8uc2hvd1N0YWNrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUluZm8odGhpcy5pbWFnZUluZm8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlbG9hZEFuZFBsb3QoKTtcbiAgfVxuXG4gIC8qKiBEZWFjdGl2YXRlIHdoYXRldmVyIHRvb2wgaXMgYXJtZWQgYW5kIGNsZWFyIGV2ZXJ5IHRvb2wgbW9kZS4gKi9cbiAgcHJpdmF0ZSBkZWFjdGl2YXRlQWN0aXZlVG9vbCgpIHtcbiAgICB0aGlzLmFjdGl2ZURyYWdNb2RlID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb24uc2V0QWN0aXZlVG9vbChudWxsKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbk92ZXJsYXkoKT8uc2V0TW9kZSgnbm9uZScpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0RHJhZ01vZGUoZmFsc2UpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0Wm9vbVRvQm94TW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRXYW5kTW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRCcnVzaE1vZGUoZmFsc2UpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2FtUG9pbnRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFZlcnRleEVyYXNlck1vZGUoZmFsc2UpO1xuICB9XG59XG5cbiIsIjwhLS0gU0FNIHRvYXN0OiBsaXZlIHN0YXR1cyArIGVuY29kZXItZG93bmxvYWQgcHJvZ3Jlc3MgYmFyIChqaXQtdWkjOTApLiBTdGlja3lcbiAgICAgd2hpbGUgYSBzZWdtZW50IHJ1bnM7IHN0YXlzIG9wZW4gdW50aWwgdGhlIGJhciByZWFjaGVzIDEwMCUgYW5kIHRoZSBydW4gZW5kcy4gLS0+XG48cC10b2FzdCBba2V5XT1cInNhbVRvYXN0S2V5XCIgcG9zaXRpb249XCJib3R0b20tcmlnaHRcIj5cbiAgPG5nLXRlbXBsYXRlIGxldC1tZXNzYWdlIHBUZW1wbGF0ZT1cIm1lc3NhZ2VcIj5cbiAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgbWluLXdpZHRoOiAxNnJlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBtYi0xXCI+e3sgbWVzc2FnZS5zdW1tYXJ5IH19PC9kaXY+XG4gICAgICA8ZGl2Pnt7IHNhbVN0YXR1cyB8fCBtZXNzYWdlLmRldGFpbCB9fTwvZGl2PlxuICAgICAgPHAtcHJvZ3Jlc3NCYXIgKm5nSWY9XCJzYW1Eb3dubG9hZGluZ1wiIFt2YWx1ZV09XCJzYW1Qcm9ncmVzc1wiIHN0eWxlQ2xhc3M9XCJtdC0yIHNhbS1wcm9ncmVzc1wiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgIDxwLXByb2dyZXNzQmFyICpuZ0lmPVwic2FtQnVzeSAmJiAhc2FtRG93bmxvYWRpbmdcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIHN0eWxlQ2xhc3M9XCJtdC0yXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7IGhlaWdodDogJzRweCcgfVwiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC10b2FzdD5cblxuPCEtLSBSZXN1bHQvZXJyb3Igbm90aWNlcyBmcm9tIHRoZSBsaWJyYXJ5IGl0c2VsZiAoc2VnbWVudGF0aW9uIG91dGNvbWUsIHJlZ2lvblxuICAgICB2YWxpZGF0aW9uKS4gUmVuZGVyZWQgaGVyZSBzbyB0aGV5IGRvIG5vdCBkZXBlbmQgb24gdGhlIGhvc3QgbW91bnRpbmcgYVxuICAgICBrZXlsZXNzIDxwLXRvYXN0PiDigJQgd2l0aG91dCB0aGlzIHRoZSBtZXNzYWdlcyB3ZW50IG5vd2hlcmUgaW4gYW55IGhvc3QgYnV0XG4gICAgIGppdC11aSwgYW5kIGEgZmFpbGVkIHJ1biBsb29rZWQgbGlrZSBhIGJ1dHRvbiB0aGF0IGRpZCBub3RoaW5nLiAtLT5cbjxwLXRvYXN0IFtrZXldPVwicmVzdWx0VG9hc3RLZXlcIiBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiPjwvcC10b2FzdD5cblxuPCEtLSBTaGFyZWQgb3V0bGV0cyBmb3Igbm90aWNlcyByYWlzZWQgd2hlcmUgdGhlcmUgaXMgbm8gcGVyLWluc3RhbmNlIGtleSB0byB1c2U6XG4gICAgIHRoZSByb290LXByb3ZpZGVkIFBsb3RseVNlcnZpY2UgYW5kIHRoZSByZWdpb24tZWRpdG9yIGRpYWxvZy4gUmVuZGVyZWQgYnkgYVxuICAgICBzaW5nbGUgdmlzdWFsaXplciAob3duc1NoYXJlZFRvYXN0cykgc28gYSBtZXNzYWdlIGZyb20gdGhlIHJvb3Qgc2VydmljZSBpc1xuICAgICBub3Qgc2hvd24gb25jZSBwZXIgbGl2ZSB2aWV3ZXIuIC0tPlxuPHAtdG9hc3QgKm5nSWY9XCJvd25zU2hhcmVkVG9hc3RzXCIgW2tleV09XCJ2aXpUb2FzdEtleVwiPjwvcC10b2FzdD5cbjxwLXRvYXN0ICpuZ0lmPVwib3duc1NoYXJlZFRvYXN0c1wiIFtrZXldPVwidml6QWxlcnRUb2FzdEtleVwiIHBvc2l0aW9uPVwiY2VudGVyXCI+PC9wLXRvYXN0PlxuXG48IS0tIFRvb2xiYXIgZG9jazogZG9ja2VkIGFjcm9zcyB0aGUgdG9wIGJ5IGRlZmF1bHQ7IGRyYWcgdGhlIGhhbmRsZSB0byBkZXRhY2hcbiAgICAgaXQgaW50byBhIGZsb2F0aW5nLCBtb3ZhYmxlIHdpbmRvdyAoZnJlZXMgdGhlIHRvcCByb3cgZm9yIHRoZSBpbWFnZSkuIC0tPlxuPGRpdiBjbGFzcz1cInRvb2xiYXItZG9ja1wiIFtjbGFzcy5mbG9hdGluZ109XCJ0b29sYmFyRmxvYXRpbmdcIlxuICAgICBbc3R5bGUubGVmdC5weF09XCJ0b29sYmFyRmxvYXRpbmcgPyB0b29sYmFyUG9zLnggOiBudWxsXCJcbiAgICAgW3N0eWxlLnRvcC5weF09XCJ0b29sYmFyRmxvYXRpbmcgPyB0b29sYmFyUG9zLnkgOiBudWxsXCI+XG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWRyYWctaGFuZGxlXCIgKG1vdXNlZG93bik9XCJvblRvb2xiYXJEcmFnU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgcFRvb2x0aXA9XCJEcmFnIHRvIGZsb2F0IHRoZSB0b29sYmFyXCIgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XG4gICAgPGkgY2xhc3M9XCJwaSBwaS1iYXJzXCI+PC9pPlxuICA8L2Rpdj5cbjxwbG90dGluZy10b29sYmFyXG4gIFtpbWFnZUluZm9dPVwiaW1hZ2VJbmZvXCJcbiAgW3Bsb3RUeXBlT3B0aW9uc109XCJwbG90VHlwZU9wdGlvbnNcIlxuICBbc2VsZWN0ZWRQbG90VHlwZV09XCJzZWxlY3RlZFBsb3RUeXBlXCJcbiAgW2lzb1JhbmdlXT1cImlzb1JhbmdlXCJcbiAgW21heEluZGV4XT1cIm1heEluZGV4XCJcbiAgW3pJbmRleF09XCJ6SW5kZXhcIlxuICBbaXNIZWF0bWFwXT1cImlzSGVhdG1hcFwiXG4gIFthY3RpdmVEcmFnTW9kZV09XCJhY3RpdmVEcmFnTW9kZVwiXG4gIFthY3RpdmVTdXJmYWNlM2RNb2RlXT1cImFjdGl2ZVN1cmZhY2UzZE1vZGVcIlxuICBbYXhlc1Zpc2libGVdPVwiYXhlc1Zpc2libGVcIlxuICBbd2lyZWZyYW1lQWN0aXZlXT1cIndpcmVmcmFtZUFjdGl2ZVwiXG4gIFtyZXNvbHV0aW9uU2NhbGVdPVwicmVzb2x1dGlvblNjYWxlXCJcbiAgW3dhbmRTZW5zaXRpdml0eV09XCJ3YW5kU2Vuc2l0aXZpdHlcIlxuICBbYnJ1c2hTaXplXT1cImJydXNoU2l6ZVwiXG4gIFtzYW1Nb2RlbHNdPVwic2FtTW9kZWxzXCJcbiAgW3NhbU1vZGVsSWRdPVwic2FtTW9kZWxJZFwiXG4gIFt2ZXJ0ZXhFcmFzZXJSYWRpdXNdPVwidmVydGV4RXJhc2VyUmFkaXVzXCJcbiAgW2NhblVuZG9dPVwiY2FuVW5kb1JlZ2lvblwiXG4gIFtjYW5SZWRvXT1cImNhblJlZG9SZWdpb25cIlxuICBbc3RhY2tPcHRpb25zXT1cInN0YWNrT3B0aW9uc1wiXG4gIFt0b29sc109XCJ0b29sYmFyVG9vbHNcIlxuICBbaW1hZ2VTbW9vdGhpbmdFbmFibGVkXT1cImltYWdlU21vb3RoaW5nRW5hYmxlZFwiXG4gIChzZWxlY3RQbG90VHlwZSk9XCJvblNlbGVjdFBsb3RUeXBlKCRldmVudClcIlxuICAodG9nZ2xlSW1hZ2VTbW9vdGhpbmcpPVwib25Ub2dnbGVJbWFnZVNtb290aGluZygpXCJcbiAgKGFkZFByb2ZpbGVMaW5lKT1cImFkZFByb2ZpbGVMaW5lKClcIlxuICAoaXNvUmFuZ2VDaGFuZ2UpPVwib25Jc29SYW5nZUNoYW5nZSgkZXZlbnQpXCJcbiAgKG9wZW5DaGFubmVsSGlzdG9ncmFtKT1cIm9wZW5DaGFubmVsSGlzdG9ncmFtKClcIlxuICAob3BlblJlZ2lvbkVkaXRvcik9XCJvcGVuUmVnaW9uRWRpdG9yKClcIlxuICAoc2VsZWN0U3RhY2tPcHRpb24pPVwic2VsZWN0U3RhY2tPcHRpb24oJGV2ZW50KVwiXG4gICh6U2NydWIpPVwib25aU2NydWIoJGV2ZW50KVwiXG4gICh6U2xpZGUpPVwib25aU2xpZGUoJGV2ZW50KVwiXG4gICh6SW5kZXhJbnB1dCk9XCJ6SW5kZXggPSAkZXZlbnQ7IHVwZGF0ZVpJbmRleCgpXCJcbiAgKHJlbG9hZEFuZFBsb3QpPVwicmVsb2FkQW5kUGxvdCgpXCJcbiAgKGRvd25sb2FkSW1hZ2UpPVwiZG93bmxvYWRJbWFnZSgpXCJcbiAgKGF1dG9zY2FsZUltYWdlKT1cImF1dG9zY2FsZUltYWdlKClcIlxuICAodG9nZ2xlRHJhZ01vZGUpPVwidG9nZ2xlRHJhZ01vZGUoJGV2ZW50KVwiXG4gICh6b29tSW4pPVwiem9vbUluKClcIlxuICAoem9vbU91dCk9XCJ6b29tT3V0KClcIlxuICAodG9nZ2xlU3VyZmFjZTNkTW9kZSk9XCJ0b2dnbGVTdXJmYWNlM2RNb2RlKCRldmVudClcIlxuICAocmVzZXRTdXJmYWNlQ2FtZXJhKT1cInJlc2V0U3VyZmFjZUNhbWVyYSgpXCJcbiAgKHRvZ2dsZUF4ZXMpPVwidG9nZ2xlQXhlcygpXCJcbiAgKHRvZ2dsZVdpcmVmcmFtZSk9XCJ0b2dnbGVXaXJlZnJhbWUoKVwiXG4gIChzZWxlY3RSZXNvbHV0aW9uKT1cInNlbGVjdFJlc29sdXRpb24oJGV2ZW50KVwiXG4gIChkZWxldGVSZWdpb24pPVwiZGVsZXRlUmVnaW9uKClcIlxuICAodW5kb1JlZ2lvbik9XCJ1bmRvUmVnaW9uKClcIlxuICAocmVkb1JlZ2lvbik9XCJyZWRvUmVnaW9uKClcIlxuICAoc2VnbWVudFJlZ2lvbnMpPVwic2VnbWVudFJlZ2lvbnMoKVwiXG4gIChzZWdtZW50Q2VsbHBvc2UpPVwic2VnbWVudENlbGxwb3NlKClcIlxuICAoc2FtTW9kZWxDaGFuZ2UpPVwib25TYW1Nb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgKHdhbmRTZW5zaXRpdml0eUNoYW5nZSk9XCJvbldhbmRTZW5zaXRpdml0eUNoYW5nZSgkZXZlbnQpXCJcbiAgKGJydXNoU2l6ZUNoYW5nZSk9XCJvbkJydXNoU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgKHZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSk9XCJvblZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSgkZXZlbnQpXCI+XG4gIDwhLS0gSG9zdC1wcm9qZWN0ZWQgY3VzdG9tIHRvb2xiYXIgYnV0dG9ucywgZm9yd2FyZGVkIGludG8gdGhlIHRvb2xiYXIuIC0tPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L3Bsb3R0aW5nLXRvb2xiYXI+XG4gIDxwLWJ1dHRvbiAqbmdJZj1cInRvb2xiYXJGbG9hdGluZ1wiIGNsYXNzPVwidG9vbGJhci1kb2NrLWJ0blwiIGljb249XCJwaSBwaS10aHVtYnRhY2tcIiBzaXplPVwic21hbGxcIiBbdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgIHBUb29sdGlwPVwiRG9jayB0byB0b3BcIiB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIiAob25DbGljayk9XCJkb2NrVG9vbGJhcigpXCI+XG4gIDwvcC1idXR0b24+XG48L2Rpdj5cblxuPHAtY29udGV4dE1lbnUgI2NtIFttb2RlbF09XCJjb250ZXh0TWVudUl0ZW1zXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLWNvbnRleHRNZW51PlxuPCEtLSBObyBgaC1mdWxsYCBoZXJlOiBQcmltZUZsZXgncyBoZWlnaHQ6MTAwJSAhaW1wb3J0YW50IG1hZGUgI3Bsb3QgYXMgdGFsbCBhc1xuICAgICB0aGUgd2hvbGUgaG9zdCwgc28gdW5kZXIgdGhlIGRvY2tlZCB0b29sYmFyIGl0cyBib3R0b20gdG9vbGJhci1oZWlnaHQgc3RyaXBcbiAgICAgKGluY2wuIHRoZSBPU0Qgc2NhbGUgYmFyIGF0IGJvdHRvbS1sZWZ0KSB3YXMgY2xpcHBlZCBieSB0aGUgaG9zdCdzXG4gICAgIG92ZXJmbG93OmhpZGRlbi4gVGhlIGNvbXBvbmVudCBzdHlsZXNoZWV0IHNpemVzIGl0ICgudml6LXBsb3QgeyBmbGV4OiAxIH0pLiAtLT5cbjxkaXYgY2xhc3M9XCJ3LWZ1bGwgcmVsYXRpdmUgdml6LXBsb3RcIiBbaWRdPVwicGxvdERpdk5hbWVcIj5cbiAgPGRpdiAqbmdJZj1cImltZ0xvYWRpbmcgfHwgc3RhY2tMb2FkaW5nIHx8IGlzQ2FjaGluZ1wiIGlkPVwib3ZlcmxheVwiPlxuICAgIDwhLS0gRGV0ZXJtaW5hdGUgc3RhY2svdm9sdW1lIHByb2dyZXNzIHRha2VzIHByZWNlZGVuY2U6IHdoaWxlIGl0J3MgYWN0aXZlIHNob3cgT05MWSB0aGVcbiAgICAgICAgIHByb2dyZXNzIGJhciArIFwiTG9hZGluZyBmcmFtZXMuLi5cIiwgbm90IHRoZSBnZW5lcmljIHNwaW5uZXIvXCJMb2FkaW5nIGltYWdlLi4uXCIgb24gdG9wIG9mXG4gICAgICAgICBpdCAoYm90aCB3ZXJlIHJlbmRlcmluZyBhdCBvbmNlIGZvciBuYXBhcmkgdm9sdW1lL2lzb3N1cmZhY2UgbG9hZHMpLiAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhY2tMb2FkaW5nOyBlbHNlIGltZ0xvYWRpbmdUcGxcIj5cbiAgICAgIDxwLXByb2dyZXNzQmFyIGNsYXNzPVwicHJvZ3Jlc3NcIiBbdmFsdWVdPVwibG9hZGluZ1BlcmNlbnRhZ2VcIj48L3AtcHJvZ3Jlc3NCYXI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPkxvYWRpbmcgZnJhbWVzLi4uPC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjaW1nTG9hZGluZ1RwbD5cbiAgICAgIDwhLS0gQ2FjaGUtY29weSBwcm9ncmVzcyBpcyBzaG93biB3aGVuZXZlciBhIGNhY2hlIGRvd25sb2FkIGlzIGFjdGl2ZSAoaXNDYWNoaW5nKSwgaW5kZXBlbmRlbnRcbiAgICAgICAgICAgb2YgYGltZ0xvYWRpbmdgLCBzbyBpdCdzIG5ldmVyIGRyb3BwZWQvbWFza2VkIG1pZC1kb3dubG9hZC4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDYWNoaW5nOyBlbHNlIHNwaW5uZXJMb2FkaW5nXCI+XG4gICAgICAgIDwhLS0gU3RhZ2UtYXdhcmUgbWVzc2FnZSBjb21lcyBmcm9tIENhY2hlUHJvZ3Jlc3NTZXJ2aWNlIHVwZGF0aW5nXG4gICAgICAgICAgICAgaW1hZ2VMb2FkaW5nTWVzc2FnZSQgKFwiQ2FjaGluZyBpbWFnZS4uLlwiIGR1cmluZyB0aGUgR0NTIGRvd25sb2FkLFxuICAgICAgICAgICAgIHRoZW4gXCJHZW5lcmF0aW5nIHByZXZpZXcuLi5cIiBkdXJpbmcgcGVyLXNsaWNlIHRodW1ibmFpbCBnZW4pLiBPbmNlIHRoZVxuICAgICAgICAgICAgIGRvd25sb2FkIGhpdHMgMTAwJSB0aGUgcmVtYWluaW5nIHdvcmsgKHNlcnZlciBwcmV2aWV3L3RpbGUgZ2VuZXJhdGlvbilcbiAgICAgICAgICAgICBoYXMgbm8gZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MsIHNvIGZhbGwgdGhyb3VnaCB0byB0aGUgc3Bpbm5lciB0ZW1wbGF0ZVxuICAgICAgICAgICAgIHJhdGhlciB0aGFuIHBhcmtpbmcgYSBmdWxsIGJhciB1bmRlciBcIkxvYWRpbmcgaW1hZ2UuLi5cIi4gLS0+XG4gICAgICAgIDxwLXByb2dyZXNzQmFyIGNsYXNzPVwicHJvZ3Jlc3NcIiBbdmFsdWVdPVwiY2FjaGVQcm9ncmVzc1wiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxvYWRpbmdcIj57e2xvYWRpbmdNZXNzYWdlfX08L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc3Bpbm5lckxvYWRpbmc+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpbWdMb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nTG9hZGluZyAmJiAhem9vbVwiIGNsYXNzPVwidGV4dC1sb2FkaW5nXCI+e3tsb2FkaW5nTWVzc2FnZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImltZ0xvYWRpbmcgJiYgem9vbVwiIGNsYXNzPVwiem9vbS10ZXh0LWxvYWRpbmdcIj57e2xvYWRpbmdNZXNzYWdlfX08L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPHAtYnV0dG9uICpuZ0lmPVwic3RhY2tMb2FkaW5nIHx8IGltZ0xvYWRpbmdcIiBjbGFzcz1cImNhbmNlbC1sb2FkaW5nIFwiIGxhYmVsPVwiQ2FuY2VsXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2FuY2VsTG9hZGluZygpXCI+XG4gICAgPC9wLWJ1dHRvbj5cbiAgPC9kaXY+XG4gIDwhLS0gVHJhbnNsdWNlbnQgXCJzaGFycGVuaW5nXCIgb3ZlcmxheSBzaG93biBhZnRlciB0aGUgc21hbGwtdGllciBwcmV2aWV3IGlzXG4gICAgICAgb24gc2NyZWVuIHdoaWxlIHRoZSBsYXJnZS10aWVyIHJlbmRlciBpcyBzdGlsbCBsb2FkaW5nIGluIHRoZVxuICAgICAgIGJhY2tncm91bmQuIExldHMgdGhlIHVzZXIgc2VlIHRoZSBibHVycnkgaW1hZ2UgdW5kZXJuZWF0aCBidXQgbWFrZXNcbiAgICAgICBpdCBjbGVhciBzb21ldGhpbmcgaXMgc3RpbGwgbG9hZGluZyBzbyB0aGV5IGRvbid0IG1pc3Rha2UgdGhlXG4gICAgICAgbG93LXJlcyByZW5kZXIgZm9yIHRoZSBmaW5hbCBpbWFnZS4gLS0+XG4gIDxkaXYgKm5nSWY9XCJzaGFycGVuaW5nICYmICFpbWdMb2FkaW5nICYmICFzdGFja0xvYWRpbmcgJiYgIWlzQ2FjaGluZ1wiIGlkPVwic2hhcnBlbmluZy1vdmVybGF5XCI+XG4gICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPlNoYXJwZW5pbmcgcHJldmlldy4uLjwvc3Bhbj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuXG48IS0tIEZsb2F0aW5nLCBkcmFnZ2FibGUgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQuIFNob3duIGluIExJTkUgbW9kZTsgdGhlIGNoYXJ0XG4gICAgIHVwZGF0ZXMgbGl2ZSBhcyB0aGUgbGluZSBST0kgb24gdGhlIGltYWdlIGlzIG1vdmVkLiBLZXB0IE9VVFNJREUgI3Bsb3QgYW5kXG4gICAgIHBvc2l0aW9uZWQgZml4ZWQgc28gaXQgZmxvYXRzIG92ZXIgdGhlIHdob2xlIHBhZ2UgKG5vdCBjbGlwcGVkIHRvIHRoZVxuICAgICBkaWFncmFtL2NhbnZhcyBhcmVhKS4gLS0+XG48ZGl2ICpuZ0lmPVwiaGFzUHJvZmlsZXNcIiBjbGFzcz1cImludGVuc2l0eS1wYW5lbFwiXG4gICAgIFtzdHlsZS5sZWZ0LnB4XT1cInByb2ZpbGVQYW5lbFBvcy54XCIgW3N0eWxlLnRvcC5weF09XCJwcm9maWxlUGFuZWxQb3MueVwiPlxuICA8ZGl2IGNsYXNzPVwiaW50ZW5zaXR5LXBhbmVsLWhlYWRlclwiIChtb3VzZWRvd24pPVwib25Qcm9maWxlUGFuZWxEcmFnU3RhcnQoJGV2ZW50KVwiPlxuICAgIDxzcGFuPkludGVuc2l0eSBwcm9maWxlPC9zcGFuPlxuICAgIDxpIGNsYXNzPVwicGkgcGktYXJyb3dzLWFsdFwiPjwvaT5cbiAgPC9kaXY+XG4gIDxkaXYgW2lkXT1cImludGVuc2l0eUluc2V0RGl2XCIgY2xhc3M9XCJpbnRlbnNpdHktcGFuZWwtcGxvdFwiPjwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gQ2hhbm5lbHMgJiBIaXN0b2dyYW06IG5vbi1tb2RhbCBmbG9hdGluZyBkaWFsb2cgb3BlbmVkIGZyb20gdGhlIHRvb2xiYXIuIC0tPlxuPGNoYW5uZWwtaGlzdG9ncmFtIFsodmlzaWJsZSldPVwic2hvd0NoYW5uZWxIaXN0b2dyYW1cIj48L2NoYW5uZWwtaGlzdG9ncmFtPlxuXG48IS0tIFJlZ2lvbiBFZGl0b3I6IG5vbi1tb2RhbCwgZHJhZ2dhYmxlLCByZXNpemFibGUgZmxvYXRpbmcgZGlhbG9nIG9wZW5lZCBmcm9tXG4gICAgIHRoZSB0b29sYmFyIChmb3JtZXJseSB0aGUgcmlnaHQtcGFuZWwgUmVnaW9ucyB0YWIpLiBNb2RlbGVzcyBzbyByZWdpb25zIGNhblxuICAgICBzdGlsbCBiZSBkcmF3bi9zZWxlY3RlZCBvbiB0aGUgcGxvdCB3aGlsZSBpdCdzIG9wZW47IHN0YXlzIGxpbmtlZCB0byB0aGlzXG4gICAgIHBsb3R0aW5nIGluc3RhbmNlIHZpYSB0aGUgcm9vdCBSZWdpb25TdG9yZSBzaW5nbGV0b24uIE9wZW5zIG92ZXIgdGhlIHJpZ2h0XG4gICAgIHNpZGUgb2YgdGhlIHZpZXcuIC0tPlxuPHAtZGlhbG9nIGhlYWRlcj1cIlJlZ2lvbiBFZGl0b3JcIiBbKHZpc2libGUpXT1cInNob3dSZWdpb25FZGl0b3JcIlxuICAgICAgICAgIFttb2RhbF09XCJmYWxzZVwiIFtyZXNpemFibGVdPVwidHJ1ZVwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgW21heGltaXphYmxlXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIiBwb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICBbc3R5bGVdPVwieyB3aWR0aDogcmVnaW9uRWRpdG9yV2lkdGgsIGhlaWdodDogJzg1dmgnIH1cIlxuICAgICAgICAgIFtjb250ZW50U3R5bGVdPVwieyBvdmVyZmxvdzogJ2F1dG8nIH1cIj5cbiAgPHJlZ2lvbi1lZGl0b3I+PC9yZWdpb24tZWRpdG9yPlxuPC9wLWRpYWxvZz5cblxuPCEtLSBTaW1wbGlmeSAoRG91Z2xhc+KAk1BldWNrZXIpOiBjdXN0b20gcHgtdGhyZXNob2xkIHBpY2tlciBmb3IgdGhlIHNlbGVjdGVkXG4gICAgIHJlZ2lvbihzKSwgb3BlbmVkIGZyb20gdGhlIHJpZ2h0LWNsaWNrIFwiU2ltcGxpZnkg4pa4IEN1c3RvbeKAplwiIGFjdGlvbi4gLS0+XG48cC1kaWFsb2cgaGVhZGVyPVwiU2ltcGxpZnkgcmVnaW9uKHMpXCIgWyh2aXNpYmxlKV09XCJkaXNwbGF5U2ltcGxpZnlEaWFsb2dcIiBbbW9kYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgW3N0eWxlXT1cInt3aWR0aDogJzIycmVtJ31cIiBbZHJhZ2dhYmxlXT1cImZhbHNlXCIgW3Jlc2l6YWJsZV09XCJmYWxzZVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiPlxuICAgIDxzcGFuPkFsdGl0dWRlIHRocmVzaG9sZDogPGI+e3sgc2ltcGxpZnlUaHJlc2hvbGQgfX0gcHg8L2I+PC9zcGFuPlxuICAgIDxwLXNsaWRlciBbKG5nTW9kZWwpXT1cInNpbXBsaWZ5VGhyZXNob2xkXCIgW21pbl09XCIxXCIgW21heF09XCIyMFwiIFtzdGVwXT1cIjFcIj48L3Atc2xpZGVyPlxuICAgIDxzbWFsbD5WZXJ0aWNlcyB3aXRoaW4gdGhpcyBkaXN0YW5jZSBvZiB0aGUgbGluZSBiZXR3ZWVuIHRoZWlyIG5laWdoYm91cnMgYXJlIHJlbW92ZWQuPC9zbWFsbD5cbiAgPC9kaXY+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8cC1idXR0b24gbGFiZWw9XCJDYW5jZWxcIiBbdGV4dF09XCJ0cnVlXCIgKG9uQ2xpY2spPVwiZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gZmFsc2VcIj48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvbiBsYWJlbD1cIkFwcGx5XCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKG9uQ2xpY2spPVwic2ltcGxpZnlSZWdpb25zKHNpbXBsaWZ5VGhyZXNob2xkKVwiPjwvcC1idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuXG4iXX0=
|
|
1701
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Zpc3VhbGl6ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi92aXN1YWxpemVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQWlCLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWdDLFFBQVEsRUFBRSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6TSxPQUFPLEVBQW1CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBWSxjQUFjLEVBQVksTUFBTSxhQUFhLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsUUFBUSxFQUVSLFVBQVUsRUFDVix1QkFBdUIsR0FDeEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1B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LENBQUMsQ0FBQztJQUM5QyxDQUFDOzhHQTVzRFUsbUJBQW1CLGtCQTRQcEIsZ0JBQWdCLGFBQ2hCLFVBQVUsd1FBU0UsVUFBVTtrR0F0UXJCLG1CQUFtQiwyWEMzQ2hDLDZoVUE4TEE7OzJGRG5KYSxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBR0UsWUFBWTs7MEJBZ1FuQixNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ3ZCLE1BQU07MkJBQUMsVUFBVTs7MEJBU2pCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsVUFBVTt5Q0FqT2hDLFlBQVk7c0JBRFgsTUFBTTtnQkFHUCxnQkFBZ0I7c0JBRGYsTUFBTTtnQkFNSCxZQUFZO3NCQURmLEtBQUs7Z0JBY04sUUFBUTtzQkFEUCxLQUFLO2dCQTZDVyxXQUFXO3NCQUEzQixTQUFTO3VCQUFDLElBQUk7Z0JBMjhCZixTQUFTO3NCQURSLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBBZnRlclZpZXdJbml0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTWVudUl0ZW0sIE1lc3NhZ2VTZXJ2aWNlLCBUcmVlTm9kZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAncHJpbWVuZy9jb250ZXh0bWVudSc7XG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgSW1hZ2VTdGF0ZVBvcnQsIElNQUdFX1NUQVRFX1BPUlQgfSBmcm9tICcuL2NvbnRyYWN0cy9wb3J0cy9pbWFnZS1zdGF0ZS5wb3J0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlY3RhbmdsZSwgTXVsdGlQb2x5Z29uLCBSZWdpb24gfSBmcm9tICcuL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgUmVnaW9uT3BzU2VydmljZSB9IGZyb20gJy4vcmVnaW9uLW9wcy5zZXJ2aWNlJztcbmltcG9ydCB7IFZJWl9UT0FTVF9LRVksIFZJWl9BTEVSVF9UT0FTVF9LRVkgfSBmcm9tICcuL3RvYXN0LW91dGxldHMnO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVuZGVyT3JjaGVzdHJhdG9yLCBTbGljZVNjcnViYmVyIH0gZnJvbSAnLi9yZW5kZXItb3JjaGVzdHJhdG9yJztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIGlzTmFwYXJpM2QsXG4gIE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFLFxufSBmcm9tICcuL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHsgVmlld2VyRmVhdHVyZSB9IGZyb20gJy4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlLCBJVmlzdWFsaXplciwgVklTVUFMSVpFUiB9IGZyb20gJy4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgU0FNX01PREVMUywgZ2V0RGVmYXVsdFNhbU1vZGVsSWQsIGlzU2FtTW9kZWxSZWFkeSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLW1vZGVsLXJlZ2lzdHJ5JztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVBvaW50VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25Ub29sTW9kZSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IFRvb2xiYXJUb29sVmlzaWJpbGl0eSwgQUxMX1RPT0xCQVJfVE9PTFMgfSBmcm9tICcuL2NvbnRyYWN0cy90b29sYmFyLWNvbmZpZyc7XG5pbXBvcnQgeyBWSVpfQ09ORklHLCBWaXpDb25maWcgfSBmcm9tICcuL2NvbnRyYWN0cy92aXotY29uZmlnJztcblxuLyoqIFBlci1pbnN0YW5jZSBwbG90LWRpdiBpZCBzb3VyY2UuIFRoZSBtb3VudCBlbGVtZW50J3MgaWQgbXVzdCBiZSB1bmlxdWUgc28gdHdvXG4gKiAgbGl2ZSB2aWV3ZXJzIChlLmcuIHRoZSBtYWluIGRpYWdyYW0gKyBhIG1vZGFsIHByZXZpZXcpIGRvbid0IGNvbGxpZGUgb24gdGhlXG4gKiAgc2FtZSBET00gaWQg4oCUIGBnZXRFbGVtZW50QnlJZGAgd291bGQgb3RoZXJ3aXNlIHJldHVybiB3aGljaGV2ZXIgY2FtZSBmaXJzdC5cbiAqICBTdHlsaW5nIGhhbmdzIG9mZiB0aGUgYC52aXotcGxvdGAgY2xhc3MgaW5zdGVhZCBvZiB0aGUgaWQuICovXG5sZXQgcGxvdEluc3RhbmNlU2VxID0gMDtcblxuQENvbXBvbmVudCh7XG4gIC8vIENhbm9uaWNhbCBwcmVmaXhlZCBzZWxlY3RvciBmaXJzdDsgdGhlIHVucHJlZml4ZWQgb3JpZ2luYWwgaXMga2VwdCBhcyBhblxuICAvLyBhbGlhcyBmb3Igb25lIHJlbGVhc2UgKHByZS1wdWJsaWNhdGlvbiBiYWNrLWNvbXBhdCkuXG4gIHNlbGVjdG9yOiAndmlzdWFsaXplcicsXG4gIHRlbXBsYXRlVXJsOiAnLi92aXN1YWxpemVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmlzdWFsaXplci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBQZXItaW5zdGFuY2UgdG9hc3Qga2V5LiBNZXNzYWdlU2VydmljZSBpcyBhIGdsb2JhbCBzaW5nbGV0b24sIHNvIHR3byBsaXZlXG4gICAqICBgPHZpc3VhbGl6ZXI+YCBpbnN0YW5jZXMgKG1haW4gdmlld2VyICsgcGlwZWxpbmUtZGlhbG9nIHByZXZpZXcpIHNoYXJpbmdcbiAgICogIG9uZSBrZXkgd291bGQgZWFjaCByZW5kZXIgdGhlIHNhbWUgbWVzc2FnZSDigJQgYSBkdXBsaWNhdGUgdG9hc3QuIEEgdW5pcXVlXG4gICAqICBrZXkgcGVyIGluc3RhbmNlIHNjb3BlcyB0aGUgdG9hc3QgdG8gdGhlIGNvbXBvbmVudCB0aGF0IHJhaXNlZCBpdC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbmV4dFRvYXN0SWQgPSAwO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlicmFyeSBhbHNvIHJhaXNlcyBub3RpY2VzIGZyb20gcGxhY2VzIHRoYXQgaGF2ZSBubyBpbnN0YW5jZSBvZiB0aGVpclxuICAgKiBvd24gdG8ga2V5IGFnYWluc3Q6IHtAbGluayBQbG90bHlTZXJ2aWNlfSBpcyBgcHJvdmlkZWRJbjogJ3Jvb3QnYCwgYW5kIHRoZVxuICAgKiByZWdpb24gZWRpdG9yIGlzIGEgY2hpbGQgZGlhbG9nLiBUaG9zZSB1c2UgdGhlIGZpeGVkXG4gICAqIHtAbGluayBWSVpfVE9BU1RfS0VZfSAvIHtAbGluayBWSVpfQUxFUlRfVE9BU1RfS0VZfSBvdXRsZXRzLlxuICAgKlxuICAgKiBGb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBwZXItaW5zdGFuY2Uga2V5IGFib3ZlIGV4aXN0cywgZXhhY3RseSBPTkUgbW91bnRlZFxuICAgKiB2aXN1YWxpemVyIG1heSByZW5kZXIgdGhvc2Ugc2hhcmVkIG91dGxldHMg4oCUIG90aGVyd2lzZSBhIG1lc3NhZ2UgZnJvbSB0aGVcbiAgICogcm9vdCBzZXJ2aWNlIHdvdWxkIGJlIHNob3duIG9uY2UgcGVyIGxpdmUgdmlld2VyIChqaXQtdWkgcnVucyBhIG1haW4gdmlld1xuICAgKiBhbmQgYSBwaXBlbGluZS1wcmV2aWV3IGF0IHRoZSBzYW1lIHRpbWUpLiBUaGUgZmlyc3QgdG8gaW5pdCBjbGFpbXMgdGhlbSBhbmRcbiAgICogcmVsZWFzZXMgb24gZGVzdHJveSwgc28gdGhlIHN1cnZpdmluZyB2aWV3ZXIgcGlja3MgdGhlbSB1cC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxpdmVJbnN0YW5jZXMgPSBuZXcgU2V0PFZpc3VhbGl6ZXJDb21wb25lbnQ+KCk7XG4gIHJlYWRvbmx5IHZpelRvYXN0S2V5ID0gVklaX1RPQVNUX0tFWTtcbiAgcmVhZG9ubHkgdml6QWxlcnRUb2FzdEtleSA9IFZJWl9BTEVSVF9UT0FTVF9LRVk7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaW5zdGFuY2UgcmVuZGVycyB0aGUgc2hhcmVkIG91dGxldHMuIFRoZSBvd25lciBpcyBzaW1wbHkgdGhlXG4gICAqIG9sZGVzdCBsaXZlIHZpc3VhbGl6ZXIg4oCUIGEgYFNldGAgaXRlcmF0ZXMgaW4gaW5zZXJ0aW9uIG9yZGVyLCBzbyB3aGVuIHRoZVxuICAgKiBvd25lciBpcyBkZXN0cm95ZWQgdGhlIG5leHQgb25lIHRha2VzIG92ZXIgb24gaXRzIGZvbGxvd2luZyBjaGFuZ2UtZGV0ZWN0aW9uXG4gICAqIHBhc3MuIFRyYWNraW5nIGEgc2V0IHJhdGhlciB0aGFuIGEgc2luZ2xlIG93bmVyIG1hdHRlcnM6IHdpdGggYSBsb25lXG4gICAqIGBvd25lcmAgcmVmZXJlbmNlLCB0ZWFyaW5nIGRvd24gdGhlIG93bmVyIHdoaWxlIGEgc2libGluZyB3YXMgYWxyZWFkeVxuICAgKiBpbml0aWFsaXNlZCB3b3VsZCBsZWF2ZSBub2JvZHkgcmVuZGVyaW5nIHRoZSBvdXRsZXRzLCBhbmQgZXZlcnkgbm90aWNlIGZyb21cbiAgICogdGhlIHJvb3Qgc2VydmljZSB3b3VsZCBzaWxlbnRseSB2YW5pc2ggYWdhaW4uXG4gICAqL1xuICBnZXQgb3duc1NoYXJlZFRvYXN0cygpOiBib29sZWFuIHtcbiAgICBjb25zdCBvbGRlc3QgPSBWaXN1YWxpemVyQ29tcG9uZW50LmxpdmVJbnN0YW5jZXMudmFsdWVzKCkubmV4dCgpO1xuICAgIHJldHVybiAhb2xkZXN0LmRvbmUgJiYgb2xkZXN0LnZhbHVlID09PSB0aGlzO1xuICB9XG5cbiAgQE91dHB1dCgpXG4gIGlzU3RhY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuICBAT3V0cHV0KClcbiAgaXNHcmF5c2NhbGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuXG4gIC8qKiBXaGljaCB0b29sYmFyIGdyb3VwcyB0byBzaG93LiBBIHBhcnRpYWwgb3ZlcnJpZGUgbWVyZ2VzIG92ZXIgdGhlIGZ1bGwgc2V0LFxuICAgKiAgc28gYHsgc3BlY2lhbFRvb2xzOiBmYWxzZSB9YCBoaWRlcyBvbmx5IHRoYXQgZ3JvdXAuIERlZmF1bHRzIHRvIGV2ZXJ5dGhpbmcuICovXG4gIEBJbnB1dCgpXG4gIHNldCB0b29sYmFyVG9vbHModjogVG9vbGJhclRvb2xWaXNpYmlsaXR5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdG9vbGJhclRvb2xzID0geyAuLi5BTExfVE9PTEJBUl9UT09MUywgLi4uKHYgPz8ge30pIH07XG4gIH1cblxuICBnZXQgdG9vbGJhclRvb2xzKCk6IFJlcXVpcmVkPFRvb2xiYXJUb29sVmlzaWJpbGl0eT4ge1xuICAgIHJldHVybiB0aGlzLl90b29sYmFyVG9vbHM7XG4gIH1cbiAgcHJpdmF0ZSBfdG9vbGJhclRvb2xzOiBSZXF1aXJlZDxUb29sYmFyVG9vbFZpc2liaWxpdHk+ID0gQUxMX1RPT0xCQVJfVE9PTFM7XG5cbiAgLyoqIEV4cG9zZSB0ZXN0LW9ubHkgcGxvdCBtb2RlcyBpbiB0aGUgc2VsZWN0b3IgKGUuZy4gdGhlIG5hcGFyaSBgSW1hZ2VgXG4gICAqICBtb2RlLCBvdGhlcndpc2UgaGlkZGVuKS4gVGhlIGhvc3QgYXBwIHNldHMgdGhpcyBmcm9tIGEgYD90ZXN0PTFgIFVSTFxuICAgKiAgdG9nZ2xlLiBPZmYgYnkgZGVmYXVsdCwgc28gcHJvZHVjdGlvbiB1c2VycyBuZXZlciBzZWUgdGhlbS4gKi9cbiAgQElucHV0KClcbiAgdGVzdE1vZGUgPSBmYWxzZTtcblxuICAvKiogSW1hZ2Utc21vb3RoaW5nIHN0YXRlIGZvciB0aGUgdG9vbGJhcidzIFNtb290aGVuIHRvZ2dsZSAoT1NEIG9ubHkpLlxuICAgKiAgRGVmYXVsdHMgdG8gYGZhbHNlYCBzbyBPU0Qgc2hvd3MgcmF3IHBpeGVscyAobmVhcmVzdC1uZWlnaGJvdXIpLiAqL1xuICBpbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgbG9hZGluZ01lc3NhZ2UgPSAnTG9hZGluZyBpbWFnZS4uLic7XG4gIHpvb20gPSBmYWxzZTtcbiAgZmlsZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBsb2FkZWRGaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpbWFnZUluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSB1bnN1YiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcHJldmlld1N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwdWJsaWMgc3RhY2tMb2FkaW5nID0gZmFsc2U7XG4gIHB1YmxpYyBpbWdMb2FkaW5nID0gZmFsc2U7XG4gIHB1YmxpYyBsb2FkaW5nUGVyY2VudGFnZSA9IDA7XG4gIC8vIE5vbi1udWxsICgwLi4xMDApIHdoaWxlIGppdC1zZXJ2aWNlIGlzIGNvcHlpbmcgdGhlIHNvdXJjZSBmaWxlIGludG8gdGhlXG4gIC8vIGxvY2FsIGNhY2hlIFBWQyBvbiBmaXJzdCBjbGljay4gV2hlbiBzZXQsIHRoZSBsb2FkaW5nIG92ZXJsYXkgc3dhcHMgdGhlXG4gIC8vIHNwaW5uZXIgZm9yIGEgZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgYmFyIHdpdGggYSBcIkNhY2hpbmcgaW1hZ2VcIiBtZXNzYWdlLlxuICBwdWJsaWMgY2FjaGVQcm9ncmVzczogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8vIFRydWUgYmV0d2VlbiB0aGUgc21hbGwtdGllciByZW5kZXIgbGFuZGluZyBhbmQgdGhlIGxhcmdlLXRpZXIgcmVuZGVyXG4gIC8vIGxhbmRpbmcgaW4gdGhlIG11bHRpLXRpZXIgcmVuZGVyaW5nIHBhdGguIFRoZSB0ZW1wbGF0ZSB1c2VzIHRoaXMgdG9cbiAgLy8gb3ZlcmxheSBhIHRyYW5zbHVjZW50IHNwaW5uZXIgb24gdG9wIG9mIHRoZSBibHVycnkgc21hbGwtdGllciBpbWFnZSBzb1xuICAvLyB0aGUgdXNlciBkb2Vzbid0IG1pc3Rha2UgaXQgZm9yIHRoZSBmaW5hbCBwcmV2aWV3LlxuICBwdWJsaWMgc2hhcnBlbmluZyA9IGZhbHNlO1xuICAvKiogQSBqaXQtc2VydmljZSBjYWNoZSBjb3B5IGlzIGFjdGl2ZWx5IGluIHByb2dyZXNzIChkZXRlcm1pbmF0ZSAwLi45OSkuIERyaXZlcyB0aGUgY2FjaGVcbiAgICogIHByb2dyZXNzIGJhciBpbmRlcGVuZGVudGx5IG9mIGBpbWdMb2FkaW5nYCBzbyB0aGUgYmFyIGNhbid0IGJlIGRyb3BwZWQg4oCUIG9yIG1hc2tlZCBieSB0aGVcbiAgICogIFwiU2hhcnBlbmluZyBwcmV2aWV3Li4uXCIgb3ZlcmxheSDigJQgbWlkLWRvd25sb2FkIGlmIHRoZSBsb2FkaW5nIGZsYWcgZmxpcHMgZWFybHkuICovXG4gIGdldCBpc0NhY2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVQcm9ncmVzcyAhPT0gbnVsbCAmJiB0aGlzLmNhY2hlUHJvZ3Jlc3MgPCAxMDA7XG4gIH1cbiAgcHJpdmF0ZSBydW5uaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1vbm90b25pYyByZW5kZXIgZ2VuZXJhdGlvbi4gQnVtcGVkIHdoZW4gYSByZW5kZXIgc3RhcnRzLCBzbyBhIHJlbmRlciB0aGF0XG4gICAqIGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBpbWFnZSBjYW4gYmUgcmVjb2duaXNlZCBhbmQgbWFkZSBpbmVydDogaXRzXG4gICAqIGNhbGxiYWNrcyByZXR1cm4gZWFybHkgaW5zdGVhZCBvZiBwYWludGluZywgY2xlYXJpbmcgYHJ1bm5pbmdgLCByZWxlYXNpbmdcbiAgICogdGhlIG5ld2VyIHJlbmRlcidzIG92ZXJsYXksIG9yIGFwcGx5aW5nIGl0cyBST0lzLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJUb2tlbiA9IDA7XG4gIHB1YmxpYyB6SW5kZXggPSAwO1xuICBwdWJsaWMgbWF4SW5kZXggPSAwO1xuXG4gIEBWaWV3Q2hpbGQoJ2NtJykgY29udGV4dE1lbnUhOiBDb250ZXh0TWVudTtcbiAgY29udGV4dE1lbnVJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuXG4gIGFjdGl2ZURyYWdNb2RlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogV2hldGhlciBhIHJlZ2lvbiBhY3Rpb24gaXMgYXZhaWxhYmxlIHRvIHVuZG8gKGppdC11aSM4NSkuIE1pcnJvcnMgdGhlXG4gICAqICBzaGFyZWQgUmVnaW9uU3RvcmUncyBoaXN0b3J5IGRlcHRoOyBkcml2ZXMgdGhlIHRvb2xiYXIgVW5kbyBidXR0b24uICovXG4gIGNhblVuZG9SZWdpb24gPSBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgYW4gdW5kb25lIHJlZ2lvbiBhY3Rpb24gaXMgYXZhaWxhYmxlIHRvIHJlZG8gKGppdC11aSM4NSkuICovXG4gIGNhblJlZG9SZWdpb24gPSBmYWxzZTtcblxuICAvKiogQ3VzdG9tLXRocmVzaG9sZCBTaW1wbGlmeSBkaWFsb2cgKGppdC11aSM4NSkuICovXG4gIGRpc3BsYXlTaW1wbGlmeURpYWxvZyA9IGZhbHNlO1xuICBzaW1wbGlmeVRocmVzaG9sZCA9IDM7XG4gIC8qKiBDdXJyZW50IHJlZ2lvbiBzZWxlY3Rpb24gKGFycmF5IGluZGljZXMpIOKAlCBtaXJyb3JlZCBmcm9tIHRoZSBzdG9yZSBzbyB0aGVcbiAgICogIGNvbnRleHQtbWVudSByZWdpb24gYWN0aW9ucyBjYW4gcmVhZCBpdCBzeW5jaHJvbm91c2x5IChqaXQtdWkjODUpLiAqL1xuICBwcml2YXRlIHNlbGVjdGVkSW5kaWNlczogbnVtYmVyW10gPSBbXTtcblxuICAvKiogV2FuZCBzZW5zaXRpdml0eSDigJQgaGlnaGVyID0gc3RyaWN0ZXIgKHNtYWxsZXIgc2VsZWN0aW9uKS4gTWF0Y2hlcyBRdVBhdGggZGVmYXVsdC4gKi9cbiAgd2FuZFNlbnNpdGl2aXR5ID0gMi4wO1xuICAvKiogQnJ1c2ggZGlhbWV0ZXIgaW4gaW1hZ2UtcGl4ZWwgY29vcmRpbmF0ZXMgKGRyaXZlcyB0aGUgcGFpbnRlZCBkaXNjIHNpemUpLiAqL1xuICBicnVzaFNpemUgPSA0MDtcbiAgLyoqIFNBTSBtb2RlbCBwaWNrZXIgb3B0aW9ucyArIGN1cnJlbnQgc2VsZWN0aW9uIChqaXQtdWkjOTAgUDEpLiBPbmx5IG1vZGVsc1xuICAgKiAgd2l0aCBhIGhvc3RlZCBPTk5YIHBhaXIgKGNvbmZpZ3VyZWQgdmlhIHNldFNhbU1vZGVsVXJscyBhdCBhcHAgaW5pdCkgYXJlXG4gICAqICBvZmZlcmVkLCBzbyB0aGUgcGlja2VyIGNhbid0IHNlbGVjdCBhIG1vZGVsIHRoYXQgY2FuJ3QgcnVuLiAqL1xuICBzYW1Nb2RlbHMgPSBTQU1fTU9ERUxTLmZpbHRlcihpc1NhbU1vZGVsUmVhZHkpLm1hcCgobSkgPT4gKHsgaWQ6IG0uaWQsIGxhYmVsOiBtLmxhYmVsIH0pKTtcbiAgc2FtTW9kZWxJZCA9IGdldERlZmF1bHRTYW1Nb2RlbElkKCk7XG4gIC8qKiBTQU0gZG93bmxvYWQvc2VnbWVudCB0b2FzdCBzdGF0ZSAoYm91bmQgYnkgdGhlIGBzYW1gIHAtdG9hc3QgdGVtcGxhdGUpLiAqL1xuICBzYW1TdGF0dXMgPSAnJztcbiAgc2FtUHJvZ3Jlc3MgPSAwOyAvLyAwLi4xMDAsIGVuY29kZXIgZG93bmxvYWRcbiAgc2FtRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgc2FtQnVzeSA9IGZhbHNlOyAvLyBhbnkgU0FNIHdvcmsgaW4gZmxpZ2h0IChkcml2ZXMgdGhlIGluZGV0ZXJtaW5hdGUgc3Bpbm5lcilcbiAgLyoqIFdoZXRoZXIgdGhlIHNoYXJlZCBgc2FtYCB0b2FzdCBpcyBjdXJyZW50bHkgc2hvd24gKGF2b2lkcyBzdGFja2luZyBpdCBvblxuICAgKiAgZXZlcnkgcG9pbnQgY2xpY2ssIHdoaWNoIHJlLXJ1bnMgaW5mZXJlbmNlKS4gKi9cbiAgcHJpdmF0ZSBzYW1Ub2FzdFNob3duID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgc2FtVG9hc3RLZXkgPSBgc2FtLSR7VmlzdWFsaXplckNvbXBvbmVudC5uZXh0VG9hc3RJZCsrfWA7XG4gIC8qKlxuICAgKiBPdXRsZXQgZm9yIHRoZSBsaWJyYXJ5J3Mgb3duIHJlc3VsdC9lcnJvciBub3RpY2VzLlxuICAgKlxuICAgKiBQcmltZU5HIHJvdXRlcyBhIG1lc3NhZ2UgdG8gYSBgPHAtdG9hc3Q+YCBvbmx5IHdoZW4gdGhlIGtleXMgbWF0Y2gg4oCUIGFcbiAgICoga2V5bGVzcyBtZXNzYWdlIHJlYWNoZXMgYSBrZXlsZXNzIHRvYXN0IGFuZCBub3RoaW5nIGVsc2UuIFRoZXNlIG5vdGljZXMgdXNlZFxuICAgKiB0byBiZSBlbWl0dGVkIHdpdGggbm8ga2V5LCBzbyB0aGV5IHJlbmRlcmVkIG9ubHkgaW4gaG9zdHMgdGhhdCBoYXBwZW4gdG9cbiAgICogbW91bnQgYSBiYXJlIGA8cC10b2FzdD5gIChqaXQtdWkgZG9lcywgaW4gaXRzIGZpbGUtdHJlZSBjb21wb25lbnQpLiBFdmVyeVxuICAgKiBvdGhlciBob3N0IOKAlCBpbmNsdWRpbmcgdGhpcyByZXBvJ3Mgb3duIGJyb3dzZXIgZXhhbXBsZSDigJQgZHJvcHBlZCB0aGVtXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYWRlIGEgZmFpbGVkIG9yIG5vLW9wIHNlZ21lbnRhdGlvbiBsb29rIGxpa2UgYSBkZWFkIGJ1dHRvbjpcbiAgICogdGhlIHN0aWNreSBwcm9ncmVzcyB0b2FzdCBpcyBjbGVhcmVkIGluIHRoZSBzYW1lIHRpY2sgYnkgaGlkZVNhbVRvYXN0LCBhbmRcbiAgICogdGhlIG1lc3NhZ2UgZXhwbGFpbmluZyB3aHkgbmV2ZXIgYXBwZWFyZWQgYW55d2hlcmUuXG4gICAqXG4gICAqIEtleWVkIHRvIHRoaXMgY29tcG9uZW50IGluc3RhbmNlIHNvIHRoZSBsaWJyYXJ5IHJlbmRlcnMgaXRzIG93biBvdXRsZXQgYW5kXG4gICAqIGlzIG5vdCBkZXBlbmRlbnQgb24gaG9zdCBtYXJrdXAuIERlbGliZXJhdGVseSBOT1QgdGhlIHN0aWNreSB0b2FzdCdzIGtleTpcbiAgICoge0BsaW5rIGhpZGVTYW1Ub2FzdH0gY2xlYXJzIHRoYXQga2V5IGluIHRoZSBgZmluYWxseWAsIHdoaWNoIHdvdWxkIHdpcGUgdGhlXG4gICAqIHJlc3VsdCB0aGUgbW9tZW50IGl0IHdhcyBwb3N0ZWQsIGFuZCB0aGUgc3RpY2t5IHRvYXN0J3MgY3VzdG9tIHRlbXBsYXRlIGlzXG4gICAqIGJ1aWx0IGZvciB0aGUgbGl2ZSBzdGF0dXMgKyBwcm9ncmVzcyBiYXIuXG4gICAqL1xuICByZWFkb25seSByZXN1bHRUb2FzdEtleSA9IGAke3RoaXMuc2FtVG9hc3RLZXl9LXJlc3VsdGA7XG4gIC8qKiBTdWJzY3JpcHRpb25zIHRvIHRoZSBwb2ludCB0b29sJ3MgbGl2ZSBmZWVkcyAoc3RhdHVzL2J1c3kvZG93bmxvYWQpLiAqL1xuICBwcml2YXRlIHNhbVBvaW50U3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAvKiogVmVydGV4IGVyYXNlciByYWRpdXMgaW4gaW1hZ2UtcGl4ZWwgY29vcmRpbmF0ZXMuICovXG4gIHZlcnRleEVyYXNlclJhZGl1cyA9IDIwO1xuXG4gIGNvbG9ybWFwc09wdGlvbnMhOiBhbnk7XG4gIHJldmVyc2VzY2FsZSA9IGZhbHNlO1xuICBzZWxlY3RlZENvbG9ybWFwITogYW55O1xuICAvKiogQ2hhbm5lbHMgJiBIaXN0b2dyYW0gZGlhbG9nIHZpc2liaWxpdHkgKG9wZW5lZCBmcm9tIHRoZSB0b29sYmFyKS4gKi9cbiAgc2hvd0NoYW5uZWxIaXN0b2dyYW0gPSBmYWxzZTtcbiAgLyoqIFJlZ2lvbiBFZGl0b3IgZGlhbG9nIHZpc2liaWxpdHkgKG9wZW5lZCBmcm9tIHRoZSB0b29sYmFyKS4gKi9cbiAgc2hvd1JlZ2lvbkVkaXRvciA9IGZhbHNlO1xuICAvKiogUmVnaW9uIEVkaXRvciBkaWFsb2cgd2lkdGguIE9uIG9wZW4gaXQgaXMgc2V0IHRvIHRoZSBjb25maWd1cmVkIGhvc3RcbiAgICogIGVsZW1lbnQncyBjdXJyZW50IHdpZHRoLCBvciDigJQgd2hlbiBubyBzZWxlY3RvciBpcyBjb25maWd1cmVkIC8gdGhlIGVsZW1lbnRcbiAgICogIGlzbid0IGZvdW5kIOKAlCB0byBhIHF1YXJ0ZXIgb2YgdGhlIHBhZ2UgKHNlZSBvcGVuUmVnaW9uRWRpdG9yKS4gKi9cbiAgcmVnaW9uRWRpdG9yV2lkdGggPSAnMjV2dyc7XG4gIHN0YWNrT3B0aW9ucyA9IFtcbiAgICB7IG5hbWU6ICdTaW5nbGUgaW1hZ2UnLCB2YWw6ICdmYWxzZScgfSxcbiAgICB7IG5hbWU6ICdTdGFjaycsIHZhbDogJ3RydWUnIH0sXG4gIF07XG4gIHNlbGVjdGVkU3RhY2tPcHRpb246IHsgbmFtZTogc3RyaW5nOyB2YWw6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0gdGhpcy5zdGFja09wdGlvbnNbMF07XG4gIHJlYWRvbmx5IHBsb3REaXZOYW1lID0gYHZpei1wbG90LSR7cGxvdEluc3RhbmNlU2VxKyt9YDtcbiAgcGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgaXNIZWF0bWFwID0gdHJ1ZTtcbiAgYWN0aXZlU3VyZmFjZTNkTW9kZSA9ICd0dXJudGFibGUnO1xuICAvKiogV2hldGhlciB0aGUgbmFwYXJpIDNEIGNvb3JkaW5hdGUtYXhlcyAvIHNjYWxlIGdpem1vIGlzIHNob3duICh2b2x1bWUvaXNvc3VyZmFjZSkuICovXG4gIGF4ZXNWaXNpYmxlID0gdHJ1ZTtcbiAgd2lyZWZyYW1lQWN0aXZlID0gZmFsc2U7XG4gIC8qKiBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yICgxID0gRnVsbCDigKYgOCA9IOKFmzsgZGVmYXVsdCDCvSk7IGNoYW5naW5nIGl0IHJlLXBsb3RzLiAqL1xuICByZXNvbHV0aW9uU2NhbGUgPSBOQVBBUklfREVGQVVMVF9ERUNJTUFURTtcblxuICAvKiogUGxvdCB0eXBlcyB0aGUgYWN0aXZlIGJhY2tlbmQgYWR2ZXJ0aXNlcyAoM0QgZ2F0ZWQgYnkgY2FwYWJpbGl0eSkuICovXG4gIHBsb3RUeXBlT3B0aW9uczogUGxvdFR5cGVEZXNjcmlwdG9yW10gPSBbXTtcbiAgc2VsZWN0ZWRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcblxuICAvKiogRmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgKExJTkUgbW9kZSkuICovXG4gIHJlYWRvbmx5IGludGVuc2l0eUluc2V0RGl2ID0gJ2ludGVuc2l0eS1pbnNldC1wbG90JztcbiAgcHJvZmlsZVBhbmVsUG9zID0geyB4OiAyMCwgeTogNzAgfTtcbiAgcHJpdmF0ZSBwcm9maWxlUGFuZWxEcmFnZ2luZyA9IGZhbHNlO1xuICBwcml2YXRlIHByb2ZpbGVQYW5lbFN0YXJ0ID0geyBteDogMCwgbXk6IDAsIHg6IDAsIHk6IDAgfTtcblxuICAvKiogVG9vbGJhciBkb2NraW5nOiBkb2NrZWQgYWNyb3NzIHRoZSB0b3AgYnkgZGVmYXVsdDsgZHJhZ2dpbmcgaXRzIGhhbmRsZVxuICAgKiAgZGV0YWNoZXMgaXQgaW50byBhIGZsb2F0aW5nLCBtb3ZhYmxlIHdpbmRvdyAoZnJlZXMgdGhlIHRvcCByb3cgZm9yIHRoZVxuICAgKiAgdmlzdWFsaXphdGlvbikuICovXG4gIHRvb2xiYXJGbG9hdGluZyA9IGZhbHNlO1xuICB0b29sYmFyUG9zID0geyB4OiA4LCB5OiA4IH07XG4gIHByaXZhdGUgdG9vbGJhckRyYWdnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgdG9vbGJhclN0YXJ0ID0geyBteDogMCwgbXk6IDAsIHg6IDAsIHk6IDAgfTtcbiAgcHJpdmF0ZSBsYXRlc3RQcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdID0gW107XG4gIC8qKiBEcml2ZXMgdGhlIGludGVuc2l0eSBpbnNldCBwYW5lbCdzIHZpc2liaWxpdHkg4oCUIHRydWUgd2hlbmV2ZXIgYW55XG4gICAqICBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIGV4aXN0cyAoaW5kZXBlbmRlbnQgb2YgdGhlIGN1cnJlbnQgcGxvdCB0eXBlKS4gKi9cbiAgaGFzUHJvZmlsZXMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbnRlbnNpdHlQcm9maWxlU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHZpZXdwb3J0Q2hhbmdlU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgcHJvZmlsZURyYWdVcExpc3RlbmVyPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBwcm9maWxlUmVzaXplTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKiBMSU5FIHBsb3QgdHlwZSBzaG93cyB0aGUgaW1hZ2UgKyBkcmFnZ2FibGUgbGluZSBST0kgKyBpbnRlbnNpdHkgaW5zZXQuICovXG4gIGdldCBpc1Byb2ZpbGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPT09IFBsb3RUeXBlLkxJTkU7XG4gIH1cblxuICAvKiogVHJ1ZSBmb3IgdGhlIEltYWdlIHBsb3QgdHlwZSwgd2hpY2ggcmVuZGVycyBhcyBhIG5hdGl2ZWx5IHBhbi96b29tLWFibGVcbiAgICogIHJhc3RlciDigJQgc28gdGhlIGJhY2tlbmQtYWdub3N0aWMgem9vbS9wYW4gdG9vbGJhciB0b29scyBhcmUgaGlkZGVuLiBUaGVcbiAgICogIGNvbXBvbmVudCBkcml2ZXMgdGhpcyBvZmYgdGhlIHBsb3QgdHlwZSwgbm90IHRoZSBhY3RpdmUgYmFja2VuZC4gKi9cbiAgZ2V0IGlzSW1hZ2VWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPT09IFBsb3RUeXBlLklNQUdFO1xuICB9XG5cbiAgLyoqIElzb3N1cmZhY2UgYmFuZCBhcyBhIDDigJMyNTUgc2xpZGVyIHBvc2l0aW9uLCBtYXBwZWQgb250byB0aGUgdm9sdW1lJ3MgcmVhbFxuICAgKiAgaW50ZW5zaXR5IHJhbmdlIGJ5IHRoZSByZW5kZXJlci4gRGVmYXVsdHMgdG8gdGhlIGZ1bGwgcmFuZ2UuICovXG4gIGlzb1JhbmdlOiBudW1iZXJbXSA9IFswLCAyNTVdO1xuXG4gIHBsb3RXaWR0aFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgaW1hZ2VMb2FkaW5nU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBpbWdMb2FkaW5nTWVzc2FnZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgaXNab29tU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBmaWxlbmFtZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgYXV0b3NjYWxlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgcGxvdENvbnRleHRNZW51TGlzdGVuZXI/OiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBrZXlkb3duTGlzdGVuZXI/OiAoZTogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSB3aGVlbExpc3RlbmVyPzogKGU6IFdoZWVsRXZlbnQpID0+IHZvaWQ7XG5cbiAgLyoqIERlYm91bmNlZCB6LXNsaWNlIHNjcnViYmluZyAoc2VlIFNsaWNlU2NydWJiZXIg4oCUIHJlZmFjdG9yaW5nIHBsYW4gU3RlcCA3KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzY3J1YmJlciA9IG5ldyBTbGljZVNjcnViYmVyKCh6KSA9PiB7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRaSW5kZXgoeik7XG4gICAgLy8gSW4gYSBwZXItc2xpY2Ugei1zdGFjayBzZXNzaW9uIHRoZSBzdG9yZSBzd2FwcyB0aGUgbGl2ZSByZWdpb24gc2V0IHRvIHRoaXNcbiAgICAvLyBzbGljZSAocHJlc2VydmluZyBlZGl0cyBtYWRlIG9uIHRoZSBwcmV2aW91cyBvbmUpOyBvdXRzaWRlIHN0YWNrIG1vZGUgdGhpc1xuICAgIC8vIGp1c3QgcmVjb3JkcyB0aGUgc2xpY2UsIGxlYXZpbmcgc2luZ2xlLXBsYW5lIHJlZ2lvbnMgdW50b3VjaGVkIChqaXQtdWkjOTMpLlxuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0RGlzcGxheVNsaWNlKHopO1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KElNQUdFX1NUQVRFX1BPUlQpIHByaXZhdGUgc3RhdGU6IEltYWdlU3RhdGVQb3J0LFxuICAgIEBJbmplY3QoVklTVUFMSVpFUikgcHVibGljIHBsb3RTZXJ2aWNlOiBJVmlzdWFsaXplcixcbiAgICBwdWJsaWMgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgc2Vzc2lvbjogVmlzdWFsaXplclN0b3JlLFxuICAgIHByaXZhdGUgc2FtVG9vbDogU2FtVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZWxsU2VnbWVudFRvb2w6IENlbGxTZWdtZW50VG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWdpb25PcHM6IFJlZ2lvbk9wc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChWSVpfQ09ORklHKSBwcml2YXRlIHZpekNvbmZpZz86IFZpekNvbmZpZyxcbiAgKSB7XG4gICAgdGhpcy5jb2xvcm1hcHNPcHRpb25zID0gcGxvdFNlcnZpY2UuZ2V0Q29sb3JtYXBPcHRpb25zKCk7XG4gICAgdGhpcy5jb21wdXRlUGxvdFR5cGVPcHRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxvdCB0eXBlcyBvZmZlcmVkIGluIHRoZSBzZWxlY3RvciBmb3IgdGhlIGN1cnJlbnQgaW1hZ2U6XG4gICAqICAtIE91dHNpZGUgKip0ZXN0IG1vZGUqKiwgb25seSB0aGUgY3VyYXRlZCBkZWZhdWx0IHNldCAoZGVzY3JpcHRvcnMgd2l0aCBhXG4gICAqICAgIGBwcm9kdWN0aW9uTGFiZWxgKSBpcyBvZmZlcmVkLCBzaG93biB1bmRlciBzdWZmaXgtZnJlZSBuYW1lcyDigJQgSW1hZ2UsXG4gICAqICAgIEhlYXRtYXAsIENvbnRvdXIgYW5kIHRoZSBuYXBhcmkgU3VyZmFjZSAvIFZvbHVtZSAvIElzb3N1cmZhY2UuIFRlc3QgbW9kZVxuICAgKiAgICBleHBvc2VzIGV2ZXJ5IGJhY2tlbmQncyB0eXBlIHVuZGVyIGl0cyBmdWxsIChiYWNrZW5kLXN1ZmZpeGVkKSBsYWJlbC5cbiAgICogIC0gM0QgdHlwZXMgaGlkZGVuIHdoZW4gdGhlIGJhY2tlbmQgY2FuJ3QgcmVuZGVyIGEgM0Qgc2NlbmUuXG4gICAqICAtIHN0YWNrLW9ubHkgdHlwZXMgKHZvbHVtZSwgaXNvc3VyZmFjZSkgaGlkZGVuIHVubGVzcyB0aGUgZmlsZSBpcyBhIHN0YWNrIOKAlFxuICAgKiAgICBhIHZvbHVtZSBuZWVkcyBtdWx0aXBsZSB6LXNsaWNlcy5cbiAgICogIC0gc2NhbGFyLWludGVuc2l0eSB0eXBlcyAoY29udG91ciwgc3VyZmFjZSwgaXNvc3VyZmFjZSkgaGlkZGVuIGZvciBSR0JcbiAgICogICAgaW1hZ2VzIOKAlCB0aGV5IG1hcCBhIHNpbmdsZSBpbnRlbnNpdHkgcGVyIHBpeGVsLiBJbWFnZSBhbmQgSGVhdG1hcCByZW5kZXJcbiAgICogICAgYW55IGltYWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlUGxvdFR5cGVPcHRpb25zKCkge1xuICAgIGNvbnN0IGNhcHMgPSB0aGlzLnBsb3RTZXJ2aWNlLmNhcGFiaWxpdGllcztcbiAgICBjb25zdCBpc1N0YWNrID0gISF0aGlzLmltYWdlSW5mbz8uaXNTdGFjaztcbiAgICBjb25zdCBpc0dyYXlzY2FsZSA9ICEhdGhpcy5pbWFnZUluZm8/LmlzR3JheXNjYWxlO1xuICAgIC8vIEEgbXVsdGljaGFubmVsIGltYWdlJ3MgYmFuZHMgYXJlIGVhY2ggc2luZ2xlLWJhbmQgKHNjYWxhciksIHNvIHRoZSBzY2FsYXJcbiAgICAvLyBwbG90IG1vZGVzIChIZWF0bWFwIC8gU3VyZmFjZSAvIFZvbHVtZSAvIElzb3N1cmZhY2UpIGFwcGx5IHBlciBjaGFubmVsIGV2ZW5cbiAgICAvLyB0aG91Z2ggdGhlIFJHQiBjb21wb3NpdGUgaXNuJ3QgZ3JheXNjYWxlIOKAlCBkb24ndCBnYXRlIHRoZW0gb3V0LlxuICAgIGNvbnN0IG0wID0gdGhpcy5pbWFnZUluZm8/LmltYWdlTWV0YT8uWzBdO1xuICAgIGNvbnN0IGlzTXVsdGljaGFubmVsID0gKG0wPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxICYmIChtMD8ucmdiQ2hhbm5lbHMgPz8gMSkgPCAzO1xuICAgIHRoaXMucGxvdFR5cGVPcHRpb25zID0gdGhpcy5wbG90U2VydmljZS5nZXRQbG90VHlwZURlc2NyaXB0b3JzKClcbiAgICAgIC5maWx0ZXIoKGQpID0+IHtcbiAgICAgICAgLy8gT3V0c2lkZSB0ZXN0IG1vZGUsIG9ubHkgdGhlIGN1cmF0ZWQgc2V0ICh0aG9zZSB3aXRoIGEgcHJvZHVjdGlvbkxhYmVsKVxuICAgICAgICAvLyBpcyBvZmZlcmVkOyB0ZXN0IG1vZGUgZXhwb3NlcyBldmVyeSBiYWNrZW5kJ3MgdHlwZS5cbiAgICAgICAgaWYgKCF0aGlzLnRlc3RNb2RlICYmICFkLnByb2R1Y3Rpb25MYWJlbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZC5kaW1lbnNpb25zID09PSAnM2QnICYmICFjYXBzLmhhcyhWaWV3ZXJGZWF0dXJlLlN1cmZhY2UzRCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGQucmVxdWlyZXNTdGFjayAmJiAhaXNTdGFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZC5yZXF1aXJlc0dyYXlzY2FsZSAmJiAhaXNHcmF5c2NhbGUgJiYgIWlzTXVsdGljaGFubmVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSlcbiAgICAgIC8vIERlZmF1bHQgc2VsZWN0b3Igc2hvd3MgdGhlIHN1ZmZpeC1mcmVlIHByb2R1Y3Rpb25MYWJlbDsgdGVzdCBtb2RlIGtlZXBzXG4gICAgICAvLyB0aGUgZnVsbCBiYWNrZW5kLXN1ZmZpeGVkIGxhYmVsIHNvIHNhbWUtbmFtZWQgbW9kZXMgc3RheSBkaXN0aW5ndWlzaGFibGUuXG4gICAgICAubWFwKChkKSA9PiAodGhpcy50ZXN0TW9kZSA/IGQgOiB7IC4uLmQsIGxhYmVsOiBkLnByb2R1Y3Rpb25MYWJlbCEgfSkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIFRoZSBjb25zdHJ1Y3RvciBjb21wdXRlcyB0aGUgb3B0aW9ucyB3aXRoIHRlc3RNb2RlIHN0aWxsIGF0IGl0cyBkZWZhdWx0O1xuICAgIC8vIHJlY29tcHV0ZSBvbmNlIHRoZSBob3N0IGJpbmRzIGl0IChhbmQgb24gYW55IGxhdGVyIGNoYW5nZSkgc28gdGhlIHNlbGVjdG9yXG4gICAgLy8gcmVmbGVjdHMgdGVzdCBtb2RlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgZm9yIGFuIGltYWdlIHRvIChyZSlsb2FkLlxuICAgIGlmIChjaGFuZ2VzWyd0ZXN0TW9kZSddKSB7XG4gICAgICB0aGlzLmNvbXB1dGVQbG90VHlwZU9wdGlvbnMoKTtcbiAgICAgIC8vIElmIHRlc3QgbW9kZSBpcyB0dXJuZWQgb2ZmIHdoaWxlIGEgdGVzdC1vbmx5IHR5cGUgKGUuZy4gTkFQQVJJX0lNQUdFKSBpc1xuICAgICAgLy8gYWN0aXZlLCB0aGF0IHR5cGUgaXMgbm8gbG9uZ2VyIG9mZmVyZWQg4oCUIGZhbGwgYmFjayB0byBJbWFnZS5cbiAgICAgIHRoaXMucmVjb25jaWxlU2VsZWN0ZWRQbG90VHlwZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBJZiB0aGUgYWN0aXZlIHBsb3QgdHlwZSBpcyBubyBsb25nZXIgaW4gdGhlIG9mZmVyZWQgb3B0aW9ucyAoZS5nLiB0ZXN0IG1vZGVcbiAgICogIHR1cm5lZCBvZmYgd2hpbGUgYSB0ZXN0LW9ubHkgdHlwZSB3YXMgYWN0aXZlLCBvciBhIHNjYWxhciB0eXBlIGNhcnJpZWQgb250b1xuICAgKiAgYW4gUkdCIGltYWdlKSwgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IDJEIEltYWdlIHZpZXcuICovXG4gIHByaXZhdGUgcmVjb25jaWxlU2VsZWN0ZWRQbG90VHlwZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGxvdFR5cGVPcHRpb25zLnNvbWUoKGQpID0+IGQudHlwZSA9PT0gdGhpcy5zZWxlY3RlZFBsb3RUeXBlKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gICAgICB0aGlzLnBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gICAgICB0aGlzLmlzSGVhdG1hcCA9IHRydWU7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKFBsb3RUeXBlLklNQUdFKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBKb2luIHRoZSBsaXZlIHNldDsgdGhlIG9sZGVzdCBtZW1iZXIgcmVuZGVycyB0aGUgc2hhcmVkIG5vdGljZSBvdXRsZXRzLlxuICAgIFZpc3VhbGl6ZXJDb21wb25lbnQubGl2ZUluc3RhbmNlcy5hZGQodGhpcyk7XG4gICAgdGhpcy5zdGF0ZS5zZXREaWFncmFtKHRoaXMpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2xvcm1hcCA9XG4gICAgICB0aGlzLmNvbG9ybWFwc09wdGlvbnNbMF0uY2hpbGRyZW4uZmluZCgoYzogYW55KSA9PiBjLmxhYmVsID09PSAnR3JleXMgSW52JykgPz9cbiAgICAgIHRoaXMuY29sb3JtYXBzT3B0aW9uc1swXS5jaGlsZHJlblswXTtcbiAgICB0aGlzLnN0YWNrT3B0aW9ucyA9IFtcbiAgICAgIHsgbmFtZTogJ1NpbmdsZSBpbWFnZScsIHZhbDogJ2ZhbHNlJyB9LFxuICAgICAgeyBuYW1lOiAnU3RhY2snLCB2YWw6ICd0cnVlJyB9LFxuICAgIF07XG4gICAgdGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uID0gdGhpcy5zdGFja09wdGlvbnNbMF07XG4gICAgdGhpcy5hdXRvc2NhbGVTdWJzY3JpcHRpb24gPSB0aGlzLnBsb3RTZXJ2aWNlLmdldEF1dG9zY2FsZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIHJlc2V0IHRoZSBpbWFnZSBtb2RlIHRvIHNpbmdsZSBpbWFnZVxuICAgICAgdGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uID0geyBuYW1lOiAnU2luZ2xlIGltYWdlJywgdmFsOiAnZmFsc2UnIH07XG4gICAgICB0aGlzLmFjdGl2ZURyYWdNb2RlID0gbnVsbDtcbiAgICAgIHRoaXMuc2Vzc2lvbi5zZXRBY3RpdmVUb29sKG51bGwpO1xuICAgIH0pO1xuICAgIHRoaXMuaW1hZ2VMb2FkaW5nU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5pc0ltYWdlTG9hZGluZyQoKS5zdWJzY3JpYmUoKGlzSW1hZ2VMb2FkaW5nKSA9PiB7XG4gICAgICB0aGlzLmltZ0xvYWRpbmcgPSBpc0ltYWdlTG9hZGluZztcbiAgICB9KTtcbiAgICAvLyBVbmRvIGF2YWlsYWJpbGl0eSAoaml0LXVpIzg1KTogdGhlIHNoYXJlZCBSZWdpb25TdG9yZSBlbWl0cyB3aGVuZXZlciBpdHNcbiAgICAvLyBoaXN0b3J5IGRlcHRoIGNoYW5nZXM7IGdyZXlzIG91dCB0aGUgdG9vbGJhciBVbmRvIGJ1dHRvbiBhY2NvcmRpbmdseS5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlXG4gICAgICAuZ2V0Q2FuVW5kbyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWIpKVxuICAgICAgLnN1YnNjcmliZSgoY2FuVW5kbykgPT4ge1xuICAgICAgICB0aGlzLmNhblVuZG9SZWdpb24gPSBjYW5VbmRvO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlXG4gICAgICAuZ2V0Q2FuUmVkbyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWIpKVxuICAgICAgLnN1YnNjcmliZSgoY2FuUmVkbykgPT4ge1xuICAgICAgICB0aGlzLmNhblJlZG9SZWdpb24gPSBjYW5SZWRvO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICAvLyBNaXJyb3IgdGhlIHJlZ2lvbiBzZWxlY3Rpb24gc28gdGhlIHJpZ2h0LWNsaWNrIGFjdGlvbiBncm91cCAoaml0LXVpIzg1KVxuICAgIC8vIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHkgd2hlbiB0aGUgbWVudSBpcyBidWlsdC5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlXG4gICAgICAuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3ViKSlcbiAgICAgIC5zdWJzY3JpYmUoKGluZGljZXMpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGljZXMgPSBpbmRpY2VzIHx8IFtdO1xuICAgICAgfSk7XG4gICAgLy8gSW50ZXJhY3RpdmUgcG9pbnQtcHJvbXB0IHNlZ21lbnRhdGlvbiBydW5zIGluc2lkZSB0aGUgcmVuZGVyZXIgb24gZWFjaFxuICAgIC8vIGNsaWNrOyBzdXJmYWNlIGl0cyBsaXZlIHN0YXR1cyArIGRvd25sb2FkIHByb2dyZXNzIGluIHRoZSBzaGFyZWQgYHNhbWBcbiAgICAvLyB0b2FzdCBzbyB0aGUgdXNlciBzZWVzIGl0IHdvcmtpbmcgKHRoZSBmaXJzdCBjbGljayBwdWxscyB0aGUgZW5jb2RlcikuXG4gICAgdGhpcy5zYW1Qb2ludFN1Yi5hZGQoXG4gICAgICB0aGlzLnNhbVBvaW50VG9vbC5wcm9ncmVzcyQuc3Vic2NyaWJlKChmKSA9PiB7XG4gICAgICAgIHRoaXMuc2FtRG93bmxvYWRpbmcgPSBmID49IDAgJiYgZiA8IDE7XG4gICAgICAgIGlmIChmID49IDApIHRoaXMuc2FtUHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgucm91bmQoZiAqIDEwMCkpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc2FtUG9pbnRTdWIuYWRkKFxuICAgICAgdGhpcy5zYW1Qb2ludFRvb2wuc3RhdHVzJC5zdWJzY3JpYmUoKG0pID0+IHtcbiAgICAgICAgdGhpcy5zYW1TdGF0dXMgPSBtO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc2FtUG9pbnRTdWIuYWRkKFxuICAgICAgdGhpcy5zYW1Qb2ludFRvb2wuYnVzeSQuc3Vic2NyaWJlKChidXN5KSA9PiB7XG4gICAgICAgIHRoaXMuc2FtQnVzeSA9IGJ1c3k7XG4gICAgICAgIGlmIChidXN5KSB0aGlzLnNob3dTYW1Ub2FzdCgnU0FNIHBvaW50IHNlZ21lbnRhdGlvbicpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKS5zdWJzY3JpYmUoKGxvYWRpbmdQcm9ncmVzcykgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nUGVyY2VudGFnZSA9IGxvYWRpbmdQcm9ncmVzcztcbiAgICB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmlzU3RhY2tMb2FkaW5nKCkuc3Vic2NyaWJlKChzdGFja0xvYWRpbmcpID0+IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nID0gc3RhY2tMb2FkaW5nO1xuICAgIH0pO1xuICAgIHRoaXMucGxvdFdpZHRoU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRQYW5lbFdpZHRoJCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlbGF5b3V0KCk7XG4gICAgICAvLyBUaGUgaW50ZW5zaXR5IGluc2V0IGlzIGEgc2VwYXJhdGUgUGxvdGx5IGNoYXJ0IGluIGEgZmxvYXRpbmcgcGFuZWw7IHJlZmxvd1xuICAgICAgLy8gaXQgdG8gaXRzIGN1cnJlbnQgc2l6ZSB3aGVuIHRoZSBjYW52YXMgcmVzaXplcywgZWxzZSBpdCBrZWVwcyB0aGUgc3RhbGVcbiAgICAgIC8vIHNpemUgYW5kIGJsYW5rcyBvdXQuIERlZmVyIGEgdGljayBzbyB0aGUgcGFuZWwgbGF5b3V0IGhhcyBzZXR0bGVkLlxuICAgICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbmRlckludGVuc2l0eUluc2V0KCksIDApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaW1nTG9hZGluZ01lc3NhZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmdldEltYWdlTG9hZGluZ01lc3NhZ2UkKCkuc3Vic2NyaWJlKChtZXNzYWdlKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmdNZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlXG4gICAgICAuZ2V0Q2FjaGVQcm9ncmVzcyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWIpKVxuICAgICAgLnN1YnNjcmliZSgocHJvZ3Jlc3MpID0+IHtcbiAgICAgICAgdGhpcy5jYWNoZVByb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgICB9KTtcbiAgICB0aGlzLmlzWm9vbVN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuaXNab29tJCgpLnN1YnNjcmliZSgoem9vbSkgPT4ge1xuICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICB9KTtcbiAgICB0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRGaWxlbmFtZSQoKS5zdWJzY3JpYmUoKGZpbGVuYW1lKSA9PiB7XG4gICAgICBpZiAoZmlsZW5hbWUpIHtcbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVuYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0Q29sb3JtYXAoKS5zdWJzY3JpYmUoKGNvbG9ybWFwKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29sb3JtYXAgPSBjb2xvcm1hcDtcbiAgICB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFJldmVyc2VTY2FsZSgpLnN1YnNjcmliZSgocmV2ZXJzZXNjYWxlKSA9PiB7XG4gICAgICB0aGlzLnJldmVyc2VzY2FsZSA9IHJldmVyc2VzY2FsZTtcbiAgICB9KTtcbiAgICB0aGlzLmludGVuc2l0eVByb2ZpbGVTdWIgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldEludGVuc2l0eVByb2ZpbGUkKCkuc3Vic2NyaWJlKChwcm9maWxlcykgPT4ge1xuICAgICAgdGhpcy5sYXRlc3RQcm9maWxlcyA9IHByb2ZpbGVzO1xuICAgICAgdGhpcy5oYXNQcm9maWxlcyA9IHByb2ZpbGVzLmxlbmd0aCA+IDA7XG4gICAgICAvLyBUaGUgcGFuZWwgZGl2IGlzIGJlaGluZCAqbmdJZj1cImhhc1Byb2ZpbGVzXCIuIGRldGVjdENoYW5nZXMoKSBtYXRlcmlhbGl6ZXNcbiAgICAgIC8vIGl0IHN5bmNocm9ub3VzbHkgKHRoZSBzdWJzY3JpcHRpb24gbWF5IGZpcmUgb3V0c2lkZSBBbmd1bGFyJ3Mgem9uZSDigJQgZS5nLlxuICAgICAgLy8gZnJvbSBhbiBPU0QgZHJhZyDigJQgc28gQ0Qgd291bGRuJ3QgcnVuIG9uIGl0cyBvd24pLiBUaGVuIHJlbmRlciBvbiB0aGUgbmV4dFxuICAgICAgLy8gYW5pbWF0aW9uIGZyYW1lLCBBRlRFUiB0aGUgYnJvd3NlciBsYXlzIHRoZSBwYW5lbCBvdXQ6IGEgc3luY2hyb25vdXMgZHJhd1xuICAgICAgLy8gaGl0cyBhIHplcm8tc2l6ZSBjb250YWluZXIgb24gZmlyc3QgY3JlYXRlIGFuZCBQbG90bHkga2VlcHMgdGhhdCBzaXplLCBzb1xuICAgICAgLy8gdGhlIGluc2V0IHN0YXlzIGJsYW5rIGFuZCBsaXZlIHVwZGF0ZXMgcmVkcmF3IGludG8gdGhlIHNhbWUgemVybyBib3guXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5yZW5kZXJJbnRlbnNpdHlJbnNldCgpKTtcbiAgICB9KTtcbiAgICAvLyBXaGVuIHRoZSBPU0QgdmlldyBzZXR0bGVzIGF0IGEgbmV3IHpvb20vcGFuLCByZS1zYW1wbGUgdGhlIGludGVuc2l0eSBsaW5lc1xuICAgIC8vIGZyb20gYSBjcm9wIG9mIHRoZSB2aXNpYmxlIHJlZ2lvbiBzbyB0aGUgaW5zZXQgcmVmbGVjdHMgdGhlIHpvb20tbGV2ZWxcbiAgICAvLyByZXNvbHV0aW9uIChQbG90bHkncyBvd24gaGlnaC1kZWYgem9vbSB1cGRhdGVzIHRoZSBzYW1wbGluZyBjYWNoZSBpbmxpbmUpLlxuICAgIHRoaXMudmlld3BvcnRDaGFuZ2VTdWIgPSB0aGlzLnBsb3RTZXJ2aWNlLmdldFZpZXdwb3J0Q2hhbmdlJCgpLnN1YnNjcmliZSgocm9pKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNQcm9maWxlcyAmJiB0aGlzLmlzSW1hZ2VWaWV3KSB7XG4gICAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHJvaS54LCByb2kueSwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCB0aGlzLnpJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wcmV2aWV3U3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRJbWFnZUluZm8kKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChpbWdJbmZvKSA9PiB7XG4gICAgICAgIGlmIChpbWdJbmZvKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZUluZm8gPSBpbWdJbmZvO1xuICAgICAgICAgIC8vIFN0YWNrLW9ubHkgcGxvdCB0eXBlcyAoaXNvc3VyZmFjZSwgc2NhdHRlcjNkKSBkZXBlbmQgb24gd2hldGhlciB0aGlzXG4gICAgICAgICAgLy8gZmlsZSBpcyBhIHN0YWNrIOKAlCByZWNvbXB1dGUgdGhlIHNlbGVjdG9yIG9wdGlvbnMuXG4gICAgICAgICAgdGhpcy5jb21wdXRlUGxvdFR5cGVPcHRpb25zKCk7XG4gICAgICAgICAgLy8gSWYgdGhlIGFjdGl2ZSBwbG90IHR5cGUgaXNuJ3QgdmFsaWQgZm9yIHRoaXMgaW1hZ2UgKGUuZy4gYSBzY2FsYXJcbiAgICAgICAgICAvLyB0eXBlIGxpa2UgQ29udG91ciBjYXJyaWVkIG92ZXIgdG8gYW4gUkdCIGltYWdlKSwgZmFsbCBiYWNrIHRvIEltYWdlLlxuICAgICAgICAgIHRoaXMucmVjb25jaWxlU2VsZWN0ZWRQbG90VHlwZSgpO1xuICAgICAgICAgIC8vIHJlc2V0IHN0YWNrIG9wdGlvbnMgc2VsZWN0aW9uXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFN0YWNrT3B0aW9uID0gaW1nSW5mby5zaG93U3RhY2sgPyB0aGlzLnN0YWNrT3B0aW9uc1sxXSA6IHRoaXMuc3RhY2tPcHRpb25zWzBdO1xuXG4gICAgICAgICAgdGhpcy5pc0dyYXlzY2FsZUV2ZW50LmVtaXQodGhpcy5pbWFnZUluZm8uaXNHcmF5c2NhbGUpO1xuICAgICAgICAgIHRoaXMuaXNTdGFja0V2ZW50LmVtaXQodGhpcy5pbWFnZUluZm8uaXNTdGFjayk7XG4gICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIGRlZmF1bHQgMkQgSW1hZ2UgdmlldyB3aGVuIGEgZGlmZmVyZW50IGltYWdlIGlzXG4gICAgICAgICAgLy8gc2VsZWN0ZWQgd2hpbGUgYSAzRCB0eXBlIGlzIGFjdGl2ZS5cbiAgICAgICAgICBpZiAoIXRoaXMuaXNIZWF0bWFwICYmIGltZ0luZm8uZmlsZU5hbWUgIT09IHRoaXMubG9hZGVkRmlsZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuaXNIZWF0bWFwID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9IFBsb3RUeXBlLklNQUdFO1xuICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZSh0aGlzLnBsb3RUeXBlKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZSA9ICd0dXJudGFibGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvYWRlZEZpbGVOYW1lID0gaW1nSW5mby5maWxlTmFtZTtcbiAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldEltYWdlTWV0YSh0aGlzLmltYWdlSW5mby5pbWFnZU1ldGEpO1xuICAgICAgICAgIGNvbnN0IHVybHMgPSBpbWdJbmZvLnVybHM7XG4gICAgICAgICAgLy8gQSBuZXdlciBpbWFnZSBBTFdBWVMgcHJlZW1wdHMgYW4gaW4tZmxpZ2h0IHJlbmRlci4gVGhpcyB3YXNcbiAgICAgICAgICAvLyBgaWYgKCF0aGlzLnJ1bm5pbmcpYCwgd2hpY2ggRFJPUFBFRCB0aGUgbmV3IGltYWdlIHdoaWxlIHRoZSBvbGQgb25lXG4gICAgICAgICAgLy8gZmluaXNoZWQ6IGlkZW50aXR5IGFib3ZlIGhhZCBhbHJlYWR5IGZsaXBwZWQgdG8gdGhlIG5ldyBmaWxlLCBzbyB0aGVcbiAgICAgICAgICAvLyBhcHAgcmVwb3J0ZWQgaW1hZ2UgQiBhcyBsb2FkZWQgd2hpbGUgaW1hZ2UgQSBzdGF5ZWQgb24gc2NyZWVuLiBXb3JzZSxcbiAgICAgICAgICAvLyBhIGNvbGQgaW1hZ2UgaG9sZHMgdGhlIHNsb3QgZm9yIGl0cyB3aG9sZSBzZXJ2ZXItc2lkZSBjYWNoZSBmaWxsLCBzb1xuICAgICAgICAgIC8vIGV2ZXJ5IGNsaWNrIGZvciAxLTIgbWludXRlcyB3YXMgZGlzY2FyZGVkIGFnYWluc3QgYSBibGFuayB2aWV3cG9ydFxuICAgICAgICAgIC8vIGFuZCBhIFwiTG9hZGluZyBpbWFnZS4uLlwiIG92ZXJsYXkgdGhhdCBuZXZlciByZXNvbHZlZC5cbiAgICAgICAgICBpZiAodXJscykge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSArK3RoaXMucmVuZGVyVG9rZW47XG4gICAgICAgICAgICBjb25zdCBpc0N1cnJlbnQgPSAoKSA9PiB0aGlzLnJlbmRlclRva2VuID09PSB0b2tlbjtcbiAgICAgICAgICAgIGlmICh0aGlzLnJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgcHJldmlvdXMgcmVuZGVyJ3MgZnJhbWUgc3RyZWFtaW5nIChuYXBhcmkgdm9sdW1lL3N1cmZhY2VcbiAgICAgICAgICAgICAgLy8gcHJlbG9hZCBrZWVwcyBmZXRjaGluZyBvdGhlcndpc2UpIGFuZCBjbGVhciBpdHMgc2hhcnBlbiBmbGFnLiBJdHNcbiAgICAgICAgICAgICAgLy8gY2FsbGJhY2tzIGFyZSBhbHJlYWR5IGluZXJ0IHZpYSB0aGUgdG9rZW4sIHNvIGl0IGNhbiBuZWl0aGVyIHBhaW50XG4gICAgICAgICAgICAgIC8vIG5vciByZWxlYXNlIHRoZSBvdmVybGF5IHRoaXMgcmVuZGVyIG5vdyBvd25zLlxuICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLmNhbmNlbExvYWRpbmc/LigpO1xuICAgICAgICAgICAgICB0aGlzLnNoYXJwZW5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGltYWdlIHNpemUg4oCUIG1lYXN1cmUgdGhlIHBsb3QgZGl2IGRpcmVjdGx5IHNvIHRoZSB0b29sYmFyIGhlaWdodCBpcyBleGNsdWRlZFxuICAgICAgICAgICAgY29uc3QgcGxvdERpdjogSFRNTEVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2TmFtZSk7XG4gICAgICAgICAgICBjb25zdCBzY3JlZW5IZWlnaHQgPSBwbG90RGl2Py5vZmZzZXRIZWlnaHQgfHwgNTAwO1xuICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmcgPSBpbWdJbmZvLmlzU3RhY2sgJiYgaW1nSW5mby5zaG93U3RhY2s7XG4gICAgICAgICAgICAvLyBzZXQgbWF4IGluZGV4IG9mIHN0YWNrIOKAlCBjb21wdXRlZCBiZWZvcmUgdXBkYXRlWkluZGV4IHNvIGFcbiAgICAgICAgICAgIC8vIGZyZXNoIHN0YWNrIChzaG9ydGVyIG9yIGxvbmdlciB0aGFuIHdoYXRldmVyIHdhcyBwcmV2aW91c2x5XG4gICAgICAgICAgICAvLyBsb2FkZWQpIGNsYW1wcyBhZ2FpbnN0IElUUyBib3VuZHMsIG5vdCB0aGUgc3RhbGUgb25lcy5cbiAgICAgICAgICAgIC8vIE9uZSBVUkwgcGVyIHNsaWNlICgwLWluZGV4ZWQpLCBzbyB0aGUgbGFzdCByZWFjaGFibGUgaW5kZXggaXNcbiAgICAgICAgICAgIC8vIGxlbmd0aC0xIOKAlCBlYXJsaWVyIGBsZW5ndGgtMmAgZHJvcHBlZCB0aGUgZmluYWwgc2xpY2UuXG4gICAgICAgICAgICB0aGlzLm1heEluZGV4ID0gdXJscy5sZW5ndGggPiAxID8gdXJscy5sZW5ndGggLSAxIDogMDtcbiAgICAgICAgICAgIC8vIE9uZS1zaG90IGhpbnQ6IGp1bXAgc3RyYWlnaHQgdG8gYSBzcGVjaWZpYyBzbGljZSAoZS5nLiB0aGVcbiAgICAgICAgICAgIC8vIGZpbGUgdGhlIHVzZXIgYWN0dWFsbHkgY2xpY2tlZCB3aXRoaW4gYSBudW1iZXJlZCBzZXJpZXMpLlxuICAgICAgICAgICAgLy8gQ29uc3VtZWQgaW1tZWRpYXRlbHkgc28gcmVkZWxpdmVyaW5nIHRoZSBzYW1lIEltYWdlSW5mbyBsYXRlclxuICAgICAgICAgICAgLy8gKGEgcGxvdC10eXBlIHN3aXRjaCwgcmVsb2FkQW5kUGxvdCkgZG9lc24ndCByZXNldCB0aGUgdXNlcidzXG4gICAgICAgICAgICAvLyBjdXJyZW50IHNjcnViIHBvc2l0aW9uIGJhY2sgdG8gaXQuXG4gICAgICAgICAgICBpZiAoaW1nSW5mby5pbml0aWFsWkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy56SW5kZXggPSBpbWdJbmZvLmluaXRpYWxaSW5kZXg7XG4gICAgICAgICAgICAgIGltZ0luZm8uaW5pdGlhbFpJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgemluZGV4IGlzIHdpdGhpbiBib3VuZHNcbiAgICAgICAgICAgIHRoaXMudXBkYXRlWkluZGV4KHVybHMpO1xuICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIE11bHRpLXRpZXIgcmVuZGVyaW5nIChzbWFsbCBibHVycnkgdGllciBmaXJzdCwgdGhlbiBzaGFycGVuIGluXG4gICAgICAgICAgICAvLyBwbGFjZSkg4oCUIHNlcXVlbmNpbmcgbGl2ZXMgaW4gUmVuZGVyT3JjaGVzdHJhdG9yOyB0aGlzIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gc3VwcGxpZXMgdGhlIHBoYXNlIHJlbmRlciBhbmQgb3ducyB0aGUgVUkgZmxhZ3MgdmlhIGNhbGxiYWNrcy5cbiAgICAgICAgICAgIC8vIDNEIHBsb3QgdHlwZXMgcmVuZGVyIHNpbmdsZS1wYXNzOiB0aGUgaW4tcGxhY2UgbGFyZ2UgcGFzcyBkb2Vzbid0XG4gICAgICAgICAgICAvLyByZWJ1aWxkIGEgM0QgZ2wtbWVzaCBpc29zdXJmYWNlLCBzbyB0aGUgc2hhcnBlbiBzdGVwIGJsYW5rZWQgaXQuXG4gICAgICAgICAgICBjb25zdCBoYXNTbWFsbFRpZXIgPVxuICAgICAgICAgICAgICB0aGlzLmlzSGVhdG1hcCAmJlxuICAgICAgICAgICAgICAoaW1nSW5mby5zbWFsbFVybHM/Lmxlbmd0aCA/PyAwKSA9PT0gdXJscy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgKGltZ0luZm8uc21hbGxVcmxzPy5sZW5ndGggPz8gMCkgPiAwO1xuICAgICAgICAgICAgY29uc3Qgc21hbGxJbWdJbmZvID0gaGFzU21hbGxUaWVyID8geyAuLi5pbWdJbmZvLCB1cmxzOiBpbWdJbmZvLnNtYWxsVXJscyBhcyBzdHJpbmdbXSB9IDogbnVsbDtcblxuICAgICAgICAgICAgLy8gRW50ZXIgcGVyLXNsaWNlIHN0YWNrIG1vZGUgd2l0aCB0aGUgZ2l2ZW4gc2xpY2XihpJyZWdpb25zIG1hcCBhbmRcbiAgICAgICAgICAgIC8vIHNlZWQgdGhlIFwicHJldmlvdXMgc2hhcGVzXCIgZnJvbSB0aGUgbm93LWxpdmUgc2xpY2UuIGVudGVyU3RhY2tNb2RlXG4gICAgICAgICAgICAvLyBtYWtlcyB6SW5kZXgncyBzbGljZSBsaXZlIGFuZCByZXNldHMgdW5kbyAoaml0LXVpIzkzKS5cbiAgICAgICAgICAgIGNvbnN0IGVudGVyU3RhY2sgPSAoXG4gICAgICAgICAgICAgIHNsaWNlczogTWFwPG51bWJlciwgUmVnaW9uW10+LFxuICAgICAgICAgICAgICBsYXlvdXQ6ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2UuZW50ZXJTdGFja01vZGUoc2xpY2VzLCB0aGlzLnpJbmRleCwgbGF5b3V0KTtcbiAgICAgICAgICAgICAgY29uc3Qgc2hhcGVzID0gdGhpcy5wbG90U2VydmljZVxuICAgICAgICAgICAgICAgIC5nZXRSZWdpb25zKClcbiAgICAgICAgICAgICAgICAubWFwKChyZWdpb24pID0+IHJlZ2lvbi5nZXRTaGFwZSh0aGlzLnBsb3RTZXJ2aWNlLmdldFNob3dTaGFwZUxhYmVsKCkpKTtcbiAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQcmV2aW91c1NoYXBlcyhzaGFwZXMpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgYXBwbHlSb2kgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEZvbGRlciBzdGFjazogYSBzdGFjayBvZiBzZWxmLWNvbnRhaW5lZCBwZXItc2xpY2UgZmlsZXNcbiAgICAgICAgICAgICAgLy8gKHRpbGVkID09PSBmYWxzZTsgc2VlIGxvYWRTZXJpZXNBc1N0YWNrKS4gRWFjaCBzbGljZS1maWxlIG1heVxuICAgICAgICAgICAgICAvLyBjYXJyeSBpdHMgb3duIHNpYmxpbmcgXCI8c3RlbT4uZ2VvanNvblwiIChyb2lKc29uU3Ryc1t6XSksIGJ1dCBhXG4gICAgICAgICAgICAgIC8vIGZyZXNoIGZvbGRlciB3aXRoIG5vbmUgeWV0IGxlYXZlcyByb2lKc29uU3RycyB1bmRlZmluZWQg4oCUIGtleVxuICAgICAgICAgICAgICAvLyBvZmYgYHRpbGVkID09PSBmYWxzZWAsIE5PVCByb2lKc29uU3Rycywgc28gYW4gdW5hbm5vdGF0ZWRcbiAgICAgICAgICAgICAgLy8gZm9sZGVyIHN0YWNrIHN0aWxsIGVudGVycyB0aGUgcGVyLXNsaWNlLWZpbGUgbGF5b3V0IChhbmQgc2F2ZXNcbiAgICAgICAgICAgICAgLy8gYmFjayBvbmUgZ2VvanNvbiBwZXIgc2xpY2UtZmlsZSkgcmF0aGVyIHRoYW4gZmFsbGluZyB0aHJvdWdoIHRvXG4gICAgICAgICAgICAgIC8vIHRoZSBzaW5nbGUtZmlsZSBjb21iaW5lZCBwYXRoIChqaXQtdWkjOTMpLlxuICAgICAgICAgICAgICBpZiAoaW1nSW5mby5pc1N0YWNrICYmIGltZ0luZm8udGlsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVyU2xpY2UgPSBpbWdJbmZvLnJvaUpzb25TdHJzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNsaWNlQ291bnQgPSBpbWdJbmZvLnVybHM/Lmxlbmd0aCA/PyBwZXJTbGljZT8ubGVuZ3RoID8/IDA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpY2VzID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgc2xpY2VDb3VudDsgeisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gcGVyU2xpY2U/Llt6XSA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgc2xpY2VzLnNldCh6LCBqc29uID8gdGhpcy5wbG90U2VydmljZS5pbXBvcnRSZWdpb25zKGpzb24pIDogW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbnRlclN0YWNrKHNsaWNlcywgJ3Blci1zbGljZS1maWxlJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNpbmdsZS1maWxlIHotc3RhY2s6IG9uZSBzaWJsaW5nIGdlb2pzb24gaG9sZGluZyBldmVyeSBzbGljZSdzXG4gICAgICAgICAgICAgIC8vIHJlZ2lvbnMgaW5kZXhlZCBieSBRdVBhdGgncyBnZW9tZXRyeS5wbGFuZS56LiBFbnRlciBwZXItc2xpY2VcbiAgICAgICAgICAgICAgLy8gbW9kZSAoc2F2aW5nIGJhY2sgb25lIGNvbWJpbmVkIHotaW5kZXhlZCBnZW9qc29uKSB3aGVuIHRoZVxuICAgICAgICAgICAgICAvLyBnZW9qc29uIGFjdHVhbGx5IGNhcnJpZXMgc2xpY2UgaW5kaWNlcywgb3Igd2hlbiB0aGVyZSdzIG5vdGhpbmdcbiAgICAgICAgICAgICAgLy8geWV0IHRvIGF1dGhvciBhZ2FpbnN0LiBBIGxlZ2FjeSBnZW9qc29uIHdob3NlIHJlZ2lvbnMgYXJlIGFsbCBvblxuICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCBwbGFuZSBzdGF5cyBnbG9iYWwgKHNob3duIG9uIGV2ZXJ5IHNsaWNlKSBzb1xuICAgICAgICAgICAgICAvLyBleGlzdGluZyBzaW5nbGUtcGxhbmUgYW5ub3RhdGlvbnMgYXJlbid0IGNvbmZpbmVkIHRvIHNsaWNlIDAuXG4gICAgICAgICAgICAgIGNvbnN0IHJvaUpzb24gPSBpbWdJbmZvLnJvaUpzb25TdHI7XG4gICAgICAgICAgICAgIGlmIChpbWdJbmZvLmlzU3RhY2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdpb25zID0gcm9pSnNvbiA/IHRoaXMucGxvdFNlcnZpY2UuaW1wb3J0UmVnaW9ucyhyb2lKc29uKSA6IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc1NsaWNlSW5mbyA9IHJlZ2lvbnMuc29tZSgocikgPT4gKHIueiA/PyAwKSAhPT0gMCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyb2lKc29uIHx8IGhhc1NsaWNlSW5mbykge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2xpY2VzID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeiA9IHIueiA/PyAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidWNrZXQgPSBzbGljZXMuZ2V0KHopO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0KSBidWNrZXQucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBzbGljZXMuc2V0KHosIFtyXSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbnRlclN0YWNrKHNsaWNlcywgJ2NvbWJpbmVkJyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNpbmdsZS1wbGFuZSBpbWFnZSAob3IgYSBsZWdhY3kgZ2xvYmFsIHotc3RhY2sgZ2VvanNvbik6IG9uZVxuICAgICAgICAgICAgICAvLyByZWdpb24gc2V0IGZvciB0aGUgd2hvbGUgaW1hZ2UuXG4gICAgICAgICAgICAgIGlmIChyb2lKc29uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucGxvdFNlcnZpY2UuaW1wb3J0UmVnaW9ucyhyb2lKc29uKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFJlZ2lvbnMocmVnaW9ucyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5tYXAoKHJlZ2lvbikgPT5cbiAgICAgICAgICAgICAgICAgIHJlZ2lvbi5nZXRTaGFwZSh0aGlzLnBsb3RTZXJ2aWNlLmdldFNob3dTaGFwZUxhYmVsKCkpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRQcmV2aW91c1NoYXBlcyhzaGFwZXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIExvYWRpbmcgYW4gaW1hZ2UncyBzYXZlZCBST0lzIGlzIG5vdCBhIHVzZXIgZWRpdCDigJQgc3RhcnQgdGhlXG4gICAgICAgICAgICAgIC8vIHVuZG8gaGlzdG9yeSBmcmVzaCBzbyB0aGUgZmlyc3QgdW5kbyBjYW4ndCB3aXBlIHRoZW0gKGppdC11aSM4NSkuXG4gICAgICAgICAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBvdmVybGF5UmVsZWFzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJlbGVhc2VPdmVybGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAob3ZlcmxheVJlbGVhc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgIG92ZXJsYXlSZWxlYXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGlmIChpbWdJbmZvLmlzU3RhY2sgJiYgaW1nSW5mby5zaG93U3RhY2spIHRoaXMuc3RhY2tMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG5ldyBSZW5kZXJPcmNoZXN0cmF0b3Ioe1xuICAgICAgICAgICAgICAvLyBpblBsYWNlPXRydWUgdXBkYXRlcyB0aGUgZXhpc3RpbmcgcmVuZGVyIGluc3RlYWQgb2YgcmVidWlsZGluZ1xuICAgICAgICAgICAgICAvLyBpdCwgc28gdGhlIGNhbnZhcyBkb2Vzbid0IGJsYW5rIGR1cmluZyB0aGUgc21hbGzihpJsYXJnZSBzd2FwLlxuICAgICAgICAgICAgICByZW5kZXJQaGFzZTogKHBoYXNlSW5mbywgaW5QbGFjZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN1cGVyc2VkZWQgQkVGT1JFIHRoaXMgcGhhc2Ugc3RhcnRlZCDigJQgZG9uJ3QgZXZlbiBpc3N1ZSB0aGUgbG9hZC5cbiAgICAgICAgICAgICAgICAvLyBSZW5kZXJPcmNoZXN0cmF0b3IgY2FsbHMgcmVuZGVyUGhhc2Ugb25jZSBwZXIgdGllciBhbmQgcmV0cmllcyB0aGVcbiAgICAgICAgICAgICAgICAvLyBzaGFycGVuIHBhc3Mgb24gZmFpbHVyZSwgc28gY2hlY2tpbmcgb25seSBhZnRlciB0aGUgbG9hZCByZXNvbHZlc1xuICAgICAgICAgICAgICAgIC8vIHdvdWxkIGxldCBhIHByZWVtcHRlZCByZW5kZXIga2VlcCBmZXRjaGluZyBzbGljZXMvdGlsZXMgZm9yIGFuXG4gICAgICAgICAgICAgICAgLy8gaW1hZ2Ugbm9ib2R5IGlzIGxvb2tpbmcgYXQuXG4gICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wbG90U2VydmljZS5sb2FkKHBoYXNlSW5mbywgdGhpcy56SW5kZXgpLnRoZW4oKGxvYWRlZEltYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBQcmVlbXB0ZWQgd2hpbGUgdGhpcyBwaGFzZSB3YXMgbG9hZGluZyDigJQgZHJvcCBpdCBvbiB0aGUgZmxvb3IuXG4gICAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudCgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgYSBuZXdlciBjbGljayByZWFjaGluZyB1cyBtaWQtcmVuZGVyLlxuICAgICAgICAgICAgICAgICAgaWYgKHBoYXNlSW5mby5maWxlTmFtZSAhPT0gbG9hZGVkSW1hZ2UuZmlsZW5hbWUpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGxvdFNlcnZpY2UucGxvdChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbG90RGl2TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVkSW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgIHBoYXNlSW5mbyxcbiAgICAgICAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsb3RUeXBlLFxuICAgICAgICAgICAgICAgICAgICBpblBsYWNlLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc21hbGxTaG93bjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KCkpIHJldHVybjsgLy8gc3VwZXJzZWRlZCBieSBhIG5ld2VyIGltYWdlXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGUgaXMgc3RpbGwgYmVpbmcgY2FjaGVkL3ByZXBhcmVkIHNlcnZlci1zaWRlLCBrZWVwIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgLy8gY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheSB1cCBpbnN0ZWFkIG9mIGRyb3BwaW5nIHRvIHRoZSB0cmFuc2x1Y2VudCBcIlNoYXJwZW5pbmdcbiAgICAgICAgICAgICAgICAvLyBwcmV2aWV3Li4uXCIgc3Bpbm5lciBvdmVyIGEgYmxhbmsgY2FudmFzIChhIGxhcmdlIHVuY2FjaGVkIGltYWdlIHJlbmRlcnMgaXRzXG4gICAgICAgICAgICAgICAgLy8gc21hbGwgcHJldmlldyBiZWZvcmUgaXRzIHRpbGVzIGV4aXN0KS4gZmluaXNoZWQoKSByZWxlYXNlcyB0aGUgb3ZlcmxheSBvbmNlXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgcmVuZGVyIGxhbmRzLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ2FjaGluZykgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIFNtYWxsIHRpZXIgb24gc2NyZWVuIOKAlCBkcm9wIHRoZSBmdWxsIG92ZXJsYXkgYnV0IGtlZXAgYSB0cmFuc2x1Y2VudCBzcGlubmVyIHNvXG4gICAgICAgICAgICAgICAgLy8gdGhlIGJsdXJyeSByZW5kZXIgaXNuJ3QgbWlzdGFrZW4gZm9yIHRoZSBmaW5hbCBpbWFnZS5cbiAgICAgICAgICAgICAgICByZWxlYXNlT3ZlcmxheSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhcnBlbmluZyA9IHRydWU7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNoYXJwZW5TZXR0bGVkOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgaW1hZ2VcbiAgICAgICAgICAgICAgICB0aGlzLnNoYXJwZW5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZmluaXNoZWQ6IChfdmlhU21hbGwsIGxvZ1RhZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KCkpIHJldHVybjsgLy8gc3VwZXJzZWRlZCBieSBhIG5ld2VyIGltYWdlXG4gICAgICAgICAgICAgICAgLy8gSWRlbXBvdGVudCDigJQgcmVsZWFzZXMgbm93IGlmIHNtYWxsU2hvd24gZGVmZXJyZWQgaXQgKGNhY2hpbmcpIG9yIHdhcyBza2lwcGVkLlxuICAgICAgICAgICAgICAgIHJlbGVhc2VPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYXBwbHlSb2koKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsb2dUYWcpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzaGFycGVuRmFpbGVkOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudCgpKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBpbWFnZVxuICAgICAgICAgICAgICAgIC8vIFRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGUgZmFsbGJhY2sg4oCUIHRlbGwgdGhlXG4gICAgICAgICAgICAgICAgLy8gdXNlciB0aGUgc2hhcnBlciB2ZXJzaW9uIGlzbid0IGNvbWluZy5cbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCBlcnI/LnN0YXR1c1RleHQgfHwgU3RyaW5nKGVycik7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAga2V5OiB0aGlzLnZpekFsZXJ0VG9hc3RLZXksXG4gICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgICAgc3VtbWFyeTogJ1ByZXZpZXcgbm90IHNoYXJwZW5lZCcsXG4gICAgICAgICAgICAgICAgICBkZXRhaWw6IGBUaGUgZnVsbC1yZXNvbHV0aW9uIHByZXZpZXcgZGlkIG5vdCBsb2FkICgke21zZ30pLiBUaGUgbG93LXJlc29sdXRpb24gcHJldmlldyBpcyBzdGlsbCBzaG93bi4gVHJ5IGNsaWNraW5nIHRoZSBpbWFnZSBhZ2Fpbi5gLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGFwcGx5Um9pKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KS5yZW5kZXIoaW1nSW5mbywgc21hbGxJbWdJbmZvKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCBlcnI/LnN0YXR1c1RleHQgfHwgU3RyaW5nKGVycik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VyZWQgd2hlbiBnZXR0aW5nIGltYWdlIGluZm8nLCBlcnIpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAga2V5OiB0aGlzLnZpekFsZXJ0VG9hc3RLZXksXG4gICAgICAgICAgc3RpY2t5OiB0cnVlLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIHN1bW1hcnk6ICdBbiBlcnJvciBvY2N1cmVkJyxcbiAgICAgICAgICBkZXRhaWw6IGBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VyZWQgd2hpbGUgZ2V0dGluZyBpbWFnZSBpbmZvOiAke21zZ30uXG4gICAgICAgICAgICAgICAgICAgUGxlYXNlIHRyeSB0byBvcGVuIHRoZSBpbWFnZSBhZ2FpbiB0aHJvdWdoIHRoZSBmaWxlIG5hdmlnYXRvci5gLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdGFja0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wbG90U2VydmljZS5yZXNldCgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnBsb3RDb250ZXh0TWVudUxpc3RlbmVyID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBwbG90RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXZOYW1lKTtcbiAgICAgIGlmICghcGxvdEVsPy5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnVJdGVtcyA9IHRoaXMuYnVpbGRDb250ZXh0TWVudUl0ZW1zKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lciwgdHJ1ZSk7XG5cbiAgICB0aGlzLmtleWRvd25MaXN0ZW5lciA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkgcmV0dXJuO1xuICAgICAgLy8gU0FNIHBvaW50IG1vZGU6IEVudGVyIGNvbW1pdHMgdGhlIG9iamVjdCwgRXNjIGNsZWFycyB0aGUgcHJvbXB0LlxuICAgICAgaWYgKHRoaXMuYWN0aXZlRHJhZ01vZGUgPT09ICdzYW1Qb2ludCcgJiYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICdFc2NhcGUnKSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHRoaXMucGxvdFNlcnZpY2UuY29tbWl0U2FtUG9pbnRzKCk7XG4gICAgICAgICAgZWxzZSB0aGlzLnBsb3RTZXJ2aWNlLmNsZWFyU2FtUG9pbnRzKCk7XG4gICAgICAgICAgdGhpcy5oaWRlU2FtVG9hc3QoKTsgLy8gcHJvbXB0IHJlc29sdmVkIOKGkiBkaXNtaXNzIHRoZSBzdGF0dXMgdG9hc3RcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lvbiBoaXN0b3J5IChqaXQtdWkjODUpOiBDdHJsL0NtZCtaIHVuZG9lczsgQ3RybC9DbWQrU2hpZnQrWiBvclxuICAgICAgLy8gQ3RybC9DbWQrWSByZWRvZXMuXG4gICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XG4gICAgICAgIGNvbnN0IGsgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGsgPT09ICd6JyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnVuZG9SZWdpb24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoayA9PT0gJ3onICYmIGV2ZW50LnNoaWZ0S2V5KSB8fCBrID09PSAneScpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnJlZG9SZWdpb24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRGVsZXRlJyB8fCBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGV2ZW50LmtleSA9PT0gJ2QnIHx8IGV2ZW50LmtleSA9PT0gJ0QnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmRlbGV0ZVJlZ2lvbigpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnKycgfHwgZXZlbnQua2V5ID09PSAnPScpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuem9vbUluKCkpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICctJyB8fCBldmVudC5rZXkgPT09ICdfJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy56b29tT3V0KCkpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdwJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgncGFuJykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdiJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnem9vbVRvQm94JykpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdyJykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd3JlY3QnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ2YnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3Y2xvc2VkcGF0aCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAndycpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3dhbmQnKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ2UnKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdlcmFzZVZlcnRleCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAncycpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3NlbGVjdCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnbCcpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2RyYXdvcGVucGF0aCcpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duTGlzdGVuZXIpO1xuXG4gICAgdGhpcy53aGVlbExpc3RlbmVyID0gKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBwbG90RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXZOYW1lKTtcbiAgICAgIGlmICghcGxvdEVsPy5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHJldHVybjtcbiAgICAgIC8vIFRoZSBJbWFnZSB2aWV3IGhhbmRsZXMgc2Nyb2xsLXpvb20gbmF0aXZlbHkgKGl0IHJlc3BlY3RzIHRoZSBzY3JvbGxcbiAgICAgIC8vIGRlbHRhKS4gSW50ZXJjZXB0aW5nIGhlcmUgd291bGQgZmlyZSBhIGZpeGVkIHpvb20gc3RlcCBwZXIgd2hlZWxcbiAgICAgIC8vIGV2ZW50IOKAlCBmYXIgdG9vIHNlbnNpdGl2ZSDigJQgc28gbGV0IHRoZSByZW5kZXJlciBvd24gaXQuXG4gICAgICBpZiAodGhpcy5pc0ltYWdlVmlldykgcmV0dXJuO1xuICAgICAgLy8gM0QgcGxvdCB0eXBlcyAoc3VyZmFjZSwgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSByZW5kZXIgaW4gYSBQbG90bHkgc2NlbmVcbiAgICAgIC8vIHRoYXQgb3JiaXRzL3pvb21zIG5hdGl2ZWx5IG9uIHNjcm9sbC4gVGhlIDJEIHN0ZXAtem9vbSBkb2Vzbid0IGFwcGx5IGFuZFxuICAgICAgLy8gd291bGQgdGhyb3cgKG5vIHhheGlzIG9uIGEgc2NlbmUpLCBzbyBsZXQgUGxvdGx5IGhhbmRsZSB0aGUgd2hlZWwuXG4gICAgICBpZiAoIXRoaXMuaXNIZWF0bWFwKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoZXZlbnQuZGVsdGFZIDwgMCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy56b29tSW4oKSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuem9vbU91dCgpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMud2hlZWxMaXN0ZW5lciwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiBmYWxzZSB9KTtcblxuICAgIC8vIERyYWcgaGFuZGxpbmcgZm9yIHRoZSBmbG9hdGluZyBpbnRlbnNpdHktcHJvZmlsZSBwYW5lbC5cbiAgICB0aGlzLnByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLnByb2ZpbGVQYW5lbERyYWdnaW5nKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9maWxlUGFuZWxQb3MgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnByb2ZpbGVQYW5lbFN0YXJ0LnggKyAoZS5jbGllbnRYIC0gdGhpcy5wcm9maWxlUGFuZWxTdGFydC5teCksXG4gICAgICAgICAgICB5OiB0aGlzLnByb2ZpbGVQYW5lbFN0YXJ0LnkgKyAoZS5jbGllbnRZIC0gdGhpcy5wcm9maWxlUGFuZWxTdGFydC5teSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudG9vbGJhckRyYWdnaW5nKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy50b29sYmFyUG9zID0ge1xuICAgICAgICAgICAgeDogdGhpcy50b29sYmFyU3RhcnQueCArIChlLmNsaWVudFggLSB0aGlzLnRvb2xiYXJTdGFydC5teCksXG4gICAgICAgICAgICB5OiB0aGlzLnRvb2xiYXJTdGFydC55ICsgKGUuY2xpZW50WSAtIHRoaXMudG9vbGJhclN0YXJ0Lm15KSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMucHJvZmlsZURyYWdVcExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9maWxlUGFuZWxEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy50b29sYmFyRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLnByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucHJvZmlsZURyYWdVcExpc3RlbmVyKTtcblxuICAgIC8vIE9uIGFueSB3aW5kb3cgcmVzaXplLCByZWZsb3cgdGhlIGludGVuc2l0eSBpbnNldCB0byBpdHMgKGZpeGVkKSBwYW5lbCBzaXplXG4gICAgLy8gb24gdGhlIG5leHQgZnJhbWUsIG9uY2UgbGF5b3V0IGhhcyBzZXR0bGVkLiBXaXRob3V0IHRoaXMgdGhlIGluc2V0IGNhbiBiZVxuICAgIC8vIGxlZnQgYXQgYSBzdGFsZS96ZXJvIHNpemUgYnkgYSBtaWQtcmVmbG93IHJlc2l6ZSBhbmQgc3RvcCBzaG93aW5nLlxuICAgIHRoaXMucHJvZmlsZVJlc2l6ZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmhhc1Byb2ZpbGVzKSByZXR1cm47XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5yZW5kZXJJbnRlbnNpdHlJbnNldCgpKTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnByb2ZpbGVSZXNpemVMaXN0ZW5lcik7XG4gIH1cblxuICBvblByb2ZpbGVQYW5lbERyYWdTdGFydChlOiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5wcm9maWxlUGFuZWxEcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy5wcm9maWxlUGFuZWxTdGFydCA9IHtcbiAgICAgIG14OiBlLmNsaWVudFgsXG4gICAgICBteTogZS5jbGllbnRZLFxuICAgICAgeDogdGhpcy5wcm9maWxlUGFuZWxQb3MueCxcbiAgICAgIHk6IHRoaXMucHJvZmlsZVBhbmVsUG9zLnksXG4gICAgfTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKiogR3JhYiB0aGUgdG9vbGJhciBoYW5kbGU6IGRldGFjaCBpdCBpbnRvIGEgZmxvYXRpbmcgd2luZG93IChpZiBzdGlsbCBkb2NrZWQpXG4gICAqICBhbmQgc3RhcnQgZHJhZ2dpbmcuICovXG4gIG9uVG9vbGJhckRyYWdTdGFydChlOiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnRvb2xiYXJGbG9hdGluZykge1xuICAgICAgdGhpcy50b29sYmFyRmxvYXRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy50b29sYmFyUG9zID0geyB4OiA4LCB5OiA4IH07XG4gICAgfVxuICAgIHRoaXMudG9vbGJhckRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnRvb2xiYXJTdGFydCA9IHtcbiAgICAgIG14OiBlLmNsaWVudFgsXG4gICAgICBteTogZS5jbGllbnRZLFxuICAgICAgeDogdGhpcy50b29sYmFyUG9zLngsXG4gICAgICB5OiB0aGlzLnRvb2xiYXJQb3MueSxcbiAgICB9O1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8qKiBTbmFwIHRoZSBmbG9hdGluZyB0b29sYmFyIGJhY2sgdG8gaXRzIGRvY2tlZCBwb3NpdGlvbiBhY3Jvc3MgdGhlIHRvcC4gKi9cbiAgZG9ja1Rvb2xiYXIoKSB7XG4gICAgdGhpcy50b29sYmFyRmxvYXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIGludGVuc2l0eSBpbnNldCBjaGFydCBmcm9tIHRoZSBsYXRlc3QgcHJvZmlsZSBkYXRhLiBUaGUgYWN0dWFsXG4gICAqICBjaGFydGluZyBpcyBvd25lZCBieSB0aGUgdmlzdWFsaXplciBzZXJ2aWNlIOKAlCB0aGUgY29tcG9uZW50IGp1c3QgZGVjaWRlc1xuICAgKiAgd2hlbiAocHJvZmlsZSBtb2RlICsgYSBmcmVzaCBwcm9maWxlKS4gKi9cbiAgcHJpdmF0ZSByZW5kZXJJbnRlbnNpdHlJbnNldCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzUHJvZmlsZXMpIHJldHVybjtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlbmRlckludGVuc2l0eUluc2V0KHRoaXMuaW50ZW5zaXR5SW5zZXREaXYsIHRoaXMubGF0ZXN0UHJvZmlsZXMpO1xuICB9XG5cbiAgLyoqIFRvb2xiYXIgXCJJbnRlbnNpdHlcIiBncm91cDogYWRkIGFub3RoZXIgbGluZSBST0kgKG5leHQgYnJpZ2h0IGNvbG91cikuICovXG4gIGFzeW5jIGFkZFByb2ZpbGVMaW5lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFBhcmsgdGhlIGZsb2F0aW5nIGluc2V0IG5lYXIgdGhlIHBsb3QncyB0b3AtcmlnaHQgd2hlbiB0aGUgZmlyc3QgbGluZSBpc1xuICAgIC8vIGFkZGVkIChpdCdzIHBvc2l0aW9uOmZpeGVkLCBzbyB1c2Ugdmlld3BvcnQgY29vcmRzIGZyb20gdGhlIHBsb3QgcmVjdCkuXG4gICAgaWYgKCF0aGlzLmhhc1Byb2ZpbGVzKSB7XG4gICAgICBjb25zdCByZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2TmFtZSk/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5wcm9maWxlUGFuZWxQb3MgPSByZWN0XG4gICAgICAgID8geyB4OiBNYXRoLm1heCgxMCwgcmVjdC5yaWdodCAtIDMwMCksIHk6IHJlY3QudG9wICsgMTAgfVxuICAgICAgICA6IHsgeDogMjAsIHk6IDcwIH07XG4gICAgfVxuICAgIC8vIEltYWdlIChPU0QpIG1vZGU6IFBsb3RseSBuZXZlciByZW5kZXJlZCwgc28gaXQgaGFzIG5vIHBpeGVsIGNhY2hlIC8gZXh0ZW50LlxuICAgIC8vIExvYWQgdGhlIGN1cnJlbnQgc2xpY2UncyBmcmFtZXMgZm9yIHNhbXBsaW5nICsgbGluZSBwbGFjZW1lbnQgZmlyc3QuXG4gICAgaWYgKHRoaXMuaXNJbWFnZVZpZXcgJiYgdGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIGF3YWl0IHRoaXMucGxvdFNlcnZpY2UuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcodGhpcy5pbWFnZUluZm8sIHRoaXMuekluZGV4KTtcbiAgICB9XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5wbG90U2VydmljZS5nZXRJbnRlbnNpdHlDb250cm9scygpPy5hZGRQcm9maWxlTGluZSgpO1xuICAgIC8vIEF1dG8tc2VsZWN0IHRoZSBuZXcgbGluZSBvbiB0aGUgYWN0aXZlIGJhY2tlbmQgKFBsb3RseSBoYW5kbGVzIC8gT1NEXG4gICAgLy8gaGlnaGxpZ2h0KSBzbyBpdCdzIHJlYWR5IHRvIG1vdmUgb3IgZGVsZXRlIGltbWVkaWF0ZWx5LlxuICAgIGlmIChyZWdpb24pIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2VsZWN0UmVnaW9uKHJlZ2lvbik7XG4gICAgICAvLyBPU0Qgb25seSBkcmF3cyBhIHNlbGVjdGVkIHJlZ2lvbidzIGhhbmRsZXMgaW4gYW4gZWRpdCBtb2RlLCBzbyBhIGxpbmUgaW5cbiAgICAgIC8vICdub25lJyBtb2RlIGxvb2tzIHVuc2VsZWN0ZWQuIFN3aXRjaCB0byAnc2VsZWN0JyBzbyB0aGUgbmV3IGxpbmUgc2hvd3NcbiAgICAgIC8vIGl0cyBlbmRwb2ludCBoYW5kbGVzIGFuZCBjYW4gYmUgZHJhZ2dlZC9kZWxldGVkIHJpZ2h0IGF3YXkuXG4gICAgICBpZiAodGhpcy5pc0ltYWdlVmlldyAmJiB0aGlzLmFjdGl2ZURyYWdNb2RlICE9PSAnc2VsZWN0Jykge1xuICAgICAgICB0aGlzLnRvZ2dsZURyYWdNb2RlKCdzZWxlY3QnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBMZWF2ZSB0aGUgbGl2ZSBzZXQgc28gdGhlIG5leHQtb2xkZXN0IHZpc3VhbGl6ZXIgcGlja3MgdXAgdGhlIG91dGxldHMuXG4gICAgVmlzdWFsaXplckNvbXBvbmVudC5saXZlSW5zdGFuY2VzLmRlbGV0ZSh0aGlzKTtcbiAgICB0aGlzLnNjcnViYmVyLmNhbmNlbCgpO1xuICAgIHRoaXMuc2FtUG9pbnRTdWIudW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5wbG90Q29udGV4dE1lbnVMaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmtleWRvd25MaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd25MaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLndoZWVsTGlzdGVuZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMud2hlZWxMaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2ZpbGVEcmFnTW92ZUxpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5wcm9maWxlRHJhZ01vdmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2ZpbGVEcmFnVXBMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnByb2ZpbGVEcmFnVXBMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2ZpbGVSZXNpemVMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucHJvZmlsZVJlc2l6ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW50ZW5zaXR5UHJvZmlsZVN1Yikge1xuICAgICAgdGhpcy5pbnRlbnNpdHlQcm9maWxlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdwb3J0Q2hhbmdlU3ViKSB7XG4gICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMudW5zdWIubmV4dCgpO1xuICAgIHRoaXMudW5zdWIuY29tcGxldGUoKTtcbiAgICBpZiAodGhpcy5wcmV2aWV3U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnByZXZpZXdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGxvdFdpZHRoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnBsb3RXaWR0aFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZUxvYWRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuaW1hZ2VMb2FkaW5nU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmltZ0xvYWRpbmdNZXNzYWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzWm9vbVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5pc1pvb21TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXV0b3NjYWxlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmF1dG9zY2FsZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgaGFzUmVnaW9ucygpOiBib29sZWFuIHtcbiAgICAvLyBVc2UgdGhlIGNvbnRyYWN0J3MgZnJhbWV3b3JrLW5ldXRyYWwgcmVnaW9uIGFjY2Vzc29yLCBub3QgdGhlIHJhd1xuICAgIC8vIFBsb3RseS1zaGFwZWQgZ2V0U2hhcGVzKCkg4oCUIHRoZSBjb21wb25lbnQgb25seSBuZWVkcyB0byBrbm93IHdoZXRoZXIgYW55XG4gICAgLy8gcmVnaW9uIGV4aXN0cywgYW5kIG11c3Qgbm90IGRlcGVuZCBvbiBhIGJhY2tlbmQncyB3aXJlIGZvcm1hdC5cbiAgICByZXR1cm4gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gbWFpbkZhY2FkZS5jb25maWdSZXF1ZXN0KCkgLSBETyBOT1QgREVMRVRFXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdIHtcbiAgICByZXR1cm4gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25Qb2x5Z29ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgY29sb3Igc2NhbGUgdHlwZTogY2FsbGVkIGJ5IHRoZSBjb2xvciBzY2FsZSBzZWxlY3QgYnV0dG9uXG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgdG9nZ2xlUmV2ZXJzZVNjYWxlKCkge1xuICAgIHRoaXMucmV2ZXJzZXNjYWxlID0gIXRoaXMucmV2ZXJzZXNjYWxlO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UmV2ZXJzZVNjYWxlKHRoaXMucmV2ZXJzZXNjYWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYSBjb2xvciBtYXA6IGNhbGxlZCBieSB0aGUgY29sb3IgbWFwIGRyb3Bkb3duIGJ1dHRvblxuICAgKiBAcGFyYW0gY29sb3JtYXBOb2RlXG4gICAqL1xuICBzZWxlY3RDb2xvcm1hcChjb2xvcm1hcE5vZGU6IFRyZWVOb2RlKSB7XG4gICAgaWYgKCFjb2xvcm1hcE5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0Q29sb3JtYXAoY29sb3JtYXBOb2RlKTtcbiAgICB9XG4gIH1cblxuICAvKiogT3BlbiB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gZGlhbG9nICh0b29sYmFyIGJ1dHRvbikuICovXG4gIG9wZW5DaGFubmVsSGlzdG9ncmFtKCkge1xuICAgIHRoaXMuc2hvd0NoYW5uZWxIaXN0b2dyYW0gPSB0cnVlO1xuICB9XG5cbiAgLyoqIE9wZW4gdGhlIFJlZ2lvbiBFZGl0b3IgZGlhbG9nICh0b29sYmFyIGJ1dHRvbikuIFRoZSBlZGl0b3Igc3RheXMgbGlua2VkIHRvXG4gICAqICB0aGlzIHBsb3R0aW5nIGluc3RhbmNlIHRocm91Z2ggdGhlIHJvb3QgUmVnaW9uU3RvcmUgc2luZ2xldG9uLCBzbyBpdCB3b3Jrc1xuICAgKiAgdGhlIHNhbWUgYXMgdGhlIGZvcm1lciByaWdodC1wYW5lbCBSZWdpb25zIHRhYi4gKi9cbiAgb3BlblJlZ2lvbkVkaXRvcigpIHtcbiAgICAvLyBTaXplIHRoZSBkaWFsb2cgdG8gbWF0Y2ggdGhlIGhvc3QncyBjb25maWd1cmVkIGVsZW1lbnQgKGUuZy4gdGhlIGFwcCdzXG4gICAgLy8gcmlnaHQgcGFuZWwpIGF0IG9wZW4gdGltZS4gTWVhc3VyZWQgb25jZSDigJQgaXQgaW50ZW50aW9uYWxseSBkb2VzIG5vdFxuICAgIC8vIHRyYWNrIGxhdGVyIGJyb3dzZXIvc3BsaXQgcmVzaXplcy4gRmFsbHMgYmFjayB0byBhIHF1YXJ0ZXIgb2YgdGhlIHBhZ2VcbiAgICAvLyB3aGVuIG5vIHNlbGVjdG9yIGlzIGNvbmZpZ3VyZWQgb3IgdGhlIGVsZW1lbnQgaXNuJ3QgcHJlc2VudC5cbiAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMudml6Q29uZmlnPy5yZWdpb25FZGl0b3JXaWR0aFNlbGVjdG9yO1xuICAgIGNvbnN0IHdpZHRoID0gc2VsZWN0b3JcbiAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oc2VsZWN0b3IpPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aFxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZWdpb25FZGl0b3JXaWR0aCA9IHdpZHRoICYmIHdpZHRoID4gMCA/IGAke01hdGgucm91bmQod2lkdGgpfXB4YCA6ICcyNXZ3JztcbiAgICB0aGlzLnNob3dSZWdpb25FZGl0b3IgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgc3RhY2svc2luZ2xlIGltYWdlIGRyb3Bkb3duIGJ1dHRvblxuICAgKiBAcGFyYW0gc2hvd3N0YWNrXG4gICAqL1xuICBzZWxlY3RTdGFja09wdGlvbihzZWxlY3RlZFN0YWNrT3B0aW9uOiBhbnkpIHtcbiAgICBjb25zdCBzaG93c3RhY2sgPSBzZWxlY3RlZFN0YWNrT3B0aW9uLnZhbCA9PT0gJ3RydWUnO1xuICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHNlbGVjdGVkU3RhY2tPcHRpb247XG4gICAgY29uc29sZS5sb2coJ3NlbGVjdGVkIHN0YWNrIG9wdGlvbicgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkU3RhY2tPcHRpb24pKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyA9IHNob3dzdGFjaztcbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyghc2hvd3N0YWNrKTtcbiAgICAvLyBTdGFjayBtb2RlIGlzIGFsd2F5cyBhIDJEIGhlYXRtYXAg4oCUIHJlc2V0IHN1cmZhY2UgbW9kZSBpZiBhY3RpdmVcbiAgICBpZiAoIXRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICB0aGlzLmlzSGVhdG1hcCA9IHRydWU7XG4gICAgICB0aGlzLnBsb3RUeXBlID0gUGxvdFR5cGUuSEVBVE1BUDtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9IFBsb3RUeXBlLkhFQVRNQVA7XG4gICAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFBsb3RUeXBlKHRoaXMucGxvdFR5cGUpO1xuICAgIH1cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNob3dTdGFjayhzaG93c3RhY2spO1xuICB9XG5cbiAgdXBkYXRlWkluZGV4KHVybHM/OiBzdHJpbmdbXSkge1xuICAgIGlmICh0aGlzLnpJbmRleCA+IHRoaXMubWF4SW5kZXgpIHtcbiAgICAgIHRoaXMuekluZGV4ID0gdGhpcy5tYXhJbmRleDtcbiAgICB9XG4gICAgaWYgKHRoaXMuekluZGV4IDwgMCkge1xuICAgICAgdGhpcy56SW5kZXggPSAwO1xuICAgIH1cbiAgICBpZiAodXJscykge1xuICAgICAgaWYgKHRoaXMuekluZGV4ID4gdXJscz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5tYXhJbmRleCA9IHVybHMubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRaSW5kZXgodGhpcy56SW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpdmUgei1zbGljZSBzY3J1YiBmb3IgdGhlIEltYWdlIHZpZXc6IHRoZSByZW5kZXJlciBzd2FwcyB0aGUgZGlzcGxheWVkXG4gICAqIHNsaWNlIGluIHBsYWNlIChubyByZS1tb3VudCksIHNvIGRyYWdnaW5nIHRoZSBzbGlkZXIgc3RlcHMgdGhyb3VnaCB0aGVcbiAgICogc3RhY2sgdGhlIHNhbWUgd2F5IHRoZSBoZWF0bWFwIGZyYW1lIHNsaWRlciBkb2VzLlxuICAgKi9cbiAgb25aU2xpZGUoejogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHogPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuekluZGV4ID0gejtcbiAgICB0aGlzLnNjcnViYmVyLmNvbW1pdCh6KTtcbiAgICAvLyBLZWVwIHRoZSBpbnRlbnNpdHkgaW5zZXQgaW4gc3luYyB3aXRoIHRoZSBkaXNwbGF5ZWQgc2xpY2UgKEltYWdlL09TRCBtb2RlLFxuICAgIC8vIHdoZXJlIHRoZSBwcm9maWxlIHNhbXBsZXIgaXMgZmVkIGZyb20gdGhlIGxvYWRlZCBwcmV2aWV3IGZyYW1lcykuXG4gICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMgJiYgdGhpcy5pc0ltYWdlVmlldyAmJiB0aGlzLmltYWdlSW5mbykge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyh0aGlzLmltYWdlSW5mbywgeik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpdmUgKGRlYm91bmNlZCkgc2NydWIgd2hpbGUgZHJhZ2dpbmcgdGhlIEltYWdlLXZpZXcgei1zbGlkZXI6IHVwZGF0ZSB0aGVcbiAgICogc2xpY2UgYXMgdGhlIHVzZXIgZHJhZ3MsIGJ1dCBjb2FsZXNjZSByYXBpZCBjaGFuZ2VzIHNvIHdlIGRvbid0IGZpcmUgYVxuICAgKiBzbGljZSBzd2FwIG9uIGV2ZXJ5IHBpeGVsLiBUaGUgZmluYWwgdmFsdWUgYWxzbyBsYW5kcyB2aWEgb25aU2xpZGUgKG9uU2xpZGVFbmQpLlxuICAgKi9cbiAgb25aU2NydWIoejogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHogPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuekluZGV4ID0gejtcbiAgICB0aGlzLnNjcnViYmVyLnNjcnViKHopO1xuICB9XG5cbiAgLyoqXG4gICAqIEtleWJvYXJkIHN0YWNrIG5hdmlnYXRpb246IOKGkC/ihpIgc3RlcCB0aGUgei1zbGljZSBpbiB0aGUgSW1hZ2UgdmlldywgdGhlIHNhbWVcbiAgICogd2F5IHRoZSBzbGlkZXIgZG9lcy4gT25seSBhY3RpdmUgZm9yIGEgbG9hZGVkIHN0YWNrIGluIEltYWdlIHZpZXcsIGFuZFxuICAgKiBpZ25vcmVkIHdoaWxlIGEgZm9ybSBmaWVsZCBpcyBmb2N1c2VkIHNvIHR5cGluZyBpc24ndCBoaWphY2tlZC4gVXAvRG93biBhcmVcbiAgICogbGVmdCB0byBPcGVuU2VhZHJhZ29uIChwYW5uaW5nKS5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZS5rZXkgIT09ICdBcnJvd0xlZnQnICYmIGUua2V5ICE9PSAnQXJyb3dSaWdodCcpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuaW1hZ2VJbmZvPy5pc1N0YWNrIHx8ICF0aGlzLmlzSW1hZ2VWaWV3KSByZXR1cm47XG4gICAgY29uc3QgdCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAodCAmJiAoL14oSU5QVVR8VEVYVEFSRUF8U0VMRUNUKSQvLnRlc3QodC50YWdOYW1lKSB8fCB0LmlzQ29udGVudEVkaXRhYmxlKSkgcmV0dXJuO1xuICAgIC8vIFRoZSBzbGljZSBzbGlkZXIgaGFuZGxlcyBhcnJvd3MgbmF0aXZlbHkgd2hlbiBmb2N1c2VkIChhbHNvIGEgKzEgc3RlcCkg4oCUXG4gICAgLy8gc2tpcCBoZXJlIHNvIHdlIGRvbid0IGRvdWJsZS1zdGVwIGl0LlxuICAgIGlmICh0ICYmICh0LmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnc2xpZGVyJyB8fCB0LmNsb3Nlc3QoJy5wLXNsaWRlcicpKSkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnN0ZXBTbGljZShlLmtleSA9PT0gJ0Fycm93UmlnaHQnID8gMSA6IC0xKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIHRoZSBkaXNwbGF5ZWQgc2xpY2UgYnkgYGRlbHRhYCwgY2xhbXBlZCB0byB0aGUgc3RhY2sgYm91bmRzLiAqL1xuICBzdGVwU2xpY2UoZGVsdGE6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBNYXRoLm1pbih0aGlzLm1heEluZGV4LCBNYXRoLm1heCgwLCB0aGlzLnpJbmRleCArIGRlbHRhKSk7XG4gICAgaWYgKG5leHQgPT09IHRoaXMuekluZGV4KSByZXR1cm47XG4gICAgdGhpcy5vblpTbGlkZShuZXh0KTtcbiAgfVxuXG4gIHJlbG9hZEFuZFBsb3QoKSB7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcodHJ1ZSk7XG4gICAgLy8gUmUtZHJpdmUgdGhlIHJlbmRlciBwaXBlbGluZSBmcm9tIHRoZSBjdXJyZW50IGltYWdlIGluZm8gKHRoZSBzb3VyY2Ugb2ZcbiAgICAvLyB0cnV0aCwgd2l0aCByZWFsIHVybHMvZmlsZU5hbWUpLiBEb24ndCB1c2UgcGxvdFNlcnZpY2UucmVsb2FkQW5kUGxvdCgpOlxuICAgIC8vIHRoYXQgcmVidWlsZHMgdGhlIGluZm8gZnJvbSB0aGUgcmVuZGVyZXIncyBpbnRlcm5hbCBzdGF0ZSwgd2hpY2ggY2FuIGJlXG4gICAgLy8gc3RhbGUgKGUuZy4gYWZ0ZXIgc3dpdGNoaW5nIHBsb3QgdHlwZSBJbWFnZSAtPiBIZWF0bWFwKSBhbmQgcmUtZW1pdFxuICAgIC8vIGVtcHR5L29sZCB1cmxzLCBmYWlsaW5nIHRvIGhhbmQgdGhlIGRpdiBvdmVyIHRvIHRoZSBuZXcgcmVuZGVyZXIuXG4gICAgaWYgKHRoaXMuaW1hZ2VJbmZvKSB7XG4gICAgICB0aGlzLnN0YXRlLnNldEltYWdlSW5mbyh0aGlzLmltYWdlSW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxvdFNlcnZpY2UucmVsb2FkQW5kUGxvdCgpO1xuICAgIH1cbiAgfVxuICBjYW5jZWxMb2FkaW5nKCkge1xuICAgIC8vIFN0b3AgYW55IGluLWZsaWdodCBmcmFtZSBzdHJlYW1pbmcgKG5hcGFyaS1qcyB2b2x1bWUvc3VyZmFjZSBwcmVsb2FkKSBzbyB0aGUgZmV0Y2ggbG9vcHNcbiAgICAvLyBhY3R1YWxseSBhYm9ydCDigJQgY2xlYXJpbmcgdGhlIGZsYWcgYWxvbmUgb25seSByb3V0ZWQgdG8gUGxvdGx5IGFuZCBsZWZ0IG5hcGFyaSBmZXRjaGluZy5cbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmNhbmNlbExvYWRpbmc/LigpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pbWdMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFpJbmRleCh0aGlzLnpJbmRleCk7XG4gICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTdGFja0xvYWRpbmcoZmFsc2UpO1xuICB9XG5cbiAgZG93bmxvYWRJbWFnZSgpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmRvd25sb2FkSW1hZ2UoKTtcbiAgfVxuXG4gIGF1dG9zY2FsZUltYWdlKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuYXV0b3NjYWxlKCk7XG4gIH1cblxuICAvKiogVG9vbGJhciBwaXhlbC9zbW9vdGggdG9nZ2xlOiBmbGlwIHNtb290aGluZyBhbmQgYXBwbHkgdG8gdGhlIGFjdGl2ZSBiYWNrZW5kLiAqL1xuICBvblRvZ2dsZUltYWdlU21vb3RoaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gIXRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkKTtcbiAgfVxuXG4gIHJlc2V0QXhlcygpIHtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnJlc2V0QXhlcygpO1xuICB9XG5cbiAgdG9nZ2xlRHJhZ01vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgLy8gVG9nZ2xlIG9mZiBpZiB0aGUgc2FtZSBtb2RlIGlzIHJlLXNlbGVjdGVkLlxuICAgIHRoaXMuYWN0aXZlRHJhZ01vZGUgPSB0aGlzLmFjdGl2ZURyYWdNb2RlID09PSBtb2RlID8gbnVsbCA6IG1vZGU7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5hY3RpdmVEcmFnTW9kZTtcbiAgICAvLyBSZWNvcmQgdGhlIGFybWVkIHRvb2wgaW4gdGhlIHNoYXJlZCBzZXNzaW9uIHN0b3JlLlxuICAgIHRoaXMuc2Vzc2lvbi5zZXRBY3RpdmVUb29sKGFjdGl2ZSk7XG5cbiAgICAvLyBSZWdpb24gZHJhdy9zZWxlY3QgcnVuIHRocm91Z2ggdGhlIHJlbmRlcmVyJ3MgcmVnaW9uIG92ZXJsYXkuXG4gICAgdGhpcy5wbG90U2VydmljZVxuICAgICAgLmdldFJlZ2lvbk92ZXJsYXkoKVxuICAgICAgPy5zZXRNb2RlKHRoaXMuaXNSZWdpb25Nb2RlKGFjdGl2ZSkgPyAoYWN0aXZlIGFzIFJlZ2lvblRvb2xNb2RlKSA6ICdub25lJyk7XG5cbiAgICAvLyBWaWV3cG9ydCBkcmFnIG1vZGVzIChwYW4vYm94LXpvb20pLiBSZWdpb24gbW9kZXMgb3duIHRoZSBkcmFnIG1vZGUgdmlhXG4gICAgLy8gdGhlIG92ZXJsYXksIHNvIGRvbid0IGFsc28gc2V0IG9uZSBoZXJlLlxuICAgIGlmICghdGhpcy5pc1JlZ2lvbk1vZGUoYWN0aXZlKSkge1xuICAgICAgY29uc3Qgdmlld3BvcnREcmFnID0gYWN0aXZlID09PSAncGFuJyB8fCBhY3RpdmUgPT09ICd6b29tJztcbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0RHJhZ01vZGUodmlld3BvcnREcmFnID8gYWN0aXZlIDogZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIE9uLWNhbnZhcyB0b29sIG92ZXJsYXlzLlxuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0Wm9vbVRvQm94TW9kZShhY3RpdmUgPT09ICd6b29tVG9Cb3gnKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFdhbmRNb2RlKGFjdGl2ZSA9PT0gJ3dhbmQnLCB7IHNlbnNpdGl2aXR5OiB0aGlzLndhbmRTZW5zaXRpdml0eSB9KTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldEJydXNoTW9kZShhY3RpdmUgPT09ICdicnVzaCcsIHsgc2l6ZTogdGhpcy5icnVzaFNpemUgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTYW1Qb2ludE1vZGUoYWN0aXZlID09PSAnc2FtUG9pbnQnKTtcbiAgICAvLyBMZWF2aW5nIHBvaW50IG1vZGUgZGlzbWlzc2VzIGFueSBsaW5nZXJpbmcgc3RhdHVzIHRvYXN0LlxuICAgIGlmIChhY3RpdmUgIT09ICdzYW1Qb2ludCcpIHRoaXMuaGlkZVNhbVRvYXN0KCk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZSA9PT0gJ2VyYXNlVmVydGV4Jyk7XG4gICAgaWYgKGFjdGl2ZSA9PT0gJ2VyYXNlVmVydGV4Jykge1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRWZXJ0ZXhFcmFzZXJSYWRpdXModGhpcy52ZXJ0ZXhFcmFzZXJSYWRpdXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWdpb24gZHJhdy9zZWxlY3QvZWRpdCBtb2RlcyByb3V0ZWQgdGhyb3VnaCB0aGUgcmVnaW9uIG92ZXJsYXkuIFRoZVxuICAgKiAgVGhlIHZlcnRleCB0b29scyAoZHJhd3BvbHlnb24vYWRkcG9pbnQvZGVsZXRlcG9pbnQvbW92ZSkgYXJlXG4gICAqICBoYW5kbGVkIGJ5IHRoZSBPcGVuU2VhZHJhZ29uIG92ZXJsYXk7IFBsb3RseSdzIG92ZXJsYXkgbWFwcyB0aGVtIHRvIG5vLW9wLiAqL1xuICBwcml2YXRlIGlzUmVnaW9uTW9kZShtb2RlOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIG1vZGUgPT09ICdkcmF3cmVjdCcgfHxcbiAgICAgIG1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCcgfHxcbiAgICAgIG1vZGUgPT09ICdkcmF3b3BlbnBhdGgnIHx8XG4gICAgICBtb2RlID09PSAnc2VsZWN0JyB8fFxuICAgICAgbW9kZSA9PT0gJ2RyYXdwb2x5Z29uJyB8fFxuICAgICAgbW9kZSA9PT0gJ2FkZHBvaW50JyB8fFxuICAgICAgbW9kZSA9PT0gJ2RlbGV0ZXBvaW50JyB8fFxuICAgICAgbW9kZSA9PT0gJ21vdmUnXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBMaXZlLXVwZGF0ZSB0aGUgaXNvc3VyZmFjZSBhcyB0aGUgcmFuZ2Ugc2xpZGVyIG1vdmVzLiBUaGUgY29udHJvbCBpcyBvbmx5XG4gICAqICBhdmFpbGFibGUgd2hlbiB0aGUgYWN0aXZlIGJhY2tlbmQgcmVuZGVycyBpc29zdXJmYWNlcyAoSVNPU1VSRkFDRSBtb2RlKS4gKi9cbiAgb25Jc29SYW5nZUNoYW5nZSh2YWx1ZXM6IG51bWJlcltdIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF2YWx1ZXMgfHwgdmFsdWVzLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICB0aGlzLmlzb1JhbmdlID0gdmFsdWVzO1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk/LnNldElzb1JhbmdlKHZhbHVlc1swXSwgdmFsdWVzWzFdKTtcbiAgfVxuXG4gIG9uV2FuZFNlbnNpdGl2aXR5Q2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMud2FuZFNlbnNpdGl2aXR5ID0gdmFsdWU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRXYW5kT3B0aW9ucyh7IHNlbnNpdGl2aXR5OiB2YWx1ZSB9KTtcbiAgfVxuXG4gIG9uQnJ1c2hTaXplQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMuYnJ1c2hTaXplID0gdmFsdWU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRCcnVzaE9wdGlvbnMoeyBzaXplOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIG9uVmVydGV4RXJhc2VyUmFkaXVzQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMudmVydGV4RXJhc2VyUmFkaXVzID0gdmFsdWU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRWZXJ0ZXhFcmFzZXJSYWRpdXModmFsdWUpO1xuICB9XG5cbiAgem9vbUluKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuem9vbUluKCk7XG4gIH1cblxuICB6b29tT3V0KCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuem9vbU91dCgpO1xuICB9XG5cbiAgZGVsZXRlUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZGVsZXRlQWN0aXZlU2hhcGUoKTtcbiAgfVxuXG4gIC8qKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiBVcCB0byAxMCBzdGVwcyBiYWNrLiAqL1xuICB1bmRvUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UudW5kbygpO1xuICB9XG5cbiAgLyoqIFJlZG8gdGhlIG1vc3QgcmVjZW50bHkgdW5kb25lIHJlZ2lvbiBhY3Rpb24gKGppdC11aSM4NSkuICovXG4gIHJlZG9SZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5yZWRvKCk7XG4gIH1cblxuICAvLyDilIDilIAgUmVnaW9uIHNldC1vcGVyYXRpb25zIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoaml0LXVpIzg1KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhlIGN1cnJlbnRseS1zZWxlY3RlZCByZWdpb25zIChsaXZlIHN0b3JlIGluc3RhbmNlcykuICovXG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJbmRpY2VzXG4gICAgICAubWFwKChpKSA9PiBhbGxbaV0pXG4gICAgICAuZmlsdGVyKChyKTogciBpcyBSZWdpb24gPT4gISFyKTtcbiAgfVxuXG4gIC8qKiBSZWdpb25zIGVsaWdpYmxlIGZvciBzZXQtb3BzOiBjbG9zZWQgYXJlYXMgKHJlY3QgLyBjbG9zZWQgcG9seWdvbiAvXG4gICAqICBtdWx0aS1wb2x5Z29uKSwgZXhjbHVkaW5nIGludGVuc2l0eS1wcm9maWxlIGxpbmVzLiAqL1xuICBwcml2YXRlIG9wRWxpZ2libGUocmVnaW9uczogUmVnaW9uW10pOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHJlZ2lvbnMuZmlsdGVyKChyKSA9PiByLmtpbmQgIT09ICdwcm9maWxlJyAmJiAoXG4gICAgICByLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fFxuICAgICAgci5ib3VuZHMgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24gfHxcbiAgICAgIChyLmJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24gJiYgci5ib3VuZHMuY2xvc2VkICE9PSBmYWxzZSlcbiAgICApKTtcbiAgfVxuXG4gIC8qKiBJbWFnZSBwaXhlbCBkaW1lbnNpb25zIGZvciB0aGUgcmFzdGVyIG9wczsgZmFsbHMgYmFjayB0byB0aGUgc2VsZWN0aW9uJ3NcbiAgICogIGV4dGVudCB3aGVuIHRoZSBpbWFnZSBzaXplIGlzbid0IGtub3duIChrZWVwcyBjbGFtcGluZyBzYW5lKS4gKi9cbiAgcHJpdmF0ZSBvcEltYWdlRGltcyhyZWdpb25zOiBSZWdpb25bXSk6IHsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB7XG4gICAgbGV0IFt3LCBoXSA9IHRoaXMuaW1hZ2VJbmZvPy50cnVlSW1hZ2VTaXplID8/IFswLCAwXTtcbiAgICBpZiAoISh3ID4gMCkgfHwgIShoID4gMCkpIHtcbiAgICAgIGxldCBtYXhYID0gMCwgbWF4WSA9IDA7XG4gICAgICBjb25zdCBzY2FuID0gKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeCBvZiB4cykgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgICAgICBmb3IgKGNvbnN0IHkgb2YgeXMpIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTtcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgICAgICBjb25zdCBiID0gci5ib3VuZHM7XG4gICAgICAgIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSBzY2FuKFtiLnggKyBiLndpZHRoXSwgW2IueSArIGIuaGVpZ2h0XSk7XG4gICAgICAgIGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uKSBzY2FuKGIueHBvaW50cywgYi55cG9pbnRzKTtcbiAgICAgICAgZWxzZSBpZiAoYiBpbnN0YW5jZW9mIE11bHRpUG9seWdvbikgZm9yIChjb25zdCBwIG9mIGIucG9seWdvbnMpIHNjYW4ocC54cG9pbnRzLCBwLnlwb2ludHMpO1xuICAgICAgfVxuICAgICAgdyA9IE1hdGgubWF4KHcsIE1hdGguY2VpbChtYXhYKSArIDIpO1xuICAgICAgaCA9IE1hdGgubWF4KGgsIE1hdGguY2VpbChtYXhZKSArIDIpO1xuICAgIH1cbiAgICByZXR1cm4geyB3LCBoIH07XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIOKJpTIgZWxpZ2libGUgcmVnaW9ucyBhcmUgc2VsZWN0ZWQgKE1lcmdlIGF2YWlsYWJsZSkuICovXG4gIGdldCBjYW5NZXJnZVJlZ2lvbnMoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpLmxlbmd0aCA+PSAyOyB9XG4gIC8qKiBUcnVlIHdoZW4gYW55IHNlbGVjdGVkIHJlZ2lvbiBpcyBtdWx0aS1wYXJ0IChVbmdyb3VwIGF2YWlsYWJsZSkuICovXG4gIGdldCBjYW5Vbmdyb3VwUmVnaW9ucygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSZWdpb25zLnNvbWUoKHIpID0+IHRoaXMucmVnaW9uT3BzLmNhblVuZ3JvdXAocikpOyB9XG4gIC8qKiBUcnVlIHdoZW4g4omlMSBlbGlnaWJsZSByZWdpb24gaXMgc2VsZWN0ZWQgKEludmVyc2UgLyBTaW1wbGlmeSBhdmFpbGFibGUpLiAqL1xuICBnZXQgaGFzRWxpZ2libGVTZWxlY3Rpb24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpLmxlbmd0aCA+PSAxOyB9XG5cbiAgLyoqIFNlbGVjdCBldmVyeSByZWdpb24gb24gdGhlIGltYWdlIChleGNsdWRlcyBpbnRlbnNpdHktcHJvZmlsZSBsaW5lcykuICovXG4gIHNlbGVjdEFsbFJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBhbGwuZm9yRWFjaCgociwgaSkgPT4geyBpZiAoci5raW5kICE9PSAncHJvZmlsZScpIGluZGljZXMucHVzaChpKTsgfSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzKTtcbiAgfVxuXG4gIC8qKiBNZXJnZSB0aGUgc2VsZWN0ZWQgcmVnaW9ucyBpbnRvIGEgc2luZ2xlIChwb3NzaWJseSBtdWx0aS1wYXJ0KSByZWdpb24uICovXG4gIG1lcmdlUmVnaW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpO1xuICAgIGlmIChzZWwubGVuZ3RoIDwgMikgcmV0dXJuO1xuICAgIGNvbnN0IHsgdywgaCB9ID0gdGhpcy5vcEltYWdlRGltcyhzZWwpO1xuICAgIGNvbnN0IG1lcmdlZCA9IHRoaXMucmVnaW9uT3BzLm1lcmdlKHNlbCwgdywgaCk7XG4gICAgaWYgKG1lcmdlZCkgdGhpcy5yZXBsYWNlUmVnaW9ucyhzZWwsIFttZXJnZWRdKTtcbiAgfVxuXG4gIC8qKiBTcGxpdCBlYWNoIHNlbGVjdGVkIG11bHRpLXBhcnQgcmVnaW9uIGludG8gb25lIHJlZ2lvbiBwZXIgcGFydC4gKi9cbiAgdW5ncm91cFJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbnMuZmlsdGVyKChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5jYW5Vbmdyb3VwKHIpKTtcbiAgICBpZiAoc2VsLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlc3VsdHM6IFJlZ2lvbltdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHNlbCkgcmVzdWx0cy5wdXNoKC4uLnRoaXMucmVnaW9uT3BzLnVuZ3JvdXAocikpO1xuICAgIHRoaXMucmVwbGFjZVJlZ2lvbnMoc2VsLCByZXN1bHRzKTtcbiAgfVxuXG4gIC8qKiBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCBpdHMgaW52ZXJzZSBpbnNpZGUgdGhlIGltYWdlIHJlY3RhbmdsZS4gKi9cbiAgaW52ZXJzZVJlZ2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5vcEVsaWdpYmxlKHRoaXMuc2VsZWN0ZWRSZWdpb25zKTtcbiAgICBpZiAoc2VsLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgdywgaCB9ID0gdGhpcy5vcEltYWdlRGltcyhzZWwpO1xuICAgIGNvbnN0IGludiA9IHRoaXMucmVnaW9uT3BzLmludmVyc2Uoc2VsLCB3LCBoKTtcbiAgICBpZiAoIWludikge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICBrZXk6IHRoaXMucmVzdWx0VG9hc3RLZXksXG4gICAgICAgIHNldmVyaXR5OiAnd2FybicsIHN1bW1hcnk6ICdJbnZlcnNlJyxcbiAgICAgICAgZGV0YWlsOiAnTm90aGluZyB0byBpbnZlcnQg4oCUIHNlbGVjdCBvbmUgb3IgbW9yZSBjbG9zZWQgcmVnaW9ucyBmaXJzdC4nLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVwbGFjZVJlZ2lvbnMoc2VsLCBbaW52XSk7XG4gIH1cblxuICAvKiogRG91Z2xhc+KAk1BldWNrZXIgc2ltcGxpZnkgZWFjaCBzZWxlY3RlZCByZWdpb24gYnkgYHRocmVzaG9sZFB4YC4gKi9cbiAgc2ltcGxpZnlSZWdpb25zKHRocmVzaG9sZFB4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLm9wRWxpZ2libGUodGhpcy5zZWxlY3RlZFJlZ2lvbnMpO1xuICAgIGlmIChzZWwubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5yZXBsYWNlUmVnaW9ucyhzZWwsIHNlbC5tYXAoKHIpID0+IHRoaXMucmVnaW9uT3BzLnNpbXBsaWZ5KHIsIHRocmVzaG9sZFB4KSkpO1xuICAgIHRoaXMuZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gZmFsc2U7XG4gIH1cblxuICAvKiogT3BlbiB0aGUgY3VzdG9tLXRocmVzaG9sZCBzaW1wbGlmeSBkaWFsb2cuICovXG4gIG9wZW5TaW1wbGlmeURpYWxvZygpOiB2b2lkIHsgdGhpcy5kaXNwbGF5U2ltcGxpZnlEaWFsb2cgPSB0cnVlOyB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCBhIHNldC1vcDogZHJvcCB0aGUgYHJlbW92ZWAgcmVnaW9ucywgYXBwZW5kIGBhZGRgLCBhbmQgc2VsZWN0IHRoZVxuICAgKiByZXN1bHRzLiBHb2VzIHRocm91Z2ggc2V0UmVnaW9ucyBzbyBpdCdzIHVuZG8tdHJhY2tlZCBhbmQgcmUtcmVuZGVyZWQ7XG4gICAqIHByb2ZpbGUgbGluZXMgYW5kIHVuc2VsZWN0ZWQgcmVnaW9ucyBhcmUgcHJlc2VydmVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZXBsYWNlUmVnaW9ucyhyZW1vdmU6IFJlZ2lvbltdLCBhZGQ6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgaWYgKGFkZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByZW1vdmVTZXQgPSBuZXcgU2V0KHJlbW92ZSk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gIXJlbW92ZVNldC5oYXMocikpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0UmVnaW9ucyhbLi4ua2VwdCwgLi4uYWRkXSk7IC8vIG1pbnRzIGlkcyBvbiBgYWRkYCwgcmVjb3JkcyB1bmRvXG4gICAgY29uc3Qgc3RvcmVkID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3Qgc2VsID0gYWRkLm1hcCgocikgPT4gc3RvcmVkLmluZGV4T2YocikpLmZpbHRlcigoaSkgPT4gaSA+PSAwKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKHNlbCk7XG4gIH1cblxuICAvKiogQm94LXByb21wdGVkIFNBTSBzZWdtZW50YXRpb24gb2YgdGhlIGRyYXduIHJlY3RhbmdsZXMgKGppdC11aSM5MCkuIEEgc3RpY2t5XG4gICAqICBgc2FtYCB0b2FzdCBzaG93cyBsaXZlIHN0YXR1cyArIGEgZG93bmxvYWQgcHJvZ3Jlc3MgYmFyIChmaXJzdCBydW4gcHVsbHMgdGhlXG4gICAqICBlbmNvZGVyLCB+MTcwIE1CKTsgaXQgc3RheXMgb3BlbiB1bnRpbCB0aGUgcnVuIGZpbmlzaGVzIChiYXIgaGl0cyAxMDAlKS4gKi9cbiAgYXN5bmMgc2VnbWVudFJlZ2lvbnMoKSB7XG4gICAgYXdhaXQgdGhpcy5ydW5TZWdtZW50V2l0aFRvYXN0KCdTQU0nLCB0aGlzLnNhbVRvb2wsICgpID0+IHRoaXMucGxvdFNlcnZpY2Uuc2VnbWVudFJlY3RhbmdsZXMoKSk7XG4gIH1cblxuICAvKiogQXV0by1zZWdtZW50IGNlbGxzIGluc2lkZSBlYWNoIGRyYXduIHJlY3RhbmdsZSB3aXRoIGNlbGxwb3NlLVNBTSwgY2xpZW50LXNpZGVcbiAgICogIChqaXQtdWkjOTApLiBFYWNoIGJveCBpcyBjcm9wcGVkIChicm93c2VyIHNsaWRlLWNyb3ApIHRoZW4gcnVuIHRocm91Z2ggdGhlXG4gICAqICBjZWxscG9zZS1qcyBtb2RlbDsgdGhlIHNhbWUgc3RpY2t5IGBzYW1gIHRvYXN0ICsgcHJvZ3Jlc3MgYmFyIGlzIHJldXNlZC4gKi9cbiAgYXN5bmMgc2VnbWVudENlbGxwb3NlKCkge1xuICAgIGF3YWl0IHRoaXMucnVuU2VnbWVudFdpdGhUb2FzdCgnQ2VsbHBvc2UnLCB0aGlzLmNlbGxTZWdtZW50VG9vbCwgKCkgPT5cbiAgICAgIHRoaXMucGxvdFNlcnZpY2Uuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpLFxuICAgICk7XG4gIH1cblxuICAvKiogU2hhcmVkIGRyaXZlciBmb3IgdGhlIGJveC1wcm9tcHQgc2VnbWVudCB0b29sczogd2lyZXMgdGhlIHRvb2wncyBzdGF0dXMgK1xuICAgKiAgZG93bmxvYWQgcHJvZ3Jlc3MgaW50byB0aGUgc3RpY2t5IGBzYW1gIHRvYXN0LCBydW5zIGBvcGAsIGFuZCByZXBvcnRzIHRoZVxuICAgKiAgcmVnaW9uIGNvdW50LiBLZWVwcyB0aGUgdG9hc3Qgb3BlbiB1bnRpbCB0aGUgcnVuIHNldHRsZXMgKGJhciBoaXRzIDEwMCUpLiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blNlZ21lbnRXaXRoVG9hc3QoXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICB0b29sOiB7IHN0YXR1cyQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+OyBwcm9ncmVzcyQ6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+IH0sXG4gICAgb3A6ICgpID0+IFByb21pc2U8bnVtYmVyPixcbiAgKSB7XG4gICAgdGhpcy5zYW1TdGF0dXMgPSAnU3RhcnRpbmfigKYnO1xuICAgIHRoaXMuc2FtUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuc2FtRG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNhbUJ1c3kgPSB0cnVlO1xuICAgIGNvbnN0IHBzdWIgPSB0b29sLnByb2dyZXNzJC5zdWJzY3JpYmUoKGYpID0+IHtcbiAgICAgIHRoaXMuc2FtRG93bmxvYWRpbmcgPSBmID49IDAgJiYgZiA8IDE7XG4gICAgICBpZiAoZiA+PSAwKSB0aGlzLnNhbVByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKGYgKiAxMDApKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgICBjb25zdCBzc3ViID0gdG9vbC5zdGF0dXMkLnN1YnNjcmliZSgobSkgPT4ge1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgdGhpcy5zYW1TdGF0dXMgPSBtO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zaG93U2FtVG9hc3QobGFiZWwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBuID0gYXdhaXQgb3AoKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAga2V5OiB0aGlzLnJlc3VsdFRvYXN0S2V5LFxuICAgICAgICBzZXZlcml0eTogbiA+IDAgPyAnc3VjY2VzcycgOiAnd2FybicsXG4gICAgICAgIHN1bW1hcnk6IGxhYmVsLFxuICAgICAgICBkZXRhaWw6IHRvb2wuc3RhdHVzJC52YWx1ZSB8fCAobiA+IDAgPyBgQWRkZWQgJHtufSByZWdpb24ocykuYCA6ICdObyByZWdpb25zIGFkZGVkLicpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICBrZXk6IHRoaXMucmVzdWx0VG9hc3RLZXksXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiBgJHtsYWJlbH0gZmFpbGVkYCwgZGV0YWlsOiBTdHJpbmcoZSksXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgc3N1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5oaWRlU2FtVG9hc3QoKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2hvdyB0aGUgc2hhcmVkIHN0aWNreSBgc2FtYCB0b2FzdCBvbmNlIChpZGVtcG90ZW50IOKAlCByZS1hZGRpbmcgd291bGQgc3RhY2tcbiAgICogIGEgbmV3IHRvYXN0IG9uIGV2ZXJ5IHBvaW50IGNsaWNrKS4gKi9cbiAgcHJpdmF0ZSBzaG93U2FtVG9hc3Qoc3VtbWFyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2FtVG9hc3RTaG93bikgcmV0dXJuO1xuICAgIHRoaXMuc2FtVG9hc3RTaG93biA9IHRydWU7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IHRoaXMuc2FtVG9hc3RLZXksIHN0aWNreTogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeSB9KTtcbiAgfVxuXG4gIC8qKiBEaXNtaXNzIHRoZSBzaGFyZWQgYHNhbWAgdG9hc3QgYW5kIHJlc2V0IGl0cyBwcm9ncmVzcy9zcGlubmVyIHN0YXRlLiAqL1xuICBwcml2YXRlIGhpZGVTYW1Ub2FzdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNhbVRvYXN0U2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLnNhbUJ1c3kgPSBmYWxzZTtcbiAgICB0aGlzLnNhbURvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zYW1Qcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5jbGVhcih0aGlzLnNhbVRvYXN0S2V5KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogUGljayB0aGUgU0FNIG1vZGVsIHRoZSBzZWdtZW50IHRvb2xzIHVzZSAoaml0LXVpIzkwIFAxKS4gKi9cbiAgb25TYW1Nb2RlbENoYW5nZShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zYW1Nb2RlbElkID0gaWQ7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTYW1Nb2RlbChpZCk7XG4gIH1cblxuICAvKiogQ29udmVydCB0aGUgc2VsZWN0ZWQgcmVnaW9uIHRvIGEgc21vb3RoIGJlemllciBjdXJ2ZS4gKi9cbiAgdG9CZXppZXJSZWdpb24oKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25PdmVybGF5KCk/LnNldFNlbGVjdGVkQmV6aWVyKHRydWUpO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgdGhlIHNlbGVjdGVkIHJlZ2lvbiBiYWNrIHRvIGEgc3RyYWlnaHQtZWRnZWQgcG9seWdvbi4gKi9cbiAgdG9Qb2x5Z29uUmVnaW9uKCkge1xuICAgIHRoaXMucGxvdFNlcnZpY2UuZ2V0UmVnaW9uT3ZlcmxheSgpPy5zZXRTZWxlY3RlZEJlemllcihmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogSW1tZWRpYXRlIHJlZ2lvbiBhY3Rpb25zIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoaml0LXVpIzg1KTogbWVyZ2UsXG4gICAqIHVuZ3JvdXAsIGludmVyc2UsIHNpbXBsaWZ5LCB0aGUgQsOpemllciBjb252ZXJzaW9ucywgYW5kIGRlbGV0ZSDigJQgdGhlXG4gICAqIG9uZS1zaG90IGdlb21ldHJ5IHRyYW5zZm9ybXMsIGdyb3VwZWQgYXBhcnQgZnJvbSB0aGUgdG9vbC9tb2RlIHRvZ2dsZXMgYW5kXG4gICAqIHNob3duIG9ubHkgd2hlbiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQuIEVhY2ggaXRlbSBpcyBnYXRlZCBvbiB3aGF0IHRoZVxuICAgKiBzZWxlY3Rpb24gc3VwcG9ydHMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUmVnaW9uQWN0aW9uSXRlbXMoKTogTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5wbG90U2VydmljZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3Qgc2VsZWN0YWJsZSA9IGFsbC5maWx0ZXIoKHIpID0+IHIua2luZCAhPT0gJ3Byb2ZpbGUnKTtcbiAgICBpZiAoc2VsZWN0YWJsZS5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuXG4gICAgLy8gU2VsZWN0IGFsbCDigJQgYXZhaWxhYmxlIHdoZW5ldmVyIHRoZSBpbWFnZSBoYXMgcmVnaW9ucywgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAvLyBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICBpdGVtcy5wdXNoKHtcbiAgICAgIGxhYmVsOiAnU2VsZWN0IGFsbCByZWdpb25zJywgaWNvbjogJ3BpIHBpLWNoZWNrLXNxdWFyZScsXG4gICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnNlbGVjdEFsbFJlZ2lvbnMoKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNlbEFsbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25zO1xuICAgIGlmIChzZWxBbGwubGVuZ3RoID09PSAwKSByZXR1cm4gaXRlbXM7XG4gICAgY29uc3QgZWxpZ2libGUgPSB0aGlzLm9wRWxpZ2libGUoc2VsQWxsKTtcblxuICAgIGlmIChlbGlnaWJsZS5sZW5ndGggPj0gMikge1xuICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnTWVyZ2UgLyBncm91cCcsIGljb246ICdwaSBwaS1saW5rJywgY29tbWFuZDogKCkgPT4gdGhpcy5tZXJnZVJlZ2lvbnMoKSB9KTtcbiAgICB9XG4gICAgaWYgKHNlbEFsbC5zb21lKChyKSA9PiB0aGlzLnJlZ2lvbk9wcy5jYW5Vbmdyb3VwKHIpKSkge1xuICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnVW5ncm91cCcsIGljb246ICdwaSBwaS1zaXRlbWFwJywgY29tbWFuZDogKCkgPT4gdGhpcy51bmdyb3VwUmVnaW9ucygpIH0pO1xuICAgIH1cbiAgICBpZiAoZWxpZ2libGUubGVuZ3RoID49IDEpIHtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdJbnZlcnNlJywgaWNvbjogJ3BpIHBpLWNsb25lJywgY29tbWFuZDogKCkgPT4gdGhpcy5pbnZlcnNlUmVnaW9ucygpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NpbXBsaWZ5JywgaWNvbjogJ3BpIHBpLWNoYXJ0LWxpbmUnLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnTGlnaHQgKDEgcHgpJywgY29tbWFuZDogKCkgPT4gdGhpcy5zaW1wbGlmeVJlZ2lvbnMoMSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdNZWRpdW0gKDMgcHgpJywgY29tbWFuZDogKCkgPT4gdGhpcy5zaW1wbGlmeVJlZ2lvbnMoMykgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTdHJvbmcgKDggcHgpJywgY29tbWFuZDogKCkgPT4gdGhpcy5zaW1wbGlmeVJlZ2lvbnMoOCkgfSxcbiAgICAgICAgICAgIHsgc2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ3VzdG9t4oCmJywgY29tbWFuZDogKCkgPT4gdGhpcy5vcGVuU2ltcGxpZnlEaWFsb2coKSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBCw6l6aWVyIGNvbnZlcnNpb25zIGFyZSB2ZXJ0ZXgtbGV2ZWwgZWRpdHMg4oCUIEltYWdlIChPcGVuU2VhZHJhZ29uKSB2aWV3XG4gICAgLy8gb25seSDigJQgZ2F0ZWQgb24gdGhlIHNlbGVjdGlvbidzIGN1cnJlbnQgZm9ybS5cbiAgICBpZiAodGhpcy5zZWxlY3RlZFBsb3RUeXBlID09PSBQbG90VHlwZS5JTUFHRSkge1xuICAgICAgY29uc3QgaGFzU3RyYWlnaHQgPSBzZWxBbGwuc29tZSgocikgPT5cbiAgICAgICAgKHIuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbiAmJiAhci5ib3VuZHMuYmV6aWVyKSB8fCByLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSk7XG4gICAgICBjb25zdCBoYXNCZXppZXIgPSBzZWxBbGwuc29tZSgocikgPT4gci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uICYmIHIuYm91bmRzLmJlemllcik7XG4gICAgICBpZiAoaGFzU3RyYWlnaHQpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnQ29udmVydCB0byBCw6l6aWVyJywgaWNvbjogJ3RvLWJlemllci1pY29uJywgY29tbWFuZDogKCkgPT4gdGhpcy50b0JlemllclJlZ2lvbigpIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGhhc0Jlemllcikge1xuICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdDb252ZXJ0IHRvIHBvbHlnb24nLCBpY29uOiAndG8tcG9seWdvbi1pY29uJywgY29tbWFuZDogKCkgPT4gdGhpcy50b1BvbHlnb25SZWdpb24oKSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnRGVsZXRlIHJlZ2lvbicsIGljb246ICdwaSBwaS10cmFzaCcsIGNvbW1hbmQ6ICgpID0+IHRoaXMuZGVsZXRlUmVnaW9uKCkgfSk7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbnRleHRNZW51SXRlbXMoKTogTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5hY3RpdmVEcmFnTW9kZTtcbiAgICBjb25zdCBhY3RpdmVDbGFzcyA9ICdjb250ZXh0LW1lbnUtYWN0aXZlJztcbiAgICBjb25zdCBpdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuICAgIC8vIFNlbGVjdGVkLXJlZ2lvbiBhY3Rpb25zIGxlYWQgdGhlIG1lbnUgKHNlcGFyYXRlZCBmcm9tIHRoZSB0b29sIHRvZ2dsZXMpLlxuICAgIGlmICh0aGlzLmlzSGVhdG1hcCkge1xuICAgICAgY29uc3QgYWN0aW9ucyA9IHRoaXMuYnVpbGRSZWdpb25BY3Rpb25JdGVtcygpO1xuICAgICAgaWYgKGFjdGlvbnMubGVuZ3RoKSBpdGVtcy5wdXNoKC4uLmFjdGlvbnMsIHsgc2VwYXJhdG9yOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0hlYXRtYXApIHtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdBdXRvc2NhbGUnLCBpY29uOiAncGkgcGktd2luZG93LW1heGltaXplJywgY29tbWFuZDogKCkgPT4gdGhpcy5hdXRvc2NhbGVJbWFnZSgpIH0sXG4gICAgICAgIHsgc2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgLy8gJ1pvb20gc2VsZWN0aW9uJyBpcyBQbG90bHkncyBydWJiZXItYmFuZCB6b29tOyBpdCBkb2Vzbid0IGFwcGx5IHRvIHRoZVxuICAgICAgLy8gT3BlblNlYWRyYWdvbi1iYWNrZWQgSW1hZ2UgdmlldyAodXNlICdab29tIHRvIGJveCcgdGhlcmUgaW5zdGVhZCkuXG4gICAgICBpZiAoIXRoaXMuaXNJbWFnZVZpZXcpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgbGFiZWw6ICdab29tIHNlbGVjdGlvbicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXNlYXJjaCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnem9vbScgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3pvb20nKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6ICdab29tIHRvIGJveCcsXG4gICAgICAgIGljb246ICd6b29tLWJveC1vZmYtaWNvbicsXG4gICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ3pvb21Ub0JveCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCd6b29tVG9Cb3gnKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0hlYXRtYXApIHtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ1BhbicsXG4gICAgICAgIGljb246ICdwaSBwaS1hcnJvd3MtYWx0JyxcbiAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAncGFuJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3BhbicpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHMzZCA9IHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZTtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1pvb20nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1zZWFyY2gnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IHMzZCA9PT0gJ3pvb20nID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZVN1cmZhY2UzZE1vZGUoJ3pvb20nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnUGFuJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktYXJyb3dzLWFsdCcsXG4gICAgICAgICAgc3R5bGVDbGFzczogczNkID09PSAncGFuJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVTdXJmYWNlM2RNb2RlKCdwYW4nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnT3JiaXRhbCByb3RhdGlvbicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWdsb2JlJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBzM2QgPT09ICdvcmJpdCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlU3VyZmFjZTNkTW9kZSgnb3JiaXQnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnVHVybnRhYmxlIHJvdGF0aW9uJyxcbiAgICAgICAgICBpY29uOiAncGkgcGktc3luYycsXG4gICAgICAgICAgc3R5bGVDbGFzczogczNkID09PSAndHVybnRhYmxlJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVTdXJmYWNlM2RNb2RlKCd0dXJudGFibGUnKSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBzZXBhcmF0b3I6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Jlc2V0IGNhbWVyYScsIGljb246ICdwaSBwaS1ob21lJywgY29tbWFuZDogKCkgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNIZWF0bWFwKSB7XG4gICAgICBpdGVtcy5wdXNoKFxuICAgICAgICB7IGxhYmVsOiAnWm9vbSBpbicsIGljb246ICdwaSBwaS1zZWFyY2gtcGx1cycsIGNvbW1hbmQ6ICgpID0+IHRoaXMuem9vbUluKCkgfSxcbiAgICAgICAgeyBsYWJlbDogJ1pvb20gb3V0JywgaWNvbjogJ3BpIHBpLXNlYXJjaC1taW51cycsIGNvbW1hbmQ6ICgpID0+IHRoaXMuem9vbU91dCgpIH0sXG4gICAgICAgIHsgc2VwYXJhdG9yOiB0cnVlIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCcsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWFycm93LXVwLXJpZ2h0JyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdzZWxlY3QnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdzZWxlY3QnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRnJlZWZvcm0nLFxuICAgICAgICAgIGljb246ICdwaSBwaS1wZW5jaWwnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RyYXdjbG9zZWRwYXRoJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd2Nsb3NlZHBhdGgnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnQnJ1c2gnLFxuICAgICAgICAgIGljb246ICdicnVzaC1pY29uJyxcbiAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdicnVzaCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2JydXNoJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1BvbHlsaW5lJyxcbiAgICAgICAgICBpY29uOiAncG9seWxpbmUtaWNvbicsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZHJhd29wZW5wYXRoJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd29wZW5wYXRoJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1JlY3RhbmdsZScsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLXN0b3AnLFxuICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RyYXdyZWN0JyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZHJhd3JlY3QnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnV2FuZCcsXG4gICAgICAgICAgaWNvbjogJ3dhbmQtaWNvbicsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnd2FuZCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ3dhbmQnKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnVmVydGV4IGVyYXNlcicsXG4gICAgICAgICAgaWNvbjogJ3BpIHBpLWVyYXNlcicsXG4gICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnZXJhc2VWZXJ0ZXgnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdlcmFzZVZlcnRleCcpLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIFZlcnRleCBlZGl0aW5nIHJ1bnMgb24gdGhlIE9wZW5TZWFkcmFnb24gb3ZlcmxheSwgd2hpY2hcbiAgICAgIC8vIGJhY2tzIHRoZSBJbWFnZSBwbG90IHR5cGUuIEhpZGRlbiBmb3Igb3RoZXIgMkQgdHlwZXMgKFBsb3RseSksIHdoZXJlXG4gICAgICAvLyB0aGVzZSBtb2RlcyBhcmUgbm8tb3BzLlxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQbG90VHlwZSA9PT0gUGxvdFR5cGUuSU1BR0UpIHtcbiAgICAgICAgaXRlbXMucHVzaChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1BvbHlnb24gKGNsaWNrIHZlcnRpY2VzKScsXG4gICAgICAgICAgICBpY29uOiAncG9seWdvbi12ZXJ0aWNlcy1pY29uJyxcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6IGFjdGl2ZSA9PT0gJ2RyYXdwb2x5Z29uJyA/IGFjdGl2ZUNsYXNzIDogJycsXG4gICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnRvZ2dsZURyYWdNb2RlKCdkcmF3cG9seWdvbicpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdBZGQgdmVydGV4JyxcbiAgICAgICAgICAgIGljb246ICd2ZXJ0ZXgtYWRkLWljb24nLFxuICAgICAgICAgICAgc3R5bGVDbGFzczogYWN0aXZlID09PSAnYWRkcG9pbnQnID8gYWN0aXZlQ2xhc3MgOiAnJyxcbiAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudG9nZ2xlRHJhZ01vZGUoJ2FkZHBvaW50JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ0RlbGV0ZSB2ZXJ0ZXgnLFxuICAgICAgICAgICAgaWNvbjogJ3ZlcnRleC1kZWxldGUtaWNvbicsXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiBhY3RpdmUgPT09ICdkZWxldGVwb2ludCcgPyBhY3RpdmVDbGFzcyA6ICcnLFxuICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy50b2dnbGVEcmFnTW9kZSgnZGVsZXRlcG9pbnQnKSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gQsOpemllciBjb252ZXJzaW9ucyArIERlbGV0ZSBhcmUgaW1tZWRpYXRlIHNlbGVjdGlvbiAqYWN0aW9ucyosIG5vdyBpbiB0aGVcbiAgICAgIC8vIFwiU2VsZWN0ZWQgcmVnaW9uKHMpXCIgZ3JvdXAgYXQgdGhlIHRvcCAoc2VlIGJ1aWxkUmVnaW9uQWN0aW9uSXRlbXMpLlxuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICB0b2dnbGVTdXJmYWNlM2RNb2RlKG1vZGU6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZSA9IG1vZGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSk7XG4gIH1cblxuICByZXNldFN1cmZhY2VDYW1lcmEoKSB7XG4gICAgdGhpcy5wbG90U2VydmljZS5yZXNldFN1cmZhY2VDYW1lcmEoKTtcbiAgfVxuXG4gIC8qKiBUb2dnbGUgdGhlIG5hcGFyaSAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyAodm9sdW1lL2lzb3N1cmZhY2UpLiBOby1vcCBvbiBiYWNrZW5kc1xuICAgKiAgdGhhdCBkb24ndCByZW5kZXIgb25lICh0aGUgY29udHJvbCBtZXRob2QgaXMgb3B0aW9uYWwpLiAqL1xuICB0b2dnbGVBeGVzKCkge1xuICAgIHRoaXMuYXhlc1Zpc2libGUgPSAhdGhpcy5heGVzVmlzaWJsZTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnNldEF4ZXNWaXNpYmxlPy4odGhpcy5heGVzVmlzaWJsZSk7XG4gIH1cblxuICAvKiogVG9nZ2xlIHRoZSBuYXBhcmkgc3VyZmFjZSB3aXJlZnJhbWUgKGVkZ2VzIHZzIGZpbGxlZCkuIE5vLW9wIG9uIGJhY2tlbmRzIHdpdGhvdXQgYSBzdXJmYWNlLiAqL1xuICB0b2dnbGVXaXJlZnJhbWUoKSB7XG4gICAgdGhpcy53aXJlZnJhbWVBY3RpdmUgPSAhdGhpcy53aXJlZnJhbWVBY3RpdmU7XG4gICAgdGhpcy5wbG90U2VydmljZS5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRXaXJlZnJhbWU/Lih0aGlzLndpcmVmcmFtZUFjdGl2ZSk7XG4gIH1cblxuICAvKiogQ2hhbmdlIHRoZSBuYXBhcmkgM0QgZGVjaW1hdGUgZmFjdG9yLiBEZWNpbWF0aW9uIGNoYW5nZXMgdGhlIGZldGNoZWQvYXNzZW1ibGVkIGRhdGEsIHNvIHRoaXNcbiAgICogIHJlLXBsb3RzIHRoZSBjdXJyZW50IDNEIHR5cGUgYXQgdGhlIG5ldyByZXNvbHV0aW9uICh1bmxpa2UgYXhlcy93aXJlZnJhbWUsIHdoaWNoIGFyZSBsaXZlKS4gKi9cbiAgc2VsZWN0UmVzb2x1dGlvbihzY2FsZTogbnVtYmVyKSB7XG4gICAgaWYgKHNjYWxlID09PSB0aGlzLnJlc29sdXRpb25TY2FsZSkgcmV0dXJuO1xuICAgIHRoaXMucmVzb2x1dGlvblNjYWxlID0gc2NhbGU7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRSZXNvbHV0aW9uU2NhbGU/LihzY2FsZSk7XG4gICAgdGhpcy5yZWxvYWRBbmRQbG90KCk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoIHRoZSBhY3RpdmUgcGxvdCB0eXBlIChoZWF0bWFwLCBzdXJmYWNlLCBjb250b3VyLCBzY2F0dGVyLCBsaW5lLFxuICAgKiBzY2F0dGVyM2QsIGlzb3N1cmZhY2UpLiBLZWVwcyBgaXNIZWF0bWFwYCBhcyB0aGUgMkQtdnMtM0QgZmxhZyB0aGUgcmVzdCBvZlxuICAgKiB0aGUgdG9vbGJhci9jb250ZXh0LW1lbnUgbG9naWMgcmVsaWVzIG9uLCBkZWFjdGl2YXRlcyAyRC1vbmx5IHRvb2xzIHdoZW5cbiAgICogbW92aW5nIHRvIGEgM0QgdHlwZSwgdGhlbiByZS1wbG90cy5cbiAgICovXG4gIG9uU2VsZWN0UGxvdFR5cGUodHlwZTogUGxvdFR5cGUpIHtcbiAgICB0aGlzLnBsb3RUeXBlID0gdHlwZTtcbiAgICB0aGlzLnNlbGVjdGVkUGxvdFR5cGUgPSB0eXBlO1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLnBsb3RUeXBlT3B0aW9ucy5maW5kKChkKSA9PiBkLnR5cGUgPT09IHR5cGUpO1xuICAgIGNvbnN0IGlzM2QgPSBkZXNjcmlwdG9yPy5kaW1lbnNpb25zID09PSAnM2QnO1xuICAgIHRoaXMuaXNIZWF0bWFwID0gIWlzM2Q7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRQbG90VHlwZSh0eXBlKTtcbiAgICAvLyBTd2l0Y2hpbmcgcGxvdCB0eXBlIGNhbmNlbHMgdGhlIGFjdGl2ZSB0b29sIOKAlCBub3QgZXZlcnkgdHlwZSBzdXBwb3J0cyB0aGVcbiAgICAvLyBzYW1lIHRvb2xzIChsaW5lL3NjYXR0ZXIgY2hhcnRzIGFuZCAzRCBzY2VuZXMgaGF2ZSBubyBib3ggem9vbSBvciByZWdpb25cbiAgICAvLyBkcmF3aW5nKSwgc28gbGVhdmluZyBhIHRvb2wgYXJtZWQgd291bGQgbWlzYmVoYXZlIG9uIHRoZSBuZXcgcGxvdC5cbiAgICB0aGlzLmRlYWN0aXZhdGVBY3RpdmVUb29sKCk7XG4gICAgaWYgKGlzM2QpIHtcbiAgICAgIHRoaXMuYWN0aXZlU3VyZmFjZTNkTW9kZSA9ICd0dXJudGFibGUnO1xuICAgIH1cbiAgICAvLyBuYXBhcmktanMgdm9sdW1lL2lzb3N1cmZhY2UgYXNzZW1ibGUgdGhlaXIgb3duIDNEIHRleHR1cmUgZnJvbSB0aGUgc2xpY2UgZW5kcG9pbnQsIHNvXG4gICAgLy8gdGhleSB0YWtlIHRoZSBub3JtYWwgcmUtcGxvdCBwYXRoIOKAlCBOT1QgUGxvdGx5J3Mgc3RhY2stZnJhbWUgbG9hZGVyICh3aG9zZSBcIkxvYWRpbmdcbiAgICAvLyBmcmFtZXNcIiBvdmVybGF5IHdvdWxkIG5ldmVyIGNsZWFyLCBzaW5jZSBQbG90bHkgaXNuJ3QgdGhlIGFjdGl2ZSBiYWNrZW5kKSAoaml0LXVpIzEwMikuXG4gICAgY29uc3QgaXNOYXBhcmkgPSB0eXBlID09PSBQbG90VHlwZS5OQVBBUklfSU1BR0UgfHwgaXNOYXBhcmkzZCh0eXBlKTtcbiAgICBpZiAoZGVzY3JpcHRvcj8ucmVxdWlyZXNTdGFjayAmJiAhaXNOYXBhcmkpIHtcbiAgICAgIC8vIFZvbHVtZSB0eXBlcyAoaXNvc3VyZmFjZSwgc2NhdHRlcjNkKSBuZWVkIHRoZSB3aG9sZSB6LXN0YWNrIGxvYWRlZCBhcyBhXG4gICAgICAvLyAzRCBhcnJheSwgYW5kIHRoZXkgYWx3YXlzIHJlbmRlciBvbiBQbG90bHkuIERyaXZlIHRoZSBzdGFjayByZWxvYWRcbiAgICAgIC8vIGRpcmVjdGx5IHRocm91Z2ggdGhlIGltYWdlLWluZm8gc3RyZWFtIHJhdGhlciB0aGFuIHRoZSBhY3RpdmUgcmVuZGVyZXInc1xuICAgICAgLy8gc2V0U2hvd1N0YWNrOiB3aGVuIE9wZW5TZWFkcmFnb24gb3ducyB0aGUgSW1hZ2UgdmlldyBpdHMgc2V0U2hvd1N0YWNrIGlzXG4gICAgICAvLyBhIG5vLW9wLCBzbyB0aGUgcmVsb2FkIG5ldmVyIGZpcmVkIGFuZCB0aGUgbG9hZGVyIHNwdW4gZm9yZXZlci4gV2UgYXJtXG4gICAgICAvLyBQbG90bHkncyBzdGFjay1sb2FkaW5nIGZsYWcgKGtlZXBzIGl0cyBmcmFtZS1mZXRjaCBsb29wIGFsaXZlKSBhbmRcbiAgICAgIC8vIHJlLWVtaXQgdGhlIGltYWdlIGluZm8gd2l0aCBzaG93U3RhY2sgb24gc28gdGhlIHBpcGVsaW5lIHJlbG9hZHMgb25cbiAgICAgIC8vIFBsb3RseSByZWdhcmRsZXNzIG9mIHdoaWNoIGJhY2tlbmQgd2FzIG9uIHNjcmVlbi5cbiAgICAgIHRoaXMuc2VsZWN0ZWRTdGFja09wdGlvbiA9IHRoaXMuc3RhY2tPcHRpb25zWzFdO1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5wbG90U2VydmljZS5zZXRTdGFja0xvYWRpbmcodHJ1ZSk7XG4gICAgICBpZiAodGhpcy5pbWFnZUluZm8pIHtcbiAgICAgICAgdGhpcy5pbWFnZUluZm8uc2hvd1N0YWNrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUluZm8odGhpcy5pbWFnZUluZm8pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlbG9hZEFuZFBsb3QoKTtcbiAgfVxuXG4gIC8qKiBEZWFjdGl2YXRlIHdoYXRldmVyIHRvb2wgaXMgYXJtZWQgYW5kIGNsZWFyIGV2ZXJ5IHRvb2wgbW9kZS4gKi9cbiAgcHJpdmF0ZSBkZWFjdGl2YXRlQWN0aXZlVG9vbCgpIHtcbiAgICB0aGlzLmFjdGl2ZURyYWdNb2RlID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb24uc2V0QWN0aXZlVG9vbChudWxsKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLmdldFJlZ2lvbk92ZXJsYXkoKT8uc2V0TW9kZSgnbm9uZScpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0RHJhZ01vZGUoZmFsc2UpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0Wm9vbVRvQm94TW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRXYW5kTW9kZShmYWxzZSk7XG4gICAgdGhpcy5wbG90U2VydmljZS5zZXRCcnVzaE1vZGUoZmFsc2UpO1xuICAgIHRoaXMucGxvdFNlcnZpY2Uuc2V0U2FtUG9pbnRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnBsb3RTZXJ2aWNlLnNldFZlcnRleEVyYXNlck1vZGUoZmFsc2UpO1xuICB9XG59XG5cbiIsIjwhLS0gU0FNIHRvYXN0OiBsaXZlIHN0YXR1cyArIGVuY29kZXItZG93bmxvYWQgcHJvZ3Jlc3MgYmFyIChqaXQtdWkjOTApLiBTdGlja3lcbiAgICAgd2hpbGUgYSBzZWdtZW50IHJ1bnM7IHN0YXlzIG9wZW4gdW50aWwgdGhlIGJhciByZWFjaGVzIDEwMCUgYW5kIHRoZSBydW4gZW5kcy4gLS0+XG48cC10b2FzdCBba2V5XT1cInNhbVRvYXN0S2V5XCIgcG9zaXRpb249XCJib3R0b20tcmlnaHRcIj5cbiAgPG5nLXRlbXBsYXRlIGxldC1tZXNzYWdlIHBUZW1wbGF0ZT1cIm1lc3NhZ2VcIj5cbiAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgbWluLXdpZHRoOiAxNnJlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBtYi0xXCI+e3sgbWVzc2FnZS5zdW1tYXJ5IH19PC9kaXY+XG4gICAgICA8ZGl2Pnt7IHNhbVN0YXR1cyB8fCBtZXNzYWdlLmRldGFpbCB9fTwvZGl2PlxuICAgICAgPHAtcHJvZ3Jlc3NCYXIgKm5nSWY9XCJzYW1Eb3dubG9hZGluZ1wiIFt2YWx1ZV09XCJzYW1Qcm9ncmVzc1wiIHN0eWxlQ2xhc3M9XCJtdC0yIHNhbS1wcm9ncmVzc1wiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgIDxwLXByb2dyZXNzQmFyICpuZ0lmPVwic2FtQnVzeSAmJiAhc2FtRG93bmxvYWRpbmdcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIHN0eWxlQ2xhc3M9XCJtdC0yXCJcbiAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7IGhlaWdodDogJzRweCcgfVwiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC10b2FzdD5cblxuPCEtLSBSZXN1bHQvZXJyb3Igbm90aWNlcyBmcm9tIHRoZSBsaWJyYXJ5IGl0c2VsZiAoc2VnbWVudGF0aW9uIG91dGNvbWUsIHJlZ2lvblxuICAgICB2YWxpZGF0aW9uKS4gUmVuZGVyZWQgaGVyZSBzbyB0aGV5IGRvIG5vdCBkZXBlbmQgb24gdGhlIGhvc3QgbW91bnRpbmcgYVxuICAgICBrZXlsZXNzIDxwLXRvYXN0PiDigJQgd2l0aG91dCB0aGlzIHRoZSBtZXNzYWdlcyB3ZW50IG5vd2hlcmUgaW4gYW55IGhvc3QgYnV0XG4gICAgIGppdC11aSwgYW5kIGEgZmFpbGVkIHJ1biBsb29rZWQgbGlrZSBhIGJ1dHRvbiB0aGF0IGRpZCBub3RoaW5nLiAtLT5cbjxwLXRvYXN0IFtrZXldPVwicmVzdWx0VG9hc3RLZXlcIiBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiPjwvcC10b2FzdD5cblxuPCEtLSBTaGFyZWQgb3V0bGV0cyBmb3Igbm90aWNlcyByYWlzZWQgd2hlcmUgdGhlcmUgaXMgbm8gcGVyLWluc3RhbmNlIGtleSB0byB1c2U6XG4gICAgIHRoZSByb290LXByb3ZpZGVkIFBsb3RseVNlcnZpY2UgYW5kIHRoZSByZWdpb24tZWRpdG9yIGRpYWxvZy4gUmVuZGVyZWQgYnkgYVxuICAgICBzaW5nbGUgdmlzdWFsaXplciAob3duc1NoYXJlZFRvYXN0cykgc28gYSBtZXNzYWdlIGZyb20gdGhlIHJvb3Qgc2VydmljZSBpc1xuICAgICBub3Qgc2hvd24gb25jZSBwZXIgbGl2ZSB2aWV3ZXIuIC0tPlxuPHAtdG9hc3QgKm5nSWY9XCJvd25zU2hhcmVkVG9hc3RzXCIgW2tleV09XCJ2aXpUb2FzdEtleVwiPjwvcC10b2FzdD5cbjxwLXRvYXN0ICpuZ0lmPVwib3duc1NoYXJlZFRvYXN0c1wiIFtrZXldPVwidml6QWxlcnRUb2FzdEtleVwiIHBvc2l0aW9uPVwiY2VudGVyXCI+PC9wLXRvYXN0PlxuXG48IS0tIFRvb2xiYXIgZG9jazogZG9ja2VkIGFjcm9zcyB0aGUgdG9wIGJ5IGRlZmF1bHQ7IGRyYWcgdGhlIGhhbmRsZSB0byBkZXRhY2hcbiAgICAgaXQgaW50byBhIGZsb2F0aW5nLCBtb3ZhYmxlIHdpbmRvdyAoZnJlZXMgdGhlIHRvcCByb3cgZm9yIHRoZSBpbWFnZSkuIC0tPlxuPGRpdiBjbGFzcz1cInRvb2xiYXItZG9ja1wiIFtjbGFzcy5mbG9hdGluZ109XCJ0b29sYmFyRmxvYXRpbmdcIlxuICAgICBbc3R5bGUubGVmdC5weF09XCJ0b29sYmFyRmxvYXRpbmcgPyB0b29sYmFyUG9zLnggOiBudWxsXCJcbiAgICAgW3N0eWxlLnRvcC5weF09XCJ0b29sYmFyRmxvYXRpbmcgPyB0b29sYmFyUG9zLnkgOiBudWxsXCI+XG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWRyYWctaGFuZGxlXCIgKG1vdXNlZG93bik9XCJvblRvb2xiYXJEcmFnU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgcFRvb2x0aXA9XCJEcmFnIHRvIGZsb2F0IHRoZSB0b29sYmFyXCIgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCI+XG4gICAgPGkgY2xhc3M9XCJwaSBwaS1iYXJzXCI+PC9pPlxuICA8L2Rpdj5cbjxwbG90dGluZy10b29sYmFyXG4gIFtpbWFnZUluZm9dPVwiaW1hZ2VJbmZvXCJcbiAgW3Bsb3RUeXBlT3B0aW9uc109XCJwbG90VHlwZU9wdGlvbnNcIlxuICBbc2VsZWN0ZWRQbG90VHlwZV09XCJzZWxlY3RlZFBsb3RUeXBlXCJcbiAgW2lzb1JhbmdlXT1cImlzb1JhbmdlXCJcbiAgW21heEluZGV4XT1cIm1heEluZGV4XCJcbiAgW3pJbmRleF09XCJ6SW5kZXhcIlxuICBbaXNIZWF0bWFwXT1cImlzSGVhdG1hcFwiXG4gIFthY3RpdmVEcmFnTW9kZV09XCJhY3RpdmVEcmFnTW9kZVwiXG4gIFthY3RpdmVTdXJmYWNlM2RNb2RlXT1cImFjdGl2ZVN1cmZhY2UzZE1vZGVcIlxuICBbYXhlc1Zpc2libGVdPVwiYXhlc1Zpc2libGVcIlxuICBbd2lyZWZyYW1lQWN0aXZlXT1cIndpcmVmcmFtZUFjdGl2ZVwiXG4gIFtyZXNvbHV0aW9uU2NhbGVdPVwicmVzb2x1dGlvblNjYWxlXCJcbiAgW3dhbmRTZW5zaXRpdml0eV09XCJ3YW5kU2Vuc2l0aXZpdHlcIlxuICBbYnJ1c2hTaXplXT1cImJydXNoU2l6ZVwiXG4gIFtzYW1Nb2RlbHNdPVwic2FtTW9kZWxzXCJcbiAgW3NhbU1vZGVsSWRdPVwic2FtTW9kZWxJZFwiXG4gIFt2ZXJ0ZXhFcmFzZXJSYWRpdXNdPVwidmVydGV4RXJhc2VyUmFkaXVzXCJcbiAgW2NhblVuZG9dPVwiY2FuVW5kb1JlZ2lvblwiXG4gIFtjYW5SZWRvXT1cImNhblJlZG9SZWdpb25cIlxuICBbc3RhY2tPcHRpb25zXT1cInN0YWNrT3B0aW9uc1wiXG4gIFt0b29sc109XCJ0b29sYmFyVG9vbHNcIlxuICBbaW1hZ2VTbW9vdGhpbmdFbmFibGVkXT1cImltYWdlU21vb3RoaW5nRW5hYmxlZFwiXG4gIChzZWxlY3RQbG90VHlwZSk9XCJvblNlbGVjdFBsb3RUeXBlKCRldmVudClcIlxuICAodG9nZ2xlSW1hZ2VTbW9vdGhpbmcpPVwib25Ub2dnbGVJbWFnZVNtb290aGluZygpXCJcbiAgKGFkZFByb2ZpbGVMaW5lKT1cImFkZFByb2ZpbGVMaW5lKClcIlxuICAoaXNvUmFuZ2VDaGFuZ2UpPVwib25Jc29SYW5nZUNoYW5nZSgkZXZlbnQpXCJcbiAgKG9wZW5DaGFubmVsSGlzdG9ncmFtKT1cIm9wZW5DaGFubmVsSGlzdG9ncmFtKClcIlxuICAob3BlblJlZ2lvbkVkaXRvcik9XCJvcGVuUmVnaW9uRWRpdG9yKClcIlxuICAoc2VsZWN0U3RhY2tPcHRpb24pPVwic2VsZWN0U3RhY2tPcHRpb24oJGV2ZW50KVwiXG4gICh6U2NydWIpPVwib25aU2NydWIoJGV2ZW50KVwiXG4gICh6U2xpZGUpPVwib25aU2xpZGUoJGV2ZW50KVwiXG4gICh6SW5kZXhJbnB1dCk9XCJ6SW5kZXggPSAkZXZlbnQ7IHVwZGF0ZVpJbmRleCgpXCJcbiAgKHJlbG9hZEFuZFBsb3QpPVwicmVsb2FkQW5kUGxvdCgpXCJcbiAgKGRvd25sb2FkSW1hZ2UpPVwiZG93bmxvYWRJbWFnZSgpXCJcbiAgKGF1dG9zY2FsZUltYWdlKT1cImF1dG9zY2FsZUltYWdlKClcIlxuICAodG9nZ2xlRHJhZ01vZGUpPVwidG9nZ2xlRHJhZ01vZGUoJGV2ZW50KVwiXG4gICh6b29tSW4pPVwiem9vbUluKClcIlxuICAoem9vbU91dCk9XCJ6b29tT3V0KClcIlxuICAodG9nZ2xlU3VyZmFjZTNkTW9kZSk9XCJ0b2dnbGVTdXJmYWNlM2RNb2RlKCRldmVudClcIlxuICAocmVzZXRTdXJmYWNlQ2FtZXJhKT1cInJlc2V0U3VyZmFjZUNhbWVyYSgpXCJcbiAgKHRvZ2dsZUF4ZXMpPVwidG9nZ2xlQXhlcygpXCJcbiAgKHRvZ2dsZVdpcmVmcmFtZSk9XCJ0b2dnbGVXaXJlZnJhbWUoKVwiXG4gIChzZWxlY3RSZXNvbHV0aW9uKT1cInNlbGVjdFJlc29sdXRpb24oJGV2ZW50KVwiXG4gIChkZWxldGVSZWdpb24pPVwiZGVsZXRlUmVnaW9uKClcIlxuICAodW5kb1JlZ2lvbik9XCJ1bmRvUmVnaW9uKClcIlxuICAocmVkb1JlZ2lvbik9XCJyZWRvUmVnaW9uKClcIlxuICAoc2VnbWVudFJlZ2lvbnMpPVwic2VnbWVudFJlZ2lvbnMoKVwiXG4gIChzZWdtZW50Q2VsbHBvc2UpPVwic2VnbWVudENlbGxwb3NlKClcIlxuICAoc2FtTW9kZWxDaGFuZ2UpPVwib25TYW1Nb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgKHdhbmRTZW5zaXRpdml0eUNoYW5nZSk9XCJvbldhbmRTZW5zaXRpdml0eUNoYW5nZSgkZXZlbnQpXCJcbiAgKGJydXNoU2l6ZUNoYW5nZSk9XCJvbkJydXNoU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgKHZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSk9XCJvblZlcnRleEVyYXNlclJhZGl1c0NoYW5nZSgkZXZlbnQpXCI+XG4gIDwhLS0gSG9zdC1wcm9qZWN0ZWQgY3VzdG9tIHRvb2xiYXIgYnV0dG9ucywgZm9yd2FyZGVkIGludG8gdGhlIHRvb2xiYXIuIC0tPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L3Bsb3R0aW5nLXRvb2xiYXI+XG4gIDxwLWJ1dHRvbiAqbmdJZj1cInRvb2xiYXJGbG9hdGluZ1wiIGNsYXNzPVwidG9vbGJhci1kb2NrLWJ0blwiIGljb249XCJwaSBwaS10aHVtYnRhY2tcIiBzaXplPVwic21hbGxcIiBbdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgIHBUb29sdGlwPVwiRG9jayB0byB0b3BcIiB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIiAob25DbGljayk9XCJkb2NrVG9vbGJhcigpXCI+XG4gIDwvcC1idXR0b24+XG48L2Rpdj5cblxuPHAtY29udGV4dE1lbnUgI2NtIFttb2RlbF09XCJjb250ZXh0TWVudUl0ZW1zXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLWNvbnRleHRNZW51PlxuPCEtLSBObyBgaC1mdWxsYCBoZXJlOiBQcmltZUZsZXgncyBoZWlnaHQ6MTAwJSAhaW1wb3J0YW50IG1hZGUgI3Bsb3QgYXMgdGFsbCBhc1xuICAgICB0aGUgd2hvbGUgaG9zdCwgc28gdW5kZXIgdGhlIGRvY2tlZCB0b29sYmFyIGl0cyBib3R0b20gdG9vbGJhci1oZWlnaHQgc3RyaXBcbiAgICAgKGluY2wuIHRoZSBPU0Qgc2NhbGUgYmFyIGF0IGJvdHRvbS1sZWZ0KSB3YXMgY2xpcHBlZCBieSB0aGUgaG9zdCdzXG4gICAgIG92ZXJmbG93OmhpZGRlbi4gVGhlIGNvbXBvbmVudCBzdHlsZXNoZWV0IHNpemVzIGl0ICgudml6LXBsb3QgeyBmbGV4OiAxIH0pLiAtLT5cbjxkaXYgY2xhc3M9XCJ3LWZ1bGwgcmVsYXRpdmUgdml6LXBsb3RcIiBbaWRdPVwicGxvdERpdk5hbWVcIj5cbiAgPGRpdiAqbmdJZj1cImltZ0xvYWRpbmcgfHwgc3RhY2tMb2FkaW5nIHx8IGlzQ2FjaGluZ1wiIGlkPVwib3ZlcmxheVwiPlxuICAgIDwhLS0gRGV0ZXJtaW5hdGUgc3RhY2svdm9sdW1lIHByb2dyZXNzIHRha2VzIHByZWNlZGVuY2U6IHdoaWxlIGl0J3MgYWN0aXZlIHNob3cgT05MWSB0aGVcbiAgICAgICAgIHByb2dyZXNzIGJhciArIFwiTG9hZGluZyBmcmFtZXMuLi5cIiwgbm90IHRoZSBnZW5lcmljIHNwaW5uZXIvXCJMb2FkaW5nIGltYWdlLi4uXCIgb24gdG9wIG9mXG4gICAgICAgICBpdCAoYm90aCB3ZXJlIHJlbmRlcmluZyBhdCBvbmNlIGZvciBuYXBhcmkgdm9sdW1lL2lzb3N1cmZhY2UgbG9hZHMpLiAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhY2tMb2FkaW5nOyBlbHNlIGltZ0xvYWRpbmdUcGxcIj5cbiAgICAgIDxwLXByb2dyZXNzQmFyIGNsYXNzPVwicHJvZ3Jlc3NcIiBbdmFsdWVdPVwibG9hZGluZ1BlcmNlbnRhZ2VcIj48L3AtcHJvZ3Jlc3NCYXI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPkxvYWRpbmcgZnJhbWVzLi4uPC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjaW1nTG9hZGluZ1RwbD5cbiAgICAgIDwhLS0gQ2FjaGUtY29weSBwcm9ncmVzcyBpcyBzaG93biB3aGVuZXZlciBhIGNhY2hlIGRvd25sb2FkIGlzIGFjdGl2ZSAoaXNDYWNoaW5nKSwgaW5kZXBlbmRlbnRcbiAgICAgICAgICAgb2YgYGltZ0xvYWRpbmdgLCBzbyBpdCdzIG5ldmVyIGRyb3BwZWQvbWFza2VkIG1pZC1kb3dubG9hZC4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDYWNoaW5nOyBlbHNlIHNwaW5uZXJMb2FkaW5nXCI+XG4gICAgICAgIDwhLS0gU3RhZ2UtYXdhcmUgbWVzc2FnZSBjb21lcyBmcm9tIENhY2hlUHJvZ3Jlc3NTZXJ2aWNlIHVwZGF0aW5nXG4gICAgICAgICAgICAgaW1hZ2VMb2FkaW5nTWVzc2FnZSQgKFwiQ2FjaGluZyBpbWFnZS4uLlwiIGR1cmluZyB0aGUgR0NTIGRvd25sb2FkLFxuICAgICAgICAgICAgIHRoZW4gXCJHZW5lcmF0aW5nIHByZXZpZXcuLi5cIiBkdXJpbmcgcGVyLXNsaWNlIHRodW1ibmFpbCBnZW4pLiBPbmNlIHRoZVxuICAgICAgICAgICAgIGRvd25sb2FkIGhpdHMgMTAwJSB0aGUgcmVtYWluaW5nIHdvcmsgKHNlcnZlciBwcmV2aWV3L3RpbGUgZ2VuZXJhdGlvbilcbiAgICAgICAgICAgICBoYXMgbm8gZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MsIHNvIGZhbGwgdGhyb3VnaCB0byB0aGUgc3Bpbm5lciB0ZW1wbGF0ZVxuICAgICAgICAgICAgIHJhdGhlciB0aGFuIHBhcmtpbmcgYSBmdWxsIGJhciB1bmRlciBcIkxvYWRpbmcgaW1hZ2UuLi5cIi4gLS0+XG4gICAgICAgIDxwLXByb2dyZXNzQmFyIGNsYXNzPVwicHJvZ3Jlc3NcIiBbdmFsdWVdPVwiY2FjaGVQcm9ncmVzc1wiPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxvYWRpbmdcIj57e2xvYWRpbmdNZXNzYWdlfX08L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc3Bpbm5lckxvYWRpbmc+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpbWdMb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nTG9hZGluZyAmJiAhem9vbVwiIGNsYXNzPVwidGV4dC1sb2FkaW5nXCI+e3tsb2FkaW5nTWVzc2FnZX19PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImltZ0xvYWRpbmcgJiYgem9vbVwiIGNsYXNzPVwiem9vbS10ZXh0LWxvYWRpbmdcIj57e2xvYWRpbmdNZXNzYWdlfX08L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPHAtYnV0dG9uICpuZ0lmPVwic3RhY2tMb2FkaW5nIHx8IGltZ0xvYWRpbmdcIiBjbGFzcz1cImNhbmNlbC1sb2FkaW5nIFwiIGxhYmVsPVwiQ2FuY2VsXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2FuY2VsTG9hZGluZygpXCI+XG4gICAgPC9wLWJ1dHRvbj5cbiAgPC9kaXY+XG4gIDwhLS0gVHJhbnNsdWNlbnQgXCJzaGFycGVuaW5nXCIgb3ZlcmxheSBzaG93biBhZnRlciB0aGUgc21hbGwtdGllciBwcmV2aWV3IGlzXG4gICAgICAgb24gc2NyZWVuIHdoaWxlIHRoZSBsYXJnZS10aWVyIHJlbmRlciBpcyBzdGlsbCBsb2FkaW5nIGluIHRoZVxuICAgICAgIGJhY2tncm91bmQuIExldHMgdGhlIHVzZXIgc2VlIHRoZSBibHVycnkgaW1hZ2UgdW5kZXJuZWF0aCBidXQgbWFrZXNcbiAgICAgICBpdCBjbGVhciBzb21ldGhpbmcgaXMgc3RpbGwgbG9hZGluZyBzbyB0aGV5IGRvbid0IG1pc3Rha2UgdGhlXG4gICAgICAgbG93LXJlcyByZW5kZXIgZm9yIHRoZSBmaW5hbCBpbWFnZS4gLS0+XG4gIDxkaXYgKm5nSWY9XCJzaGFycGVuaW5nICYmICFpbWdMb2FkaW5nICYmICFzdGFja0xvYWRpbmcgJiYgIWlzQ2FjaGluZ1wiIGlkPVwic2hhcnBlbmluZy1vdmVybGF5XCI+XG4gICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInRleHQtbG9hZGluZ1wiPlNoYXJwZW5pbmcgcHJldmlldy4uLjwvc3Bhbj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuXG48IS0tIEZsb2F0aW5nLCBkcmFnZ2FibGUgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQuIFNob3duIGluIExJTkUgbW9kZTsgdGhlIGNoYXJ0XG4gICAgIHVwZGF0ZXMgbGl2ZSBhcyB0aGUgbGluZSBST0kgb24gdGhlIGltYWdlIGlzIG1vdmVkLiBLZXB0IE9VVFNJREUgI3Bsb3QgYW5kXG4gICAgIHBvc2l0aW9uZWQgZml4ZWQgc28gaXQgZmxvYXRzIG92ZXIgdGhlIHdob2xlIHBhZ2UgKG5vdCBjbGlwcGVkIHRvIHRoZVxuICAgICBkaWFncmFtL2NhbnZhcyBhcmVhKS4gLS0+XG48ZGl2ICpuZ0lmPVwiaGFzUHJvZmlsZXNcIiBjbGFzcz1cImludGVuc2l0eS1wYW5lbFwiXG4gICAgIFtzdHlsZS5sZWZ0LnB4XT1cInByb2ZpbGVQYW5lbFBvcy54XCIgW3N0eWxlLnRvcC5weF09XCJwcm9maWxlUGFuZWxQb3MueVwiPlxuICA8ZGl2IGNsYXNzPVwiaW50ZW5zaXR5LXBhbmVsLWhlYWRlclwiIChtb3VzZWRvd24pPVwib25Qcm9maWxlUGFuZWxEcmFnU3RhcnQoJGV2ZW50KVwiPlxuICAgIDxzcGFuPkludGVuc2l0eSBwcm9maWxlPC9zcGFuPlxuICAgIDxpIGNsYXNzPVwicGkgcGktYXJyb3dzLWFsdFwiPjwvaT5cbiAgPC9kaXY+XG4gIDxkaXYgW2lkXT1cImludGVuc2l0eUluc2V0RGl2XCIgY2xhc3M9XCJpbnRlbnNpdHktcGFuZWwtcGxvdFwiPjwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gQ2hhbm5lbHMgJiBIaXN0b2dyYW06IG5vbi1tb2RhbCBmbG9hdGluZyBkaWFsb2cgb3BlbmVkIGZyb20gdGhlIHRvb2xiYXIuIC0tPlxuPGNoYW5uZWwtaGlzdG9ncmFtIFsodmlzaWJsZSldPVwic2hvd0NoYW5uZWxIaXN0b2dyYW1cIj48L2NoYW5uZWwtaGlzdG9ncmFtPlxuXG48IS0tIFJlZ2lvbiBFZGl0b3I6IG5vbi1tb2RhbCwgZHJhZ2dhYmxlLCByZXNpemFibGUgZmxvYXRpbmcgZGlhbG9nIG9wZW5lZCBmcm9tXG4gICAgIHRoZSB0b29sYmFyIChmb3JtZXJseSB0aGUgcmlnaHQtcGFuZWwgUmVnaW9ucyB0YWIpLiBNb2RlbGVzcyBzbyByZWdpb25zIGNhblxuICAgICBzdGlsbCBiZSBkcmF3bi9zZWxlY3RlZCBvbiB0aGUgcGxvdCB3aGlsZSBpdCdzIG9wZW47IHN0YXlzIGxpbmtlZCB0byB0aGlzXG4gICAgIHBsb3R0aW5nIGluc3RhbmNlIHZpYSB0aGUgcm9vdCBSZWdpb25TdG9yZSBzaW5nbGV0b24uIE9wZW5zIG92ZXIgdGhlIHJpZ2h0XG4gICAgIHNpZGUgb2YgdGhlIHZpZXcuIC0tPlxuPHAtZGlhbG9nIGhlYWRlcj1cIlJlZ2lvbiBFZGl0b3JcIiBbKHZpc2libGUpXT1cInNob3dSZWdpb25FZGl0b3JcIlxuICAgICAgICAgIFttb2RhbF09XCJmYWxzZVwiIFtyZXNpemFibGVdPVwidHJ1ZVwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgW21heGltaXphYmxlXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIiBwb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICBbc3R5bGVdPVwieyB3aWR0aDogcmVnaW9uRWRpdG9yV2lkdGgsIGhlaWdodDogJzg1dmgnIH1cIlxuICAgICAgICAgIFtjb250ZW50U3R5bGVdPVwieyBvdmVyZmxvdzogJ2F1dG8nIH1cIj5cbiAgPHJlZ2lvbi1lZGl0b3I+PC9yZWdpb24tZWRpdG9yPlxuPC9wLWRpYWxvZz5cblxuPCEtLSBTaW1wbGlmeSAoRG91Z2xhc+KAk1BldWNrZXIpOiBjdXN0b20gcHgtdGhyZXNob2xkIHBpY2tlciBmb3IgdGhlIHNlbGVjdGVkXG4gICAgIHJlZ2lvbihzKSwgb3BlbmVkIGZyb20gdGhlIHJpZ2h0LWNsaWNrIFwiU2ltcGxpZnkg4pa4IEN1c3RvbeKAplwiIGFjdGlvbi4gLS0+XG48cC1kaWFsb2cgaGVhZGVyPVwiU2ltcGxpZnkgcmVnaW9uKHMpXCIgWyh2aXNpYmxlKV09XCJkaXNwbGF5U2ltcGxpZnlEaWFsb2dcIiBbbW9kYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgW3N0eWxlXT1cInt3aWR0aDogJzIycmVtJ31cIiBbZHJhZ2dhYmxlXT1cImZhbHNlXCIgW3Jlc2l6YWJsZV09XCJmYWxzZVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiPlxuICAgIDxzcGFuPkFsdGl0dWRlIHRocmVzaG9sZDogPGI+e3sgc2ltcGxpZnlUaHJlc2hvbGQgfX0gcHg8L2I+PC9zcGFuPlxuICAgIDxwLXNsaWRlciBbKG5nTW9kZWwpXT1cInNpbXBsaWZ5VGhyZXNob2xkXCIgW21pbl09XCIxXCIgW21heF09XCIyMFwiIFtzdGVwXT1cIjFcIj48L3Atc2xpZGVyPlxuICAgIDxzbWFsbD5WZXJ0aWNlcyB3aXRoaW4gdGhpcyBkaXN0YW5jZSBvZiB0aGUgbGluZSBiZXR3ZWVuIHRoZWlyIG5laWdoYm91cnMgYXJlIHJlbW92ZWQuPC9zbWFsbD5cbiAgPC9kaXY+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8cC1idXR0b24gbGFiZWw9XCJDYW5jZWxcIiBbdGV4dF09XCJ0cnVlXCIgKG9uQ2xpY2spPVwiZGlzcGxheVNpbXBsaWZ5RGlhbG9nID0gZmFsc2VcIj48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvbiBsYWJlbD1cIkFwcGx5XCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKG9uQ2xpY2spPVwic2ltcGxpZnlSZWdpb25zKHNpbXBsaWZ5VGhyZXNob2xkKVwiPjwvcC1idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuXG4iXX0=
|