@sumaris-net/ngx-components 18.26.9 → 18.26.11

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.
@@ -4,15 +4,15 @@ import { isNilOrBlank } from '../../../functions';
4
4
  import { createPromiseEventEmitter, emitPromiseEvent } from '../../../events';
5
5
  import { Alerts } from '../../../alerts';
6
6
  import { APP_SHOW_TOOLTIP } from '../../../constants';
7
+ import { waitFor } from '../../../observables';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@ionic/angular";
9
10
  import * as i2 from "@ngx-translate/core";
10
11
  import * as i3 from "@angular/common";
11
12
  import * as i4 from "@angular/material/icon";
12
13
  import * as i5 from "@angular/material/tooltip";
13
- import * as i6 from "../../../pipes/property.pipes";
14
- import * as i7 from "../../../pipes/arrays.pipe";
15
- import * as i8 from "../../../pipes/url.pipes";
14
+ import * as i6 from "../../../pipes/arrays.pipe";
15
+ import * as i7 from "../../../pipes/url.pipes";
16
16
  /**
17
17
  * The zoom/pan/rotate/crop slideshow shown when clicking an image in `AppImageGalleryComponent`.
18
18
  * Extracted into its own component so the exact same slideshow can be presented either inside an
@@ -22,9 +22,9 @@ export class AppImageGallerySlideshowComponent {
22
22
  alterCtrl;
23
23
  translate;
24
24
  cd;
25
- activeSlideIndex = 0;
26
- swiperModules = [IonicSlides];
27
25
  _swiper;
26
+ swiperModules = [IonicSlides];
27
+ activeSlideIndex = 0;
28
28
  // Mouse wheel zoom & rotation state
29
29
  _zoomState = { scale: 1, tx: 0, ty: 0 };
30
30
  _rotation = 0; // degrees: 0, 90, 180, 270
@@ -102,6 +102,10 @@ export class AppImageGallerySlideshowComponent {
102
102
  this._swiper = (swiperElement || this.swiperRef?.nativeElement)?.swiper || this._swiper;
103
103
  return this._swiper;
104
104
  }
105
+ async waitForSwiper(swiperElement, waitForOptions) {
106
+ await waitFor(() => !!this.getSwiper(swiperElement), { checkPeriod: 50, timeout: 500, ...waitForOptions });
107
+ return this._swiper;
108
+ }
105
109
  /**
106
110
  * Waits (a few animation frames) until Swiper's own slides array reflects at least `minCount` items.
107
111
  * Needed after `fetchMore`: the new `<swiper-slide>` elements come from the `rows` input re-rendering,
@@ -141,14 +145,15 @@ export class AppImageGallerySlideshowComponent {
141
145
  const event = { index: activeIndex, row: this.rows?.[activeIndex] };
142
146
  (isNext ? this.nextSlide : this.previousSlide).emit(event);
143
147
  }
144
- onSwiperInit(swiperElement) {
145
- this._resetZoom();
146
- const swiper = this.getSwiper(swiperElement);
148
+ async onSwiperInit(swiperElement) {
149
+ this._resetZoom(swiperElement);
150
+ // Get the swiper
151
+ const swiper = await this.waitForSwiper(swiperElement, { timeout: 1000 });
147
152
  // The `initialSlide` binding can NOT work here: Angular inserts <swiper-container> into the DOM (which
148
153
  // synchronously runs its connectedCallback, constructing the Swiper instance and reading `initialSlide`
149
154
  // off the element) *before* it applies property bindings in its update pass -- so Swiper always reads
150
155
  // `initialSlide` as unset (0). It must be corrected explicitly, once Swiper actually exists.
151
- if (swiper && this.selectedIndex > 0 && swiper.activeIndex !== this.selectedIndex) {
156
+ if (this.selectedIndex > 0 && swiper && swiper.activeIndex !== this.selectedIndex) {
152
157
  swiper.slideTo(this.selectedIndex, 0 /*no transition, to avoid a "revert" effect*/);
153
158
  }
154
159
  this.activeSlideIndex = swiper?.activeIndex ?? this.selectedIndex;
@@ -722,11 +727,11 @@ export class AppImageGallerySlideshowComponent {
722
727
  this.cd.markForCheck();
723
728
  }
724
729
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppImageGallerySlideshowComponent, deps: [{ token: i1.AlertController }, { token: i2.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
725
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AppImageGallerySlideshowComponent, selector: "app-image-gallery-slideshow", inputs: { rows: "rows", selectedIndex: "selectedIndex", mobile: ["mobile", "mobile", booleanAttribute], readOnly: ["readOnly", "readOnly", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], debug: ["debug", "debug", booleanAttribute], enableMouseZoom: ["enableMouseZoom", "enableMouseZoom", booleanAttribute], wheelZoomStep: "wheelZoomStep", maxZoomRatio: "maxZoomRatio", enableRotate: ["enableRotate", "enableRotate", booleanAttribute], enableCrop: ["enableCrop", "enableCrop", booleanAttribute], editionFormat: "editionFormat", editionQuality: "editionQuality", imageSizeQueryParam: "imageSizeQueryParam", modalImageSize: "modalImageSize", enableLoop: ["enableLoop", "enableLoop", booleanAttribute], canFetchMore: ["canFetchMore", "canFetchMore", booleanAttribute] }, outputs: { deleteRequested: "deleteRequested", closeRequested: "closeRequested", afterEditImage: "afterEditImage", afterEditRow: "afterEditRow", previousSlide: "previousSlide", nextSlide: "nextSlide", fetchMore: "fetchMore" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "swiperRef", first: true, predicate: ["slideshowSwiper"], descendants: true }], ngImport: i0, template: "<ion-content\n class=\"ion-no-padding ion-no-margin\"\n (mousedown)=\"onPointerDown($event, slideshowSwiper)\"\n (mousemove)=\"onPointerMove($event, slideshowSwiper)\"\n (mouseup)=\"onPointerUp($event, slideshowSwiper)\"\n (mouseleave)=\"onPointerUp($event, slideshowSwiper)\"\n (touchmove)=\"onCropPointerMove($event, slideshowSwiper)\"\n (touchend)=\"onCropPointerUp($event, slideshowSwiper)\"\n (touchcancel)=\"onCropPointerUp($event, slideshowSwiper)\"\n>\n @let count = rows?.length || 0;\n <!-- Counter -->\n <div class=\"top-left\">\n <ion-label color=\"light\">{{ activeSlideIndex + 1 }} / {{ count }}</ion-label>\n </div>\n\n <!-- zoom / rotation / crop buttons: all shown together, no \"enter edit mode\" step needed -->\n <div class=\"top-right\">\n @if (!mobile) {\n <ion-fab-button size=\"small\" (click)=\"zoom(slideshowSwiper, true)\" color=\"light\">\n <ion-icon name=\"search\"></ion-icon>\n <ion-icon class=\"icon-secondary\" name=\"add\"></ion-icon>\n </ion-fab-button>\n <ion-fab-button size=\"small\" (click)=\"zoom(slideshowSwiper, false)\" color=\"light\">\n <ion-icon name=\"search\"></ion-icon>\n <ion-icon class=\"icon-secondary\" name=\"remove\"></ion-icon>\n </ion-fab-button>\n }\n @if (!readOnly && enableRotate) {\n <ion-fab-button\n size=\"small\"\n (click)=\"rotate(slideshowSwiper, 'left')\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_LEFT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_LEFT' | translate) : ''\"\n >\n <mat-icon>rotate_left</mat-icon>\n </ion-fab-button>\n <ion-fab-button\n size=\"small\"\n (click)=\"rotate(slideshowSwiper, 'right')\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_RIGHT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_RIGHT' | translate) : ''\"\n >\n <mat-icon>rotate_right</mat-icon>\n </ion-fab-button>\n }\n @if (!readOnly && enableCrop) {\n <ion-fab-button\n size=\"small\"\n (click)=\"toggleCropTool(slideshowSwiper)\"\n [color]=\"_cropToolActive ? 'tertiary' : 'light'\"\n [title]=\"\n !showTooltip\n ? ((_cropToolActive ? 'IMAGE.GALLERY.BTN_CROP_DEACTIVATE' : 'IMAGE.GALLERY.BTN_CROP_ACTIVATE') | translate)\n : ''\n \"\n [matTooltip]=\"\n showTooltip\n ? ((_cropToolActive ? 'IMAGE.GALLERY.BTN_CROP_DEACTIVATE' : 'IMAGE.GALLERY.BTN_CROP_ACTIVATE') | translate)\n : ''\n \"\n >\n <mat-icon>crop</mat-icon>\n </ion-fab-button>\n @if (_cropToolActive) {\n <ion-fab-button\n size=\"small\"\n (click)=\"resetCrop(slideshowSwiper)\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_CROP_RESET' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_CROP_RESET' | translate) : ''\"\n >\n <mat-icon>crop_free</mat-icon>\n </ion-fab-button>\n }\n }\n </div>\n\n <!-- navigation side buttons next/back: hidden while a crop/rotation edit is pending, to keep the focus on validating/cancelling it -->\n <ng-container *ngIf=\"!mobile && !hasPendingEdit && (rows | isArrayLength: { greaterThan: 1 })\">\n <div class=\"side-buttons prev\" [class.disabled]=\"isPrevDisabled\" (click)=\"slidePrev(slideshowSwiper)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\" [class.disabled]=\"isNextDisabled\" (click)=\"slideNext(slideshowSwiper)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container\n #slideshowSwiper\n [modules]=\"swiperModules\"\n [zoom]=\"!enableMouseZoom\"\n [initialSlide]=\"selectedIndex\"\n (swiperslidechange)=\"onSlideChange(slideshowSwiper)\"\n (swiperinit)=\"onSwiperInit(slideshowSwiper)\"\n >\n @for (row of rows; track row.id; let i = $index) {\n <swiper-slide>\n @let image = row | propertyGet: 'currentData';\n <div class=\"swiper-zoom-container\">\n @if (image.url) {\n <ion-img class=\"swiper-zoom-target\" [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <img [src]=\"image.dataUrl\" [alt]=\"image.title\" />\n }\n\n <!-- crop overlay: only rendered for the active slide -->\n @if (!readOnly && enableCrop && _cropToolActive && i === activeSlideIndex) {\n <div\n class=\"crop-overlay\"\n (mousedown)=\"onCropPointerDown($event, slideshowSwiper, 'move')\"\n (touchstart)=\"onCropPointerDown($event, slideshowSwiper, 'move')\"\n >\n <!-- darkened mask around the selection: clipped to the image bounds -->\n <div class=\"crop-mask\">\n <div\n class=\"crop-mask-rect\"\n [style.left.%]=\"_cropRect.x * 100\"\n [style.top.%]=\"_cropRect.y * 100\"\n [style.width.%]=\"_cropRect.width * 100\"\n [style.height.%]=\"_cropRect.height * 100\"\n ></div>\n </div>\n\n <!-- interactive selection border, grid & drag handles: never clipped, so corner/edge handles\n remain fully grabbable even when the selection touches the image bounds -->\n <div\n class=\"crop-rect\"\n [style.left.%]=\"_cropRect.x * 100\"\n [style.top.%]=\"_cropRect.y * 100\"\n [style.width.%]=\"_cropRect.width * 100\"\n [style.height.%]=\"_cropRect.height * 100\"\n >\n <div class=\"crop-grid\">\n <span class=\"line v\" style=\"left: 33.333%\"></span>\n <span class=\"line v\" style=\"left: 66.666%\"></span>\n <span class=\"line h\" style=\"top: 33.333%\"></span>\n <span class=\"line h\" style=\"top: 66.666%\"></span>\n </div>\n @for (handle of _cropHandles; track handle) {\n <div\n class=\"crop-handle {{ handle }}\"\n (mousedown)=\"onCropPointerDown($event, slideshowSwiper, handle)\"\n (touchstart)=\"onCropPointerDown($event, slideshowSwiper, handle)\"\n ></div>\n }\n </div>\n </div>\n }\n </div>\n </swiper-slide>\n }\n </swiper-container>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar color=\"light\">\n @if (!hasPendingEdit) {\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n @if (!readOnly) {\n <ion-button\n (click)=\"requestDelete(slideshowSwiper)\"\n [disabled]=\"disabled\"\n fill=\"clear\"\n color=\"danger\"\n >\n <mat-icon slot=\"start\">delete</mat-icon>\n {{ 'COMMON.BTN_DELETE' | translate }}\n </ion-button>\n }\n </ion-col>\n <ion-col size=\"4\"></ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"closeRequested.emit()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"closeRequested.emit()\" color=\"tertiary\">\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n } @else {\n <!-- A crop or rotation change is pending: ask for an explicit validation before exporting the image -->\n <ion-row>\n <ion-col size=\"12\" class=\"ion-text-end\">\n <ion-button\n (click)=\"discardEdit(slideshowSwiper)\"\n color=\"dark\"\n fill=\"clear\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_CANCEL_EDIT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_CANCEL_EDIT' | translate) : ''\"\n >\n <ion-icon slot=\"start\" name=\"arrow-undo\"></ion-icon>\n {{ 'COMMON.BTN_CANCEL' | translate }}\n </ion-button>\n <ion-button (click)=\"validateEdit(slideshowSwiper)\" color=\"danger\">\n <ion-icon slot=\"start\" name=\"checkmark\"></ion-icon>\n {{ 'COMMON.BTN_VALIDATE' | translate }}\n </ion-button>\n </ion-col>\n </ion-row>\n }\n </ion-toolbar>\n</ion-footer>\n", styles: [":host{display:flex;flex-direction:column;height:100%;-webkit-user-select:none;user-select:none}:host ion-content{flex:1 1 auto}:host .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}:host .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}:host .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}:host .side-buttons ion-icon{top:50%;color:#fff;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}:host .side-buttons:hover{cursor:pointer}:host .side-buttons:hover ion-icon{opacity:1}:host .side-buttons.prev{left:0}:host .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}:host .side-buttons.next{right:0}:host .side-buttons.next ion-icon{right:var(--side-buttons-margin)}:host .side-buttons.disabled{pointer-events:none}:host swiper-container{height:100%;background:#000}:host .swiper-zoom-container{position:relative}:host ion-fab-button .icon-secondary{top:11px;left:6px;height:14px}:host .crop-overlay{position:absolute;z-index:15;cursor:move;touch-action:none;animation:crop-overlay-fade-in .15s ease-in}:host .crop-overlay .crop-mask{position:absolute;inset:0;overflow:hidden;pointer-events:none}:host .crop-overlay .crop-mask .crop-mask-rect{position:absolute;box-shadow:0 0 0 2000px #0009}:host .crop-overlay .crop-rect{position:absolute;box-sizing:border-box;border:1px solid rgba(255,255,255,.95);cursor:move;touch-action:none}:host .crop-overlay .crop-rect .crop-grid{position:absolute;inset:0;pointer-events:none}:host .crop-overlay .crop-rect .crop-grid .line{position:absolute;background:#ffffff73}:host .crop-overlay .crop-rect .crop-grid .line.v{top:0;bottom:0;width:1px}:host .crop-overlay .crop-rect .crop-grid .line.h{left:0;right:0;height:1px}:host .crop-overlay .crop-rect .crop-handle{position:absolute;width:16px;height:16px;margin:-8px;background:#fff;border:1px solid rgba(0,0,0,.45);border-radius:50%;box-shadow:0 1px 4px #00000080;transition:transform .12s ease;touch-action:none}:host .crop-overlay .crop-rect .crop-handle:hover{transform:scale(1.3)}:host .crop-overlay .crop-rect .crop-handle.nw{left:0;top:0;cursor:nwse-resize}:host .crop-overlay .crop-rect .crop-handle.n{left:50%;top:0;cursor:ns-resize}:host .crop-overlay .crop-rect .crop-handle.ne{left:100%;top:0;cursor:nesw-resize}:host .crop-overlay .crop-rect .crop-handle.e{left:100%;top:50%;cursor:ew-resize}:host .crop-overlay .crop-rect .crop-handle.se{left:100%;top:100%;cursor:nwse-resize}:host .crop-overlay .crop-rect .crop-handle.s{left:50%;top:100%;cursor:ns-resize}:host .crop-overlay .crop-rect .crop-handle.sw{left:0;top:100%;cursor:nesw-resize}:host .crop-overlay .crop-rect .crop-handle.w{left:0;top:50%;cursor:ew-resize}@keyframes crop-overlay-fade-in{0%{opacity:0}to{opacity:1}}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i6.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i7.ArrayLengthPipe, name: "isArrayLength" }, { kind: "pipe", type: i8.AppendQueryParamsPipePipe, name: "appendQueryParams" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
730
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AppImageGallerySlideshowComponent, selector: "app-image-gallery-slideshow", inputs: { rows: "rows", selectedIndex: "selectedIndex", mobile: ["mobile", "mobile", booleanAttribute], readOnly: ["readOnly", "readOnly", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], debug: ["debug", "debug", booleanAttribute], enableMouseZoom: ["enableMouseZoom", "enableMouseZoom", booleanAttribute], wheelZoomStep: "wheelZoomStep", maxZoomRatio: "maxZoomRatio", enableRotate: ["enableRotate", "enableRotate", booleanAttribute], enableCrop: ["enableCrop", "enableCrop", booleanAttribute], editionFormat: "editionFormat", editionQuality: "editionQuality", imageSizeQueryParam: "imageSizeQueryParam", modalImageSize: "modalImageSize", enableLoop: ["enableLoop", "enableLoop", booleanAttribute], canFetchMore: ["canFetchMore", "canFetchMore", booleanAttribute] }, outputs: { deleteRequested: "deleteRequested", closeRequested: "closeRequested", afterEditImage: "afterEditImage", afterEditRow: "afterEditRow", previousSlide: "previousSlide", nextSlide: "nextSlide", fetchMore: "fetchMore" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "swiperRef", first: true, predicate: ["swiperContainer"], descendants: true }], ngImport: i0, template: "<ion-content\n class=\"ion-no-padding ion-no-margin\"\n (mousedown)=\"onPointerDown($event, swiperContainer)\"\n (mousemove)=\"onPointerMove($event, swiperContainer)\"\n (mouseup)=\"onPointerUp($event, swiperContainer)\"\n (mouseleave)=\"onPointerUp($event, swiperContainer)\"\n (touchmove)=\"onCropPointerMove($event, swiperContainer)\"\n (touchend)=\"onCropPointerUp($event, swiperContainer)\"\n (touchcancel)=\"onCropPointerUp($event, swiperContainer)\"\n>\n @let count = rows?.length || 0;\n <!-- Counter -->\n <div class=\"top-left\">\n <ion-label color=\"light\">{{ activeSlideIndex + 1 }} / {{ count }}</ion-label>\n </div>\n\n <!-- zoom / rotation / crop buttons: all shown together, no \"enter edit mode\" step needed -->\n <div class=\"top-right\">\n @if (!mobile) {\n <ion-fab-button size=\"small\" (click)=\"zoom(swiperContainer, true)\" color=\"light\">\n <ion-icon name=\"search\"></ion-icon>\n <ion-icon class=\"icon-secondary\" name=\"add\"></ion-icon>\n </ion-fab-button>\n <ion-fab-button size=\"small\" (click)=\"zoom(swiperContainer, false)\" color=\"light\">\n <ion-icon name=\"search\"></ion-icon>\n <ion-icon class=\"icon-secondary\" name=\"remove\"></ion-icon>\n </ion-fab-button>\n }\n @if (!readOnly && enableRotate) {\n <ion-fab-button\n size=\"small\"\n (click)=\"rotate(swiperContainer, 'left')\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_LEFT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_LEFT' | translate) : ''\"\n >\n <mat-icon>rotate_left</mat-icon>\n </ion-fab-button>\n <ion-fab-button\n size=\"small\"\n (click)=\"rotate(swiperContainer, 'right')\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_RIGHT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_RIGHT' | translate) : ''\"\n >\n <mat-icon>rotate_right</mat-icon>\n </ion-fab-button>\n }\n @if (!readOnly && enableCrop) {\n <ion-fab-button\n size=\"small\"\n (click)=\"toggleCropTool(swiperContainer)\"\n [color]=\"_cropToolActive ? 'tertiary' : 'light'\"\n [title]=\"\n !showTooltip\n ? ((_cropToolActive ? 'IMAGE.GALLERY.BTN_CROP_DEACTIVATE' : 'IMAGE.GALLERY.BTN_CROP_ACTIVATE') | translate)\n : ''\n \"\n [matTooltip]=\"\n showTooltip\n ? ((_cropToolActive ? 'IMAGE.GALLERY.BTN_CROP_DEACTIVATE' : 'IMAGE.GALLERY.BTN_CROP_ACTIVATE') | translate)\n : ''\n \"\n >\n <mat-icon>crop</mat-icon>\n </ion-fab-button>\n @if (_cropToolActive) {\n <ion-fab-button\n size=\"small\"\n (click)=\"resetCrop(swiperContainer)\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_CROP_RESET' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_CROP_RESET' | translate) : ''\"\n >\n <mat-icon>crop_free</mat-icon>\n </ion-fab-button>\n }\n }\n </div>\n\n <!-- navigation side buttons next/back: hidden while a crop/rotation edit is pending, to keep the focus on validating/cancelling it -->\n <ng-container *ngIf=\"!mobile && !hasPendingEdit && (rows | isArrayLength: { greaterThan: 1 })\">\n <div class=\"side-buttons prev\" [class.disabled]=\"isPrevDisabled\" (click)=\"slidePrev(swiperContainer)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\" [class.disabled]=\"isNextDisabled\" (click)=\"slideNext(swiperContainer)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container\n #swiperContainer\n [modules]=\"swiperModules\"\n [zoom]=\"!enableMouseZoom\"\n [initialSlide]=\"selectedIndex\"\n (swiperslidechange)=\"onSlideChange(swiperContainer)\"\n (swiperinit)=\"onSwiperInit(swiperContainer)\"\n >\n @for (row of rows; track row.id; let index = $index) {\n <ng-container *ngTemplateOutlet=\"slideTemplate; context: { image: row.currentData, index }\"></ng-container>\n }\n </swiper-container>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar color=\"light\">\n @if (!hasPendingEdit) {\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n @if (!readOnly) {\n <ion-button\n (click)=\"requestDelete(swiperContainer)\"\n [disabled]=\"disabled\"\n fill=\"clear\"\n color=\"danger\"\n >\n <mat-icon slot=\"start\">delete</mat-icon>\n {{ 'COMMON.BTN_DELETE' | translate }}\n </ion-button>\n }\n </ion-col>\n <ion-col size=\"4\"></ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"closeRequested.emit()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"closeRequested.emit()\" color=\"tertiary\">\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n } @else {\n <!-- A crop or rotation change is pending: ask for an explicit validation before exporting the image -->\n <ion-row>\n <ion-col size=\"12\" class=\"ion-text-end\">\n <ion-button\n (click)=\"discardEdit(swiperContainer)\"\n color=\"dark\"\n fill=\"clear\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_CANCEL_EDIT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_CANCEL_EDIT' | translate) : ''\"\n >\n <ion-icon slot=\"start\" name=\"arrow-undo\"></ion-icon>\n {{ 'COMMON.BTN_CANCEL' | translate }}\n </ion-button>\n <ion-button (click)=\"validateEdit(swiperContainer)\" color=\"danger\">\n <ion-icon slot=\"start\" name=\"checkmark\"></ion-icon>\n {{ 'COMMON.BTN_VALIDATE' | translate }}\n </ion-button>\n </ion-col>\n </ion-row>\n }\n </ion-toolbar>\n</ion-footer>\n\n<ng-template #slideTemplate let-image=\"image\" let-index=\"index\">\n <swiper-slide>\n <div class=\"swiper-zoom-container\" [class.cdk-visually-hidden]=\"!_swiper && index !== selectedIndex\">\n\n <!-- the image -->\n @if (image?.url) {\n <ion-img class=\"swiper-zoom-target\" [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <img [src]=\"image.dataUrl\" [alt]=\"image.title\" />\n }\n\n <!-- crop overlay: only rendered for the active slide -->\n @if (!readOnly && enableCrop && _cropToolActive && index === activeSlideIndex) {\n <div\n class=\"crop-overlay\"\n (mousedown)=\"onCropPointerDown($event, swiperContainer, 'move')\"\n (touchstart)=\"onCropPointerDown($event, swiperContainer, 'move')\"\n >\n <!-- darkened mask around the selection: clipped to the image bounds -->\n <div class=\"crop-mask\">\n <div\n class=\"crop-mask-rect\"\n [style.left.%]=\"_cropRect.x * 100\"\n [style.top.%]=\"_cropRect.y * 100\"\n [style.width.%]=\"_cropRect.width * 100\"\n [style.height.%]=\"_cropRect.height * 100\"\n ></div>\n </div>\n\n <!-- interactive selection border, grid & drag handles: never clipped, so corner/edge handles\n remain fully grabbable even when the selection touches the image bounds -->\n <div\n class=\"crop-rect\"\n [style.left.%]=\"_cropRect.x * 100\"\n [style.top.%]=\"_cropRect.y * 100\"\n [style.width.%]=\"_cropRect.width * 100\"\n [style.height.%]=\"_cropRect.height * 100\"\n >\n <div class=\"crop-grid\">\n <span class=\"line v\" style=\"left: 33.333%\"></span>\n <span class=\"line v\" style=\"left: 66.666%\"></span>\n <span class=\"line h\" style=\"top: 33.333%\"></span>\n <span class=\"line h\" style=\"top: 66.666%\"></span>\n </div>\n @for (handle of _cropHandles; track handle) {\n <div\n class=\"crop-handle {{ handle }}\"\n (mousedown)=\"onCropPointerDown($event, swiperContainer, handle)\"\n (touchstart)=\"onCropPointerDown($event, swiperContainer, handle)\"\n ></div>\n }\n </div>\n </div>\n }\n </div>\n </swiper-slide>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;height:100%;-webkit-user-select:none;user-select:none}:host ion-content{flex:1 1 auto}:host .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}:host .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}:host .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}:host .side-buttons ion-icon{top:50%;color:#fff;background:#00000080;padding:4px;border-radius:50%;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}:host .side-buttons:hover{cursor:pointer}:host .side-buttons:hover ion-icon{opacity:1}:host .side-buttons.prev{left:0}:host .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}:host .side-buttons.next{right:0}:host .side-buttons.next ion-icon{right:var(--side-buttons-margin)}:host .side-buttons.disabled{pointer-events:none}:host swiper-container{height:100%;background:#000}:host .swiper-zoom-container{position:relative}:host ion-fab-button .icon-secondary{top:11px;left:6px;height:14px}:host .crop-overlay{position:absolute;z-index:15;cursor:move;touch-action:none;animation:crop-overlay-fade-in .15s ease-in}:host .crop-overlay .crop-mask{position:absolute;inset:0;overflow:hidden;pointer-events:none}:host .crop-overlay .crop-mask .crop-mask-rect{position:absolute;box-shadow:0 0 0 2000px #0009}:host .crop-overlay .crop-rect{position:absolute;box-sizing:border-box;border:1px solid rgba(255,255,255,.95);cursor:move;touch-action:none}:host .crop-overlay .crop-rect .crop-grid{position:absolute;inset:0;pointer-events:none}:host .crop-overlay .crop-rect .crop-grid .line{position:absolute;background:#ffffff73}:host .crop-overlay .crop-rect .crop-grid .line.v{top:0;bottom:0;width:1px}:host .crop-overlay .crop-rect .crop-grid .line.h{left:0;right:0;height:1px}:host .crop-overlay .crop-rect .crop-handle{position:absolute;width:16px;height:16px;margin:-8px;background:#fff;border:1px solid rgba(0,0,0,.45);border-radius:50%;box-shadow:0 1px 4px #00000080;transition:transform .12s ease;touch-action:none}:host .crop-overlay .crop-rect .crop-handle:hover{transform:scale(1.3)}:host .crop-overlay .crop-rect .crop-handle.nw{left:0;top:0;cursor:nwse-resize}:host .crop-overlay .crop-rect .crop-handle.n{left:50%;top:0;cursor:ns-resize}:host .crop-overlay .crop-rect .crop-handle.ne{left:100%;top:0;cursor:nesw-resize}:host .crop-overlay .crop-rect .crop-handle.e{left:100%;top:50%;cursor:ew-resize}:host .crop-overlay .crop-rect .crop-handle.se{left:100%;top:100%;cursor:nwse-resize}:host .crop-overlay .crop-rect .crop-handle.s{left:50%;top:100%;cursor:ns-resize}:host .crop-overlay .crop-rect .crop-handle.sw{left:0;top:100%;cursor:nesw-resize}:host .crop-overlay .crop-rect .crop-handle.w{left:0;top:50%;cursor:ew-resize}@keyframes crop-overlay-fade-in{0%{opacity:0}to{opacity:1}}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i6.ArrayLengthPipe, name: "isArrayLength" }, { kind: "pipe", type: i7.AppendQueryParamsPipePipe, name: "appendQueryParams" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
726
731
  }
727
732
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppImageGallerySlideshowComponent, decorators: [{
728
733
  type: Component,
729
- args: [{ selector: 'app-image-gallery-slideshow', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-content\n class=\"ion-no-padding ion-no-margin\"\n (mousedown)=\"onPointerDown($event, slideshowSwiper)\"\n (mousemove)=\"onPointerMove($event, slideshowSwiper)\"\n (mouseup)=\"onPointerUp($event, slideshowSwiper)\"\n (mouseleave)=\"onPointerUp($event, slideshowSwiper)\"\n (touchmove)=\"onCropPointerMove($event, slideshowSwiper)\"\n (touchend)=\"onCropPointerUp($event, slideshowSwiper)\"\n (touchcancel)=\"onCropPointerUp($event, slideshowSwiper)\"\n>\n @let count = rows?.length || 0;\n <!-- Counter -->\n <div class=\"top-left\">\n <ion-label color=\"light\">{{ activeSlideIndex + 1 }} / {{ count }}</ion-label>\n </div>\n\n <!-- zoom / rotation / crop buttons: all shown together, no \"enter edit mode\" step needed -->\n <div class=\"top-right\">\n @if (!mobile) {\n <ion-fab-button size=\"small\" (click)=\"zoom(slideshowSwiper, true)\" color=\"light\">\n <ion-icon name=\"search\"></ion-icon>\n <ion-icon class=\"icon-secondary\" name=\"add\"></ion-icon>\n </ion-fab-button>\n <ion-fab-button size=\"small\" (click)=\"zoom(slideshowSwiper, false)\" color=\"light\">\n <ion-icon name=\"search\"></ion-icon>\n <ion-icon class=\"icon-secondary\" name=\"remove\"></ion-icon>\n </ion-fab-button>\n }\n @if (!readOnly && enableRotate) {\n <ion-fab-button\n size=\"small\"\n (click)=\"rotate(slideshowSwiper, 'left')\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_LEFT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_LEFT' | translate) : ''\"\n >\n <mat-icon>rotate_left</mat-icon>\n </ion-fab-button>\n <ion-fab-button\n size=\"small\"\n (click)=\"rotate(slideshowSwiper, 'right')\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_RIGHT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_RIGHT' | translate) : ''\"\n >\n <mat-icon>rotate_right</mat-icon>\n </ion-fab-button>\n }\n @if (!readOnly && enableCrop) {\n <ion-fab-button\n size=\"small\"\n (click)=\"toggleCropTool(slideshowSwiper)\"\n [color]=\"_cropToolActive ? 'tertiary' : 'light'\"\n [title]=\"\n !showTooltip\n ? ((_cropToolActive ? 'IMAGE.GALLERY.BTN_CROP_DEACTIVATE' : 'IMAGE.GALLERY.BTN_CROP_ACTIVATE') | translate)\n : ''\n \"\n [matTooltip]=\"\n showTooltip\n ? ((_cropToolActive ? 'IMAGE.GALLERY.BTN_CROP_DEACTIVATE' : 'IMAGE.GALLERY.BTN_CROP_ACTIVATE') | translate)\n : ''\n \"\n >\n <mat-icon>crop</mat-icon>\n </ion-fab-button>\n @if (_cropToolActive) {\n <ion-fab-button\n size=\"small\"\n (click)=\"resetCrop(slideshowSwiper)\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_CROP_RESET' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_CROP_RESET' | translate) : ''\"\n >\n <mat-icon>crop_free</mat-icon>\n </ion-fab-button>\n }\n }\n </div>\n\n <!-- navigation side buttons next/back: hidden while a crop/rotation edit is pending, to keep the focus on validating/cancelling it -->\n <ng-container *ngIf=\"!mobile && !hasPendingEdit && (rows | isArrayLength: { greaterThan: 1 })\">\n <div class=\"side-buttons prev\" [class.disabled]=\"isPrevDisabled\" (click)=\"slidePrev(slideshowSwiper)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\" [class.disabled]=\"isNextDisabled\" (click)=\"slideNext(slideshowSwiper)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container\n #slideshowSwiper\n [modules]=\"swiperModules\"\n [zoom]=\"!enableMouseZoom\"\n [initialSlide]=\"selectedIndex\"\n (swiperslidechange)=\"onSlideChange(slideshowSwiper)\"\n (swiperinit)=\"onSwiperInit(slideshowSwiper)\"\n >\n @for (row of rows; track row.id; let i = $index) {\n <swiper-slide>\n @let image = row | propertyGet: 'currentData';\n <div class=\"swiper-zoom-container\">\n @if (image.url) {\n <ion-img class=\"swiper-zoom-target\" [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <img [src]=\"image.dataUrl\" [alt]=\"image.title\" />\n }\n\n <!-- crop overlay: only rendered for the active slide -->\n @if (!readOnly && enableCrop && _cropToolActive && i === activeSlideIndex) {\n <div\n class=\"crop-overlay\"\n (mousedown)=\"onCropPointerDown($event, slideshowSwiper, 'move')\"\n (touchstart)=\"onCropPointerDown($event, slideshowSwiper, 'move')\"\n >\n <!-- darkened mask around the selection: clipped to the image bounds -->\n <div class=\"crop-mask\">\n <div\n class=\"crop-mask-rect\"\n [style.left.%]=\"_cropRect.x * 100\"\n [style.top.%]=\"_cropRect.y * 100\"\n [style.width.%]=\"_cropRect.width * 100\"\n [style.height.%]=\"_cropRect.height * 100\"\n ></div>\n </div>\n\n <!-- interactive selection border, grid & drag handles: never clipped, so corner/edge handles\n remain fully grabbable even when the selection touches the image bounds -->\n <div\n class=\"crop-rect\"\n [style.left.%]=\"_cropRect.x * 100\"\n [style.top.%]=\"_cropRect.y * 100\"\n [style.width.%]=\"_cropRect.width * 100\"\n [style.height.%]=\"_cropRect.height * 100\"\n >\n <div class=\"crop-grid\">\n <span class=\"line v\" style=\"left: 33.333%\"></span>\n <span class=\"line v\" style=\"left: 66.666%\"></span>\n <span class=\"line h\" style=\"top: 33.333%\"></span>\n <span class=\"line h\" style=\"top: 66.666%\"></span>\n </div>\n @for (handle of _cropHandles; track handle) {\n <div\n class=\"crop-handle {{ handle }}\"\n (mousedown)=\"onCropPointerDown($event, slideshowSwiper, handle)\"\n (touchstart)=\"onCropPointerDown($event, slideshowSwiper, handle)\"\n ></div>\n }\n </div>\n </div>\n }\n </div>\n </swiper-slide>\n }\n </swiper-container>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar color=\"light\">\n @if (!hasPendingEdit) {\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n @if (!readOnly) {\n <ion-button\n (click)=\"requestDelete(slideshowSwiper)\"\n [disabled]=\"disabled\"\n fill=\"clear\"\n color=\"danger\"\n >\n <mat-icon slot=\"start\">delete</mat-icon>\n {{ 'COMMON.BTN_DELETE' | translate }}\n </ion-button>\n }\n </ion-col>\n <ion-col size=\"4\"></ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"closeRequested.emit()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"closeRequested.emit()\" color=\"tertiary\">\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n } @else {\n <!-- A crop or rotation change is pending: ask for an explicit validation before exporting the image -->\n <ion-row>\n <ion-col size=\"12\" class=\"ion-text-end\">\n <ion-button\n (click)=\"discardEdit(slideshowSwiper)\"\n color=\"dark\"\n fill=\"clear\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_CANCEL_EDIT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_CANCEL_EDIT' | translate) : ''\"\n >\n <ion-icon slot=\"start\" name=\"arrow-undo\"></ion-icon>\n {{ 'COMMON.BTN_CANCEL' | translate }}\n </ion-button>\n <ion-button (click)=\"validateEdit(slideshowSwiper)\" color=\"danger\">\n <ion-icon slot=\"start\" name=\"checkmark\"></ion-icon>\n {{ 'COMMON.BTN_VALIDATE' | translate }}\n </ion-button>\n </ion-col>\n </ion-row>\n }\n </ion-toolbar>\n</ion-footer>\n", styles: [":host{display:flex;flex-direction:column;height:100%;-webkit-user-select:none;user-select:none}:host ion-content{flex:1 1 auto}:host .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}:host .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}:host .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}:host .side-buttons ion-icon{top:50%;color:#fff;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}:host .side-buttons:hover{cursor:pointer}:host .side-buttons:hover ion-icon{opacity:1}:host .side-buttons.prev{left:0}:host .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}:host .side-buttons.next{right:0}:host .side-buttons.next ion-icon{right:var(--side-buttons-margin)}:host .side-buttons.disabled{pointer-events:none}:host swiper-container{height:100%;background:#000}:host .swiper-zoom-container{position:relative}:host ion-fab-button .icon-secondary{top:11px;left:6px;height:14px}:host .crop-overlay{position:absolute;z-index:15;cursor:move;touch-action:none;animation:crop-overlay-fade-in .15s ease-in}:host .crop-overlay .crop-mask{position:absolute;inset:0;overflow:hidden;pointer-events:none}:host .crop-overlay .crop-mask .crop-mask-rect{position:absolute;box-shadow:0 0 0 2000px #0009}:host .crop-overlay .crop-rect{position:absolute;box-sizing:border-box;border:1px solid rgba(255,255,255,.95);cursor:move;touch-action:none}:host .crop-overlay .crop-rect .crop-grid{position:absolute;inset:0;pointer-events:none}:host .crop-overlay .crop-rect .crop-grid .line{position:absolute;background:#ffffff73}:host .crop-overlay .crop-rect .crop-grid .line.v{top:0;bottom:0;width:1px}:host .crop-overlay .crop-rect .crop-grid .line.h{left:0;right:0;height:1px}:host .crop-overlay .crop-rect .crop-handle{position:absolute;width:16px;height:16px;margin:-8px;background:#fff;border:1px solid rgba(0,0,0,.45);border-radius:50%;box-shadow:0 1px 4px #00000080;transition:transform .12s ease;touch-action:none}:host .crop-overlay .crop-rect .crop-handle:hover{transform:scale(1.3)}:host .crop-overlay .crop-rect .crop-handle.nw{left:0;top:0;cursor:nwse-resize}:host .crop-overlay .crop-rect .crop-handle.n{left:50%;top:0;cursor:ns-resize}:host .crop-overlay .crop-rect .crop-handle.ne{left:100%;top:0;cursor:nesw-resize}:host .crop-overlay .crop-rect .crop-handle.e{left:100%;top:50%;cursor:ew-resize}:host .crop-overlay .crop-rect .crop-handle.se{left:100%;top:100%;cursor:nwse-resize}:host .crop-overlay .crop-rect .crop-handle.s{left:50%;top:100%;cursor:ns-resize}:host .crop-overlay .crop-rect .crop-handle.sw{left:0;top:100%;cursor:nesw-resize}:host .crop-overlay .crop-rect .crop-handle.w{left:0;top:50%;cursor:ew-resize}@keyframes crop-overlay-fade-in{0%{opacity:0}to{opacity:1}}\n"] }]
734
+ args: [{ selector: 'app-image-gallery-slideshow', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-content\n class=\"ion-no-padding ion-no-margin\"\n (mousedown)=\"onPointerDown($event, swiperContainer)\"\n (mousemove)=\"onPointerMove($event, swiperContainer)\"\n (mouseup)=\"onPointerUp($event, swiperContainer)\"\n (mouseleave)=\"onPointerUp($event, swiperContainer)\"\n (touchmove)=\"onCropPointerMove($event, swiperContainer)\"\n (touchend)=\"onCropPointerUp($event, swiperContainer)\"\n (touchcancel)=\"onCropPointerUp($event, swiperContainer)\"\n>\n @let count = rows?.length || 0;\n <!-- Counter -->\n <div class=\"top-left\">\n <ion-label color=\"light\">{{ activeSlideIndex + 1 }} / {{ count }}</ion-label>\n </div>\n\n <!-- zoom / rotation / crop buttons: all shown together, no \"enter edit mode\" step needed -->\n <div class=\"top-right\">\n @if (!mobile) {\n <ion-fab-button size=\"small\" (click)=\"zoom(swiperContainer, true)\" color=\"light\">\n <ion-icon name=\"search\"></ion-icon>\n <ion-icon class=\"icon-secondary\" name=\"add\"></ion-icon>\n </ion-fab-button>\n <ion-fab-button size=\"small\" (click)=\"zoom(swiperContainer, false)\" color=\"light\">\n <ion-icon name=\"search\"></ion-icon>\n <ion-icon class=\"icon-secondary\" name=\"remove\"></ion-icon>\n </ion-fab-button>\n }\n @if (!readOnly && enableRotate) {\n <ion-fab-button\n size=\"small\"\n (click)=\"rotate(swiperContainer, 'left')\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_LEFT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_LEFT' | translate) : ''\"\n >\n <mat-icon>rotate_left</mat-icon>\n </ion-fab-button>\n <ion-fab-button\n size=\"small\"\n (click)=\"rotate(swiperContainer, 'right')\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_RIGHT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_RIGHT' | translate) : ''\"\n >\n <mat-icon>rotate_right</mat-icon>\n </ion-fab-button>\n }\n @if (!readOnly && enableCrop) {\n <ion-fab-button\n size=\"small\"\n (click)=\"toggleCropTool(swiperContainer)\"\n [color]=\"_cropToolActive ? 'tertiary' : 'light'\"\n [title]=\"\n !showTooltip\n ? ((_cropToolActive ? 'IMAGE.GALLERY.BTN_CROP_DEACTIVATE' : 'IMAGE.GALLERY.BTN_CROP_ACTIVATE') | translate)\n : ''\n \"\n [matTooltip]=\"\n showTooltip\n ? ((_cropToolActive ? 'IMAGE.GALLERY.BTN_CROP_DEACTIVATE' : 'IMAGE.GALLERY.BTN_CROP_ACTIVATE') | translate)\n : ''\n \"\n >\n <mat-icon>crop</mat-icon>\n </ion-fab-button>\n @if (_cropToolActive) {\n <ion-fab-button\n size=\"small\"\n (click)=\"resetCrop(swiperContainer)\"\n color=\"light\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_CROP_RESET' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_CROP_RESET' | translate) : ''\"\n >\n <mat-icon>crop_free</mat-icon>\n </ion-fab-button>\n }\n }\n </div>\n\n <!-- navigation side buttons next/back: hidden while a crop/rotation edit is pending, to keep the focus on validating/cancelling it -->\n <ng-container *ngIf=\"!mobile && !hasPendingEdit && (rows | isArrayLength: { greaterThan: 1 })\">\n <div class=\"side-buttons prev\" [class.disabled]=\"isPrevDisabled\" (click)=\"slidePrev(swiperContainer)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\" [class.disabled]=\"isNextDisabled\" (click)=\"slideNext(swiperContainer)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container\n #swiperContainer\n [modules]=\"swiperModules\"\n [zoom]=\"!enableMouseZoom\"\n [initialSlide]=\"selectedIndex\"\n (swiperslidechange)=\"onSlideChange(swiperContainer)\"\n (swiperinit)=\"onSwiperInit(swiperContainer)\"\n >\n @for (row of rows; track row.id; let index = $index) {\n <ng-container *ngTemplateOutlet=\"slideTemplate; context: { image: row.currentData, index }\"></ng-container>\n }\n </swiper-container>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar color=\"light\">\n @if (!hasPendingEdit) {\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n @if (!readOnly) {\n <ion-button\n (click)=\"requestDelete(swiperContainer)\"\n [disabled]=\"disabled\"\n fill=\"clear\"\n color=\"danger\"\n >\n <mat-icon slot=\"start\">delete</mat-icon>\n {{ 'COMMON.BTN_DELETE' | translate }}\n </ion-button>\n }\n </ion-col>\n <ion-col size=\"4\"></ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"closeRequested.emit()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"closeRequested.emit()\" color=\"tertiary\">\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n } @else {\n <!-- A crop or rotation change is pending: ask for an explicit validation before exporting the image -->\n <ion-row>\n <ion-col size=\"12\" class=\"ion-text-end\">\n <ion-button\n (click)=\"discardEdit(swiperContainer)\"\n color=\"dark\"\n fill=\"clear\"\n [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_CANCEL_EDIT' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_CANCEL_EDIT' | translate) : ''\"\n >\n <ion-icon slot=\"start\" name=\"arrow-undo\"></ion-icon>\n {{ 'COMMON.BTN_CANCEL' | translate }}\n </ion-button>\n <ion-button (click)=\"validateEdit(swiperContainer)\" color=\"danger\">\n <ion-icon slot=\"start\" name=\"checkmark\"></ion-icon>\n {{ 'COMMON.BTN_VALIDATE' | translate }}\n </ion-button>\n </ion-col>\n </ion-row>\n }\n </ion-toolbar>\n</ion-footer>\n\n<ng-template #slideTemplate let-image=\"image\" let-index=\"index\">\n <swiper-slide>\n <div class=\"swiper-zoom-container\" [class.cdk-visually-hidden]=\"!_swiper && index !== selectedIndex\">\n\n <!-- the image -->\n @if (image?.url) {\n <ion-img class=\"swiper-zoom-target\" [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <img [src]=\"image.dataUrl\" [alt]=\"image.title\" />\n }\n\n <!-- crop overlay: only rendered for the active slide -->\n @if (!readOnly && enableCrop && _cropToolActive && index === activeSlideIndex) {\n <div\n class=\"crop-overlay\"\n (mousedown)=\"onCropPointerDown($event, swiperContainer, 'move')\"\n (touchstart)=\"onCropPointerDown($event, swiperContainer, 'move')\"\n >\n <!-- darkened mask around the selection: clipped to the image bounds -->\n <div class=\"crop-mask\">\n <div\n class=\"crop-mask-rect\"\n [style.left.%]=\"_cropRect.x * 100\"\n [style.top.%]=\"_cropRect.y * 100\"\n [style.width.%]=\"_cropRect.width * 100\"\n [style.height.%]=\"_cropRect.height * 100\"\n ></div>\n </div>\n\n <!-- interactive selection border, grid & drag handles: never clipped, so corner/edge handles\n remain fully grabbable even when the selection touches the image bounds -->\n <div\n class=\"crop-rect\"\n [style.left.%]=\"_cropRect.x * 100\"\n [style.top.%]=\"_cropRect.y * 100\"\n [style.width.%]=\"_cropRect.width * 100\"\n [style.height.%]=\"_cropRect.height * 100\"\n >\n <div class=\"crop-grid\">\n <span class=\"line v\" style=\"left: 33.333%\"></span>\n <span class=\"line v\" style=\"left: 66.666%\"></span>\n <span class=\"line h\" style=\"top: 33.333%\"></span>\n <span class=\"line h\" style=\"top: 66.666%\"></span>\n </div>\n @for (handle of _cropHandles; track handle) {\n <div\n class=\"crop-handle {{ handle }}\"\n (mousedown)=\"onCropPointerDown($event, swiperContainer, handle)\"\n (touchstart)=\"onCropPointerDown($event, swiperContainer, handle)\"\n ></div>\n }\n </div>\n </div>\n }\n </div>\n </swiper-slide>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;height:100%;-webkit-user-select:none;user-select:none}:host ion-content{flex:1 1 auto}:host .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}:host .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}:host .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}:host .side-buttons ion-icon{top:50%;color:#fff;background:#00000080;padding:4px;border-radius:50%;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}:host .side-buttons:hover{cursor:pointer}:host .side-buttons:hover ion-icon{opacity:1}:host .side-buttons.prev{left:0}:host .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}:host .side-buttons.next{right:0}:host .side-buttons.next ion-icon{right:var(--side-buttons-margin)}:host .side-buttons.disabled{pointer-events:none}:host swiper-container{height:100%;background:#000}:host .swiper-zoom-container{position:relative}:host ion-fab-button .icon-secondary{top:11px;left:6px;height:14px}:host .crop-overlay{position:absolute;z-index:15;cursor:move;touch-action:none;animation:crop-overlay-fade-in .15s ease-in}:host .crop-overlay .crop-mask{position:absolute;inset:0;overflow:hidden;pointer-events:none}:host .crop-overlay .crop-mask .crop-mask-rect{position:absolute;box-shadow:0 0 0 2000px #0009}:host .crop-overlay .crop-rect{position:absolute;box-sizing:border-box;border:1px solid rgba(255,255,255,.95);cursor:move;touch-action:none}:host .crop-overlay .crop-rect .crop-grid{position:absolute;inset:0;pointer-events:none}:host .crop-overlay .crop-rect .crop-grid .line{position:absolute;background:#ffffff73}:host .crop-overlay .crop-rect .crop-grid .line.v{top:0;bottom:0;width:1px}:host .crop-overlay .crop-rect .crop-grid .line.h{left:0;right:0;height:1px}:host .crop-overlay .crop-rect .crop-handle{position:absolute;width:16px;height:16px;margin:-8px;background:#fff;border:1px solid rgba(0,0,0,.45);border-radius:50%;box-shadow:0 1px 4px #00000080;transition:transform .12s ease;touch-action:none}:host .crop-overlay .crop-rect .crop-handle:hover{transform:scale(1.3)}:host .crop-overlay .crop-rect .crop-handle.nw{left:0;top:0;cursor:nwse-resize}:host .crop-overlay .crop-rect .crop-handle.n{left:50%;top:0;cursor:ns-resize}:host .crop-overlay .crop-rect .crop-handle.ne{left:100%;top:0;cursor:nesw-resize}:host .crop-overlay .crop-rect .crop-handle.e{left:100%;top:50%;cursor:ew-resize}:host .crop-overlay .crop-rect .crop-handle.se{left:100%;top:100%;cursor:nwse-resize}:host .crop-overlay .crop-rect .crop-handle.s{left:50%;top:100%;cursor:ns-resize}:host .crop-overlay .crop-rect .crop-handle.sw{left:0;top:100%;cursor:nesw-resize}:host .crop-overlay .crop-rect .crop-handle.w{left:0;top:50%;cursor:ew-resize}@keyframes crop-overlay-fade-in{0%{opacity:0}to{opacity:1}}\n"] }]
730
735
  }], ctorParameters: () => [{ type: i1.AlertController }, { type: i2.TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { rows: [{
731
736
  type: Input
732
737
  }], selectedIndex: [{
@@ -786,9 +791,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
786
791
  type: Output
787
792
  }], swiperRef: [{
788
793
  type: ViewChild,
789
- args: ['slideshowSwiper']
794
+ args: ['swiperContainer']
790
795
  }], onWindowResize: [{
791
796
  type: HostListener,
792
797
  args: ['window:resize']
793
798
  }] } });
794
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9zbGlkZXNob3cvaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9zbGlkZXNob3cvaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7OztBQVl0RDs7OztHQUlHO0FBT0gsTUFBTSxPQUFPLGlDQUFpQztJQWlGaEM7SUFDQTtJQUNBO0lBbEZGLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUNyQixhQUFhLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QixPQUFPLENBQVM7SUFFMUIsb0NBQW9DO0lBQzFCLFVBQVUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUs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Z0IsRUFBRTtnQkFDN0IsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVrQyxVQUFVO3NCQUFqRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUVFLFlBQVk7c0JBQW5ELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRzVCLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxTQUFTO3NCQUFsQixNQUFNO2dCQUtHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRXVCLFNBQVM7c0JBQXRDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQTBSbEIsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRhYmxlRWxlbWVudCB9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIsIElvbmljU2xpZGVzIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3dpcGVyIH0gZnJvbSAnc3dpcGVyL3R5cGVzJztcbmltcG9ydCB7IEltYWdlLCBJbWFnZVNpemUgfSBmcm9tICcuLi8uLi9pbWFnZS5tb2RlbCc7XG5pbXBvcnQgeyBpc05pbE9yQmxhbmsgfSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlciwgZW1pdFByb21pc2VFdmVudCB9IGZyb20gJy4uLy4uLy4uL2V2ZW50cyc7XG5pbXBvcnQgeyBBbGVydHMgfSBmcm9tICcuLi8uLi8uLi9hbGVydHMnO1xuaW1wb3J0IHsgQVBQX1NIT1dfVE9PTFRJUCB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge0ltYWdlRWRpdEV2ZW50LCBJbWFnZUVkaXRGb3JtYXQsIEltYWdlR2FsbGVyeVNsaWRlQ2hhbmdlRXZlbnR9IGZyb20gJy4uL2ltYWdlLWdhbGxlcnkubW9kZWwnO1xuXG5pbnRlcmZhY2UgQ3JvcFJlY3Qge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbnR5cGUgQ3JvcEhhbmRsZSA9ICdtb3ZlJyB8ICdudycgfCAnbicgfCAnbmUnIHwgJ2UnIHwgJ3NlJyB8ICdzJyB8ICdzdycgfCAndyc7XG5cbi8qKlxuICogVGhlIHpvb20vcGFuL3JvdGF0ZS9jcm9wIHNsaWRlc2hvdyBzaG93biB3aGVuIGNsaWNraW5nIGFuIGltYWdlIGluIGBBcHBJbWFnZUdhbGxlcnlDb21wb25lbnRgLlxuICogRXh0cmFjdGVkIGludG8gaXRzIG93biBjb21wb25lbnQgc28gdGhlIGV4YWN0IHNhbWUgc2xpZGVzaG93IGNhbiBiZSBwcmVzZW50ZWQgZWl0aGVyIGluc2lkZSBhblxuICogYGlvbi1tb2RhbGAgKGRlZmF1bHQpLCBvciBpbmxpbmUgYXMgYW4gb3ZlcmxheSBkaXJlY3RseSB3aXRoaW4gdGhlIGdhbGxlcnksIHdpdGhvdXQgYW55IGR1cGxpY2F0aW9uLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1nYWxsZXJ5LXNsaWRlc2hvdy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwSW1hZ2VHYWxsZXJ5U2xpZGVzaG93Q29tcG9uZW50PFQgZXh0ZW5kcyBJbWFnZSA9IEltYWdlPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBhY3RpdmVTbGlkZUluZGV4ID0gMDtcbiAgcHJvdGVjdGVkIHN3aXBlck1vZHVsZXMgPSBbSW9uaWNTbGlkZXNdO1xuICBwcm90ZWN0ZWQgX3N3aXBlcjogU3dpcGVyO1xuXG4gIC8vIE1vdXNlIHdoZWVsIHpvb20gJiByb3RhdGlvbiBzdGF0ZVxuICBwcm90ZWN0ZWQgX3pvb21TdGF0ZSA9IHsgc2NhbGU6IDEsIHR4OiAwLCB0eTogMCB9O1xuICBwcm90ZWN0ZWQgX3JvdGF0aW9uID0gMDsgLy8gZGVncmVlczogMCwgOTAsIDE4MCwgMjcwXG4gIHByb3RlY3RlZCBfZHJhZ1N0YXRlOiB7IHN0YXJ0WDogbnVtYmVyOyBzdGFydFk6IG51bWJlcjsgc3RhcnRUeDogbnVtYmVyOyBzdGFydFR5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgX3doZWVsTGlzdGVuZXI6ICgoZTogV2hlZWxFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIF93aGVlbEVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8vIENyb3AgJiByb3RhdGUgc3RhdGUuIFJvdGF0aW9uIGlzIGFsd2F5cyBhdmFpbGFibGU7IHRoZSBjcm9wIGdyaWQvaGFuZGxlcyBvbmx5IHNob3cgb25jZSB0aGVcbiAgLy8gY3JvcCB0b29sIGhhcyBiZWVuIGV4cGxpY2l0bHkgYWN0aXZhdGVkIChmYWIgYnV0dG9uKS4gVmFsaWRhdGUvY2FuY2VsIHNob3cgdXAgb25jZSBzb21ldGhpbmcgY2hhbmdlZC5cbiAgLy8gSW5zZXQgYXBwbGllZCB0byB0aGUgY3JvcCBzZWxlY3Rpb24gYXMgc29vbiBhcyB0aGUgdG9vbCBpcyBhY3RpdmF0ZWQgKG9yIHJlc2V0KSwgc28gdGhlIHJlc2l6ZVxuICAvLyBoYW5kbGVzIHN0YXJ0IGF3YXkgZnJvbSB0aGUgaW1hZ2UgZWRnZXMsIHdoZXJlIHRoZXkgYXJlIGhhcmQgdG8gZ3JhYi5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kZWZhdWx0Q3JvcEluc2V0ID0gMC4xNTtcbiAgcHJvdGVjdGVkIF9jcm9wVG9vbEFjdGl2ZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2Nyb3BSZWN0OiBDcm9wUmVjdCA9IHsgeDogMCwgeTogMCwgd2lkdGg6IDEsIGhlaWdodDogMSB9O1xuICBwcm90ZWN0ZWQgX2Nyb3BPdmVybGF5UmVjdDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBfY3JvcERyYWdTdGF0ZTogeyBoYW5kbGU6IENyb3BIYW5kbGU7IHN0YXJ0WDogbnVtYmVyOyBzdGFydFk6IG51bWJlcjsgc3RhcnRSZWN0OiBDcm9wUmVjdCB9IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY3JvcEhhbmRsZXM6IENyb3BIYW5kbGVbXSA9IFsnbncnLCAnbicsICduZScsICdlJywgJ3NlJywgJ3MnLCAnc3cnLCAndyddO1xuXG4gIC8vIFNldCBieSBzbGlkZVByZXYoKS9zbGlkZU5leHQoKSBqdXN0IGJlZm9yZSBhc2tpbmcgU3dpcGVyIHRvIG1vdmUsIHNvIG9uU2xpZGVDaGFuZ2UoKSBjYW4gdGVsbCBhcGFydFxuICAvLyBhIFwic3RlcFwiIGZyb20gYSBcIndyYXBcIiB1bmFtYmlndW91c2x5ICh3aXRoIGV4YWN0bHkgMiBzbGlkZXMsIGJvdGggcHJvZHVjZSB0aGUgdmVyeSBzYW1lIGluZGV4IGNoYW5nZSkuXG4gIHByb3RlY3RlZCBfcGVuZGluZ1NsaWRlRGlyZWN0aW9uOiAncHJldicgfCAnbmV4dCcgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSByb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSB8IFJlYWRvbmx5QXJyYXk8VGFibGVFbGVtZW50PFQ+PiA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3RlZEluZGV4ID0gMDtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG1vYmlsZSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVhZE9ubHkgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkZWJ1ZyA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZW5hYmxlTW91c2Vab29tID0gZmFsc2U7XG4gIEBJbnB1dCgpIHdoZWVsWm9vbVN0ZXAgPSAwLjM7XG4gIEBJbnB1dCgpIG1heFpvb21SYXRpbyA9IDM7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBlbmFibGVSb3RhdGUgPSB0cnVlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZW5hYmxlQ3JvcCA9IHRydWU7XG4gIEBJbnB1dCgpIGVkaXRpb25Gb3JtYXQ6IEltYWdlRWRpdEZvcm1hdCA9ICdwbmcnO1xuICBASW5wdXQoKSBlZGl0aW9uUXVhbGl0eSA9IDAuOTI7XG4gIEBJbnB1dCgpIGltYWdlU2l6ZVF1ZXJ5UGFyYW0gPSAnc2l6ZSc7XG4gIEBJbnB1dCgpIG1vZGFsSW1hZ2VTaXplOiBJbWFnZVNpemUgfCBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHJlYWNoaW5nIHRoZSBsYXN0IChyZXNwLiBmaXJzdCkgc2xpZGUgc2hvdWxkIHdyYXAgYXJvdW5kIHRvIHRoZSBmaXJzdCAocmVzcC4gbGFzdCkgb25lLiBEZWZhdWx0IHRydWUuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBlbmFibGVMb29wID0gdHJ1ZTtcbiAgLyoqIFdoZXRoZXIgbW9yZSByb3dzIG1heSBleGlzdCBiZXlvbmQgdGhlIG9uZXMgY3VycmVudGx5IGxvYWRlZCAoZS5nLiBhIGZ1cnRoZXIgcGFnZSwgbm90IHlldCBmZXRjaGVkKS4gV2hlbiB0cnVlLCByZWFjaGluZyB0aGUgbGFzdCBzbGlkZSBhc2tzIHRoZSBwYXJlbnQgKHZpYSBgZmV0Y2hNb3JlYCkgaW5zdGVhZCBvZiBsb29waW5nL3N0b3BwaW5nLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2FuRmV0Y2hNb3JlID0gZmFsc2U7XG5cbiAgLyoqIFJlcXVlc3RzIGRlbGV0aW9uIG9mIHRoZSBnaXZlbiByb3cuIFRoZSBjYWxsZXIgKGdhbGxlcnkpIG93bnMgdGhlIGNvbmZpcm1hdGlvbi9kZWxldGlvbiBsb2dpYyBhbmQgcmVzb2x2ZXMgdGhlIHByb21pc2Ugd2l0aCB3aGV0aGVyIGl0IGFjdHVhbGx5IGhhcHBlbmVkLiAqL1xuICBAT3V0cHV0KCkgZGVsZXRlUmVxdWVzdGVkID0gY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlcjxib29sZWFuLCB7IHJvdzogVGFibGVFbGVtZW50PFQ+IH0+KCk7XG4gIEBPdXRwdXQoKSBjbG9zZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGFmdGVyRWRpdEltYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxJbWFnZUVkaXRFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIGFmdGVyRWRpdFJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFbGVtZW50PFQ+PigpO1xuICAvKiogRW1pdHRlZCB3aGVuZXZlciB0aGUgYWN0aXZlIHNsaWRlIG1vdmVzIGJhY2t3YXJkIChwcmV2aW91cyBpbWFnZSksIHdoZXRoZXIgdHJpZ2dlcmVkIGJ5IHRoZSBzaWRlIGJ1dHRvbiwgYSBzd2lwZSwgb3IgbG9vcGluZyBwYXN0IHRoZSBmaXJzdCBzbGlkZS4gKi9cbiAgQE91dHB1dCgpIHByZXZpb3VzU2xpZGUgPSBuZXcgRXZlbnRFbWl0dGVyPEltYWdlR2FsbGVyeVNsaWRlQ2hhbmdlRXZlbnQ8VD4+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW5ldmVyIHRoZSBhY3RpdmUgc2xpZGUgbW92ZXMgZm9yd2FyZCAobmV4dCBpbWFnZSksIHdoZXRoZXIgdHJpZ2dlcmVkIGJ5IHRoZSBzaWRlIGJ1dHRvbiwgYSBzd2lwZSwgb3IgbG9vcGluZyBwYXN0IHRoZSBsYXN0IHNsaWRlLiAqL1xuICBAT3V0cHV0KCkgbmV4dFNsaWRlID0gbmV3IEV2ZW50RW1pdHRlcjxJbWFnZUdhbGxlcnlTbGlkZUNoYW5nZUV2ZW50PFQ+PigpO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHJlYWNoaW5nIHRoZSBsYXN0IHNsaWRlIHdoaWxlIGBjYW5GZXRjaE1vcmVgIGlzIHRydWU6IHRoZSBwYXJlbnQgaXMgZXhwZWN0ZWQgdG8gZmV0Y2hcbiAgICogdGhlIG5leHQgcGFnZSAoaG93ZXZlciBpdCBkb2VzIHNvKSBhbmQgcmVzb2x2ZSB3aXRoIHdoZXRoZXIgbmV3IHJvd3Mgd2VyZSBhY3R1YWxseSBhZGRlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBmZXRjaE1vcmUgPSBjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyPGJvb2xlYW4sIHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2xpZGVzaG93U3dpcGVyJykgc3dpcGVyUmVmOiBFbGVtZW50UmVmO1xuXG4gIHNob3dUb29sdGlwID0gaW5qZWN0KEFQUF9TSE9XX1RPT0xUSVAsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcHJvdGVjdGVkIGdldCBoYXNQZW5kaW5nRWRpdCgpOiBib29sZWFuIHtcbiAgICBjb25zdCByID0gdGhpcy5fY3JvcFJlY3Q7XG4gICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uICE9PSAwIHx8IHIueCAhPT0gMCB8fCByLnkgIT09IDAgfHwgci53aWR0aCAhPT0gMSB8fCByLmhlaWdodCAhPT0gMTtcbiAgfVxuXG4gIC8qKiBObyBcImZldGNoIHByZXZpb3VzIHBhZ2VcIiBjb25jZXB0IGV4aXN0czogcmVhY2hpbmcgdGhlIGZpcnN0IHNsaWRlIGNhbiBvbmx5IGxvb3AsIG9yIHN0b3AuICovXG4gIHByb3RlY3RlZCBnZXQgaXNQcmV2RGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmVuYWJsZUxvb3AgJiYgdGhpcy5hY3RpdmVTbGlkZUluZGV4ID09PSAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpc05leHREaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZW5hYmxlTG9vcCAmJiAhdGhpcy5jYW5GZXRjaE1vcmUgJiYgdGhpcy5hY3RpdmVTbGlkZUluZGV4ID09PSB0aGlzLnJvd3MubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBhbHRlckN0cmw6IEFsZXJ0Q29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2NsZWFudXBXaGVlbFpvb20oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTd2lwZXIoc3dpcGVyRWxlbWVudD86IGFueSk6IFN3aXBlciB7XG4gICAgdGhpcy5fc3dpcGVyID0gKHN3aXBlckVsZW1lbnQgfHwgdGhpcy5zd2lwZXJSZWY/Lm5hdGl2ZUVsZW1lbnQpPy5zd2lwZXIgfHwgdGhpcy5fc3dpcGVyO1xuICAgIHJldHVybiB0aGlzLl9zd2lwZXI7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgKGEgZmV3IGFuaW1hdGlvbiBmcmFtZXMpIHVudGlsIFN3aXBlcidzIG93biBzbGlkZXMgYXJyYXkgcmVmbGVjdHMgYXQgbGVhc3QgYG1pbkNvdW50YCBpdGVtcy5cbiAgICogTmVlZGVkIGFmdGVyIGBmZXRjaE1vcmVgOiB0aGUgbmV3IGA8c3dpcGVyLXNsaWRlPmAgZWxlbWVudHMgY29tZSBmcm9tIHRoZSBgcm93c2AgaW5wdXQgcmUtcmVuZGVyaW5nLFxuICAgKiB3aGljaCBtYXkgbm90IGhhdmUgcmVhY2hlZCB0aGUgRE9NIGJ5IHRoZSB0aW1lIHRoZSBwYXJlbnQncyByZXR1cm5lZCBwcm9taXNlIHJlc29sdmVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIF93YWl0Rm9yU2xpZGVDb3VudChzd2lwZXI6IFN3aXBlciwgbWluQ291bnQ6IG51bWJlciwgcmV0cmllc0xlZnQgPSAzMCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICgoc3dpcGVyLnNsaWRlcz8ubGVuZ3RoID8/IDApID49IG1pbkNvdW50KSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgIGlmIChyZXRyaWVzTGVmdCA8PSAwKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKHRoaXMuX3dhaXRGb3JTbGlkZUNvdW50KHN3aXBlciwgbWluQ291bnQsIHJldHJpZXNMZWZ0IC0gMSkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNsaWRlQ2hhbmdlKHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBzd2lwZXIucHJldmlvdXNJbmRleDtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICB0aGlzLmFjdGl2ZVNsaWRlSW5kZXggPSBhY3RpdmVJbmRleDtcbiAgICB0aGlzLl9yZXNldFpvb20oc3dpcGVyRWxlbWVudCk7XG4gICAgdGhpcy5fdXBkYXRlU3dpcGVyVG91Y2hNb3ZlKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5fZW1pdFNsaWRlQ2hhbmdlKHByZXZpb3VzSW5kZXgsIGFjdGl2ZUluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBgcHJldmlvdXNTbGlkZWAvYG5leHRTbGlkZWAgZnJvbSB0aGUgYWN0dWFsIGluZGV4IGNoYW5nZSwgY292ZXJpbmcgc2lkZSBidXR0b25zIGFzIHdlbGwgYXMgdG91Y2hcbiAgICogc3dpcGVzLiBXaGVuIGBzbGlkZVByZXYoKWAvYHNsaWRlTmV4dCgpYCB0cmlnZ2VyZWQgdGhlIGNoYW5nZSwgdGhlaXIgZXhwbGljaXQgaW50ZW50IGlzIHVzZWQgKHNpbmNlIHdpdGhcbiAgICogZXhhY3RseSAyIHNsaWRlcywgYSBcInN0ZXBcIiBhbmQgYSBtYW51YWwgXCJ3cmFwXCIgcHJvZHVjZSB0aGUgdmVyeSBzYW1lIGluZGV4IGNoYW5nZSBhbmQgY2FuJ3QgYmUgdG9sZCBhcGFydFxuICAgKiBmcm9tIHRoZSBpbmRleGVzIGFsb25lKS4gT3RoZXJ3aXNlIChhIHBsYWluIHRvdWNoIHN3aXBlKSBTd2lwZXIgbmV2ZXIgd3JhcHMgb24gaXRzIG93biAobm8gYGxvb3BgIG1vZGVcbiAgICogY29uZmlndXJlZCBoZXJlKSwgc28gYSBzaW1wbGUgaW5kZXggY29tcGFyaXNvbiBpcyB1bmFtYmlndW91cy5cbiAgICovXG4gIHByb3RlY3RlZCBfZW1pdFNsaWRlQ2hhbmdlKHByZXZpb3VzSW5kZXg6IG51bWJlciwgYWN0aXZlSW5kZXg6IG51bWJlcikge1xuICAgIGlmIChwcmV2aW91c0luZGV4ID09PSBhY3RpdmVJbmRleCkgcmV0dXJuO1xuICAgIGNvbnN0IGlzTmV4dCA9IHRoaXMuX3BlbmRpbmdTbGlkZURpcmVjdGlvbiA/IHRoaXMuX3BlbmRpbmdTbGlkZURpcmVjdGlvbiA9PT0gJ25leHQnIDogYWN0aXZlSW5kZXggPiBwcmV2aW91c0luZGV4O1xuICAgIHRoaXMuX3BlbmRpbmdTbGlkZURpcmVjdGlvbiA9IG51bGw7XG4gICAgY29uc3QgZXZlbnQ6IEltYWdlR2FsbGVyeVNsaWRlQ2hhbmdlRXZlbnQ8VD4gPSB7IGluZGV4OiBhY3RpdmVJbmRleCwgcm93OiB0aGlzLnJvd3M/LlthY3RpdmVJbmRleF0gfTtcbiAgICAoaXNOZXh0ID8gdGhpcy5uZXh0U2xpZGUgOiB0aGlzLnByZXZpb3VzU2xpZGUpLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3dpcGVySW5pdChzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLl9yZXNldFpvb20oKTtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICAvLyBUaGUgYGluaXRpYWxTbGlkZWAgYmluZGluZyBjYW4gTk9UIHdvcmsgaGVyZTogQW5ndWxhciBpbnNlcnRzIDxzd2lwZXItY29udGFpbmVyPiBpbnRvIHRoZSBET00gKHdoaWNoXG4gICAgLy8gc3luY2hyb25vdXNseSBydW5zIGl0cyBjb25uZWN0ZWRDYWxsYmFjaywgY29uc3RydWN0aW5nIHRoZSBTd2lwZXIgaW5zdGFuY2UgYW5kIHJlYWRpbmcgYGluaXRpYWxTbGlkZWBcbiAgICAvLyBvZmYgdGhlIGVsZW1lbnQpICpiZWZvcmUqIGl0IGFwcGxpZXMgcHJvcGVydHkgYmluZGluZ3MgaW4gaXRzIHVwZGF0ZSBwYXNzIC0tIHNvIFN3aXBlciBhbHdheXMgcmVhZHNcbiAgICAvLyBgaW5pdGlhbFNsaWRlYCBhcyB1bnNldCAoMCkuIEl0IG11c3QgYmUgY29ycmVjdGVkIGV4cGxpY2l0bHksIG9uY2UgU3dpcGVyIGFjdHVhbGx5IGV4aXN0cy5cbiAgICBpZiAoc3dpcGVyICYmIHRoaXMuc2VsZWN0ZWRJbmRleCA+IDAgJiYgc3dpcGVyLmFjdGl2ZUluZGV4ICE9PSB0aGlzLnNlbGVjdGVkSW5kZXgpIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHRoaXMuc2VsZWN0ZWRJbmRleCwgMCAvKm5vIHRyYW5zaXRpb24sIHRvIGF2b2lkIGEgXCJyZXZlcnRcIiBlZmZlY3QqLyk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9IHN3aXBlcj8uYWN0aXZlSW5kZXggPz8gdGhpcy5zZWxlY3RlZEluZGV4O1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3ddIEluaXRpYWxpemluZyBzbGlkZXNob3csIGFjdGl2ZVNsaWRlSW5kZXg9JHt0aGlzLmFjdGl2ZVNsaWRlSW5kZXh9YCk7XG4gICAgdGhpcy5fc2V0dXBXaGVlbFpvb20oc3dpcGVyRWxlbWVudCk7XG4gICAgdGhpcy5fdXBkYXRlU3dpcGVyVG91Y2hNb3ZlKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGVFZGl0SW1hZ2VTaXplKHN3aXBlckVsZW1lbnQpO1xuICAgICAgdGhpcy5fdXBkYXRlQ3JvcE92ZXJsYXlQb3NpdGlvbihzd2lwZXJFbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2lwZXIncyBvd24gdG91Y2gvbW91c2UtZHJhZy10by1zd2lwZSBnZXN0dXJlIGlzIGNhcHR1cmVkIHZlcnkgZWFybHkgKGJlZm9yZSBvdXIgY3JvcCBvdmVybGF5J3NcbiAgICogb3duIG1vdXNlZG93biBoYW5kbGVyIGNhbiBzdG9wIGl0KSwgc28gaXQgbXVzdCBiZSBkaXNhYmxlZCB1cGZyb250IHdoZW5ldmVyIHRoZSBjcm9wIHRvb2wgaXMgYWN0aXZlXG4gICAqIC0tIG90aGVyd2lzZSBkcmFnZ2luZyBpbnNpZGUgdGhlIGNyb3Agc2VsZWN0aW9uIGVuZHMgdXAgc2xpZGluZyB0byB0aGUgbmV4dC9wcmV2aW91cyBpbWFnZSBpbnN0ZWFkLlxuICAgKiBQcmV2L25leHQgYXJyb3cgYnV0dG9ucyBrZWVwIHdvcmtpbmcsIHNpbmNlIHRoZXkgY2FsbCB0aGUgU3dpcGVyIEFQSSBkaXJlY3RseS5cbiAgICovXG4gIHByb3RlY3RlZCBfdXBkYXRlU3dpcGVyVG91Y2hNb3ZlKHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGlmICghc3dpcGVyKSByZXR1cm47XG4gICAgc3dpcGVyLmFsbG93VG91Y2hNb3ZlID0gIXRoaXMuX2Nyb3BUb29sQWN0aXZlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHpvb20oc3dpcGVyRWxlbWVudDogYW55LCB6b29tSW46IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2ltYWdlLWdhbGxlcnktc2xpZGVzaG93XSB6b29tICcgKyAoem9vbUluID8gJ2luJyA6ICdvdXQnKSwgc3dpcGVyRWxlbWVudCk7XG4gICAgaWYgKHRoaXMuZW5hYmxlTW91c2Vab29tKSB7XG4gICAgICBjb25zdCBkZWx0YSA9IHpvb21JbiA/IHRoaXMud2hlZWxab29tU3RlcCA6IC10aGlzLndoZWVsWm9vbVN0ZXA7XG4gICAgICBjb25zdCBuZXdTY2FsZSA9IE1hdGgubWF4KDEsIE1hdGgubWluKHRoaXMuX3pvb21TdGF0ZS5zY2FsZSArIGRlbHRhLCB0aGlzLm1heFpvb21SYXRpbykpO1xuICAgICAgaWYgKG5ld1NjYWxlID09PSB0aGlzLl96b29tU3RhdGUuc2NhbGUpIHJldHVybjtcbiAgICAgIGlmIChuZXdTY2FsZSA9PT0gMSkge1xuICAgICAgICB0aGlzLl96b29tU3RhdGUgPSB7IHNjYWxlOiAxLCB0eDogMCwgdHk6IDAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3pvb21TdGF0ZS5zY2FsZSA9IG5ld1NjYWxlO1xuICAgICAgICB0aGlzLl9jbGFtcFRyYW5zbGF0aW9ucyhzd2lwZXJFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FwcGx5Wm9vbShzd2lwZXJFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgICBpZiAoem9vbUluKSBzd2lwZXIuem9vbS5pbigpO1xuICAgICAgZWxzZSBzd2lwZXIuem9vbS5vdXQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVxdWVzdERlbGV0ZShzd2lwZXJFbGVtZW50OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBjdXJyZW50Um93ID0gdGhpcy5yb3dzLmZpbmQoKHJvdywgaW5kZXgpID0+IGluZGV4ID09PSBzd2lwZXIuYWN0aXZlSW5kZXgpO1xuICAgIGlmICghY3VycmVudFJvdykgcmV0dXJuIGZhbHNlOyAvLyBSb3cgbm90IGZvdW5kXG5cbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBkZWxldGVkID0gYXdhaXQgZW1pdFByb21pc2VFdmVudCh0aGlzLmRlbGV0ZVJlcXVlc3RlZCwgJ2RlbGV0ZScsIHsgZGV0YWlsOiB7IHJvdzogY3VycmVudFJvdyB9IH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiBmYWxzZTsgLy8gVXNlciBjYW5jZWxcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgaWYgKCF0aGlzLnJvd3M/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmNsb3NlUmVxdWVzdGVkLmVtaXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0Wm9vbShzd2lwZXJFbGVtZW50KTtcbiAgICAgICAgc3dpcGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzbGlkZVByZXYoc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgaWYgKGFjdGl2ZUluZGV4ID09PSAwKSB7XG4gICAgICAvLyBObyBwcmV2aW91cyBwYWdlIGNvbmNlcHQgKHBhZ2luYXRpb24gb25seSBldmVyIGxvYWRzIGZvcndhcmQpOiBqdXN0IGxvb3AsIG9yIHN0YXkgcHV0XG4gICAgICBpZiAoIXRoaXMuZW5hYmxlTG9vcCkgcmV0dXJuO1xuICAgICAgdGhpcy5fcGVuZGluZ1NsaWRlRGlyZWN0aW9uID0gJ3ByZXYnO1xuICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlVG8odGhpcy5yb3dzLmxlbmd0aCAtIDEsIDAgLypubyB0cmFuc2l0aW9uLCB0byBhdm9pZCBhIFwicmV2ZXJ0XCIgZWZmZWN0Ki8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpZGVEaXJlY3Rpb24gPSAncHJldic7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVQcmV2KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNsaWRlTmV4dChzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IHRoaXMucm93cy5sZW5ndGggLSAxKSB7XG4gICAgICAvLyBUcnkgZmV0Y2hpbmcgYSBmdXJ0aGVyIHBhZ2UgZmlyc3QsIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gbG9vcGluZy9zdG9wcGluZ1xuICAgICAgaWYgKHRoaXMuY2FuRmV0Y2hNb3JlICYmIHRoaXMuZmV0Y2hNb3JlLm9ic2VydmVkKSB7XG4gICAgICAgIGNvbnN0IHJvd0NvdW50QmVmb3JlRmV0Y2ggPSB0aGlzLnJvd3MubGVuZ3RoO1xuICAgICAgICBsZXQgZmV0Y2hlZCA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZldGNoZWQgPSBhd2FpdCBlbWl0UHJvbWlzZUV2ZW50KHRoaXMuZmV0Y2hNb3JlLCAnZmV0Y2hNb3JlJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChlcnIgIT09ICdDQU5DRUxMRUQnKSB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZldGNoZWQgJiYgdGhpcy5yb3dzLmxlbmd0aCA+IHJvd0NvdW50QmVmb3JlRmV0Y2gpIHtcbiAgICAgICAgICAvLyBUaGUgbmV3IDxzd2lwZXItc2xpZGU+IGVsZW1lbnRzIGNvbWUgZnJvbSB0aGUgYHJvd3NgIGlucHV0IHJlLXJlbmRlcmluZywgd2hpY2ggbWF5IG5vdCBoYXZlXG4gICAgICAgICAgLy8gcmVhY2hlZCB0aGUgRE9NIHlldCBhdCB0aGlzIHBvaW50OiB3YWl0IGZvciBTd2lwZXIgdG8gYWN0dWFsbHkgc2VlIHRoZSBleHRyYSBzbGlkZShzKS5cbiAgICAgICAgICBhd2FpdCB0aGlzLl93YWl0Rm9yU2xpZGVDb3VudChzd2lwZXIsIHJvd0NvdW50QmVmb3JlRmV0Y2ggKyAxKTtcbiAgICAgICAgICB0aGlzLl9wZW5kaW5nU2xpZGVEaXJlY3Rpb24gPSAnbmV4dCc7XG4gICAgICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlTmV4dCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RoaW5nIG5ldyB3YXMgYWN0dWFsbHkgYWRkZWQ6IGZhbGwgdGhyb3VnaCB0byBsb29wL3N0b3AgYmVsb3dcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5lbmFibGVMb29wKSByZXR1cm47XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpZGVEaXJlY3Rpb24gPSAnbmV4dCc7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVUbygwLCAwIC8qbm8gdHJhbnNpdGlvbiwgdG8gYXZvaWQgYSBcInJldmVydFwiIGVmZmVjdCovKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGVuZGluZ1NsaWRlRGlyZWN0aW9uID0gJ25leHQnO1xuICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlTmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJbWFnZVNpemVRdWVyeVBhcmFtcygpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBpZiAoIXRoaXMuaW1hZ2VTaXplUXVlcnlQYXJhbSB8fCBpc05pbE9yQmxhbmsodGhpcy5tb2RhbEltYWdlU2l6ZSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIFt0aGlzLmltYWdlU2l6ZVF1ZXJ5UGFyYW1dOiB0aGlzLm1vZGFsSW1hZ2VTaXplLFxuICAgIH07XG4gIH1cblxuICAvLyAtLS0gQ3JvcCAmIHJvdGF0ZSB0b29sczogYWx3YXlzIGF2YWlsYWJsZSAobm8gXCJlbnRlciBlZGl0IG1vZGVcIiBzdGVwKSAtLS1cbiAgLy8gVmFsaWRhdGUvQ2FuY2VsIG9ubHkgYXBwZWFyIG9uY2UgdGhlIHVzZXIgYWN0dWFsbHkgY2hhbmdlZCBzb21ldGhpbmcgKHNlZSBgaGFzUGVuZGluZ0VkaXRgKS5cblxuICBwcm90ZWN0ZWQgZGlzY2FyZEVkaXQoc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5fcmVzZXRFZGl0U3RhdGUoc3dpcGVyRWxlbWVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRDcm9wKF9zd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLl9jcm9wUmVjdCA9IHRoaXMuX2NyZWF0ZURlZmF1bHRDcm9wUmVjdCgpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2NyZWF0ZURlZmF1bHRDcm9wUmVjdCgpOiBDcm9wUmVjdCB7XG4gICAgY29uc3QgaW5zZXQgPSB0aGlzLl9kZWZhdWx0Q3JvcEluc2V0O1xuICAgIHJldHVybiB7IHg6IGluc2V0LCB5OiBpbnNldCwgd2lkdGg6IDEgLSAyICogaW5zZXQsIGhlaWdodDogMSAtIDIgKiBpbnNldCB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZUNyb3BUb29sKHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGlmICghdGhpcy5lbmFibGVDcm9wIHx8IHRoaXMucmVhZE9ubHkpIHJldHVybjtcbiAgICB0aGlzLl9jcm9wVG9vbEFjdGl2ZSA9ICF0aGlzLl9jcm9wVG9vbEFjdGl2ZTtcbiAgICBpZiAodGhpcy5fY3JvcFRvb2xBY3RpdmUpIHtcbiAgICAgIC8vIFN0YXJ0IHdpdGggYW4gaW5zZXQgc2VsZWN0aW9uOiBoYW5kbGVzIHJpZ2h0IGF0IHRoZSBpbWFnZSBlZGdlcyBhcmUgaGFyZCB0byBncmFiXG4gICAgICB0aGlzLl9jcm9wUmVjdCA9IHRoaXMuX2NyZWF0ZURlZmF1bHRDcm9wUmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEaXNjYXJkIGFueSBwZW5kaW5nIGNyb3Agc2VsZWN0aW9uIHdoZW4gaGlkaW5nIHRoZSB0b29sXG4gICAgICB0aGlzLl9jcm9wUmVjdCA9IHsgeDogMCwgeTogMCwgd2lkdGg6IDEsIGhlaWdodDogMSB9O1xuICAgICAgdGhpcy5fY3JvcERyYWdTdGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZVN3aXBlclRvdWNoTW92ZShzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIGlmICh0aGlzLl9jcm9wVG9vbEFjdGl2ZSkge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIGNyb3Agb3ZlcmxheSB0byBiZSByZW5kZXJlZCwgdGhlbiBjb21wdXRlIGl0cyBwb3NpdGlvblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl91cGRhdGVDcm9wT3ZlcmxheVBvc2l0aW9uKHN3aXBlckVsZW1lbnQpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdmFsaWRhdGVFZGl0KHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IGN1cnJlbnRSb3cgPSB0aGlzLnJvd3MuZmluZCgocm93LCBpbmRleCkgPT4gaW5kZXggPT09IHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgaWYgKCFjdXJyZW50Um93KSByZXR1cm47XG5cbiAgICBjb25zdCBpbWFnZSA9IGN1cnJlbnRSb3cuY3VycmVudERhdGEgYXMgVDtcbiAgICBjb25zdCBmb3JtYXQgPSB0aGlzLmVkaXRpb25Gb3JtYXQgPz8gJ3BuZyc7XG4gICAgY29uc3QgbWltZVR5cGUgPSAnaW1hZ2UvJyArIGZvcm1hdDtcbiAgICBjb25zdCBxdWFsaXR5ID0gZm9ybWF0ID09PSAnanBlZycgPyB0aGlzLmVkaXRpb25RdWFsaXR5IDogdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGF3YWl0IHRoaXMuX3JlbmRlckVkaXRlZEltYWdlKGltYWdlLCB0aGlzLl9yb3RhdGlvbiwgdGhpcy5fY3JvcFJlY3QpO1xuICAgICAgY29uc3QgZGF0YVVybCA9IGNhbnZhcy50b0RhdGFVUkwobWltZVR5cGUsIHF1YWxpdHkpO1xuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2I+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY2FudmFzLnRvQmxvYigoYikgPT4gKGIgPyByZXNvbHZlKGIpIDogcmVqZWN0KG5ldyBFcnJvcignY2FudmFzLnRvQmxvYigpIGZhaWxlZCcpKSksIG1pbWVUeXBlLCBxdWFsaXR5KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHJvdywgc28gdGhlIHNsaWRlc2hvdyBhbmQgdGh1bWJuYWlsIHJlZmxlY3QgdGhlIGNoYW5nZSBpbW1lZGlhdGVseVxuICAgICAgaW1hZ2UuZGF0YVVybCA9IGRhdGFVcmw7XG4gICAgICBpbWFnZS51cmwgPSBudWxsO1xuXG4gICAgICB0aGlzLmFmdGVyRWRpdEltYWdlLmVtaXQoeyByb3c6IGN1cnJlbnRSb3csIGltYWdlLCBkYXRhVXJsLCBibG9iLCBmb3JtYXQgfSk7XG4gICAgICB0aGlzLmFmdGVyRWRpdFJvdy5lbWl0KGN1cnJlbnRSb3cpO1xuXG4gICAgICB0aGlzLl9yZXNldEVkaXRTdGF0ZShzd2lwZXJFbGVtZW50KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tpbWFnZS1nYWxsZXJ5LXNsaWRlc2hvd10gRmFpbGVkIHRvIGV4cG9ydCB0aGUgZWRpdGVkIGltYWdlJywgZXJyKTtcbiAgICAgIGF3YWl0IEFsZXJ0cy5zaG93RXJyb3IoJ0lNQUdFLkdBTExFUlkuRVJST1JfRURJVF9JTUFHRScsIHRoaXMuYWx0ZXJDdHJsLCB0aGlzLnRyYW5zbGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9yZXNldEVkaXRTdGF0ZShzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLl9yb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5fY3JvcFJlY3QgPSB7IHg6IDAsIHk6IDAsIHdpZHRoOiAxLCBoZWlnaHQ6IDEgfTtcbiAgICB0aGlzLl9jcm9wRHJhZ1N0YXRlID0gbnVsbDtcbiAgICB0aGlzLl9jcm9wVG9vbEFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX2FwcGx5Wm9vbShzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLl91cGRhdGVFZGl0SW1hZ2VTaXplKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMuX3VwZGF0ZVN3aXBlclRvdWNoTW92ZShzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICBjb25zdCBzd2lwZXJFbGVtZW50ID0gdGhpcy5zd2lwZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFzd2lwZXJFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5fdXBkYXRlRWRpdEltYWdlU2l6ZShzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLl91cGRhdGVDcm9wT3ZlcmxheVBvc2l0aW9uKHN3aXBlckVsZW1lbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJvdGF0ZShzd2lwZXJFbGVtZW50OiBhbnksIGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0Jykge1xuICAgIGlmICghdGhpcy5lbmFibGVSb3RhdGUpIHJldHVybjtcbiAgICBjb25zdCBkZWx0YSA9IGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JyA/IDkwIDogLTkwO1xuICAgIHRoaXMuX3JvdGF0aW9uID0gKCgodGhpcy5fcm90YXRpb24gKyBkZWx0YSkgJSAzNjApICsgMzYwKSAlIDM2MDtcbiAgICB0aGlzLl9hcHBseVpvb20oc3dpcGVyRWxlbWVudCk7XG4gICAgdGhpcy5fdXBkYXRlRWRpdEltYWdlU2l6ZShzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLl91cGRhdGVDcm9wT3ZlcmxheVBvc2l0aW9uKHN3aXBlckVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnMgdGhlIGRpc3BsYXllZCBpbWFnZSBzbyB0aGF0LCBldmVuIG9uY2Ugcm90YXRlZCA5MMKwLzI3MMKwIHZpYSBDU1MgdHJhbnNmb3JtLFxuICAgKiBpdHMgdmlzdWFsIGJvdW5kaW5nIGJveCBhbHdheXMgZml0cyBpbnNpZGUgdGhlIHNsaWRlIGNvbnRhaW5lciAobm8gb3ZlcmZsb3cpLlxuICAgKi9cbiAgcHJvdGVjdGVkIF91cGRhdGVFZGl0SW1hZ2VTaXplKHN3aXBlckVsZW1lbnQ6IGFueSwgcmV0cmllc0xlZnQgPSA2MCkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IGFjdGl2ZVNsaWRlID0gc3dpcGVyPy5zbGlkZXM/Lltzd2lwZXIuYWN0aXZlSW5kZXhdIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghYWN0aXZlU2xpZGUpIHJldHVybjtcbiAgICBjb25zdCBjb250YWluZXJFbCA9IGFjdGl2ZVNsaWRlLnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItem9vbS1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBpbWdFbCA9IGFjdGl2ZVNsaWRlLnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItem9vbS10YXJnZXQsIC5zd2lwZXItem9vbS1jb250YWluZXIgPiBpbWcnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lckVsIHx8ICFpbWdFbCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5lbmFibGVDcm9wICYmICF0aGlzLmVuYWJsZVJvdGF0ZSkge1xuICAgICAgaW1nRWwuc3R5bGUud2lkdGggPSAnJztcbiAgICAgIGltZ0VsLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbmF0dXJhbFNpemUgPSB0aGlzLl9nZXRJbWFnZU5hdHVyYWxTaXplKGltZ0VsKTtcbiAgICAvLyBUaGUgY29udGFpbmVyL2ltYWdlIG1heSBub3QgYmUgbGFpZCBvdXQgb3IgbG9hZGVkIHlldDogc2tpcCBhbmQgcmV0cnkgb24gdGhlIG5leHQgZnJhbWVcbiAgICBpZiAoIWNvbnRhaW5lclJlY3Qud2lkdGggfHwgIWNvbnRhaW5lclJlY3QuaGVpZ2h0IHx8ICFuYXR1cmFsU2l6ZSkge1xuICAgICAgaWYgKHJldHJpZXNMZWZ0ID4gMCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5fdXBkYXRlRWRpdEltYWdlU2l6ZShzd2lwZXJFbGVtZW50LCByZXRyaWVzTGVmdCAtIDEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ29tcHV0ZSB0aGUgZXhhY3QgYm94IChwcmVzZXJ2aW5nIHRoZSBpbWFnZSdzIGFzcGVjdCByYXRpbykgdGhhdCBmaXRzIHRoZSBhdmFpbGFibGUgc3BhY2UsXG4gICAgLy8gc3dhcHBpbmcgd2lkdGgvaGVpZ2h0IHdoZW4gcm90YXRlZCA5MMKwLzI3MMKwIHNvIHRoZSByb3RhdGVkIHZpc3VhbCBib3ggbmV2ZXIgb3ZlcmZsb3dzLlxuICAgIGNvbnN0IHN3YXBwZWQgPSB0aGlzLl9yb3RhdGlvbiAlIDE4MCAhPT0gMDtcbiAgICBjb25zdCBhdmFpbFdpZHRoID0gc3dhcHBlZCA/IGNvbnRhaW5lclJlY3QuaGVpZ2h0IDogY29udGFpbmVyUmVjdC53aWR0aDtcbiAgICBjb25zdCBhdmFpbEhlaWdodCA9IHN3YXBwZWQgPyBjb250YWluZXJSZWN0LndpZHRoIDogY29udGFpbmVyUmVjdC5oZWlnaHQ7XG4gICAgY29uc3QgcmF0aW8gPSBNYXRoLm1pbihhdmFpbFdpZHRoIC8gbmF0dXJhbFNpemUud2lkdGgsIGF2YWlsSGVpZ2h0IC8gbmF0dXJhbFNpemUuaGVpZ2h0KTtcbiAgICBpbWdFbC5zdHlsZS53aWR0aCA9IGAke25hdHVyYWxTaXplLndpZHRoICogcmF0aW99cHhgO1xuICAgIGltZ0VsLnN0eWxlLmhlaWdodCA9IGAke25hdHVyYWxTaXplLmhlaWdodCAqIHJhdGlvfXB4YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZ2V0SW1hZ2VOYXR1cmFsU2l6ZShpbWdFbDogSFRNTEVsZW1lbnQpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBpbm5lciA9IChpbWdFbC50YWdOYW1lID09PSAnSU9OLUlNRycgPyBpbWdFbC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCdpbWcnKSA6IGltZ0VsKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGlmICghaW5uZXI/Lm5hdHVyYWxXaWR0aCB8fCAhaW5uZXI/Lm5hdHVyYWxIZWlnaHQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IHdpZHRoOiBpbm5lci5uYXR1cmFsV2lkdGgsIGhlaWdodDogaW5uZXIubmF0dXJhbEhlaWdodCB9O1xuICB9XG5cbiAgLy8gLS0tIENyb3Agb3ZlcmxheTogZHJhZyB0byBtb3ZlL3Jlc2l6ZSB0aGUgY3JvcCByZWN0YW5nbGUgLS0tXG5cbiAgcHJvdGVjdGVkIG9uQ3JvcFBvaW50ZXJEb3duKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCwgc3dpcGVyRWxlbWVudDogYW55LCBoYW5kbGU6IENyb3BIYW5kbGUpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHB0ID0gdGhpcy5fZ2V0RXZlbnRQb2ludChldmVudCk7XG4gICAgdGhpcy5fY3JvcE92ZXJsYXlSZWN0ID0gdGhpcy5fY3JvcE92ZXJsYXlSZWN0ID8/IHRoaXMuX3VwZGF0ZUNyb3BPdmVybGF5UG9zaXRpb24oc3dpcGVyRWxlbWVudCk7XG4gICAgdGhpcy5fY3JvcERyYWdTdGF0ZSA9IHtcbiAgICAgIGhhbmRsZSxcbiAgICAgIHN0YXJ0WDogcHQueCxcbiAgICAgIHN0YXJ0WTogcHQueSxcbiAgICAgIHN0YXJ0UmVjdDogeyAuLi50aGlzLl9jcm9wUmVjdCB9LFxuICAgIH07XG4gICAgLy8gQWxzbyBkaXNhYmxlIHByb2dyYW1tYXRpYyBzbGlkZSBuYXZpZ2F0aW9uIHdoaWxlIGRyYWdnaW5nIChhbGxvd1RvdWNoTW92ZSBpcyBhbHJlYWR5XG4gICAgLy8gcGVybWFuZW50bHkgb2ZmIHdoZW5ldmVyIGNyb3AgaXMgZW5hYmxlZCwgc2VlIGBfdXBkYXRlU3dpcGVyVG91Y2hNb3ZlYClcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBpZiAoc3dpcGVyKSB7XG4gICAgICBzd2lwZXIuYWxsb3dTbGlkZU5leHQgPSBmYWxzZTtcbiAgICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNyb3BQb2ludGVyTW92ZShldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsIF9zd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2Nyb3BEcmFnU3RhdGUpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9jcm9wT3ZlcmxheVJlY3Q7XG4gICAgaWYgKCFyZWN0Py53aWR0aCB8fCAhcmVjdD8uaGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3QgcHQgPSB0aGlzLl9nZXRFdmVudFBvaW50KGV2ZW50KTtcbiAgICBjb25zdCBkeCA9IChwdC54IC0gdGhpcy5fY3JvcERyYWdTdGF0ZS5zdGFydFgpIC8gcmVjdC53aWR0aDtcbiAgICBjb25zdCBkeSA9IChwdC55IC0gdGhpcy5fY3JvcERyYWdTdGF0ZS5zdGFydFkpIC8gcmVjdC5oZWlnaHQ7XG4gICAgdGhpcy5fY3JvcFJlY3QgPSB0aGlzLl9jb21wdXRlQ3JvcFJlY3QodGhpcy5fY3JvcERyYWdTdGF0ZS5oYW5kbGUsIHRoaXMuX2Nyb3BEcmFnU3RhdGUuc3RhcnRSZWN0LCBkeCwgZHkpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Dcm9wUG9pbnRlclVwKF9ldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsIHN3aXBlckVsZW1lbnQ/OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2Nyb3BEcmFnU3RhdGUpIHJldHVybjtcbiAgICB0aGlzLl9jcm9wRHJhZ1N0YXRlID0gbnVsbDtcbiAgICBjb25zdCBzd2lwZXIgPSBzd2lwZXJFbGVtZW50ID8gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCkgOiBudWxsO1xuICAgIGlmIChzd2lwZXIpIHtcbiAgICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IHRydWU7XG4gICAgICBzd2lwZXIuYWxsb3dTbGlkZVByZXYgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoc3dpcGVyRWxlbWVudCkgdGhpcy5fdXBkYXRlU3dpcGVyVG91Y2hNb3ZlKHN3aXBlckVsZW1lbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jb21wdXRlQ3JvcFJlY3QoaGFuZGxlOiBDcm9wSGFuZGxlLCBzdGFydDogQ3JvcFJlY3QsIGR4OiBudW1iZXIsIGR5OiBudW1iZXIpOiBDcm9wUmVjdCB7XG4gICAgY29uc3QgTUlOX1NJWkUgPSAwLjA4O1xuICAgIGNvbnN0IGNsYW1wMDEgPSAodjogbnVtYmVyKSA9PiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2KSk7XG5cbiAgICBpZiAoaGFuZGxlID09PSAnbW92ZScpIHtcbiAgICAgIGxldCB4ID0gY2xhbXAwMShzdGFydC54ICsgZHgpO1xuICAgICAgbGV0IHkgPSBjbGFtcDAxKHN0YXJ0LnkgKyBkeSk7XG4gICAgICB4ID0gTWF0aC5taW4oeCwgMSAtIHN0YXJ0LndpZHRoKTtcbiAgICAgIHkgPSBNYXRoLm1pbih5LCAxIC0gc3RhcnQuaGVpZ2h0KTtcbiAgICAgIHJldHVybiB7IHgsIHksIHdpZHRoOiBzdGFydC53aWR0aCwgaGVpZ2h0OiBzdGFydC5oZWlnaHQgfTtcbiAgICB9XG5cbiAgICBsZXQgbGVmdCA9IHN0YXJ0Lng7XG4gICAgbGV0IHRvcCA9IHN0YXJ0Lnk7XG4gICAgbGV0IHJpZ2h0ID0gc3RhcnQueCArIHN0YXJ0LndpZHRoO1xuICAgIGxldCBib3R0b20gPSBzdGFydC55ICsgc3RhcnQuaGVpZ2h0O1xuXG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygndycpKSBsZWZ0ID0gY2xhbXAwMShzdGFydC54ICsgZHgpO1xuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ2UnKSkgcmlnaHQgPSBjbGFtcDAxKHN0YXJ0LnggKyBzdGFydC53aWR0aCArIGR4KTtcbiAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCduJykpIHRvcCA9IGNsYW1wMDEoc3RhcnQueSArIGR5KTtcbiAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCdzJykpIGJvdHRvbSA9IGNsYW1wMDEoc3RhcnQueSArIHN0YXJ0LmhlaWdodCArIGR5KTtcblxuICAgIGlmIChyaWdodCAtIGxlZnQgPCBNSU5fU0laRSkge1xuICAgICAgaWYgKGhhbmRsZS5pbmNsdWRlcygndycpKSBsZWZ0ID0gcmlnaHQgLSBNSU5fU0laRTtcbiAgICAgIGVsc2UgcmlnaHQgPSBsZWZ0ICsgTUlOX1NJWkU7XG4gICAgfVxuICAgIGlmIChib3R0b20gLSB0b3AgPCBNSU5fU0laRSkge1xuICAgICAgaWYgKGhhbmRsZS5pbmNsdWRlcygnbicpKSB0b3AgPSBib3R0b20gLSBNSU5fU0laRTtcbiAgICAgIGVsc2UgYm90dG9tID0gdG9wICsgTUlOX1NJWkU7XG4gICAgfVxuXG4gICAgbGVmdCA9IGNsYW1wMDEobGVmdCk7XG4gICAgcmlnaHQgPSBjbGFtcDAxKHJpZ2h0KTtcbiAgICB0b3AgPSBjbGFtcDAxKHRvcCk7XG4gICAgYm90dG9tID0gY2xhbXAwMShib3R0b20pO1xuXG4gICAgcmV0dXJuIHsgeDogbGVmdCwgeTogdG9wLCB3aWR0aDogcmlnaHQgLSBsZWZ0LCBoZWlnaHQ6IGJvdHRvbSAtIHRvcCB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9nZXRFdmVudFBvaW50KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgaWYgKCd0b3VjaGVzJyBpbiBldmVudCAmJiBldmVudC50b3VjaGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgeDogZXZlbnQudG91Y2hlc1swXS5jbGllbnRYLCB5OiBldmVudC50b3VjaGVzWzBdLmNsaWVudFkgfTtcbiAgICB9XG4gICAgaWYgKCdjaGFuZ2VkVG91Y2hlcycgaW4gZXZlbnQgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB4OiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLCB5OiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIH07XG4gICAgfVxuICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBldmVudCBhcyBNb3VzZUV2ZW50O1xuICAgIHJldHVybiB7IHg6IG1vdXNlRXZlbnQuY2xpZW50WCwgeTogbW91c2VFdmVudC5jbGllbnRZIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgX3VwZGF0ZUNyb3BPdmVybGF5UG9zaXRpb24oc3dpcGVyRWxlbWVudDogYW55LCByZXRyaWVzTGVmdCA9IDYwKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3QgYWN0aXZlU2xpZGUgPSBzd2lwZXI/LnNsaWRlcz8uW3N3aXBlci5hY3RpdmVJbmRleF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFhY3RpdmVTbGlkZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY29udGFpbmVyRWwgPSBhY3RpdmVTbGlkZS5xdWVyeVNlbGVjdG9yKCcuc3dpcGVyLXpvb20tY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgaW1nRWwgPSBhY3RpdmVTbGlkZS5xdWVyeVNlbGVjdG9yKCcuc3dpcGVyLXpvb20tdGFyZ2V0LCAuc3dpcGVyLXpvb20tY29udGFpbmVyID4gaW1nJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgb3ZlcmxheUVsID0gYWN0aXZlU2xpZGUucXVlcnlTZWxlY3RvcignLmNyb3Atb3ZlcmxheScpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyRWwgfHwgIWltZ0VsIHx8ICFvdmVybGF5RWwpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBpbWdSZWN0ID0gaW1nRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gVGhlIGltYWdlIG1heSBub3QgYmUgbGFpZCBvdXQgeWV0OiBrZWVwIGFueSBwcmV2aW91cyAobm9uLXplcm8pIHZhbHVlIGFuZCByZXRyeSBvbiB0aGUgbmV4dCBmcmFtZVxuICAgIGlmICghaW1nUmVjdC53aWR0aCB8fCAhaW1nUmVjdC5oZWlnaHQpIHtcbiAgICAgIGlmIChyZXRyaWVzTGVmdCA+IDApIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuX3VwZGF0ZUNyb3BPdmVybGF5UG9zaXRpb24oc3dpcGVyRWxlbWVudCwgcmV0cmllc0xlZnQgLSAxKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fY3JvcE92ZXJsYXlSZWN0O1xuICAgIH1cbiAgICBvdmVybGF5RWwuc3R5bGUubGVmdCA9IGAke2ltZ1JlY3QubGVmdCAtIGNvbnRhaW5lclJlY3QubGVmdH1weGA7XG4gICAgb3ZlcmxheUVsLnN0eWxlLnRvcCA9IGAke2ltZ1JlY3QudG9wIC0gY29udGFpbmVyUmVjdC50b3B9cHhgO1xuICAgIG92ZXJsYXlFbC5zdHlsZS53aWR0aCA9IGAke2ltZ1JlY3Qud2lkdGh9cHhgO1xuICAgIG92ZXJsYXlFbC5zdHlsZS5oZWlnaHQgPSBgJHtpbWdSZWN0LmhlaWdodH1weGA7XG4gICAgdGhpcy5fY3JvcE92ZXJsYXlSZWN0ID0geyB3aWR0aDogaW1nUmVjdC53aWR0aCwgaGVpZ2h0OiBpbWdSZWN0LmhlaWdodCB9O1xuICAgIHJldHVybiB0aGlzLl9jcm9wT3ZlcmxheVJlY3Q7XG4gIH1cblxuICAvLyAtLS0gQ2FudmFzIHJlbmRlcmluZywgdXNlZCB0byBleHBvcnQgdGhlIGNyb3BwZWQvcm90YXRlZCBpbWFnZSAtLS1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX3JlbmRlckVkaXRlZEltYWdlKGltYWdlOiBJbWFnZSwgcm90YXRpb246IG51bWJlciwgY3JvcFJlY3Q6IENyb3BSZWN0KTogUHJvbWlzZTxIVE1MQ2FudmFzRWxlbWVudD4ge1xuICAgIGNvbnN0IHNyYyA9IGltYWdlLmRhdGFVcmwgfHwgaW1hZ2UudXJsO1xuICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMuX2xvYWRJbWFnZUVsZW1lbnQoc3JjKTtcbiAgICBjb25zdCBzdyA9IGltZy5uYXR1cmFsV2lkdGg7XG4gICAgY29uc3Qgc2ggPSBpbWcubmF0dXJhbEhlaWdodDtcbiAgICBjb25zdCBzd2FwcGVkID0gcm90YXRpb24gJSAxODAgIT09IDA7XG4gICAgY29uc3QgcncgPSBzd2FwcGVkID8gc2ggOiBzdztcbiAgICBjb25zdCByaCA9IHN3YXBwZWQgPyBzdyA6IHNoO1xuXG4gICAgLy8gMSkgRHJhdyB0aGUgZnVsbCAodW5jcm9wcGVkKSBpbWFnZSwgcm90YXRlZFxuICAgIGNvbnN0IHJvdENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHJvdENhbnZhcy53aWR0aCA9IHJ3O1xuICAgIHJvdENhbnZhcy5oZWlnaHQgPSByaDtcbiAgICBjb25zdCByY3R4ID0gcm90Q2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgcmN0eC50cmFuc2xhdGUocncgLyAyLCByaCAvIDIpO1xuICAgIHJjdHgucm90YXRlKChyb3RhdGlvbiAqIE1hdGguUEkpIC8gMTgwKTtcbiAgICByY3R4LmRyYXdJbWFnZShpbWcsIC1zdyAvIDIsIC1zaCAvIDIpO1xuXG4gICAgLy8gMikgQ3JvcCB0aGUgcm90YXRlZCBpbWFnZVxuICAgIGNvbnN0IGNyb3BYID0gTWF0aC5yb3VuZChjcm9wUmVjdC54ICogcncpO1xuICAgIGNvbnN0IGNyb3BZID0gTWF0aC5yb3VuZChjcm9wUmVjdC55ICogcmgpO1xuICAgIGNvbnN0IGNyb3BXID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChjcm9wUmVjdC53aWR0aCAqIHJ3KSk7XG4gICAgY29uc3QgY3JvcEggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGNyb3BSZWN0LmhlaWdodCAqIHJoKSk7XG5cbiAgICBjb25zdCBvdXRDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBvdXRDYW52YXMud2lkdGggPSBjcm9wVztcbiAgICBvdXRDYW52YXMuaGVpZ2h0ID0gY3JvcEg7XG4gICAgb3V0Q2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHJvdENhbnZhcywgY3JvcFgsIGNyb3BZLCBjcm9wVywgY3JvcEgsIDAsIDAsIGNyb3BXLCBjcm9wSCk7XG5cbiAgICByZXR1cm4gb3V0Q2FudmFzO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9sb2FkSW1hZ2VFbGVtZW50KHNyYzogc3RyaW5nKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgaWYgKCFzcmMuc3RhcnRzV2l0aCgnZGF0YTonKSkgaW1nLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG4gICAgICBpbWcub25sb2FkID0gKCkgPT4gcmVzb2x2ZShpbWcpO1xuICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBbaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3ddIENhbm5vdCBsb2FkIGltYWdlOiAke3NyY31gKSk7XG4gICAgICBpbWcuc3JjID0gc3JjO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tIE1vdXNlLXdoZWVsIHpvb20gJiBtb3VzZS1kcmFnIHBhbiAtLS1cblxuICBwcm90ZWN0ZWQgb25Qb2ludGVyRG93bihldmVudDogTW91c2VFdmVudCwgc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZU1vdXNlWm9vbSB8fCB0aGlzLl96b29tU3RhdGUuc2NhbGUgPD0gMSkgcmV0dXJuO1xuICAgIC8vIERvbid0IGludGVyY2VwdCBjbGlja3Mgb24gYnV0dG9ucy9jb250cm9sc1xuICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCdpb24tZmFiLWJ1dHRvbiwgaW9uLWJ1dHRvbiwgYnV0dG9uJykpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuX2RyYWdTdGF0ZSA9IHtcbiAgICAgIHN0YXJ0WDogZXZlbnQuY2xpZW50WCxcbiAgICAgIHN0YXJ0WTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHN0YXJ0VHg6IHRoaXMuX3pvb21TdGF0ZS50eCxcbiAgICAgIHN0YXJ0VHk6IHRoaXMuX3pvb21TdGF0ZS50eSxcbiAgICB9O1xuICAgIGNvbnN0IHdyYXBFbCA9IHRoaXMuX2dldEFjdGl2ZVpvb21XcmFwRWwoc3dpcGVyRWxlbWVudCk7XG4gICAgaWYgKHdyYXBFbCkgd3JhcEVsLnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7XG5cbiAgICAvLyBEaXNhYmxlIFN3aXBlciBzbGlkZS1jaGFuZ2Ugd2hpbGUgZHJhZ2dpbmdcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBpZiAoc3dpcGVyKSB7XG4gICAgICBzd2lwZXIuYWxsb3dTbGlkZU5leHQgPSBmYWxzZTtcbiAgICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblBvaW50ZXJNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50LCBzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5fY3JvcERyYWdTdGF0ZSkge1xuICAgICAgdGhpcy5vbkNyb3BQb2ludGVyTW92ZShldmVudCwgc3dpcGVyRWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5fZHJhZ1N0YXRlKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLl96b29tU3RhdGUudHggPSB0aGlzLl9kcmFnU3RhdGUuc3RhcnRUeCArIGV2ZW50LmNsaWVudFggLSB0aGlzLl9kcmFnU3RhdGUuc3RhcnRYO1xuICAgIHRoaXMuX3pvb21TdGF0ZS50eSA9IHRoaXMuX2RyYWdTdGF0ZS5zdGFydFR5ICsgZXZlbnQuY2xpZW50WSAtIHRoaXMuX2RyYWdTdGF0ZS5zdGFydFk7XG4gICAgdGhpcy5fY2xhbXBUcmFuc2xhdGlvbnMoc3dpcGVyRWxlbWVudCk7XG4gICAgdGhpcy5fYXBwbHlab29tKHN3aXBlckVsZW1lbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUG9pbnRlclVwKGV2ZW50OiBNb3VzZUV2ZW50LCBzd2lwZXJFbGVtZW50PzogYW55KSB7XG4gICAgaWYgKHRoaXMuX2Nyb3BEcmFnU3RhdGUpIHtcbiAgICAgIHRoaXMub25Dcm9wUG9pbnRlclVwKGV2ZW50LCBzd2lwZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9kcmFnU3RhdGUpIHJldHVybjtcbiAgICB0aGlzLl9kcmFnU3RhdGUgPSBudWxsO1xuICAgIGNvbnN0IHdyYXBFbCA9IHRoaXMuX2dldEFjdGl2ZVpvb21XcmFwRWwoc3dpcGVyRWxlbWVudCk7XG4gICAgaWYgKHdyYXBFbCkgd3JhcEVsLnN0eWxlLmN1cnNvciA9IHRoaXMuX3pvb21TdGF0ZS5zY2FsZSA+IDEgPyAnZ3JhYicgOiAnJztcbiAgICAvLyBSZS1lbmFibGUgU3dpcGVyIG5hdmlnYXRpb25cbiAgICBjb25zdCBzd2lwZXIgPSBzd2lwZXJFbGVtZW50ID8gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCkgOiBudWxsO1xuICAgIGlmIChzd2lwZXIpIHtcbiAgICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IHRydWU7XG4gICAgICBzd2lwZXIuYWxsb3dTbGlkZVByZXYgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfcmVzZXRab29tKHN3aXBlckVsZW1lbnQ/OiBhbnkpIHtcbiAgICB0aGlzLl96b29tU3RhdGUgPSB7IHNjYWxlOiAxLCB0eDogMCwgdHk6IDAgfTtcbiAgICB0aGlzLl9kcmFnU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuX3JvdGF0aW9uID0gMDtcbiAgICB0aGlzLl9jcm9wUmVjdCA9IHsgeDogMCwgeTogMCwgd2lkdGg6IDEsIGhlaWdodDogMSB9O1xuICAgIHRoaXMuX2Nyb3BEcmFnU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuX2Nyb3BUb29sQWN0aXZlID0gZmFsc2U7XG4gICAgaWYgKHN3aXBlckVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2FwcGx5Wm9vbShzd2lwZXJFbGVtZW50KTtcbiAgICAgIHRoaXMuX3VwZGF0ZUVkaXRJbWFnZVNpemUoc3dpcGVyRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9zZXR1cFdoZWVsWm9vbShzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLl9jbGVhbnVwV2hlZWxab29tKCk7XG4gICAgaWYgKCF0aGlzLmVuYWJsZU1vdXNlWm9vbSkgcmV0dXJuO1xuICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCA9IHN3aXBlckVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQgPz8gc3dpcGVyRWxlbWVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICB0aGlzLl93aGVlbExpc3RlbmVyID0gKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3Qgc3RlcCA9IHRoaXMud2hlZWxab29tU3RlcDtcbiAgICAgIGNvbnN0IG9sZFNjYWxlID0gdGhpcy5fem9vbVN0YXRlLnNjYWxlO1xuICAgICAgY29uc3QgbmV3U2NhbGUgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihvbGRTY2FsZSArIChldmVudC5kZWx0YVkgPCAwID8gc3RlcCA6IC1zdGVwKSwgdGhpcy5tYXhab29tUmF0aW8pKTtcbiAgICAgIGlmIChuZXdTY2FsZSA9PT0gb2xkU2NhbGUpIHJldHVybjtcblxuICAgICAgaWYgKG5ld1NjYWxlID09PSAxKSB7XG4gICAgICAgIHRoaXMuX3pvb21TdGF0ZSA9IHsgc2NhbGU6IDEsIHR4OiAwLCB0eTogMCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gWm9vbSB0b3dhcmRzIGN1cnNvciBwb3NpdGlvblxuICAgICAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihlbCk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVNsaWRlID0gc3dpcGVyPy5zbGlkZXM/Lltzd2lwZXIuYWN0aXZlSW5kZXhdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoYWN0aXZlU2xpZGUpIHtcbiAgICAgICAgICBjb25zdCByZWN0ID0gYWN0aXZlU2xpZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgY29uc3QgY3ggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gcmVjdC53aWR0aCAvIDI7XG4gICAgICAgICAgY29uc3QgY3kgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSByZWN0LmhlaWdodCAvIDI7XG4gICAgICAgICAgdGhpcy5fem9vbVN0YXRlLnR4ID0gY3ggLSAoKGN4IC0gdGhpcy5fem9vbVN0YXRlLnR4KSAqIG5ld1NjYWxlKSAvIG9sZFNjYWxlO1xuICAgICAgICAgIHRoaXMuX3pvb21TdGF0ZS50eSA9IGN5IC0gKChjeSAtIHRoaXMuX3pvb21TdGF0ZS50eSkgKiBuZXdTY2FsZSkgLyBvbGRTY2FsZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl96b29tU3RhdGUuc2NhbGUgPSBuZXdTY2FsZTtcbiAgICAgICAgdGhpcy5fY2xhbXBUcmFuc2xhdGlvbnMoZWwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYXBwbHlab29tKGVsKTtcbiAgICB9O1xuXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLl93aGVlbExpc3RlbmVyLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIHRoaXMuX3doZWVsRWwgPSBlbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2xlYW51cFdoZWVsWm9vbSgpIHtcbiAgICBpZiAodGhpcy5fd2hlZWxFbCAmJiB0aGlzLl93aGVlbExpc3RlbmVyKSB7XG4gICAgICB0aGlzLl93aGVlbEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5fd2hlZWxMaXN0ZW5lcik7XG4gICAgfVxuICAgIHRoaXMuX3doZWVsRWwgPSBudWxsO1xuICAgIHRoaXMuX3doZWVsTGlzdGVuZXIgPSBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hcHBseVpvb20oc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3QgYWN0aXZlU2xpZGUgPSBzd2lwZXI/LnNsaWRlcz8uW3N3aXBlci5hY3RpdmVJbmRleF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFhY3RpdmVTbGlkZSkgcmV0dXJuO1xuICAgIGNvbnN0IHdyYXBFbCA9IGFjdGl2ZVNsaWRlLnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItem9vbS1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBpbWdFbCA9IGFjdGl2ZVNsaWRlLnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItem9vbS10YXJnZXQsIC5zd2lwZXItem9vbS1jb250YWluZXIgPiBpbWcnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIXdyYXBFbCB8fCAhaW1nRWwpIHJldHVybjtcbiAgICBjb25zdCB7IHNjYWxlLCB0eCwgdHkgfSA9IHRoaXMuX3pvb21TdGF0ZTtcbiAgICB3cmFwRWwuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBtcyc7XG4gICAgd3JhcEVsLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3R4fXB4LCAke3R5fXB4LCAwKWA7XG4gICAgaW1nRWwuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBtcyc7XG4gICAgaW1nRWwuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKDAsIDAsIDApIHNjYWxlKCR7c2NhbGV9KSByb3RhdGUoJHt0aGlzLl9yb3RhdGlvbn1kZWcpYDtcbiAgICB3cmFwRWwuc3R5bGUuY3Vyc29yID0gc2NhbGUgPiAxID8gJ2dyYWInIDogJyc7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2NsYW1wVHJhbnNsYXRpb25zKHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IGFjdGl2ZVNsaWRlID0gc3dpcGVyPy5zbGlkZXM/Lltzd2lwZXIuYWN0aXZlSW5kZXhdIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghYWN0aXZlU2xpZGUpIHJldHVybjtcbiAgICBjb25zdCBpbWdFbCA9IGFjdGl2ZVNsaWRlLnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItem9vbS10YXJnZXQsIC5zd2lwZXItem9vbS1jb250YWluZXIgPiBpbWcnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWltZ0VsKSByZXR1cm47XG4gICAgY29uc3QgaW1nVyA9IGltZ0VsLm9mZnNldFdpZHRoIHx8IGltZ0VsLmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGltZ0ggPSBpbWdFbC5vZmZzZXRIZWlnaHQgfHwgaW1nRWwuY2xpZW50SGVpZ2h0O1xuICAgIGlmICghaW1nVyB8fCAhaW1nSCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc2NhbGUgfSA9IHRoaXMuX3pvb21TdGF0ZTtcbiAgICBjb25zdCBtYXhUeCA9IE1hdGgubWF4KDAsIChpbWdXICogc2NhbGUgLSBhY3RpdmVTbGlkZS5vZmZzZXRXaWR0aCkgLyAyKTtcbiAgICBjb25zdCBtYXhUeSA9IE1hdGgubWF4KDAsIChpbWdIICogc2NhbGUgLSBhY3RpdmVTbGlkZS5vZmZzZXRIZWlnaHQpIC8gMik7XG4gICAgdGhpcy5fem9vbVN0YXRlLnR4ID0gTWF0aC5tYXgoLW1heFR4LCBNYXRoLm1pbihtYXhUeCwgdGhpcy5fem9vbVN0YXRlLnR4KSk7XG4gICAgdGhpcy5fem9vbVN0YXRlLnR5ID0gTWF0aC5tYXgoLW1heFR5LCBNYXRoLm1pbihtYXhUeSwgdGhpcy5fem9vbVN0YXRlLnR5KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2dldEFjdGl2ZVpvb21XcmFwRWwoc3dpcGVyRWxlbWVudDogYW55KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBhY3RpdmVTbGlkZSA9IHN3aXBlcj8uc2xpZGVzPy5bc3dpcGVyLmFjdGl2ZUluZGV4XSBhcyBIVE1MRWxlbWVudDtcbiAgICByZXR1cm4gYWN0aXZlU2xpZGU/LnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItem9vbS1jb250YWluZXInKSA/PyBudWxsO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8aW9uLWNvbnRlbnRcbiAgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBpb24tbm8tbWFyZ2luXCJcbiAgKG1vdXNlZG93bik9XCJvblBvaW50ZXJEb3duKCRldmVudCwgc2xpZGVzaG93U3dpcGVyKVwiXG4gIChtb3VzZW1vdmUpPVwib25Qb2ludGVyTW92ZSgkZXZlbnQsIHNsaWRlc2hvd1N3aXBlcilcIlxuICAobW91c2V1cCk9XCJvblBvaW50ZXJVcCgkZXZlbnQsIHNsaWRlc2hvd1N3aXBlcilcIlxuICAobW91c2VsZWF2ZSk9XCJvblBvaW50ZXJVcCgkZXZlbnQsIHNsaWRlc2hvd1N3aXBlcilcIlxuICAodG91Y2htb3ZlKT1cIm9uQ3JvcFBvaW50ZXJNb3ZlKCRldmVudCwgc2xpZGVzaG93U3dpcGVyKVwiXG4gICh0b3VjaGVuZCk9XCJvbkNyb3BQb2ludGVyVXAoJGV2ZW50LCBzbGlkZXNob3dTd2lwZXIpXCJcbiAgKHRvdWNoY2FuY2VsKT1cIm9uQ3JvcFBvaW50ZXJVcCgkZXZlbnQsIHNsaWRlc2hvd1N3aXBlcilcIlxuPlxuICBAbGV0IGNvdW50ID0gcm93cz8ubGVuZ3RoIHx8IDA7XG4gIDwhLS0gQ291bnRlciAgLS0+XG4gIDxkaXYgY2xhc3M9XCJ0b3AtbGVmdFwiPlxuICAgIDxpb24tbGFiZWwgY29sb3I9XCJsaWdodFwiPnt7IGFjdGl2ZVNsaWRlSW5kZXggKyAxIH19IC8ge3sgY291bnQgfX08L2lvbi1sYWJlbD5cbiAgPC9kaXY+XG5cbiAgPCEtLSB6b29tIC8gcm90YXRpb24gLyBjcm9wIGJ1dHRvbnM6IGFsbCBzaG93biB0b2dldGhlciwgbm8gXCJlbnRlciBlZGl0IG1vZGVcIiBzdGVwIG5lZWRlZCAtLT5cbiAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgIEBpZiAoIW1vYmlsZSkge1xuICAgICAgPGlvbi1mYWItYnV0dG9uIHNpemU9XCJzbWFsbFwiIChjbGljayk9XCJ6b29tKHNsaWRlc2hvd1N3aXBlciwgdHJ1ZSlcIiBjb2xvcj1cImxpZ2h0XCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwic2VhcmNoXCI+PC9pb24taWNvbj5cbiAgICAgICAgPGlvbi1pY29uIGNsYXNzPVwiaWNvbi1zZWNvbmRhcnlcIiBuYW1lPVwiYWRkXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWZhYi1idXR0b24+XG4gICAgICA8aW9uLWZhYi1idXR0b24gc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cInpvb20oc2xpZGVzaG93U3dpcGVyLCBmYWxzZSlcIiBjb2xvcj1cImxpZ2h0XCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwic2VhcmNoXCI+PC9pb24taWNvbj5cbiAgICAgICAgPGlvbi1pY29uIGNsYXNzPVwiaWNvbi1zZWNvbmRhcnlcIiBuYW1lPVwicmVtb3ZlXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWZhYi1idXR0b24+XG4gICAgfVxuICAgIEBpZiAoIXJlYWRPbmx5ICYmIGVuYWJsZVJvdGF0ZSkge1xuICAgICAgPGlvbi1mYWItYnV0dG9uXG4gICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgIChjbGljayk9XCJyb3RhdGUoc2xpZGVzaG93U3dpcGVyLCAnbGVmdCcpXCJcbiAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0lNQUdFLkdBTExFUlkuQlROX1JPVEFURV9MRUZUJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdJTUFHRS5HQUxMRVJZLkJUTl9ST1RBVEVfTEVGVCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+cm90YXRlX2xlZnQ8L21hdC1pY29uPlxuICAgICAgPC9pb24tZmFiLWJ1dHRvbj5cbiAgICAgIDxpb24tZmFiLWJ1dHRvblxuICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAoY2xpY2spPVwicm90YXRlKHNsaWRlc2hvd1N3aXBlciwgJ3JpZ2h0JylcIlxuICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICgnSU1BR0UuR0FMTEVSWS5CVE5fUk9UQVRFX1JJR0hUJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdJTUFHRS5HQUxMRVJZLkJUTl9ST1RBVEVfUklHSFQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPnJvdGF0ZV9yaWdodDwvbWF0LWljb24+XG4gICAgICA8L2lvbi1mYWItYnV0dG9uPlxuICAgIH1cbiAgICBAaWYgKCFyZWFkT25seSAmJiBlbmFibGVDcm9wKSB7XG4gICAgICA8aW9uLWZhYi1idXR0b25cbiAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNyb3BUb29sKHNsaWRlc2hvd1N3aXBlcilcIlxuICAgICAgICBbY29sb3JdPVwiX2Nyb3BUb29sQWN0aXZlID8gJ3RlcnRpYXJ5JyA6ICdsaWdodCdcIlxuICAgICAgICBbdGl0bGVdPVwiXG4gICAgICAgICAgIXNob3dUb29sdGlwXG4gICAgICAgICAgICA/ICgoX2Nyb3BUb29sQWN0aXZlID8gJ0lNQUdFLkdBTExFUlkuQlROX0NST1BfREVBQ1RJVkFURScgOiAnSU1BR0UuR0FMTEVSWS5CVE5fQ1JPUF9BQ1RJVkFURScpIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgOiAnJ1xuICAgICAgICBcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJcbiAgICAgICAgICBzaG93VG9vbHRpcFxuICAgICAgICAgICAgPyAoKF9jcm9wVG9vbEFjdGl2ZSA/ICdJTUFHRS5HQUxMRVJZLkJUTl9DUk9QX0RFQUNUSVZBVEUnIDogJ0lNQUdFLkdBTExFUlkuQlROX0NST1BfQUNUSVZBVEUnKSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgIDogJydcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmNyb3A8L21hdC1pY29uPlxuICAgICAgPC9pb24tZmFiLWJ1dHRvbj5cbiAgICAgIEBpZiAoX2Nyb3BUb29sQWN0aXZlKSB7XG4gICAgICAgIDxpb24tZmFiLWJ1dHRvblxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlc2V0Q3JvcChzbGlkZXNob3dTd2lwZXIpXCJcbiAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdJTUFHRS5HQUxMRVJZLkJUTl9DUk9QX1JFU0VUJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0lNQUdFLkdBTExFUlkuQlROX0NST1BfUkVTRVQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5jcm9wX2ZyZWU8L21hdC1pY29uPlxuICAgICAgICA8L2lvbi1mYWItYnV0dG9uPlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPCEtLSBuYXZpZ2F0aW9uIHNpZGUgYnV0dG9ucyBuZXh0L2JhY2s6IGhpZGRlbiB3aGlsZSBhIGNyb3Avcm90YXRpb24gZWRpdCBpcyBwZW5kaW5nLCB0byBrZWVwIHRoZSBmb2N1cyBvbiB2YWxpZGF0aW5nL2NhbmNlbGxpbmcgaXQgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbW9iaWxlICYmICFoYXNQZW5kaW5nRWRpdCAmJiAocm93cyB8IGlzQXJyYXlMZW5ndGg6IHsgZ3JlYXRlclRoYW46IDEgfSlcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2lkZS1idXR0b25zIHByZXZcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNQcmV2RGlzYWJsZWRcIiAoY2xpY2spPVwic2xpZGVQcmV2KHNsaWRlc2hvd1N3aXBlcilcIj5cbiAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hldnJvbi1iYWNrXCI+PC9pb24taWNvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2lkZS1idXR0b25zIG5leHRcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNOZXh0RGlzYWJsZWRcIiAoY2xpY2spPVwic2xpZGVOZXh0KHNsaWRlc2hvd1N3aXBlcilcIj5cbiAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hldnJvbi1mb3J3YXJkXCI+PC9pb24taWNvbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBpbWFnZSBzbGlkZXMgLS0+XG4gIDxzd2lwZXItY29udGFpbmVyXG4gICAgI3NsaWRlc2hvd1N3aXBlclxuICAgIFttb2R1bGVzXT1cInN3aXBlck1vZHVsZXNcIlxuICAgIFt6b29tXT1cIiFlbmFibGVNb3VzZVpvb21cIlxuICAgIFtpbml0aWFsU2xpZGVdPVwic2VsZWN0ZWRJbmRleFwiXG4gICAgKHN3aXBlcnNsaWRlY2hhbmdlKT1cIm9uU2xpZGVDaGFuZ2Uoc2xpZGVzaG93U3dpcGVyKVwiXG4gICAgKHN3aXBlcmluaXQpPVwib25Td2lwZXJJbml0KHNsaWRlc2hvd1N3aXBlcilcIlxuICA+XG4gICAgQGZvciAocm93IG9mIHJvd3M7IHRyYWNrIHJvdy5pZDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgIDxzd2lwZXItc2xpZGU+XG4gICAgICAgIEBsZXQgaW1hZ2UgPSByb3cgfCBwcm9wZXJ0eUdldDogJ2N1cnJlbnREYXRhJztcbiAgICAgICAgPGRpdiBjbGFzcz1cInN3aXBlci16b29tLWNvbnRhaW5lclwiPlxuICAgICAgICAgIEBpZiAoaW1hZ2UudXJsKSB7XG4gICAgICAgICAgICA8aW9uLWltZyBjbGFzcz1cInN3aXBlci16b29tLXRhcmdldFwiIFtzcmNdPVwiaW1hZ2UudXJsIHwgYXBwZW5kUXVlcnlQYXJhbXM6IGdldEltYWdlU2l6ZVF1ZXJ5UGFyYW1zKClcIiAvPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlLmRhdGFVcmxcIiBbYWx0XT1cImltYWdlLnRpdGxlXCIgLz5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIGNyb3Agb3ZlcmxheTogb25seSByZW5kZXJlZCBmb3IgdGhlIGFjdGl2ZSBzbGlkZSAtLT5cbiAgICAgICAgICBAaWYgKCFyZWFkT25seSAmJiBlbmFibGVDcm9wICYmIF9jcm9wVG9vbEFjdGl2ZSAmJiBpID09PSBhY3RpdmVTbGlkZUluZGV4KSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiY3JvcC1vdmVybGF5XCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkNyb3BQb2ludGVyRG93bigkZXZlbnQsIHNsaWRlc2hvd1N3aXBlciwgJ21vdmUnKVwiXG4gICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cIm9uQ3JvcFBvaW50ZXJEb3duKCRldmVudCwgc2xpZGVzaG93U3dpcGVyLCAnbW92ZScpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPCEtLSBkYXJrZW5lZCBtYXNrIGFyb3VuZCB0aGUgc2VsZWN0aW9uOiBjbGlwcGVkIHRvIHRoZSBpbWFnZSBib3VuZHMgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcm9wLW1hc2tcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNyb3AtbWFzay1yZWN0XCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwiX2Nyb3BSZWN0LnggKiAxMDBcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcC4lXT1cIl9jcm9wUmVjdC55ICogMTAwXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cIl9jcm9wUmVjdC53aWR0aCAqIDEwMFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LiVdPVwiX2Nyb3BSZWN0LmhlaWdodCAqIDEwMFwiXG4gICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIGludGVyYWN0aXZlIHNlbGVjdGlvbiBib3JkZXIsIGdyaWQgJiBkcmFnIGhhbmRsZXM6IG5ldmVyIGNsaXBwZWQsIHNvIGNvcm5lci9lZGdlIGhhbmRsZXNcbiAgICAgICAgICAgICAgICAgICByZW1haW4gZnVsbHkgZ3JhYmJhYmxlIGV2ZW4gd2hlbiB0aGUgc2VsZWN0aW9uIHRvdWNoZXMgdGhlIGltYWdlIGJvdW5kcyAtLT5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3JvcC1yZWN0XCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cIl9jcm9wUmVjdC54ICogMTAwXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUudG9wLiVdPVwiX2Nyb3BSZWN0LnkgKiAxMDBcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cIl9jcm9wUmVjdC53aWR0aCAqIDEwMFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC4lXT1cIl9jcm9wUmVjdC5oZWlnaHQgKiAxMDBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNyb3AtZ3JpZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaW5lIHZcIiBzdHlsZT1cImxlZnQ6IDMzLjMzMyVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpbmUgdlwiIHN0eWxlPVwibGVmdDogNjYuNjY2JVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGluZSBoXCIgc3R5bGU9XCJ0b3A6IDMzLjMzMyVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpbmUgaFwiIHN0eWxlPVwidG9wOiA2Ni42NjYlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBmb3IgKGhhbmRsZSBvZiBfY3JvcEhhbmRsZXM7IHRyYWNrIGhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNyb3AtaGFuZGxlIHt7IGhhbmRsZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Dcm9wUG9pbnRlckRvd24oJGV2ZW50LCBzbGlkZXNob3dTd2lwZXIsIGhhbmRsZSlcIlxuICAgICAgICAgICAgICAgICAgICAodG91Y2hzdGFydCk9XCJvbkNyb3BQb2ludGVyRG93bigkZXZlbnQsIHNsaWRlc2hvd1N3aXBlciwgaGFuZGxlKVwiXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3N3aXBlci1zbGlkZT5cbiAgICB9XG4gIDwvc3dpcGVyLWNvbnRhaW5lcj5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxpb24tZm9vdGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJsaWdodFwiPlxuICAgIEBpZiAoIWhhc1BlbmRpbmdFZGl0KSB7XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjRcIiBjbGFzcz1cImlvbi10ZXh0LXN0YXJ0XCI+XG4gICAgICAgICAgQGlmICghcmVhZE9ubHkpIHtcbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZXF1ZXN0RGVsZXRlKHNsaWRlc2hvd1N3aXBlcilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzbG90PVwic3RhcnRcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9ERUxFVEUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCI0XCI+PC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiNFwiIGNsYXNzPVwiaW9uLXRleHQtZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cImNsb3NlUmVxdWVzdGVkLmVtaXQoKVwiIGNvbG9yPVwidGVydGlhcnlcIiBmaWxsPVwiY2xlYXJcIiAqbmdJZj1cIm1vYmlsZTsgZWxzZSBkZXNrdG9wXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImNsb3NlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIHt7ICdDT01NT04uQlROX0NMT1NFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rlc2t0b3A+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2VSZXF1ZXN0ZWQuZW1pdCgpXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiPlxuICAgICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9DTE9TRScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8IS0tIEEgY3JvcCBvciByb3RhdGlvbiBjaGFuZ2UgaXMgcGVuZGluZzogYXNrIGZvciBhbiBleHBsaWNpdCB2YWxpZGF0aW9uIGJlZm9yZSBleHBvcnRpbmcgdGhlIGltYWdlIC0tPlxuICAgICAgPGlvbi1yb3c+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiIGNsYXNzPVwiaW9uLXRleHQtZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJkaXNjYXJkRWRpdChzbGlkZXNob3dTd2lwZXIpXCJcbiAgICAgICAgICAgIGNvbG9yPVwiZGFya1wiXG4gICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICgnSU1BR0UuR0FMTEVSWS5CVE5fQ0FOQ0VMX0VESVQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdJTUFHRS5HQUxMRVJZLkJUTl9DQU5DRUxfRURJVCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYXJyb3ctdW5kb1wiPjwvaW9uLWljb24+XG4gICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9DQU5DRUwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJ2YWxpZGF0ZUVkaXQoc2xpZGVzaG93U3dpcGVyKVwiIGNvbG9yPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImNoZWNrbWFya1wiPjwvaW9uLWljb24+XG4gICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9WQUxJREFURScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICB9XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1mb290ZXI+XG4iXX0=
799
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9zbGlkZXNob3cvaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9zbGlkZXNob3cvaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxPQUFPLEVBQUMsT0FBTyxFQUFpQixNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7QUFZN0Q7Ozs7R0FJRztBQU9ILE1BQU0sT0FBTyxpQ0FBaUM7SUFtRmhDO0lBQ0E7SUFDQTtJQXBGRixPQUFPLENBQVM7SUFDaEIsYUFBYSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUIsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBRS9CLG9DQUFvQztJQUMxQixVQUFVLEdBQUcsRUFBRSxLQUFLLEVB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cEMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUFFLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFeEUsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsSUFBSSxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUM7O2dCQUM3QyxLQUFLLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsR0FBRyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7O2dCQUM3QyxNQUFNLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFD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QUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxRQUFRO3NCQUEvQyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLEtBQUs7c0JBQTVDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsZUFBZTtzQkFBdEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0IsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNrQyxZQUFZO3NCQUFuRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFVBQVU7c0JBQWpELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFFa0MsVUFBVTtzQkFBakQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFRSxZQUFZO3NCQUFuRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUc1QixlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsU0FBUztzQkFBbEIsTUFBTTtnQkFLRyxTQUFTO3NCQUFsQixNQUFNO2dCQUV1QixTQUFTO3NCQUF0QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFrU2xCLGNBQWM7c0JBRHZCLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJsZUVsZW1lbnQgfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUnO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyLCBJb25pY1NsaWRlcyB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFN3aXBlciB9IGZyb20gJ3N3aXBlci90eXBlcyc7XG5pbXBvcnQgeyBJbWFnZSwgSW1hZ2VTaXplIH0gZnJvbSAnLi4vLi4vaW1hZ2UubW9kZWwnO1xuaW1wb3J0IHsgaXNOaWxPckJsYW5rIH0gZnJvbSAnLi4vLi4vLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXIsIGVtaXRQcm9taXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ldmVudHMnO1xuaW1wb3J0IHsgQWxlcnRzIH0gZnJvbSAnLi4vLi4vLi4vYWxlcnRzJztcbmltcG9ydCB7IEFQUF9TSE9XX1RPT0xUSVAgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHtJbWFnZUVkaXRFdmVudCwgSW1hZ2VFZGl0Rm9ybWF0LCBJbWFnZUdhbGxlcnlTbGlkZUNoYW5nZUV2ZW50fSBmcm9tICcuLi9pbWFnZS1nYWxsZXJ5Lm1vZGVsJztcbmltcG9ydCB7d2FpdEZvciwgV2FpdEZvck9wdGlvbnN9IGZyb20gJy4uLy4uLy4uL29ic2VydmFibGVzJztcbmltcG9ydCB7ZmFkZUluQW5pbWF0aW9uLCBmYWRlSW5TbG93QW5pbWF0aW9ufSBmcm9tICcuLi8uLi8uLi9tYXRlcmlhbC9tYXRlcmlhbC5hbmltYXRpb25zJztcblxuaW50ZXJmYWNlIENyb3BSZWN0IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG50eXBlIENyb3BIYW5kbGUgPSAnbW92ZScgfCAnbncnIHwgJ24nIHwgJ25lJyB8ICdlJyB8ICdzZScgfCAncycgfCAnc3cnIHwgJ3cnO1xuXG4vKipcbiAqIFRoZSB6b29tL3Bhbi9yb3RhdGUvY3JvcCBzbGlkZXNob3cgc2hvd24gd2hlbiBjbGlja2luZyBhbiBpbWFnZSBpbiBgQXBwSW1hZ2VHYWxsZXJ5Q29tcG9uZW50YC5cbiAqIEV4dHJhY3RlZCBpbnRvIGl0cyBvd24gY29tcG9uZW50IHNvIHRoZSBleGFjdCBzYW1lIHNsaWRlc2hvdyBjYW4gYmUgcHJlc2VudGVkIGVpdGhlciBpbnNpZGUgYW5cbiAqIGBpb24tbW9kYWxgIChkZWZhdWx0KSwgb3IgaW5saW5lIGFzIGFuIG92ZXJsYXkgZGlyZWN0bHkgd2l0aGluIHRoZSBnYWxsZXJ5LCB3aXRob3V0IGFueSBkdXBsaWNhdGlvbi5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWltYWdlLWdhbGxlcnktc2xpZGVzaG93JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLWdhbGxlcnktc2xpZGVzaG93LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQXBwSW1hZ2VHYWxsZXJ5U2xpZGVzaG93Q29tcG9uZW50PFQgZXh0ZW5kcyBJbWFnZSA9IEltYWdlPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBfc3dpcGVyOiBTd2lwZXI7XG4gIHByb3RlY3RlZCBzd2lwZXJNb2R1bGVzID0gW0lvbmljU2xpZGVzXTtcbiAgcHJvdGVjdGVkIGFjdGl2ZVNsaWRlSW5kZXggPSAwO1xuXG4gIC8vIE1vdXNlIHdoZWVsIHpvb20gJiByb3RhdGlvbiBzdGF0ZVxuICBwcm90ZWN0ZWQgX3pvb21TdGF0ZSA9IHsgc2NhbGU6IDEsIHR4OiAwLCB0eTogMCB9O1xuICBwcm90ZWN0ZWQgX3JvdGF0aW9uID0gMDsgLy8gZGVncmVlczogMCwgOTAsIDE4MCwgMjcwXG4gIHByb3RlY3RlZCBfZHJhZ1N0YXRlOiB7IHN0YXJ0WDogbnVtYmVyOyBzdGFydFk6IG51bWJlcjsgc3RhcnRUeDogbnVtYmVyOyBzdGFydFR5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgX3doZWVsTGlzdGVuZXI6ICgoZTogV2hlZWxFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIF93aGVlbEVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8vIENyb3AgJiByb3RhdGUgc3RhdGUuIFJvdGF0aW9uIGlzIGFsd2F5cyBhdmFpbGFibGU7IHRoZSBjcm9wIGdyaWQvaGFuZGxlcyBvbmx5IHNob3cgb25jZSB0aGVcbiAgLy8gY3JvcCB0b29sIGhhcyBiZWVuIGV4cGxpY2l0bHkgYWN0aXZhdGVkIChmYWIgYnV0dG9uKS4gVmFsaWRhdGUvY2FuY2VsIHNob3cgdXAgb25jZSBzb21ldGhpbmcgY2hhbmdlZC5cbiAgLy8gSW5zZXQgYXBwbGllZCB0byB0aGUgY3JvcCBzZWxlY3Rpb24gYXMgc29vbiBhcyB0aGUgdG9vbCBpcyBhY3RpdmF0ZWQgKG9yIHJlc2V0KSwgc28gdGhlIHJlc2l6ZVxuICAvLyBoYW5kbGVzIHN0YXJ0IGF3YXkgZnJvbSB0aGUgaW1hZ2UgZWRnZXMsIHdoZXJlIHRoZXkgYXJlIGhhcmQgdG8gZ3JhYi5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kZWZhdWx0Q3JvcEluc2V0ID0gMC4xNTtcbiAgcHJvdGVjdGVkIF9jcm9wVG9vbEFjdGl2ZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2Nyb3BSZWN0OiBDcm9wUmVjdCA9IHsgeDogMCwgeTogMCwgd2lkdGg6IDEsIGhlaWdodDogMSB9O1xuICBwcm90ZWN0ZWQgX2Nyb3BPdmVybGF5UmVjdDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBfY3JvcERyYWdTdGF0ZTogeyBoYW5kbGU6IENyb3BIYW5kbGU7IHN0YXJ0WDogbnVtYmVyOyBzdGFydFk6IG51bWJlcjsgc3RhcnRSZWN0OiBDcm9wUmVjdCB9IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY3JvcEhhbmRsZXM6IENyb3BIYW5kbGVbXSA9IFsnbncnLCAnbicsICduZScsICdlJywgJ3NlJywgJ3MnLCAnc3cnLCAndyddO1xuXG4gIC8vIFNldCBieSBzbGlkZVByZXYoKS9zbGlkZU5leHQoKSBqdXN0IGJlZm9yZSBhc2tpbmcgU3dpcGVyIHRvIG1vdmUsIHNvIG9uU2xpZGVDaGFuZ2UoKSBjYW4gdGVsbCBhcGFydFxuICAvLyBhIFwic3RlcFwiIGZyb20gYSBcIndyYXBcIiB1bmFtYmlndW91c2x5ICh3aXRoIGV4YWN0bHkgMiBzbGlkZXMsIGJvdGggcHJvZHVjZSB0aGUgdmVyeSBzYW1lIGluZGV4IGNoYW5nZSkuXG4gIHByb3RlY3RlZCBfcGVuZGluZ1NsaWRlRGlyZWN0aW9uOiAncHJldicgfCAnbmV4dCcgfCBudWxsID0gbnVsbDtcblxuXG4gIEBJbnB1dCgpIHJvd3M6IFRhYmxlRWxlbWVudDxUPltdIHwgUmVhZG9ubHlBcnJheTxUYWJsZUVsZW1lbnQ8VD4+ID0gW107XG4gIEBJbnB1dCgpIHNlbGVjdGVkSW5kZXggPSAwO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBtb2JpbGUgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlYWRPbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZGVidWcgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZU1vdXNlWm9vbSA9IGZhbHNlO1xuICBASW5wdXQoKSB3aGVlbFpvb21TdGVwID0gMC4zO1xuICBASW5wdXQoKSBtYXhab29tUmF0aW8gPSAzO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZW5hYmxlUm90YXRlID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZUNyb3AgPSB0cnVlO1xuICBASW5wdXQoKSBlZGl0aW9uRm9ybWF0OiBJbWFnZUVkaXRGb3JtYXQgPSAncG5nJztcbiAgQElucHV0KCkgZWRpdGlvblF1YWxpdHkgPSAwLjkyO1xuICBASW5wdXQoKSBpbWFnZVNpemVRdWVyeVBhcmFtID0gJ3NpemUnO1xuICBASW5wdXQoKSBtb2RhbEltYWdlU2l6ZTogSW1hZ2VTaXplIHwgc3RyaW5nO1xuICAvKiogV2hldGhlciByZWFjaGluZyB0aGUgbGFzdCAocmVzcC4gZmlyc3QpIHNsaWRlIHNob3VsZCB3cmFwIGFyb3VuZCB0byB0aGUgZmlyc3QgKHJlc3AuIGxhc3QpIG9uZS4gRGVmYXVsdCB0cnVlLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZW5hYmxlTG9vcCA9IHRydWU7XG4gIC8qKiBXaGV0aGVyIG1vcmUgcm93cyBtYXkgZXhpc3QgYmV5b25kIHRoZSBvbmVzIGN1cnJlbnRseSBsb2FkZWQgKGUuZy4gYSBmdXJ0aGVyIHBhZ2UsIG5vdCB5ZXQgZmV0Y2hlZCkuIFdoZW4gdHJ1ZSwgcmVhY2hpbmcgdGhlIGxhc3Qgc2xpZGUgYXNrcyB0aGUgcGFyZW50ICh2aWEgYGZldGNoTW9yZWApIGluc3RlYWQgb2YgbG9vcGluZy9zdG9wcGluZy4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNhbkZldGNoTW9yZSA9IGZhbHNlO1xuXG4gIC8qKiBSZXF1ZXN0cyBkZWxldGlvbiBvZiB0aGUgZ2l2ZW4gcm93LiBUaGUgY2FsbGVyIChnYWxsZXJ5KSBvd25zIHRoZSBjb25maXJtYXRpb24vZGVsZXRpb24gbG9naWMgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggd2hldGhlciBpdCBhY3R1YWxseSBoYXBwZW5lZC4gKi9cbiAgQE91dHB1dCgpIGRlbGV0ZVJlcXVlc3RlZCA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwgeyByb3c6IFRhYmxlRWxlbWVudDxUPiB9PigpO1xuICBAT3V0cHV0KCkgY2xvc2VSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBhZnRlckVkaXRJbWFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VFZGl0RXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBhZnRlckVkaXRSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPj4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbmV2ZXIgdGhlIGFjdGl2ZSBzbGlkZSBtb3ZlcyBiYWNrd2FyZCAocHJldmlvdXMgaW1hZ2UpLCB3aGV0aGVyIHRyaWdnZXJlZCBieSB0aGUgc2lkZSBidXR0b24sIGEgc3dpcGUsIG9yIGxvb3BpbmcgcGFzdCB0aGUgZmlyc3Qgc2xpZGUuICovXG4gIEBPdXRwdXQoKSBwcmV2aW91c1NsaWRlID0gbmV3IEV2ZW50RW1pdHRlcjxJbWFnZUdhbGxlcnlTbGlkZUNoYW5nZUV2ZW50PFQ+PigpO1xuICAvKiogRW1pdHRlZCB3aGVuZXZlciB0aGUgYWN0aXZlIHNsaWRlIG1vdmVzIGZvcndhcmQgKG5leHQgaW1hZ2UpLCB3aGV0aGVyIHRyaWdnZXJlZCBieSB0aGUgc2lkZSBidXR0b24sIGEgc3dpcGUsIG9yIGxvb3BpbmcgcGFzdCB0aGUgbGFzdCBzbGlkZS4gKi9cbiAgQE91dHB1dCgpIG5leHRTbGlkZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VHYWxsZXJ5U2xpZGVDaGFuZ2VFdmVudDxUPj4oKTtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiByZWFjaGluZyB0aGUgbGFzdCBzbGlkZSB3aGlsZSBgY2FuRmV0Y2hNb3JlYCBpcyB0cnVlOiB0aGUgcGFyZW50IGlzIGV4cGVjdGVkIHRvIGZldGNoXG4gICAqIHRoZSBuZXh0IHBhZ2UgKGhvd2V2ZXIgaXQgZG9lcyBzbykgYW5kIHJlc29sdmUgd2l0aCB3aGV0aGVyIG5ldyByb3dzIHdlcmUgYWN0dWFsbHkgYWRkZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgZmV0Y2hNb3JlID0gY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlcjxib29sZWFuLCB2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3N3aXBlckNvbnRhaW5lcicpIHN3aXBlclJlZjogRWxlbWVudFJlZjtcblxuICBzaG93VG9vbHRpcCA9IGluamVjdChBUFBfU0hPV19UT09MVElQLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHByb3RlY3RlZCBnZXQgaGFzUGVuZGluZ0VkaXQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgciA9IHRoaXMuX2Nyb3BSZWN0O1xuICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbiAhPT0gMCB8fCByLnggIT09IDAgfHwgci55ICE9PSAwIHx8IHIud2lkdGggIT09IDEgfHwgci5oZWlnaHQgIT09IDE7XG4gIH1cblxuICAvKiogTm8gXCJmZXRjaCBwcmV2aW91cyBwYWdlXCIgY29uY2VwdCBleGlzdHM6IHJlYWNoaW5nIHRoZSBmaXJzdCBzbGlkZSBjYW4gb25seSBsb29wLCBvciBzdG9wLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzUHJldkRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVMb29wICYmIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9PT0gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNOZXh0RGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmVuYWJsZUxvb3AgJiYgIXRoaXMuY2FuRmV0Y2hNb3JlICYmIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9PT0gdGhpcy5yb3dzLmxlbmd0aCAtIDE7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgYWx0ZXJDdHJsOiBBbGVydENvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9jbGVhbnVwV2hlZWxab29tKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQ/OiBhbnkpOiBTd2lwZXIge1xuICAgIHRoaXMuX3N3aXBlciA9IChzd2lwZXJFbGVtZW50IHx8IHRoaXMuc3dpcGVyUmVmPy5uYXRpdmVFbGVtZW50KT8uc3dpcGVyIHx8IHRoaXMuX3N3aXBlcjtcbiAgICByZXR1cm4gdGhpcy5fc3dpcGVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHdhaXRGb3JTd2lwZXIoc3dpcGVyRWxlbWVudD86IGFueSwgd2FpdEZvck9wdGlvbnM/OiBXYWl0Rm9yT3B0aW9ucyk6IFByb21pc2U8U3dpcGVyPiB7XG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiAhIXRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpLCB7Y2hlY2tQZXJpb2Q6IDUwLCB0aW1lb3V0OiA1MDAsIC4uLndhaXRGb3JPcHRpb25zfSlcbiAgICByZXR1cm4gdGhpcy5fc3dpcGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIChhIGZldyBhbmltYXRpb24gZnJhbWVzKSB1bnRpbCBTd2lwZXIncyBvd24gc2xpZGVzIGFycmF5IHJlZmxlY3RzIGF0IGxlYXN0IGBtaW5Db3VudGAgaXRlbXMuXG4gICAqIE5lZWRlZCBhZnRlciBgZmV0Y2hNb3JlYDogdGhlIG5ldyBgPHN3aXBlci1zbGlkZT5gIGVsZW1lbnRzIGNvbWUgZnJvbSB0aGUgYHJvd3NgIGlucHV0IHJlLXJlbmRlcmluZyxcbiAgICogd2hpY2ggbWF5IG5vdCBoYXZlIHJlYWNoZWQgdGhlIERPTSBieSB0aGUgdGltZSB0aGUgcGFyZW50J3MgcmV0dXJuZWQgcHJvbWlzZSByZXNvbHZlcy5cbiAgICovXG4gIHByb3RlY3RlZCBfd2FpdEZvclNsaWRlQ291bnQoc3dpcGVyOiBTd2lwZXIsIG1pbkNvdW50OiBudW1iZXIsIHJldHJpZXNMZWZ0ID0gMzApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoKHN3aXBlci5zbGlkZXM/Lmxlbmd0aCA/PyAwKSA+PSBtaW5Db3VudCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICBpZiAocmV0cmllc0xlZnQgPD0gMCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSh0aGlzLl93YWl0Rm9yU2xpZGVDb3VudChzd2lwZXIsIG1pbkNvdW50LCByZXRyaWVzTGVmdCAtIDEpKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TbGlkZUNoYW5nZShzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gc3dpcGVyLnByZXZpb3VzSW5kZXg7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gICAgdGhpcy5hY3RpdmVTbGlkZUluZGV4ID0gYWN0aXZlSW5kZXg7XG4gICAgdGhpcy5fcmVzZXRab29tKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMuX3VwZGF0ZVN3aXBlclRvdWNoTW92ZShzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuX2VtaXRTbGlkZUNoYW5nZShwcmV2aW91c0luZGV4LCBhY3RpdmVJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYHByZXZpb3VzU2xpZGVgL2BuZXh0U2xpZGVgIGZyb20gdGhlIGFjdHVhbCBpbmRleCBjaGFuZ2UsIGNvdmVyaW5nIHNpZGUgYnV0dG9ucyBhcyB3ZWxsIGFzIHRvdWNoXG4gICAqIHN3aXBlcy4gV2hlbiBgc2xpZGVQcmV2KClgL2BzbGlkZU5leHQoKWAgdHJpZ2dlcmVkIHRoZSBjaGFuZ2UsIHRoZWlyIGV4cGxpY2l0IGludGVudCBpcyB1c2VkIChzaW5jZSB3aXRoXG4gICAqIGV4YWN0bHkgMiBzbGlkZXMsIGEgXCJzdGVwXCIgYW5kIGEgbWFudWFsIFwid3JhcFwiIHByb2R1Y2UgdGhlIHZlcnkgc2FtZSBpbmRleCBjaGFuZ2UgYW5kIGNhbid0IGJlIHRvbGQgYXBhcnRcbiAgICogZnJvbSB0aGUgaW5kZXhlcyBhbG9uZSkuIE90aGVyd2lzZSAoYSBwbGFpbiB0b3VjaCBzd2lwZSkgU3dpcGVyIG5ldmVyIHdyYXBzIG9uIGl0cyBvd24gKG5vIGBsb29wYCBtb2RlXG4gICAqIGNvbmZpZ3VyZWQgaGVyZSksIHNvIGEgc2ltcGxlIGluZGV4IGNvbXBhcmlzb24gaXMgdW5hbWJpZ3VvdXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2VtaXRTbGlkZUNoYW5nZShwcmV2aW91c0luZGV4OiBudW1iZXIsIGFjdGl2ZUluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAocHJldmlvdXNJbmRleCA9PT0gYWN0aXZlSW5kZXgpIHJldHVybjtcbiAgICBjb25zdCBpc05leHQgPSB0aGlzLl9wZW5kaW5nU2xpZGVEaXJlY3Rpb24gPyB0aGlzLl9wZW5kaW5nU2xpZGVEaXJlY3Rpb24gPT09ICduZXh0JyA6IGFjdGl2ZUluZGV4ID4gcHJldmlvdXNJbmRleDtcbiAgICB0aGlzLl9wZW5kaW5nU2xpZGVEaXJlY3Rpb24gPSBudWxsO1xuICAgIGNvbnN0IGV2ZW50OiBJbWFnZUdhbGxlcnlTbGlkZUNoYW5nZUV2ZW50PFQ+ID0geyBpbmRleDogYWN0aXZlSW5kZXgsIHJvdzogdGhpcy5yb3dzPy5bYWN0aXZlSW5kZXhdIH07XG4gICAgKGlzTmV4dCA/IHRoaXMubmV4dFNsaWRlIDogdGhpcy5wcmV2aW91c1NsaWRlKS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBvblN3aXBlckluaXQoc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5fcmVzZXRab29tKHN3aXBlckVsZW1lbnQpO1xuXG4gICAgLy8gR2V0IHRoZSBzd2lwZXJcbiAgICBjb25zdCBzd2lwZXIgPSBhd2FpdCB0aGlzLndhaXRGb3JTd2lwZXIoc3dpcGVyRWxlbWVudCwge3RpbWVvdXQ6IDEwMDB9KTtcblxuICAgIC8vIFRoZSBgaW5pdGlhbFNsaWRlYCBiaW5kaW5nIGNhbiBOT1Qgd29yayBoZXJlOiBBbmd1bGFyIGluc2VydHMgPHN3aXBlci1jb250YWluZXI+IGludG8gdGhlIERPTSAod2hpY2hcbiAgICAvLyBzeW5jaHJvbm91c2x5IHJ1bnMgaXRzIGNvbm5lY3RlZENhbGxiYWNrLCBjb25zdHJ1Y3RpbmcgdGhlIFN3aXBlciBpbnN0YW5jZSBhbmQgcmVhZGluZyBgaW5pdGlhbFNsaWRlYFxuICAgIC8vIG9mZiB0aGUgZWxlbWVudCkgKmJlZm9yZSogaXQgYXBwbGllcyBwcm9wZXJ0eSBiaW5kaW5ncyBpbiBpdHMgdXBkYXRlIHBhc3MgLS0gc28gU3dpcGVyIGFsd2F5cyByZWFkc1xuICAgIC8vIGBpbml0aWFsU2xpZGVgIGFzIHVuc2V0ICgwKS4gSXQgbXVzdCBiZSBjb3JyZWN0ZWQgZXhwbGljaXRseSwgb25jZSBTd2lwZXIgYWN0dWFsbHkgZXhpc3RzLlxuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPiAwICYmIHN3aXBlciAmJiBzd2lwZXIuYWN0aXZlSW5kZXggIT09IHRoaXMuc2VsZWN0ZWRJbmRleCkge1xuICAgICAgc3dpcGVyLnNsaWRlVG8odGhpcy5zZWxlY3RlZEluZGV4LCAwIC8qbm8gdHJhbnNpdGlvbiwgdG8gYXZvaWQgYSBcInJldmVydFwiIGVmZmVjdCovKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVTbGlkZUluZGV4ID0gc3dpcGVyPy5hY3RpdmVJbmRleCA/PyB0aGlzLnNlbGVjdGVkSW5kZXg7XG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFtpbWFnZS1nYWxsZXJ5LXNsaWRlc2hvd10gSW5pdGlhbGl6aW5nIHNsaWRlc2hvdywgYWN0aXZlU2xpZGVJbmRleD0ke3RoaXMuYWN0aXZlU2xpZGVJbmRleH1gKTtcbiAgICB0aGlzLl9zZXR1cFdoZWVsWm9vbShzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLl91cGRhdGVTd2lwZXJUb3VjaE1vdmUoc3dpcGVyRWxlbWVudCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZUVkaXRJbWFnZVNpemUoc3dpcGVyRWxlbWVudCk7XG4gICAgICB0aGlzLl91cGRhdGVDcm9wT3ZlcmxheVBvc2l0aW9uKHN3aXBlckVsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXBlcidzIG93biB0b3VjaC9tb3VzZS1kcmFnLXRvLXN3aXBlIGdlc3R1cmUgaXMgY2FwdHVyZWQgdmVyeSBlYXJseSAoYmVmb3JlIG91ciBjcm9wIG92ZXJsYXknc1xuICAgKiBvd24gbW91c2Vkb3duIGhhbmRsZXIgY2FuIHN0b3AgaXQpLCBzbyBpdCBtdXN0IGJlIGRpc2FibGVkIHVwZnJvbnQgd2hlbmV2ZXIgdGhlIGNyb3AgdG9vbCBpcyBhY3RpdmVcbiAgICogLS0gb3RoZXJ3aXNlIGRyYWdnaW5nIGluc2lkZSB0aGUgY3JvcCBzZWxlY3Rpb24gZW5kcyB1cCBzbGlkaW5nIHRvIHRoZSBuZXh0L3ByZXZpb3VzIGltYWdlIGluc3RlYWQuXG4gICAqIFByZXYvbmV4dCBhcnJvdyBidXR0b25zIGtlZXAgd29ya2luZywgc2luY2UgdGhleSBjYWxsIHRoZSBTd2lwZXIgQVBJIGRpcmVjdGx5LlxuICAgKi9cbiAgcHJvdGVjdGVkIF91cGRhdGVTd2lwZXJUb3VjaE1vdmUoc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgaWYgKCFzd2lwZXIpIHJldHVybjtcbiAgICBzd2lwZXIuYWxsb3dUb3VjaE1vdmUgPSAhdGhpcy5fY3JvcFRvb2xBY3RpdmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgem9vbShzd2lwZXJFbGVtZW50OiBhbnksIHpvb21JbjogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3ddIHpvb20gJyArICh6b29tSW4gPyAnaW4nIDogJ291dCcpLCBzd2lwZXJFbGVtZW50KTtcbiAgICBpZiAodGhpcy5lbmFibGVNb3VzZVpvb20pIHtcbiAgICAgIGNvbnN0IGRlbHRhID0gem9vbUluID8gdGhpcy53aGVlbFpvb21TdGVwIDogLXRoaXMud2hlZWxab29tU3RlcDtcbiAgICAgIGNvbnN0IG5ld1NjYWxlID0gTWF0aC5tYXgoMSwgTWF0aC5taW4odGhpcy5fem9vbVN0YXRlLnNjYWxlICsgZGVsdGEsIHRoaXMubWF4Wm9vbVJhdGlvKSk7XG4gICAgICBpZiAobmV3U2NhbGUgPT09IHRoaXMuX3pvb21TdGF0ZS5zY2FsZSkgcmV0dXJuO1xuICAgICAgaWYgKG5ld1NjYWxlID09PSAxKSB7XG4gICAgICAgIHRoaXMuX3pvb21TdGF0ZSA9IHsgc2NhbGU6IDEsIHR4OiAwLCB0eTogMCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fem9vbVN0YXRlLnNjYWxlID0gbmV3U2NhbGU7XG4gICAgICAgIHRoaXMuX2NsYW1wVHJhbnNsYXRpb25zKHN3aXBlckVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYXBwbHlab29tKHN3aXBlckVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICAgIGlmICh6b29tSW4pIHN3aXBlci56b29tLmluKCk7XG4gICAgICBlbHNlIHN3aXBlci56b29tLm91dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZXF1ZXN0RGVsZXRlKHN3aXBlckVsZW1lbnQ6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IGN1cnJlbnRSb3cgPSB0aGlzLnJvd3MuZmluZCgocm93LCBpbmRleCkgPT4gaW5kZXggPT09IHN3aXBlci5hY3RpdmVJbmRleCk7XG4gICAgaWYgKCFjdXJyZW50Um93KSByZXR1cm4gZmFsc2U7IC8vIFJvdyBub3QgZm91bmRcblxuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGRlbGV0ZWQgPSBhd2FpdCBlbWl0UHJvbWlzZUV2ZW50KHRoaXMuZGVsZXRlUmVxdWVzdGVkLCAnZGVsZXRlJywgeyBkZXRhaWw6IHsgcm93OiBjdXJyZW50Um93IH0gfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuIGZhbHNlOyAvLyBVc2VyIGNhbmNlbFxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVkKSB7XG4gICAgICBpZiAoIXRoaXMucm93cz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VSZXF1ZXN0ZWQuZW1pdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRab29tKHN3aXBlckVsZW1lbnQpO1xuICAgICAgICBzd2lwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNsaWRlUHJldihzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IDApIHtcbiAgICAgIC8vIE5vIHByZXZpb3VzIHBhZ2UgY29uY2VwdCAocGFnaW5hdGlvbiBvbmx5IGV2ZXIgbG9hZHMgZm9yd2FyZCk6IGp1c3QgbG9vcCwgb3Igc3RheSBwdXRcbiAgICAgIGlmICghdGhpcy5lbmFibGVMb29wKSByZXR1cm47XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpZGVEaXJlY3Rpb24gPSAncHJldic7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVUbyh0aGlzLnJvd3MubGVuZ3RoIC0gMSwgMCAvKm5vIHRyYW5zaXRpb24sIHRvIGF2b2lkIGEgXCJyZXZlcnRcIiBlZmZlY3QqLyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BlbmRpbmdTbGlkZURpcmVjdGlvbiA9ICdwcmV2JztcbiAgICAgIGF3YWl0IHN3aXBlci5zbGlkZVByZXYoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2xpZGVOZXh0KHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gdGhpcy5yb3dzLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIFRyeSBmZXRjaGluZyBhIGZ1cnRoZXIgcGFnZSBmaXJzdCwgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBsb29waW5nL3N0b3BwaW5nXG4gICAgICBpZiAodGhpcy5jYW5GZXRjaE1vcmUgJiYgdGhpcy5mZXRjaE1vcmUub2JzZXJ2ZWQpIHtcbiAgICAgICAgY29uc3Qgcm93Q291bnRCZWZvcmVGZXRjaCA9IHRoaXMucm93cy5sZW5ndGg7XG4gICAgICAgIGxldCBmZXRjaGVkID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmV0Y2hlZCA9IGF3YWl0IGVtaXRQcm9taXNlRXZlbnQodGhpcy5mZXRjaE1vcmUsICdmZXRjaE1vcmUnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVyciAhPT0gJ0NBTkNFTExFRCcpIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmV0Y2hlZCAmJiB0aGlzLnJvd3MubGVuZ3RoID4gcm93Q291bnRCZWZvcmVGZXRjaCkge1xuICAgICAgICAgIC8vIFRoZSBuZXcgPHN3aXBlci1zbGlkZT4gZWxlbWVudHMgY29tZSBmcm9tIHRoZSBgcm93c2AgaW5wdXQgcmUtcmVuZGVyaW5nLCB3aGljaCBtYXkgbm90IGhhdmVcbiAgICAgICAgICAvLyByZWFjaGVkIHRoZSBET00geWV0IGF0IHRoaXMgcG9pbnQ6IHdhaXQgZm9yIFN3aXBlciB0byBhY3R1YWxseSBzZWUgdGhlIGV4dHJhIHNsaWRlKHMpLlxuICAgICAgICAgIGF3YWl0IHRoaXMuX3dhaXRGb3JTbGlkZUNvdW50KHN3aXBlciwgcm93Q291bnRCZWZvcmVGZXRjaCArIDEpO1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdTbGlkZURpcmVjdGlvbiA9ICduZXh0JztcbiAgICAgICAgICBhd2FpdCBzd2lwZXIuc2xpZGVOZXh0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGhpbmcgbmV3IHdhcyBhY3R1YWxseSBhZGRlZDogZmFsbCB0aHJvdWdoIHRvIGxvb3Avc3RvcCBiZWxvd1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmVuYWJsZUxvb3ApIHJldHVybjtcbiAgICAgIHRoaXMuX3BlbmRpbmdTbGlkZURpcmVjdGlvbiA9ICduZXh0JztcbiAgICAgIGF3YWl0IHN3aXBlci5zbGlkZVRvKDAsIDAgLypubyB0cmFuc2l0aW9uLCB0byBhdm9pZCBhIFwicmV2ZXJ0XCIgZWZmZWN0Ki8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpZGVEaXJlY3Rpb24gPSAnbmV4dCc7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVOZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldEltYWdlU2l6ZVF1ZXJ5UGFyYW1zKCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGlmICghdGhpcy5pbWFnZVNpemVRdWVyeVBhcmFtIHx8IGlzTmlsT3JCbGFuayh0aGlzLm1vZGFsSW1hZ2VTaXplKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgW3RoaXMuaW1hZ2VTaXplUXVlcnlQYXJhbV06IHRoaXMubW9kYWxJbWFnZVNpemUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIC0tLSBDcm9wICYgcm90YXRlIHRvb2xzOiBhbHdheXMgYXZhaWxhYmxlIChubyBcImVudGVyIGVkaXQgbW9kZVwiIHN0ZXApIC0tLVxuICAvLyBWYWxpZGF0ZS9DYW5jZWwgb25seSBhcHBlYXIgb25jZSB0aGUgdXNlciBhY3R1YWxseSBjaGFuZ2VkIHNvbWV0aGluZyAoc2VlIGBoYXNQZW5kaW5nRWRpdGApLlxuXG4gIHByb3RlY3RlZCBkaXNjYXJkRWRpdChzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLl9yZXNldEVkaXRTdGF0ZShzd2lwZXJFbGVtZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldENyb3AoX3N3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMuX2Nyb3BSZWN0ID0gdGhpcy5fY3JlYXRlRGVmYXVsdENyb3BSZWN0KCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY3JlYXRlRGVmYXVsdENyb3BSZWN0KCk6IENyb3BSZWN0IHtcbiAgICBjb25zdCBpbnNldCA9IHRoaXMuX2RlZmF1bHRDcm9wSW5zZXQ7XG4gICAgcmV0dXJuIHsgeDogaW5zZXQsIHk6IGluc2V0LCB3aWR0aDogMSAtIDIgKiBpbnNldCwgaGVpZ2h0OiAxIC0gMiAqIGluc2V0IH07XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlQ3JvcFRvb2woc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUNyb3AgfHwgdGhpcy5yZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMuX2Nyb3BUb29sQWN0aXZlID0gIXRoaXMuX2Nyb3BUb29sQWN0aXZlO1xuICAgIGlmICh0aGlzLl9jcm9wVG9vbEFjdGl2ZSkge1xuICAgICAgLy8gU3RhcnQgd2l0aCBhbiBpbnNldCBzZWxlY3Rpb246IGhhbmRsZXMgcmlnaHQgYXQgdGhlIGltYWdlIGVkZ2VzIGFyZSBoYXJkIHRvIGdyYWJcbiAgICAgIHRoaXMuX2Nyb3BSZWN0ID0gdGhpcy5fY3JlYXRlRGVmYXVsdENyb3BSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERpc2NhcmQgYW55IHBlbmRpbmcgY3JvcCBzZWxlY3Rpb24gd2hlbiBoaWRpbmcgdGhlIHRvb2xcbiAgICAgIHRoaXMuX2Nyb3BSZWN0ID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMSwgaGVpZ2h0OiAxIH07XG4gICAgICB0aGlzLl9jcm9wRHJhZ1N0YXRlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlU3dpcGVyVG91Y2hNb3ZlKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgaWYgKHRoaXMuX2Nyb3BUb29sQWN0aXZlKSB7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgY3JvcCBvdmVybGF5IHRvIGJlIHJlbmRlcmVkLCB0aGVuIGNvbXB1dGUgaXRzIHBvc2l0aW9uXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3VwZGF0ZUNyb3BPdmVybGF5UG9zaXRpb24oc3dpcGVyRWxlbWVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB2YWxpZGF0ZUVkaXQoc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3QgY3VycmVudFJvdyA9IHRoaXMucm93cy5maW5kKChyb3csIGluZGV4KSA9PiBpbmRleCA9PT0gc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICBpZiAoIWN1cnJlbnRSb3cpIHJldHVybjtcblxuICAgIGNvbnN0IGltYWdlID0gY3VycmVudFJvdy5jdXJyZW50RGF0YSBhcyBUO1xuICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuZWRpdGlvbkZvcm1hdCA/PyAncG5nJztcbiAgICBjb25zdCBtaW1lVHlwZSA9ICdpbWFnZS8nICsgZm9ybWF0O1xuICAgIGNvbnN0IHF1YWxpdHkgPSBmb3JtYXQgPT09ICdqcGVnJyA/IHRoaXMuZWRpdGlvblF1YWxpdHkgOiB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FudmFzID0gYXdhaXQgdGhpcy5fcmVuZGVyRWRpdGVkSW1hZ2UoaW1hZ2UsIHRoaXMuX3JvdGF0aW9uLCB0aGlzLl9jcm9wUmVjdCk7XG4gICAgICBjb25zdCBkYXRhVXJsID0gY2FudmFzLnRvRGF0YVVSTChtaW1lVHlwZSwgcXVhbGl0eSk7XG4gICAgICBjb25zdCBibG9iID0gYXdhaXQgbmV3IFByb21pc2U8QmxvYj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjYW52YXMudG9CbG9iKChiKSA9PiAoYiA/IHJlc29sdmUoYikgOiByZWplY3QobmV3IEVycm9yKCdjYW52YXMudG9CbG9iKCkgZmFpbGVkJykpKSwgbWltZVR5cGUsIHF1YWxpdHkpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcm93LCBzbyB0aGUgc2xpZGVzaG93IGFuZCB0aHVtYm5haWwgcmVmbGVjdCB0aGUgY2hhbmdlIGltbWVkaWF0ZWx5XG4gICAgICBpbWFnZS5kYXRhVXJsID0gZGF0YVVybDtcbiAgICAgIGltYWdlLnVybCA9IG51bGw7XG5cbiAgICAgIHRoaXMuYWZ0ZXJFZGl0SW1hZ2UuZW1pdCh7IHJvdzogY3VycmVudFJvdywgaW1hZ2UsIGRhdGFVcmwsIGJsb2IsIGZvcm1hdCB9KTtcbiAgICAgIHRoaXMuYWZ0ZXJFZGl0Um93LmVtaXQoY3VycmVudFJvdyk7XG5cbiAgICAgIHRoaXMuX3Jlc2V0RWRpdFN0YXRlKHN3aXBlckVsZW1lbnQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW2ltYWdlLWdhbGxlcnktc2xpZGVzaG93XSBGYWlsZWQgdG8gZXhwb3J0IHRoZSBlZGl0ZWQgaW1hZ2UnLCBlcnIpO1xuICAgICAgYXdhaXQgQWxlcnRzLnNob3dFcnJvcignSU1BR0UuR0FMTEVSWS5FUlJPUl9FRElUX0lNQUdFJywgdGhpcy5hbHRlckN0cmwsIHRoaXMudHJhbnNsYXRlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3Jlc2V0RWRpdFN0YXRlKHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMuX3JvdGF0aW9uID0gMDtcbiAgICB0aGlzLl9jcm9wUmVjdCA9IHsgeDogMCwgeTogMCwgd2lkdGg6IDEsIGhlaWdodDogMSB9O1xuICAgIHRoaXMuX2Nyb3BEcmFnU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuX2Nyb3BUb29sQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5fYXBwbHlab29tKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMuX3VwZGF0ZUVkaXRJbWFnZVNpemUoc3dpcGVyRWxlbWVudCk7XG4gICAgdGhpcy5fdXBkYXRlU3dpcGVyVG91Y2hNb3ZlKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgcHJvdGVjdGVkIG9uV2luZG93UmVzaXplKCkge1xuICAgIGNvbnN0IHN3aXBlckVsZW1lbnQgPSB0aGlzLnN3aXBlclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXN3aXBlckVsZW1lbnQpIHJldHVybjtcbiAgICB0aGlzLl91cGRhdGVFZGl0SW1hZ2VTaXplKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMuX3VwZGF0ZUNyb3BPdmVybGF5UG9zaXRpb24oc3dpcGVyRWxlbWVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcm90YXRlKHN3aXBlckVsZW1lbnQ6IGFueSwgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnKSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVJvdGF0ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGRlbHRhID0gZGlyZWN0aW9uID09PSAncmlnaHQnID8gOTAgOiAtOTA7XG4gICAgdGhpcy5fcm90YXRpb24gPSAoKCh0aGlzLl9yb3RhdGlvbiArIGRlbHRhKSAlIDM2MCkgKyAzNjApICUgMzYwO1xuICAgIHRoaXMuX2FwcGx5Wm9vbShzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLl91cGRhdGVFZGl0SW1hZ2VTaXplKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMuX3VwZGF0ZUNyb3BPdmVybGF5UG9zaXRpb24oc3dpcGVyRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RyYWlucyB0aGUgZGlzcGxheWVkIGltYWdlIHNvIHRoYXQsIGV2ZW4gb25jZSByb3RhdGVkIDkwwrAvMjcwwrAgdmlhIENTUyB0cmFuc2Zvcm0sXG4gICAqIGl0cyB2aXN1YWwgYm91bmRpbmcgYm94IGFsd2F5cyBmaXRzIGluc2lkZSB0aGUgc2xpZGUgY29udGFpbmVyIChubyBvdmVyZmxvdykuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3VwZGF0ZUVkaXRJbWFnZVNpemUoc3dpcGVyRWxlbWVudDogYW55LCByZXRyaWVzTGVmdCA9IDYwKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3QgYWN0aXZlU2xpZGUgPSBzd2lwZXI/LnNsaWRlcz8uW3N3aXBlci5hY3RpdmVJbmRleF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFhY3RpdmVTbGlkZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lckVsID0gYWN0aXZlU2xpZGUucXVlcnlTZWxlY3RvcignLnN3aXBlci16b29tLWNvbnRhaW5lcicpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGltZ0VsID0gYWN0aXZlU2xpZGUucXVlcnlTZWxlY3RvcignLnN3aXBlci16b29tLXRhcmdldCwgLnN3aXBlci16b29tLWNvbnRhaW5lciA+IGltZycpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyRWwgfHwgIWltZ0VsKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmVuYWJsZUNyb3AgJiYgIXRoaXMuZW5hYmxlUm90YXRlKSB7XG4gICAgICBpbWdFbC5zdHlsZS53aWR0aCA9ICcnO1xuICAgICAgaW1nRWwuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBuYXR1cmFsU2l6ZSA9IHRoaXMuX2dldEltYWdlTmF0dXJhbFNpemUoaW1nRWwpO1xuICAgIC8vIFRoZSBjb250YWluZXIvaW1hZ2UgbWF5IG5vdCBiZSBsYWlkIG91dCBvciBsb2FkZWQgeWV0OiBza2lwIGFuZCByZXRyeSBvbiB0aGUgbmV4dCBmcmFtZVxuICAgIGlmICghY29udGFpbmVyUmVjdC53aWR0aCB8fCAhY29udGFpbmVyUmVjdC5oZWlnaHQgfHwgIW5hdHVyYWxTaXplKSB7XG4gICAgICBpZiAocmV0cmllc0xlZnQgPiAwKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLl91cGRhdGVFZGl0SW1hZ2VTaXplKHN3aXBlckVsZW1lbnQsIHJldHJpZXNMZWZ0IC0gMSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDb21wdXRlIHRoZSBleGFjdCBib3ggKHByZXNlcnZpbmcgdGhlIGltYWdlJ3MgYXNwZWN0IHJhdGlvKSB0aGF0IGZpdHMgdGhlIGF2YWlsYWJsZSBzcGFjZSxcbiAgICAvLyBzd2FwcGluZyB3aWR0aC9oZWlnaHQgd2hlbiByb3RhdGVkIDkwwrAvMjcwwrAgc28gdGhlIHJvdGF0ZWQgdmlzdWFsIGJveCBuZXZlciBvdmVyZmxvd3MuXG4gICAgY29uc3Qgc3dhcHBlZCA9IHRoaXMuX3JvdGF0aW9uICUgMTgwICE9PSAwO1xuICAgIGNvbnN0IGF2YWlsV2lkdGggPSBzd2FwcGVkID8gY29udGFpbmVyUmVjdC5oZWlnaHQgOiBjb250YWluZXJSZWN0LndpZHRoO1xuICAgIGNvbnN0IGF2YWlsSGVpZ2h0ID0gc3dhcHBlZCA/IGNvbnRhaW5lclJlY3Qud2lkdGggOiBjb250YWluZXJSZWN0LmhlaWdodDtcbiAgICBjb25zdCByYXRpbyA9IE1hdGgubWluKGF2YWlsV2lkdGggLyBuYXR1cmFsU2l6ZS53aWR0aCwgYXZhaWxIZWlnaHQgLyBuYXR1cmFsU2l6ZS5oZWlnaHQpO1xuICAgIGltZ0VsLnN0eWxlLndpZHRoID0gYCR7bmF0dXJhbFNpemUud2lkdGggKiByYXRpb31weGA7XG4gICAgaW1nRWwuc3R5bGUuaGVpZ2h0ID0gYCR7bmF0dXJhbFNpemUuaGVpZ2h0ICogcmF0aW99cHhgO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9nZXRJbWFnZU5hdHVyYWxTaXplKGltZ0VsOiBIVE1MRWxlbWVudCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IGlubmVyID0gKGltZ0VsLnRhZ05hbWUgPT09ICdJT04tSU1HJyA/IGltZ0VsLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIDogaW1nRWwpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgaWYgKCFpbm5lcj8ubmF0dXJhbFdpZHRoIHx8ICFpbm5lcj8ubmF0dXJhbEhlaWdodCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHsgd2lkdGg6IGlubmVyLm5hdHVyYWxXaWR0aCwgaGVpZ2h0OiBpbm5lci5uYXR1cmFsSGVpZ2h0IH07XG4gIH1cblxuICAvLyAtLS0gQ3JvcCBvdmVybGF5OiBkcmFnIHRvIG1vdmUvcmVzaXplIHRoZSBjcm9wIHJlY3RhbmdsZSAtLS1cblxuICBwcm90ZWN0ZWQgb25Dcm9wUG9pbnRlckRvd24oZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LCBzd2lwZXJFbGVtZW50OiBhbnksIGhhbmRsZTogQ3JvcEhhbmRsZSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgcHQgPSB0aGlzLl9nZXRFdmVudFBvaW50KGV2ZW50KTtcbiAgICB0aGlzLl9jcm9wT3ZlcmxheVJlY3QgPSB0aGlzLl9jcm9wT3ZlcmxheVJlY3QgPz8gdGhpcy5fdXBkYXRlQ3JvcE92ZXJsYXlQb3NpdGlvbihzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLl9jcm9wRHJhZ1N0YXRlID0ge1xuICAgICAgaGFuZGxlLFxuICAgICAgc3RhcnRYOiBwdC54LFxuICAgICAgc3RhcnRZOiBwdC55LFxuICAgICAgc3RhcnRSZWN0OiB7IC4uLnRoaXMuX2Nyb3BSZWN0IH0sXG4gICAgfTtcbiAgICAvLyBBbHNvIGRpc2FibGUgcHJvZ3JhbW1hdGljIHNsaWRlIG5hdmlnYXRpb24gd2hpbGUgZHJhZ2dpbmcgKGFsbG93VG91Y2hNb3ZlIGlzIGFscmVhZHlcbiAgICAvLyBwZXJtYW5lbnRseSBvZmYgd2hlbmV2ZXIgY3JvcCBpcyBlbmFibGVkLCBzZWUgYF91cGRhdGVTd2lwZXJUb3VjaE1vdmVgKVxuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGlmIChzd2lwZXIpIHtcbiAgICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IGZhbHNlO1xuICAgICAgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ3JvcFBvaW50ZXJNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCwgX3N3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGlmICghdGhpcy5fY3JvcERyYWdTdGF0ZSkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuX2Nyb3BPdmVybGF5UmVjdDtcbiAgICBpZiAoIXJlY3Q/LndpZHRoIHx8ICFyZWN0Py5oZWlnaHQpIHJldHVybjtcbiAgICBjb25zdCBwdCA9IHRoaXMuX2dldEV2ZW50UG9pbnQoZXZlbnQpO1xuICAgIGNvbnN0IGR4ID0gKHB0LnggLSB0aGlzLl9jcm9wRHJhZ1N0YXRlLnN0YXJ0WCkgLyByZWN0LndpZHRoO1xuICAgIGNvbnN0IGR5ID0gKHB0LnkgLSB0aGlzLl9jcm9wRHJhZ1N0YXRlLnN0YXJ0WSkgLyByZWN0LmhlaWdodDtcbiAgICB0aGlzLl9jcm9wUmVjdCA9IHRoaXMuX2NvbXB1dGVDcm9wUmVjdCh0aGlzLl9jcm9wRHJhZ1N0YXRlLmhhbmRsZSwgdGhpcy5fY3JvcERyYWdTdGF0ZS5zdGFydFJlY3QsIGR4LCBkeSk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNyb3BQb2ludGVyVXAoX2V2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCwgc3dpcGVyRWxlbWVudD86IGFueSkge1xuICAgIGlmICghdGhpcy5fY3JvcERyYWdTdGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMuX2Nyb3BEcmFnU3RhdGUgPSBudWxsO1xuICAgIGNvbnN0IHN3aXBlciA9IHN3aXBlckVsZW1lbnQgPyB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KSA6IG51bGw7XG4gICAgaWYgKHN3aXBlcikge1xuICAgICAgc3dpcGVyLmFsbG93U2xpZGVOZXh0ID0gdHJ1ZTtcbiAgICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IHRydWU7XG4gICAgfVxuICAgIGlmIChzd2lwZXJFbGVtZW50KSB0aGlzLl91cGRhdGVTd2lwZXJUb3VjaE1vdmUoc3dpcGVyRWxlbWVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2NvbXB1dGVDcm9wUmVjdChoYW5kbGU6IENyb3BIYW5kbGUsIHN0YXJ0OiBDcm9wUmVjdCwgZHg6IG51bWJlciwgZHk6IG51bWJlcik6IENyb3BSZWN0IHtcbiAgICBjb25zdCBNSU5fU0laRSA9IDAuMDg7XG4gICAgY29uc3QgY2xhbXAwMSA9ICh2OiBudW1iZXIpID0+IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHYpKTtcblxuICAgIGlmIChoYW5kbGUgPT09ICdtb3ZlJykge1xuICAgICAgbGV0IHggPSBjbGFtcDAxKHN0YXJ0LnggKyBkeCk7XG4gICAgICBsZXQgeSA9IGNsYW1wMDEoc3RhcnQueSArIGR5KTtcbiAgICAgIHggPSBNYXRoLm1pbih4LCAxIC0gc3RhcnQud2lkdGgpO1xuICAgICAgeSA9IE1hdGgubWluKHksIDEgLSBzdGFydC5oZWlnaHQpO1xuICAgICAgcmV0dXJuIHsgeCwgeSwgd2lkdGg6IHN0YXJ0LndpZHRoLCBoZWlnaHQ6IHN0YXJ0LmhlaWdodCB9O1xuICAgIH1cblxuICAgIGxldCBsZWZ0ID0gc3RhcnQueDtcbiAgICBsZXQgdG9wID0gc3RhcnQueTtcbiAgICBsZXQgcmlnaHQgPSBzdGFydC54ICsgc3RhcnQud2lkdGg7XG4gICAgbGV0IGJvdHRvbSA9IHN0YXJ0LnkgKyBzdGFydC5oZWlnaHQ7XG5cbiAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCd3JykpIGxlZnQgPSBjbGFtcDAxKHN0YXJ0LnggKyBkeCk7XG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygnZScpKSByaWdodCA9IGNsYW1wMDEoc3RhcnQueCArIHN0YXJ0LndpZHRoICsgZHgpO1xuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ24nKSkgdG9wID0gY2xhbXAwMShzdGFydC55ICsgZHkpO1xuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ3MnKSkgYm90dG9tID0gY2xhbXAwMShzdGFydC55ICsgc3RhcnQuaGVpZ2h0ICsgZHkpO1xuXG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA8IE1JTl9TSVpFKSB7XG4gICAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCd3JykpIGxlZnQgPSByaWdodCAtIE1JTl9TSVpFO1xuICAgICAgZWxzZSByaWdodCA9IGxlZnQgKyBNSU5fU0laRTtcbiAgICB9XG4gICAgaWYgKGJvdHRvbSAtIHRvcCA8IE1JTl9TSVpFKSB7XG4gICAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCduJykpIHRvcCA9IGJvdHRvbSAtIE1JTl9TSVpFO1xuICAgICAgZWxzZSBib3R0b20gPSB0b3AgKyBNSU5fU0laRTtcbiAgICB9XG5cbiAgICBsZWZ0ID0gY2xhbXAwMShsZWZ0KTtcbiAgICByaWdodCA9IGNsYW1wMDEocmlnaHQpO1xuICAgIHRvcCA9IGNsYW1wMDEodG9wKTtcbiAgICBib3R0b20gPSBjbGFtcDAxKGJvdHRvbSk7XG5cbiAgICByZXR1cm4geyB4OiBsZWZ0LCB5OiB0b3AsIHdpZHRoOiByaWdodCAtIGxlZnQsIGhlaWdodDogYm90dG9tIC0gdG9wIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgX2dldEV2ZW50UG9pbnQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICBpZiAoJ3RvdWNoZXMnIGluIGV2ZW50ICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB4OiBldmVudC50b3VjaGVzWzBdLmNsaWVudFgsIHk6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSB9O1xuICAgIH1cbiAgICBpZiAoJ2NoYW5nZWRUb3VjaGVzJyBpbiBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IHg6IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsIHk6IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgfTtcbiAgICB9XG4gICAgY29uc3QgbW91c2VFdmVudCA9IGV2ZW50IGFzIE1vdXNlRXZlbnQ7XG4gICAgcmV0dXJuIHsgeDogbW91c2VFdmVudC5jbGllbnRYLCB5OiBtb3VzZUV2ZW50LmNsaWVudFkgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfdXBkYXRlQ3JvcE92ZXJsYXlQb3NpdGlvbihzd2lwZXJFbGVtZW50OiBhbnksIHJldHJpZXNMZWZ0ID0gNjApOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBhY3RpdmVTbGlkZSA9IHN3aXBlcj8uc2xpZGVzPy5bc3dpcGVyLmFjdGl2ZUluZGV4XSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWFjdGl2ZVNsaWRlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjb250YWluZXJFbCA9IGFjdGl2ZVNsaWRlLnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItem9vbS1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBpbWdFbCA9IGFjdGl2ZVNsaWRlLnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItem9vbS10YXJnZXQsIC5zd2lwZXItem9vbS1jb250YWluZXIgPiBpbWcnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBvdmVybGF5RWwgPSBhY3RpdmVTbGlkZS5xdWVyeVNlbGVjdG9yKCcuY3JvcC1vdmVybGF5JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXJFbCB8fCAhaW1nRWwgfHwgIW92ZXJsYXlFbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGltZ1JlY3QgPSBpbWdFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyBUaGUgaW1hZ2UgbWF5IG5vdCBiZSBsYWlkIG91dCB5ZXQ6IGtlZXAgYW55IHByZXZpb3VzIChub24temVybykgdmFsdWUgYW5kIHJldHJ5IG9uIHRoZSBuZXh0IGZyYW1lXG4gICAgaWYgKCFpbWdSZWN0LndpZHRoIHx8ICFpbWdSZWN0LmhlaWdodCkge1xuICAgICAgaWYgKHJldHJpZXNMZWZ0ID4gMCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5fdXBkYXRlQ3JvcE92ZXJsYXlQb3NpdGlvbihzd2lwZXJFbGVtZW50LCByZXRyaWVzTGVmdCAtIDEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9jcm9wT3ZlcmxheVJlY3Q7XG4gICAgfVxuICAgIG92ZXJsYXlFbC5zdHlsZS5sZWZ0ID0gYCR7aW1nUmVjdC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0fXB4YDtcbiAgICBvdmVybGF5RWwuc3R5bGUudG9wID0gYCR7aW1nUmVjdC50b3AgLSBjb250YWluZXJSZWN0LnRvcH1weGA7XG4gICAgb3ZlcmxheUVsLnN0eWxlLndpZHRoID0gYCR7aW1nUmVjdC53aWR0aH1weGA7XG4gICAgb3ZlcmxheUVsLnN0eWxlLmhlaWdodCA9IGAke2ltZ1JlY3QuaGVpZ2h0fXB4YDtcbiAgICB0aGlzLl9jcm9wT3ZlcmxheVJlY3QgPSB7IHdpZHRoOiBpbWdSZWN0LndpZHRoLCBoZWlnaHQ6IGltZ1JlY3QuaGVpZ2h0IH07XG4gICAgcmV0dXJuIHRoaXMuX2Nyb3BPdmVybGF5UmVjdDtcbiAgfVxuXG4gIC8vIC0tLSBDYW52YXMgcmVuZGVyaW5nLCB1c2VkIHRvIGV4cG9ydCB0aGUgY3JvcHBlZC9yb3RhdGVkIGltYWdlIC0tLVxuXG4gIHByb3RlY3RlZCBhc3luYyBfcmVuZGVyRWRpdGVkSW1hZ2UoaW1hZ2U6IEltYWdlLCByb3RhdGlvbjogbnVtYmVyLCBjcm9wUmVjdDogQ3JvcFJlY3QpOiBQcm9taXNlPEhUTUxDYW52YXNFbGVtZW50PiB7XG4gICAgY29uc3Qgc3JjID0gaW1hZ2UuZGF0YVVybCB8fCBpbWFnZS51cmw7XG4gICAgY29uc3QgaW1nID0gYXdhaXQgdGhpcy5fbG9hZEltYWdlRWxlbWVudChzcmMpO1xuICAgIGNvbnN0IHN3ID0gaW1nLm5hdHVyYWxXaWR0aDtcbiAgICBjb25zdCBzaCA9IGltZy5uYXR1cmFsSGVpZ2h0O1xuICAgIGNvbnN0IHN3YXBwZWQgPSByb3RhdGlvbiAlIDE4MCAhPT0gMDtcbiAgICBjb25zdCBydyA9IHN3YXBwZWQgPyBzaCA6IHN3O1xuICAgIGNvbnN0IHJoID0gc3dhcHBlZCA/IHN3IDogc2g7XG5cbiAgICAvLyAxKSBEcmF3IHRoZSBmdWxsICh1bmNyb3BwZWQpIGltYWdlLCByb3RhdGVkXG4gICAgY29uc3Qgcm90Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgcm90Q2FudmFzLndpZHRoID0gcnc7XG4gICAgcm90Q2FudmFzLmhlaWdodCA9IHJoO1xuICAgIGNvbnN0IHJjdHggPSByb3RDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICByY3R4LnRyYW5zbGF0ZShydyAvIDIsIHJoIC8gMik7XG4gICAgcmN0eC5yb3RhdGUoKHJvdGF0aW9uICogTWF0aC5QSSkgLyAxODApO1xuICAgIHJjdHguZHJhd0ltYWdlKGltZywgLXN3IC8gMiwgLXNoIC8gMik7XG5cbiAgICAvLyAyKSBDcm9wIHRoZSByb3RhdGVkIGltYWdlXG4gICAgY29uc3QgY3JvcFggPSBNYXRoLnJvdW5kKGNyb3BSZWN0LnggKiBydyk7XG4gICAgY29uc3QgY3JvcFkgPSBNYXRoLnJvdW5kKGNyb3BSZWN0LnkgKiByaCk7XG4gICAgY29uc3QgY3JvcFcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGNyb3BSZWN0LndpZHRoICogcncpKTtcbiAgICBjb25zdCBjcm9wSCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoY3JvcFJlY3QuaGVpZ2h0ICogcmgpKTtcblxuICAgIGNvbnN0IG91dENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIG91dENhbnZhcy53aWR0aCA9IGNyb3BXO1xuICAgIG91dENhbnZhcy5oZWlnaHQgPSBjcm9wSDtcbiAgICBvdXRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2Uocm90Q2FudmFzLCBjcm9wWCwgY3JvcFksIGNyb3BXLCBjcm9wSCwgMCwgMCwgY3JvcFcsIGNyb3BIKTtcblxuICAgIHJldHVybiBvdXRDYW52YXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2xvYWRJbWFnZUVsZW1lbnQoc3JjOiBzdHJpbmcpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICBpZiAoIXNyYy5zdGFydHNXaXRoKCdkYXRhOicpKSBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltZyk7XG4gICAgICBpbWcub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtpbWFnZS1nYWxsZXJ5LXNsaWRlc2hvd10gQ2Fubm90IGxvYWQgaW1hZ2U6ICR7c3JjfWApKTtcbiAgICAgIGltZy5zcmMgPSBzcmM7XG4gICAgfSk7XG4gIH1cblxuICAvLyAtLS0gTW91c2Utd2hlZWwgem9vbSAmIG1vdXNlLWRyYWcgcGFuIC0tLVxuXG4gIHByb3RlY3RlZCBvblBvaW50ZXJEb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlTW91c2Vab29tIHx8IHRoaXMuX3pvb21TdGF0ZS5zY2FsZSA8PSAxKSByZXR1cm47XG4gICAgLy8gRG9uJ3QgaW50ZXJjZXB0IGNsaWNrcyBvbiBidXR0b25zL2NvbnRyb2xzXG4gICAgaWYgKChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ2lvbi1mYWItYnV0dG9uLCBpb24tYnV0dG9uLCBidXR0b24nKSkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5fZHJhZ1N0YXRlID0ge1xuICAgICAgc3RhcnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgc3RhcnRZOiBldmVudC5jbGllbnRZLFxuICAgICAgc3RhcnRUeDogdGhpcy5fem9vbVN0YXRlLnR4LFxuICAgICAgc3RhcnRUeTogdGhpcy5fem9vbVN0YXRlLnR5LFxuICAgIH07XG4gICAgY29uc3Qgd3JhcEVsID0gdGhpcy5fZ2V0QWN0aXZlWm9vbVdyYXBFbChzd2lwZXJFbGVtZW50KTtcbiAgICBpZiAod3JhcEVsKSB3cmFwRWwuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcblxuICAgIC8vIERpc2FibGUgU3dpcGVyIHNsaWRlLWNoYW5nZSB3aGlsZSBkcmFnZ2luZ1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGlmIChzd2lwZXIpIHtcbiAgICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IGZhbHNlO1xuICAgICAgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUG9pbnRlck1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQsIHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLl9jcm9wRHJhZ1N0YXRlKSB7XG4gICAgICB0aGlzLm9uQ3JvcFBvaW50ZXJNb3ZlKGV2ZW50LCBzd2lwZXJFbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9kcmFnU3RhdGUpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuX3pvb21TdGF0ZS50eCA9IHRoaXMuX2RyYWdTdGF0ZS5zdGFydFR4ICsgZXZlbnQuY2xpZW50WCAtIHRoaXMuX2RyYWdTdGF0ZS5zdGFydFg7XG4gICAgdGhpcy5fem9vbVN0YXRlLnR5ID0gdGhpcy5fZHJhZ1N0YXRlLnN0YXJ0VHkgKyBldmVudC5jbGllbnRZIC0gdGhpcy5fZHJhZ1N0YXRlLnN0YXJ0WTtcbiAgICB0aGlzLl9jbGFtcFRyYW5zbGF0aW9ucyhzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLl9hcHBseVpvb20oc3dpcGVyRWxlbWVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Qb2ludGVyVXAoZXZlbnQ6IE1vdXNlRXZlbnQsIHN3aXBlckVsZW1lbnQ/OiBhbnkpIHtcbiAgICBpZiAodGhpcy5fY3JvcERyYWdTdGF0ZSkge1xuICAgICAgdGhpcy5vbkNyb3BQb2ludGVyVXAoZXZlbnQsIHN3aXBlckVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2RyYWdTdGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMuX2RyYWdTdGF0ZSA9IG51bGw7XG4gICAgY29uc3Qgd3JhcEVsID0gdGhpcy5fZ2V0QWN0aXZlWm9vbVdyYXBFbChzd2lwZXJFbGVtZW50KTtcbiAgICBpZiAod3JhcEVsKSB3cmFwRWwuc3R5bGUuY3Vyc29yID0gdGhpcy5fem9vbVN0YXRlLnNjYWxlID4gMSA/ICdncmFiJyA6ICcnO1xuICAgIC8vIFJlLWVuYWJsZSBTd2lwZXIgbmF2aWdhdGlvblxuICAgIGNvbnN0IHN3aXBlciA9IHN3aXBlckVsZW1lbnQgPyB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KSA6IG51bGw7XG4gICAgaWYgKHN3aXBlcikge1xuICAgICAgc3dpcGVyLmFsbG93U2xpZGVOZXh0ID0gdHJ1ZTtcbiAgICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9yZXNldFpvb20oc3dpcGVyRWxlbWVudD86IGFueSkge1xuICAgIHRoaXMuX3pvb21TdGF0ZSA9IHsgc2NhbGU6IDEsIHR4OiAwLCB0eTogMCB9O1xuICAgIHRoaXMuX2RyYWdTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5fcm90YXRpb24gPSAwO1xuICAgIHRoaXMuX2Nyb3BSZWN0ID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMSwgaGVpZ2h0OiAxIH07XG4gICAgdGhpcy5fY3JvcERyYWdTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5fY3JvcFRvb2xBY3RpdmUgPSBmYWxzZTtcbiAgICBpZiAoc3dpcGVyRWxlbWVudCkge1xuICAgICAgdGhpcy5fYXBwbHlab29tKHN3aXBlckVsZW1lbnQpO1xuICAgICAgdGhpcy5fdXBkYXRlRWRpdEltYWdlU2l6ZShzd2lwZXJFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NldHVwV2hlZWxab29tKHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMuX2NsZWFudXBXaGVlbFpvb20oKTtcbiAgICBpZiAoIXRoaXMuZW5hYmxlTW91c2Vab29tKSByZXR1cm47XG4gICAgY29uc3QgZWw6IEhUTUxFbGVtZW50ID0gc3dpcGVyRWxlbWVudD8ubmF0aXZlRWxlbWVudCA/PyBzd2lwZXJFbGVtZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcblxuICAgIHRoaXMuX3doZWVsTGlzdGVuZXIgPSAoZXZlbnQ6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBzdGVwID0gdGhpcy53aGVlbFpvb21TdGVwO1xuICAgICAgY29uc3Qgb2xkU2NhbGUgPSB0aGlzLl96b29tU3RhdGUuc2NhbGU7XG4gICAgICBjb25zdCBuZXdTY2FsZSA9IE1hdGgubWF4KDEsIE1hdGgubWluKG9sZFNjYWxlICsgKGV2ZW50LmRlbHRhWSA8IDAgPyBzdGVwIDogLXN0ZXApLCB0aGlzLm1heFpvb21SYXRpbykpO1xuICAgICAgaWYgKG5ld1NjYWxlID09PSBvbGRTY2FsZSkgcmV0dXJuO1xuXG4gICAgICBpZiAobmV3U2NhbGUgPT09IDEpIHtcbiAgICAgICAgdGhpcy5fem9vbVN0YXRlID0geyBzY2FsZTogMSwgdHg6IDAsIHR5OiAwIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBab29tIHRvd2FyZHMgY3Vyc29yIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKGVsKTtcbiAgICAgICAgY29uc3QgYWN0aXZlU2xpZGUgPSBzd2lwZXI/LnNsaWRlcz8uW3N3aXBlci5hY3RpdmVJbmRleF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChhY3RpdmVTbGlkZSkge1xuICAgICAgICAgIGNvbnN0IHJlY3QgPSBhY3RpdmVTbGlkZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICBjb25zdCBjeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSByZWN0LndpZHRoIC8gMjtcbiAgICAgICAgICBjb25zdCBjeSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIHJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgICB0aGlzLl96b29tU3RhdGUudHggPSBjeCAtICgoY3ggLSB0aGlzLl96b29tU3RhdGUudHgpICogbmV3U2NhbGUpIC8gb2xkU2NhbGU7XG4gICAgICAgICAgdGhpcy5fem9vbVN0YXRlLnR5ID0gY3kgLSAoKGN5IC0gdGhpcy5fem9vbVN0YXRlLnR5KSAqIG5ld1NjYWxlKSAvIG9sZFNjYWxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3pvb21TdGF0ZS5zY2FsZSA9IG5ld1NjYWxlO1xuICAgICAgICB0aGlzLl9jbGFtcFRyYW5zbGF0aW9ucyhlbCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9hcHBseVpvb20oZWwpO1xuICAgIH07XG5cbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMuX3doZWVsTGlzdGVuZXIsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgdGhpcy5fd2hlZWxFbCA9IGVsO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jbGVhbnVwV2hlZWxab29tKCkge1xuICAgIGlmICh0aGlzLl93aGVlbEVsICYmIHRoaXMuX3doZWVsTGlzdGVuZXIpIHtcbiAgICAgIHRoaXMuX3doZWVsRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLl93aGVlbExpc3RlbmVyKTtcbiAgICB9XG4gICAgdGhpcy5fd2hlZWxFbCA9IG51bGw7XG4gICAgdGhpcy5fd2hlZWxMaXN0ZW5lciA9IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2FwcGx5Wm9vbShzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBhY3RpdmVTbGlkZSA9IHN3aXBlcj8uc2xpZGVzPy5bc3dpcGVyLmFjdGl2ZUluZGV4XSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWFjdGl2ZVNsaWRlKSByZXR1cm47XG4gICAgY29uc3Qgd3JhcEVsID0gYWN0aXZlU2xpZGUucXVlcnlTZWxlY3RvcignLnN3aXBlci16b29tLWNvbnRhaW5lcicpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGltZ0VsID0gYWN0aXZlU2xpZGUucXVlcnlTZWxlY3RvcignLnN3aXBlci16b29tLXRhcmdldCwgLnN3aXBlci16b29tLWNvbnRhaW5lciA+IGltZycpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghd3JhcEVsIHx8ICFpbWdFbCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc2NhbGUsIHR4LCB0eSB9ID0gdGhpcy5fem9vbVN0YXRlO1xuICAgIHdyYXBFbC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAnMG1zJztcbiAgICB3cmFwRWwuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7dHh9cHgsICR7dHl9cHgsIDApYDtcbiAgICBpbWdFbC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAnMG1zJztcbiAgICBpbWdFbC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoMCwgMCwgMCkgc2NhbGUoJHtzY2FsZX0pIHJvdGF0ZSgke3RoaXMuX3JvdGF0aW9ufWRlZylgO1xuICAgIHdyYXBFbC5zdHlsZS5jdXJzb3IgPSBzY2FsZSA+IDEgPyAnZ3JhYicgOiAnJztcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2xhbXBUcmFuc2xhdGlvbnMoc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3QgYWN0aXZlU2xpZGUgPSBzd2lwZXI/LnNsaWRlcz8uW3N3aXBlci5hY3RpdmVJbmRleF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFhY3RpdmVTbGlkZSkgcmV0dXJuO1xuICAgIGNvbnN0IGltZ0VsID0gYWN0aXZlU2xpZGUucXVlcnlTZWxlY3RvcignLnN3aXBlci16b29tLXRhcmdldCwgLnN3aXBlci16b29tLWNvbnRhaW5lciA+IGltZycpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghaW1nRWwpIHJldHVybjtcbiAgICBjb25zdCBpbWdXID0gaW1nRWwub2Zmc2V0V2lkdGggfHwgaW1nRWwuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgaW1nSCA9IGltZ0VsLm9mZnNldEhlaWdodCB8fCBpbWdFbC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKCFpbWdXIHx8ICFpbWdIKSByZXR1cm47XG4gICAgY29uc3QgeyBzY2FsZSB9ID0gdGhpcy5fem9vbVN0YXRlO1xuICAgIGNvbnN0IG1heFR4ID0gTWF0aC5tYXgoMCwgKGltZ1cgKiBzY2FsZSAtIGFjdGl2ZVNsaWRlLm9mZnNldFdpZHRoKSAvIDIpO1xuICAgIGNvbnN0IG1heFR5ID0gTWF0aC5tYXgoMCwgKGltZ0ggKiBzY2FsZSAtIGFjdGl2ZVNsaWRlLm9mZnNldEhlaWdodCkgLyAyKTtcbiAgICB0aGlzLl96b29tU3RhdGUudHggPSBNYXRoLm1heCgtbWF4VHgsIE1hdGgubWluKG1heFR4LCB0aGlzLl96b29tU3RhdGUudHgpKTtcbiAgICB0aGlzLl96b29tU3RhdGUudHkgPSBNYXRoLm1heCgtbWF4VHksIE1hdGgubWluKG1heFR5LCB0aGlzLl96b29tU3RhdGUudHkpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZ2V0QWN0aXZlWm9vbVdyYXBFbChzd2lwZXJFbGVtZW50OiBhbnkpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IGFjdGl2ZVNsaWRlID0gc3dpcGVyPy5zbGlkZXM/Lltzd2lwZXIuYWN0aXZlSW5kZXhdIGFzIEhUTUxFbGVtZW50O1xuICAgIHJldHVybiBhY3RpdmVTbGlkZT8ucXVlcnlTZWxlY3RvcignLnN3aXBlci16b29tLWNvbnRhaW5lcicpID8/IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxpb24tY29udGVudFxuICBjbGFzcz1cImlvbi1uby1wYWRkaW5nIGlvbi1uby1tYXJnaW5cIlxuICAobW91c2Vkb3duKT1cIm9uUG9pbnRlckRvd24oJGV2ZW50LCBzd2lwZXJDb250YWluZXIpXCJcbiAgKG1vdXNlbW92ZSk9XCJvblBvaW50ZXJNb3ZlKCRldmVudCwgc3dpcGVyQ29udGFpbmVyKVwiXG4gIChtb3VzZXVwKT1cIm9uUG9pbnRlclVwKCRldmVudCwgc3dpcGVyQ29udGFpbmVyKVwiXG4gIChtb3VzZWxlYXZlKT1cIm9uUG9pbnRlclVwKCRldmVudCwgc3dpcGVyQ29udGFpbmVyKVwiXG4gICh0b3VjaG1vdmUpPVwib25Dcm9wUG9pbnRlck1vdmUoJGV2ZW50LCBzd2lwZXJDb250YWluZXIpXCJcbiAgKHRvdWNoZW5kKT1cIm9uQ3JvcFBvaW50ZXJVcCgkZXZlbnQsIHN3aXBlckNvbnRhaW5lcilcIlxuICAodG91Y2hjYW5jZWwpPVwib25Dcm9wUG9pbnRlclVwKCRldmVudCwgc3dpcGVyQ29udGFpbmVyKVwiXG4+XG4gIEBsZXQgY291bnQgPSByb3dzPy5sZW5ndGggfHwgMDtcbiAgPCEtLSBDb3VudGVyICAtLT5cbiAgPGRpdiBjbGFzcz1cInRvcC1sZWZ0XCI+XG4gICAgPGlvbi1sYWJlbCBjb2xvcj1cImxpZ2h0XCI+e3sgYWN0aXZlU2xpZGVJbmRleCArIDEgfX0gLyB7eyBjb3VudCB9fTwvaW9uLWxhYmVsPlxuICA8L2Rpdj5cblxuICA8IS0tIHpvb20gLyByb3RhdGlvbiAvIGNyb3AgYnV0dG9uczogYWxsIHNob3duIHRvZ2V0aGVyLCBubyBcImVudGVyIGVkaXQgbW9kZVwiIHN0ZXAgbmVlZGVkIC0tPlxuICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgQGlmICghbW9iaWxlKSB7XG4gICAgICA8aW9uLWZhYi1idXR0b24gc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cInpvb20oc3dpcGVyQ29udGFpbmVyLCB0cnVlKVwiIGNvbG9yPVwibGlnaHRcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzZWFyY2hcIj48L2lvbi1pY29uPlxuICAgICAgICA8aW9uLWljb24gY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiIG5hbWU9XCJhZGRcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tZmFiLWJ1dHRvbj5cbiAgICAgIDxpb24tZmFiLWJ1dHRvbiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiem9vbShzd2lwZXJDb250YWluZXIsIGZhbHNlKVwiIGNvbG9yPVwibGlnaHRcIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzZWFyY2hcIj48L2lvbi1pY29uPlxuICAgICAgICA8aW9uLWljb24gY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiIG5hbWU9XCJyZW1vdmVcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tZmFiLWJ1dHRvbj5cbiAgICB9XG4gICAgQGlmICghcmVhZE9ubHkgJiYgZW5hYmxlUm90YXRlKSB7XG4gICAgICA8aW9uLWZhYi1idXR0b25cbiAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgKGNsaWNrKT1cInJvdGF0ZShzd2lwZXJDb250YWluZXIsICdsZWZ0JylcIlxuICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICgnSU1BR0UuR0FMTEVSWS5CVE5fUk9UQVRFX0xFRlQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0lNQUdFLkdBTExFUlkuQlROX1JPVEFURV9MRUZUJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5yb3RhdGVfbGVmdDwvbWF0LWljb24+XG4gICAgICA8L2lvbi1mYWItYnV0dG9uPlxuICAgICAgPGlvbi1mYWItYnV0dG9uXG4gICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgIChjbGljayk9XCJyb3RhdGUoc3dpcGVyQ29udGFpbmVyLCAncmlnaHQnKVwiXG4gICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdJTUFHRS5HQUxMRVJZLkJUTl9ST1RBVEVfUklHSFQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0lNQUdFLkdBTExFUlkuQlROX1JPVEFURV9SSUdIVCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+cm90YXRlX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgIDwvaW9uLWZhYi1idXR0b24+XG4gICAgfVxuICAgIEBpZiAoIXJlYWRPbmx5ICYmIGVuYWJsZUNyb3ApIHtcbiAgICAgIDxpb24tZmFiLWJ1dHRvblxuICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ3JvcFRvb2woc3dpcGVyQ29udGFpbmVyKVwiXG4gICAgICAgIFtjb2xvcl09XCJfY3JvcFRvb2xBY3RpdmUgPyAndGVydGlhcnknIDogJ2xpZ2h0J1wiXG4gICAgICAgIFt0aXRsZV09XCJcbiAgICAgICAgICAhc2hvd1Rvb2x0aXBcbiAgICAgICAgICAgID8gKChfY3JvcFRvb2xBY3RpdmUgPyAnSU1BR0UuR0FMTEVSWS5CVE5fQ1JPUF9ERUFDVElWQVRFJyA6ICdJTUFHRS5HQUxMRVJZLkJUTl9DUk9QX0FDVElWQVRFJykgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICA6ICcnXG4gICAgICAgIFwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICAgIHNob3dUb29sdGlwXG4gICAgICAgICAgICA/ICgoX2Nyb3BUb29sQWN0aXZlID8gJ0lNQUdFLkdBTExFUlkuQlROX0NST1BfREVBQ1RJVkFURScgOiAnSU1BR0UuR0FMTEVSWS5CVE5fQ1JPUF9BQ1RJVkFURScpIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgOiAnJ1xuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+Y3JvcDwvbWF0LWljb24+XG4gICAgICA8L2lvbi1mYWItYnV0dG9uPlxuICAgICAgQGlmIChfY3JvcFRvb2xBY3RpdmUpIHtcbiAgICAgICAgPGlvbi1mYWItYnV0dG9uXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAoY2xpY2spPVwicmVzZXRDcm9wKHN3aXBlckNvbnRhaW5lcilcIlxuICAgICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0lNQUdFLkdBTExFUlkuQlROX0NST1BfUkVTRVQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnSU1BR0UuR0FMTEVSWS5CVE5fQ1JPUF9SRVNFVCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmNyb3BfZnJlZTwvbWF0LWljb24+XG4gICAgICAgIDwvaW9uLWZhYi1idXR0b24+XG4gICAgICB9XG4gICAgfVxuICA8L2Rpdj5cblxuICA8IS0tIG5hdmlnYXRpb24gc2lkZSBidXR0b25zIG5leHQvYmFjazogaGlkZGVuIHdoaWxlIGEgY3JvcC9yb3RhdGlvbiBlZGl0IGlzIHBlbmRpbmcsIHRvIGtlZXAgdGhlIGZvY3VzIG9uIHZhbGlkYXRpbmcvY2FuY2VsbGluZyBpdCAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2JpbGUgJiYgIWhhc1BlbmRpbmdFZGl0ICYmIChyb3dzIHwgaXNBcnJheUxlbmd0aDogeyBncmVhdGVyVGhhbjogMSB9KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJzaWRlLWJ1dHRvbnMgcHJldlwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc1ByZXZEaXNhYmxlZFwiIChjbGljayk9XCJzbGlkZVByZXYoc3dpcGVyQ29udGFpbmVyKVwiPlxuICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGV2cm9uLWJhY2tcIj48L2lvbi1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzaWRlLWJ1dHRvbnMgbmV4dFwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc05leHREaXNhYmxlZFwiIChjbGljayk9XCJzbGlkZU5leHQoc3dpcGVyQ29udGFpbmVyKVwiPlxuICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGV2cm9uLWZvcndhcmRcIj48L2lvbi1pY29uPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIGltYWdlIHNsaWRlcyAtLT5cbiAgPHN3aXBlci1jb250YWluZXJcbiAgICAjc3dpcGVyQ29udGFpbmVyXG4gICAgW21vZHVsZXNdPVwic3dpcGVyTW9kdWxlc1wiXG4gICAgW3pvb21dPVwiIWVuYWJsZU1vdXNlWm9vbVwiXG4gICAgW2luaXRpYWxTbGlkZV09XCJzZWxlY3RlZEluZGV4XCJcbiAgICAoc3dpcGVyc2xpZGVjaGFuZ2UpPVwib25TbGlkZUNoYW5nZShzd2lwZXJDb250YWluZXIpXCJcbiAgICAoc3dpcGVyaW5pdCk9XCJvblN3aXBlckluaXQoc3dpcGVyQ29udGFpbmVyKVwiXG4gID5cbiAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93LmlkOyBsZXQgaW5kZXggPSAkaW5kZXgpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzbGlkZVRlbXBsYXRlOyBjb250ZXh0OiB7IGltYWdlOiByb3cuY3VycmVudERhdGEsIGluZGV4IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG4gIDwvc3dpcGVyLWNvbnRhaW5lcj5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxpb24tZm9vdGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJsaWdodFwiPlxuICAgIEBpZiAoIWhhc1BlbmRpbmdFZGl0KSB7XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjRcIiBjbGFzcz1cImlvbi10ZXh0LXN0YXJ0XCI+XG4gICAgICAgICAgQGlmICghcmVhZE9ubHkpIHtcbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZXF1ZXN0RGVsZXRlKHN3aXBlckNvbnRhaW5lcilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzbG90PVwic3RhcnRcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9ERUxFVEUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCI0XCI+PC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiNFwiIGNsYXNzPVwiaW9uLXRleHQtZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cImNsb3NlUmVxdWVzdGVkLmVtaXQoKVwiIGNvbG9yPVwidGVydGlhcnlcIiBmaWxsPVwiY2xlYXJcIiAqbmdJZj1cIm1vYmlsZTsgZWxzZSBkZXNrdG9wXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImNsb3NlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIHt7ICdDT01NT04uQlROX0NMT1NFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rlc2t0b3A+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2VSZXF1ZXN0ZWQuZW1pdCgpXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiPlxuICAgICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9DTE9TRScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8IS0tIEEgY3JvcCBvciByb3RhdGlvbiBjaGFuZ2UgaXMgcGVuZGluZzogYXNrIGZvciBhbiBleHBsaWNpdCB2YWxpZGF0aW9uIGJlZm9yZSBleHBvcnRpbmcgdGhlIGltYWdlIC0tPlxuICAgICAgPGlvbi1yb3c+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiIGNsYXNzPVwiaW9uLXRleHQtZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJkaXNjYXJkRWRpdChzd2lwZXJDb250YWluZXIpXCJcbiAgICAgICAgICAgIGNvbG9yPVwiZGFya1wiXG4gICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICgnSU1BR0UuR0FMTEVSWS5CVE5fQ0FOQ0VMX0VESVQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdJTUFHRS5HQUxMRVJZLkJUTl9DQU5DRUxfRURJVCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYXJyb3ctdW5kb1wiPjwvaW9uLWljb24+XG4gICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9DQU5DRUwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJ2YWxpZGF0ZUVkaXQoc3dpcGVyQ29udGFpbmVyKVwiIGNvbG9yPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImNoZWNrbWFya1wiPjwvaW9uLWljb24+XG4gICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9WQUxJREFURScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICB9XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1mb290ZXI+XG5cbjxuZy10ZW1wbGF0ZSAjc2xpZGVUZW1wbGF0ZSBsZXQtaW1hZ2U9XCJpbWFnZVwiIGxldC1pbmRleD1cImluZGV4XCI+XG4gIDxzd2lwZXItc2xpZGU+XG4gICAgPGRpdiBjbGFzcz1cInN3aXBlci16b29tLWNvbnRhaW5lclwiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFfc3dpcGVyICYmIGluZGV4ICE9PSBzZWxlY3RlZEluZGV4XCI+XG5cbiAgICAgIDwhLS0gdGhlIGltYWdlIC0tPlxuICAgICAgQGlmIChpbWFnZT8udXJsKSB7XG4gICAgICAgIDxpb24taW1nIGNsYXNzPVwic3dpcGVyLXpvb20tdGFyZ2V0XCIgW3NyY109XCJpbWFnZS51cmwgfCBhcHBlbmRRdWVyeVBhcmFtczogZ2V0SW1hZ2VTaXplUXVlcnlQYXJhbXMoKVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGltZyBbc3JjXT1cImltYWdlLmRhdGFVcmxcIiBbYWx0XT1cImltYWdlLnRpdGxlXCIgLz5cbiAgICAgIH1cblxuICAgICAgPCEtLSBjcm9wIG92ZXJsYXk6IG9ubHkgcmVuZGVyZWQgZm9yIHRoZSBhY3RpdmUgc2xpZGUgLS0+XG4gICAgICBAaWYgKCFyZWFkT25seSAmJiBlbmFibGVDcm9wICYmIF9jcm9wVG9vbEFjdGl2ZSAmJiBpbmRleCA9PT0gYWN0aXZlU2xpZGVJbmRleCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjcm9wLW92ZXJsYXlcIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwib25Dcm9wUG9pbnRlckRvd24oJGV2ZW50LCBzd2lwZXJDb250YWluZXIsICdtb3ZlJylcIlxuICAgICAgICAgICh0b3VjaHN0YXJ0KT1cIm9uQ3JvcFBvaW50ZXJEb3duKCRldmVudCwgc3dpcGVyQ29udGFpbmVyLCAnbW92ZScpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gZGFya2VuZWQgbWFzayBhcm91bmQgdGhlIHNlbGVjdGlvbjogY2xpcHBlZCB0byB0aGUgaW1hZ2UgYm91bmRzIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcm9wLW1hc2tcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcm9wLW1hc2stcmVjdFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwiX2Nyb3BSZWN0LnggKiAxMDBcIlxuICAgICAgICAgICAgICBbc3R5bGUudG9wLiVdPVwiX2Nyb3BSZWN0LnkgKiAxMDBcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJfY3JvcFJlY3Qud2lkdGggKiAxMDBcIlxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LiVdPVwiX2Nyb3BSZWN0LmhlaWdodCAqIDEwMFwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIGludGVyYWN0aXZlIHNlbGVjdGlvbiBib3JkZXIsIGdyaWQgJiBkcmFnIGhhbmRsZXM6IG5ldmVyIGNsaXBwZWQsIHNvIGNvcm5lci9lZGdlIGhhbmRsZXNcbiAgICAgICAgICAgICAgIHJlbWFpbiBmdWxseSBncmFiYmFibGUgZXZlbiB3aGVuIHRoZSBzZWxlY3Rpb24gdG91Y2hlcyB0aGUgaW1hZ2UgYm91bmRzIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY3JvcC1yZWN0XCJcbiAgICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwiX2Nyb3BSZWN0LnggKiAxMDBcIlxuICAgICAgICAgICAgW3N0eWxlLnRvcC4lXT1cIl9jcm9wUmVjdC55ICogMTAwXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cIl9jcm9wUmVjdC53aWR0aCAqIDEwMFwiXG4gICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LiVdPVwiX2Nyb3BSZWN0LmhlaWdodCAqIDEwMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNyb3AtZ3JpZFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpbmUgdlwiIHN0eWxlPVwibGVmdDogMzMuMzMzJVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaW5lIHZcIiBzdHlsZT1cImxlZnQ6IDY2LjY2NiVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGluZSBoXCIgc3R5bGU9XCJ0b3A6IDMzLjMzMyVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGluZSBoXCIgc3R5bGU9XCJ0b3A6IDY2LjY2NiVcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBmb3IgKGhhbmRsZSBvZiBfY3JvcEhhbmRsZXM7IHRyYWNrIGhhbmRsZSkge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcm9wLWhhbmRsZSB7eyBoYW5kbGUgfX1cIlxuICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Dcm9wUG9pbnRlckRvd24oJGV2ZW50LCBzd2lwZXJDb250YWluZXIsIGhhbmRsZSlcIlxuICAgICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cIm9uQ3JvcFBvaW50ZXJEb3duKCRldmVudCwgc3dpcGVyQ29udGFpbmVyLCBoYW5kbGUpXCJcbiAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9zd2lwZXItc2xpZGU+XG48L25nLXRlbXBsYXRlPlxuIl19