@sumaris-net/ngx-components 18.26.10 → 18.26.12

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
+ _activeIndex = 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
@@ -44,6 +44,9 @@ export class AppImageGallerySlideshowComponent {
44
44
  // Set by slidePrev()/slideNext() just before asking Swiper to move, so onSlideChange() can tell apart
45
45
  // a "step" from a "wrap" unambiguously (with exactly 2 slides, both produce the very same index change).
46
46
  _pendingSlideDirection = null;
47
+ get activeIndex() {
48
+ return this._activeIndex ?? this.selectedIndex;
49
+ }
47
50
  rows = [];
48
51
  selectedIndex = 0;
49
52
  mobile = false;
@@ -85,10 +88,10 @@ export class AppImageGallerySlideshowComponent {
85
88
  }
86
89
  /** No "fetch previous page" concept exists: reaching the first slide can only loop, or stop. */
87
90
  get isPrevDisabled() {
88
- return !this.enableLoop && this.activeSlideIndex === 0;
91
+ return !this.enableLoop && this._activeIndex === 0;
89
92
  }
90
93
  get isNextDisabled() {
91
- return !this.enableLoop && !this.canFetchMore && this.activeSlideIndex === this.rows.length - 1;
94
+ return !this.enableLoop && !this.canFetchMore && this._activeIndex === this.rows.length - 1;
92
95
  }
93
96
  constructor(alterCtrl, translate, cd) {
94
97
  this.alterCtrl = alterCtrl;
@@ -102,6 +105,10 @@ export class AppImageGallerySlideshowComponent {
102
105
  this._swiper = (swiperElement || this.swiperRef?.nativeElement)?.swiper || this._swiper;
103
106
  return this._swiper;
104
107
  }
108
+ async waitForSwiper(swiperElement, waitForOptions) {
109
+ await waitFor(() => !!this.getSwiper(swiperElement), { checkPeriod: 50, timeout: 500, ...waitForOptions });
110
+ return this._swiper;
111
+ }
105
112
  /**
106
113
  * Waits (a few animation frames) until Swiper's own slides array reflects at least `minCount` items.
107
114
  * Needed after `fetchMore`: the new `<swiper-slide>` elements come from the `rows` input re-rendering,
@@ -120,7 +127,7 @@ export class AppImageGallerySlideshowComponent {
120
127
  const swiper = this.getSwiper(swiperElement);
121
128
  const previousIndex = swiper.previousIndex;
122
129
  const activeIndex = swiper.activeIndex;
123
- this.activeSlideIndex = activeIndex;
130
+ this._activeIndex = activeIndex;
124
131
  this._resetZoom(swiperElement);
125
132
  this._updateSwiperTouchMove(swiperElement);
126
133
  this.markForCheck();
@@ -141,19 +148,20 @@ export class AppImageGallerySlideshowComponent {
141
148
  const event = { index: activeIndex, row: this.rows?.[activeIndex] };
142
149
  (isNext ? this.nextSlide : this.previousSlide).emit(event);
143
150
  }
144
- onSwiperInit(swiperElement) {
145
- this._resetZoom();
146
- const swiper = this.getSwiper(swiperElement);
151
+ async onSwiperInit(swiperElement) {
152
+ this._resetZoom(swiperElement);
153
+ // Get the swiper
154
+ const swiper = await this.waitForSwiper(swiperElement, { timeout: 1000 });
147
155
  // The `initialSlide` binding can NOT work here: Angular inserts <swiper-container> into the DOM (which
148
156
  // synchronously runs its connectedCallback, constructing the Swiper instance and reading `initialSlide`
149
157
  // off the element) *before* it applies property bindings in its update pass -- so Swiper always reads
150
158
  // `initialSlide` as unset (0). It must be corrected explicitly, once Swiper actually exists.
151
- if (swiper && this.selectedIndex > 0 && swiper.activeIndex !== this.selectedIndex) {
159
+ if (this.selectedIndex > 0 && swiper && swiper.activeIndex !== this.selectedIndex) {
152
160
  swiper.slideTo(this.selectedIndex, 0 /*no transition, to avoid a "revert" effect*/);
153
161
  }
154
- this.activeSlideIndex = swiper?.activeIndex ?? this.selectedIndex;
162
+ this._activeIndex = swiper?.activeIndex ?? this.selectedIndex;
155
163
  if (this.debug)
156
- console.debug(`[image-gallery-slideshow] Initializing slideshow, activeSlideIndex=${this.activeSlideIndex}`);
164
+ console.debug(`[image-gallery-slideshow] Initializing slideshow, activeSlideIndex=${this._activeIndex}`);
157
165
  this._setupWheelZoom(swiperElement);
158
166
  this._updateSwiperTouchMove(swiperElement);
159
167
  this.markForCheck();
@@ -227,7 +235,9 @@ export class AppImageGallerySlideshowComponent {
227
235
  }
228
236
  async slidePrev(swiperElement) {
229
237
  const swiper = this.getSwiper(swiperElement);
230
- const activeIndex = swiper.activeIndex;
238
+ if (!swiper)
239
+ return;
240
+ const activeIndex = swiper?.activeIndex ?? this.selectedIndex;
231
241
  if (activeIndex === 0) {
232
242
  // No previous page concept (pagination only ever loads forward): just loop, or stay put
233
243
  if (!this.enableLoop)
@@ -242,6 +252,8 @@ export class AppImageGallerySlideshowComponent {
242
252
  }
243
253
  async slideNext(swiperElement) {
244
254
  const swiper = this.getSwiper(swiperElement);
255
+ if (!swiper)
256
+ return;
245
257
  const activeIndex = swiper.activeIndex;
246
258
  if (activeIndex === this.rows.length - 1) {
247
259
  // Try fetching a further page first, before falling back to looping/stopping
@@ -722,11 +734,11 @@ export class AppImageGallerySlideshowComponent {
722
734
  this.cd.markForCheck();
723
735
  }
724
736
  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 });
737
+ 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\">{{ _activeIndex + 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 === _activeIndex) {\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
738
  }
727
739
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppImageGallerySlideshowComponent, decorators: [{
728
740
  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"] }]
741
+ 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\">{{ _activeIndex + 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 === _activeIndex) {\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
742
  }], ctorParameters: () => [{ type: i1.AlertController }, { type: i2.TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { rows: [{
731
743
  type: Input
732
744
  }], selectedIndex: [{
@@ -786,9 +798,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
786
798
  type: Output
787
799
  }], swiperRef: [{
788
800
  type: ViewChild,
789
- args: ['slideshowSwiper']
801
+ args: ['swiperContainer']
790
802
  }], onWindowResize: [{
791
803
  type: HostListener,
792
804
  args: ['window:resize']
793
805
  }] } });
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=
806
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9zbGlkZXNob3cvaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9zbGlkZXNob3cvaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxPQUFPLEVBQUMsT0FBTyxFQUFpQixNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7QUFZN0Q7Ozs7R0FJRztBQU9ILE1BQU0sT0FBTyxpQ0FBaUM7SUFzRmhDO0lBQ0E7SUFDQTtJQXZGRixPQUFPLENBQVM7SUFDaEIsYUFBYSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUIsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUUzQixvQ0FBb0M7SUFDMUIsVUFBVSxHQUFHLEVBQUUsS0FBSyxFQUFF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LEtBQUssR0FBRyxFQUFFLENBQUM7UUFDckIsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV0Qyw0QkFBNEI7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU1RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELFNBQVMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFB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aUJBQWlCO2dCQXNTbEIsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRhYmxlRWxlbWVudCB9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIsIElvbmljU2xpZGVzIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3dpcGVyIH0gZnJvbSAnc3dpcGVyL3R5cGVzJztcbmltcG9ydCB7IEltYWdlLCBJbWFnZVNpemUgfSBmcm9tICcuLi8uLi9pbWFnZS5tb2RlbCc7XG5pbXBvcnQgeyBpc05pbE9yQmxhbmsgfSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlciwgZW1pdFByb21pc2VFdmVudCB9IGZyb20gJy4uLy4uLy4uL2V2ZW50cyc7XG5pbXBvcnQgeyBBbGVydHMgfSBmcm9tICcuLi8uLi8uLi9hbGVydHMnO1xuaW1wb3J0IHsgQVBQX1NIT1dfVE9PTFRJUCB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge0ltYWdlRWRpdEV2ZW50LCBJbWFnZUVkaXRGb3JtYXQsIEltYWdlR2FsbGVyeVNsaWRlQ2hhbmdlRXZlbnR9IGZyb20gJy4uL2ltYWdlLWdhbGxlcnkubW9kZWwnO1xuaW1wb3J0IHt3YWl0Rm9yLCBXYWl0Rm9yT3B0aW9uc30gZnJvbSAnLi4vLi4vLi4vb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtmYWRlSW5BbmltYXRpb24sIGZhZGVJblNsb3dBbmltYXRpb259IGZyb20gJy4uLy4uLy4uL21hdGVyaWFsL21hdGVyaWFsLmFuaW1hdGlvbnMnO1xuXG5pbnRlcmZhY2UgQ3JvcFJlY3Qge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbnR5cGUgQ3JvcEhhbmRsZSA9ICdtb3ZlJyB8ICdudycgfCAnbicgfCAnbmUnIHwgJ2UnIHwgJ3NlJyB8ICdzJyB8ICdzdycgfCAndyc7XG5cbi8qKlxuICogVGhlIHpvb20vcGFuL3JvdGF0ZS9jcm9wIHNsaWRlc2hvdyBzaG93biB3aGVuIGNsaWNraW5nIGFuIGltYWdlIGluIGBBcHBJbWFnZUdhbGxlcnlDb21wb25lbnRgLlxuICogRXh0cmFjdGVkIGludG8gaXRzIG93biBjb21wb25lbnQgc28gdGhlIGV4YWN0IHNhbWUgc2xpZGVzaG93IGNhbiBiZSBwcmVzZW50ZWQgZWl0aGVyIGluc2lkZSBhblxuICogYGlvbi1tb2RhbGAgKGRlZmF1bHQpLCBvciBpbmxpbmUgYXMgYW4gb3ZlcmxheSBkaXJlY3RseSB3aXRoaW4gdGhlIGdhbGxlcnksIHdpdGhvdXQgYW55IGR1cGxpY2F0aW9uLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1nYWxsZXJ5LXNsaWRlc2hvdy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBBcHBJbWFnZUdhbGxlcnlTbGlkZXNob3dDb21wb25lbnQ8VCBleHRlbmRzIEltYWdlID0gSW1hZ2U+IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIF9zd2lwZXI6IFN3aXBlcjtcbiAgcHJvdGVjdGVkIHN3aXBlck1vZHVsZXMgPSBbSW9uaWNTbGlkZXNdO1xuICBwcm90ZWN0ZWQgX2FjdGl2ZUluZGV4ID0gMDtcblxuICAvLyBNb3VzZSB3aGVlbCB6b29tICYgcm90YXRpb24gc3RhdGVcbiAgcHJvdGVjdGVkIF96b29tU3RhdGUgPSB7IHNjYWxlOiAxLCB0eDogMCwgdHk6IDAgfTtcbiAgcHJvdGVjdGVkIF9yb3RhdGlvbiA9IDA7IC8vIGRlZ3JlZXM6IDAsIDkwLCAxODAsIDI3MFxuICBwcm90ZWN0ZWQgX2RyYWdTdGF0ZTogeyBzdGFydFg6IG51bWJlcjsgc3RhcnRZOiBudW1iZXI7IHN0YXJ0VHg6IG51bWJlcjsgc3RhcnRUeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIF93aGVlbExpc3RlbmVyOiAoKGU6IFdoZWVsRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBfd2hlZWxFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyBDcm9wICYgcm90YXRlIHN0YXRlLiBSb3RhdGlvbiBpcyBhbHdheXMgYXZhaWxhYmxlOyB0aGUgY3JvcCBncmlkL2hhbmRsZXMgb25seSBzaG93IG9uY2UgdGhlXG4gIC8vIGNyb3AgdG9vbCBoYXMgYmVlbiBleHBsaWNpdGx5IGFjdGl2YXRlZCAoZmFiIGJ1dHRvbikuIFZhbGlkYXRlL2NhbmNlbCBzaG93IHVwIG9uY2Ugc29tZXRoaW5nIGNoYW5nZWQuXG4gIC8vIEluc2V0IGFwcGxpZWQgdG8gdGhlIGNyb3Agc2VsZWN0aW9uIGFzIHNvb24gYXMgdGhlIHRvb2wgaXMgYWN0aXZhdGVkIChvciByZXNldCksIHNvIHRoZSByZXNpemVcbiAgLy8gaGFuZGxlcyBzdGFydCBhd2F5IGZyb20gdGhlIGltYWdlIGVkZ2VzLCB3aGVyZSB0aGV5IGFyZSBoYXJkIHRvIGdyYWIuXG4gIHByb3RlY3RlZCByZWFkb25seSBfZGVmYXVsdENyb3BJbnNldCA9IDAuMTU7XG4gIHByb3RlY3RlZCBfY3JvcFRvb2xBY3RpdmUgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9jcm9wUmVjdDogQ3JvcFJlY3QgPSB7IHg6IDAsIHk6IDAsIHdpZHRoOiAxLCBoZWlnaHQ6IDEgfTtcbiAgcHJvdGVjdGVkIF9jcm9wT3ZlcmxheVJlY3Q6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgX2Nyb3BEcmFnU3RhdGU6IHsgaGFuZGxlOiBDcm9wSGFuZGxlOyBzdGFydFg6IG51bWJlcjsgc3RhcnRZOiBudW1iZXI7IHN0YXJ0UmVjdDogQ3JvcFJlY3QgfSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Nyb3BIYW5kbGVzOiBDcm9wSGFuZGxlW10gPSBbJ253JywgJ24nLCAnbmUnLCAnZScsICdzZScsICdzJywgJ3N3JywgJ3cnXTtcblxuICAvLyBTZXQgYnkgc2xpZGVQcmV2KCkvc2xpZGVOZXh0KCkganVzdCBiZWZvcmUgYXNraW5nIFN3aXBlciB0byBtb3ZlLCBzbyBvblNsaWRlQ2hhbmdlKCkgY2FuIHRlbGwgYXBhcnRcbiAgLy8gYSBcInN0ZXBcIiBmcm9tIGEgXCJ3cmFwXCIgdW5hbWJpZ3VvdXNseSAod2l0aCBleGFjdGx5IDIgc2xpZGVzLCBib3RoIHByb2R1Y2UgdGhlIHZlcnkgc2FtZSBpbmRleCBjaGFuZ2UpLlxuICBwcm90ZWN0ZWQgX3BlbmRpbmdTbGlkZURpcmVjdGlvbjogJ3ByZXYnIHwgJ25leHQnIHwgbnVsbCA9IG51bGw7XG5cbiAgZ2V0IGFjdGl2ZUluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVJbmRleCA/PyB0aGlzLnNlbGVjdGVkSW5kZXg7XG4gIH1cblxuICBASW5wdXQoKSByb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSB8IFJlYWRvbmx5QXJyYXk8VGFibGVFbGVtZW50PFQ+PiA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3RlZEluZGV4ID0gMDtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9iaWxlID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZWFkT25seSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlYnVnID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBlbmFibGVNb3VzZVpvb20gPSBmYWxzZTtcbiAgQElucHV0KCkgd2hlZWxab29tU3RlcCA9IDAuMztcbiAgQElucHV0KCkgbWF4Wm9vbVJhdGlvID0gMztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZVJvdGF0ZSA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBlbmFibGVDcm9wID0gdHJ1ZTtcbiAgQElucHV0KCkgZWRpdGlvbkZvcm1hdDogSW1hZ2VFZGl0Rm9ybWF0ID0gJ3BuZyc7XG4gIEBJbnB1dCgpIGVkaXRpb25RdWFsaXR5ID0gMC45MjtcbiAgQElucHV0KCkgaW1hZ2VTaXplUXVlcnlQYXJhbSA9ICdzaXplJztcbiAgQElucHV0KCkgbW9kYWxJbWFnZVNpemU6IEltYWdlU2l6ZSB8IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgcmVhY2hpbmcgdGhlIGxhc3QgKHJlc3AuIGZpcnN0KSBzbGlkZSBzaG91bGQgd3JhcCBhcm91bmQgdG8gdGhlIGZpcnN0IChyZXNwLiBsYXN0KSBvbmUuIERlZmF1bHQgdHJ1ZS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZUxvb3AgPSB0cnVlO1xuICAvKiogV2hldGhlciBtb3JlIHJvd3MgbWF5IGV4aXN0IGJleW9uZCB0aGUgb25lcyBjdXJyZW50bHkgbG9hZGVkIChlLmcuIGEgZnVydGhlciBwYWdlLCBub3QgeWV0IGZldGNoZWQpLiBXaGVuIHRydWUsIHJlYWNoaW5nIHRoZSBsYXN0IHNsaWRlIGFza3MgdGhlIHBhcmVudCAodmlhIGBmZXRjaE1vcmVgKSBpbnN0ZWFkIG9mIGxvb3Bpbmcvc3RvcHBpbmcuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjYW5GZXRjaE1vcmUgPSBmYWxzZTtcblxuICAvKiogUmVxdWVzdHMgZGVsZXRpb24gb2YgdGhlIGdpdmVuIHJvdy4gVGhlIGNhbGxlciAoZ2FsbGVyeSkgb3ducyB0aGUgY29uZmlybWF0aW9uL2RlbGV0aW9uIGxvZ2ljIGFuZCByZXNvbHZlcyB0aGUgcHJvbWlzZSB3aXRoIHdoZXRoZXIgaXQgYWN0dWFsbHkgaGFwcGVuZWQuICovXG4gIEBPdXRwdXQoKSBkZWxldGVSZXF1ZXN0ZWQgPSBjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyPGJvb2xlYW4sIHsgcm93OiBUYWJsZUVsZW1lbnQ8VD4gfT4oKTtcbiAgQE91dHB1dCgpIGNsb3NlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgYWZ0ZXJFZGl0SW1hZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEltYWdlRWRpdEV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgYWZ0ZXJFZGl0Um93ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUVsZW1lbnQ8VD4+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW5ldmVyIHRoZSBhY3RpdmUgc2xpZGUgbW92ZXMgYmFja3dhcmQgKHByZXZpb3VzIGltYWdlKSwgd2hldGhlciB0cmlnZ2VyZWQgYnkgdGhlIHNpZGUgYnV0dG9uLCBhIHN3aXBlLCBvciBsb29waW5nIHBhc3QgdGhlIGZpcnN0IHNsaWRlLiAqL1xuICBAT3V0cHV0KCkgcHJldmlvdXNTbGlkZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VHYWxsZXJ5U2xpZGVDaGFuZ2VFdmVudDxUPj4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbmV2ZXIgdGhlIGFjdGl2ZSBzbGlkZSBtb3ZlcyBmb3J3YXJkIChuZXh0IGltYWdlKSwgd2hldGhlciB0cmlnZ2VyZWQgYnkgdGhlIHNpZGUgYnV0dG9uLCBhIHN3aXBlLCBvciBsb29waW5nIHBhc3QgdGhlIGxhc3Qgc2xpZGUuICovXG4gIEBPdXRwdXQoKSBuZXh0U2xpZGUgPSBuZXcgRXZlbnRFbWl0dGVyPEltYWdlR2FsbGVyeVNsaWRlQ2hhbmdlRXZlbnQ8VD4+KCk7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gcmVhY2hpbmcgdGhlIGxhc3Qgc2xpZGUgd2hpbGUgYGNhbkZldGNoTW9yZWAgaXMgdHJ1ZTogdGhlIHBhcmVudCBpcyBleHBlY3RlZCB0byBmZXRjaFxuICAgKiB0aGUgbmV4dCBwYWdlIChob3dldmVyIGl0IGRvZXMgc28pIGFuZCByZXNvbHZlIHdpdGggd2hldGhlciBuZXcgcm93cyB3ZXJlIGFjdHVhbGx5IGFkZGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIGZldGNoTW9yZSA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwgdm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCdzd2lwZXJDb250YWluZXInKSBzd2lwZXJSZWY6IEVsZW1lbnRSZWY7XG5cbiAgc2hvd1Rvb2x0aXAgPSBpbmplY3QoQVBQX1NIT1dfVE9PTFRJUCwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBwcm90ZWN0ZWQgZ2V0IGhhc1BlbmRpbmdFZGl0KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHIgPSB0aGlzLl9jcm9wUmVjdDtcbiAgICByZXR1cm4gdGhpcy5fcm90YXRpb24gIT09IDAgfHwgci54ICE9PSAwIHx8IHIueSAhPT0gMCB8fCByLndpZHRoICE9PSAxIHx8IHIuaGVpZ2h0ICE9PSAxO1xuICB9XG5cbiAgLyoqIE5vIFwiZmV0Y2ggcHJldmlvdXMgcGFnZVwiIGNvbmNlcHQgZXhpc3RzOiByZWFjaGluZyB0aGUgZmlyc3Qgc2xpZGUgY2FuIG9ubHkgbG9vcCwgb3Igc3RvcC4gKi9cbiAgcHJvdGVjdGVkIGdldCBpc1ByZXZEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZW5hYmxlTG9vcCAmJiB0aGlzLl9hY3RpdmVJbmRleCA9PT0gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNOZXh0RGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmVuYWJsZUxvb3AgJiYgIXRoaXMuY2FuRmV0Y2hNb3JlICYmIHRoaXMuX2FjdGl2ZUluZGV4ID09PSB0aGlzLnJvd3MubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBhbHRlckN0cmw6IEFsZXJ0Q29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2NsZWFudXBXaGVlbFpvb20oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTd2lwZXIoc3dpcGVyRWxlbWVudD86IGFueSk6IFN3aXBlciB7XG4gICAgdGhpcy5fc3dpcGVyID0gKHN3aXBlckVsZW1lbnQgfHwgdGhpcy5zd2lwZXJSZWY/Lm5hdGl2ZUVsZW1lbnQpPy5zd2lwZXIgfHwgdGhpcy5fc3dpcGVyO1xuICAgIHJldHVybiB0aGlzLl9zd2lwZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgd2FpdEZvclN3aXBlcihzd2lwZXJFbGVtZW50PzogYW55LCB3YWl0Rm9yT3B0aW9ucz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTxTd2lwZXI+IHtcbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+ICEhdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCksIHtjaGVja1BlcmlvZDogNTAsIHRpbWVvdXQ6IDUwMCwgLi4ud2FpdEZvck9wdGlvbnN9KVxuICAgIHJldHVybiB0aGlzLl9zd2lwZXI7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgKGEgZmV3IGFuaW1hdGlvbiBmcmFtZXMpIHVudGlsIFN3aXBlcidzIG93biBzbGlkZXMgYXJyYXkgcmVmbGVjdHMgYXQgbGVhc3QgYG1pbkNvdW50YCBpdGVtcy5cbiAgICogTmVlZGVkIGFmdGVyIGBmZXRjaE1vcmVgOiB0aGUgbmV3IGA8c3dpcGVyLXNsaWRlPmAgZWxlbWVudHMgY29tZSBmcm9tIHRoZSBgcm93c2AgaW5wdXQgcmUtcmVuZGVyaW5nLFxuICAgKiB3aGljaCBtYXkgbm90IGhhdmUgcmVhY2hlZCB0aGUgRE9NIGJ5IHRoZSB0aW1lIHRoZSBwYXJlbnQncyByZXR1cm5lZCBwcm9taXNlIHJlc29sdmVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIF93YWl0Rm9yU2xpZGVDb3VudChzd2lwZXI6IFN3aXBlciwgbWluQ291bnQ6IG51bWJlciwgcmV0cmllc0xlZnQgPSAzMCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICgoc3dpcGVyLnNsaWRlcz8ubGVuZ3RoID8/IDApID49IG1pbkNvdW50KSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgIGlmIChyZXRyaWVzTGVmdCA8PSAwKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKHRoaXMuX3dhaXRGb3JTbGlkZUNvdW50KHN3aXBlciwgbWluQ291bnQsIHJldHJpZXNMZWZ0IC0gMSkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNsaWRlQ2hhbmdlKHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBzd2lwZXIucHJldmlvdXNJbmRleDtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICB0aGlzLl9hY3RpdmVJbmRleCA9IGFjdGl2ZUluZGV4O1xuICAgIHRoaXMuX3Jlc2V0Wm9vbShzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLl91cGRhdGVTd2lwZXJUb3VjaE1vdmUoc3dpcGVyRWxlbWVudCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLl9lbWl0U2xpZGVDaGFuZ2UocHJldmlvdXNJbmRleCwgYWN0aXZlSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGBwcmV2aW91c1NsaWRlYC9gbmV4dFNsaWRlYCBmcm9tIHRoZSBhY3R1YWwgaW5kZXggY2hhbmdlLCBjb3ZlcmluZyBzaWRlIGJ1dHRvbnMgYXMgd2VsbCBhcyB0b3VjaFxuICAgKiBzd2lwZXMuIFdoZW4gYHNsaWRlUHJldigpYC9gc2xpZGVOZXh0KClgIHRyaWdnZXJlZCB0aGUgY2hhbmdlLCB0aGVpciBleHBsaWNpdCBpbnRlbnQgaXMgdXNlZCAoc2luY2Ugd2l0aFxuICAgKiBleGFjdGx5IDIgc2xpZGVzLCBhIFwic3RlcFwiIGFuZCBhIG1hbnVhbCBcIndyYXBcIiBwcm9kdWNlIHRoZSB2ZXJ5IHNhbWUgaW5kZXggY2hhbmdlIGFuZCBjYW4ndCBiZSB0b2xkIGFwYXJ0XG4gICAqIGZyb20gdGhlIGluZGV4ZXMgYWxvbmUpLiBPdGhlcndpc2UgKGEgcGxhaW4gdG91Y2ggc3dpcGUpIFN3aXBlciBuZXZlciB3cmFwcyBvbiBpdHMgb3duIChubyBgbG9vcGAgbW9kZVxuICAgKiBjb25maWd1cmVkIGhlcmUpLCBzbyBhIHNpbXBsZSBpbmRleCBjb21wYXJpc29uIGlzIHVuYW1iaWd1b3VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9lbWl0U2xpZGVDaGFuZ2UocHJldmlvdXNJbmRleDogbnVtYmVyLCBhY3RpdmVJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHByZXZpb3VzSW5kZXggPT09IGFjdGl2ZUluZGV4KSByZXR1cm47XG4gICAgY29uc3QgaXNOZXh0ID0gdGhpcy5fcGVuZGluZ1NsaWRlRGlyZWN0aW9uID8gdGhpcy5fcGVuZGluZ1NsaWRlRGlyZWN0aW9uID09PSAnbmV4dCcgOiBhY3RpdmVJbmRleCA+IHByZXZpb3VzSW5kZXg7XG4gICAgdGhpcy5fcGVuZGluZ1NsaWRlRGlyZWN0aW9uID0gbnVsbDtcbiAgICBjb25zdCBldmVudDogSW1hZ2VHYWxsZXJ5U2xpZGVDaGFuZ2VFdmVudDxUPiA9IHsgaW5kZXg6IGFjdGl2ZUluZGV4LCByb3c6IHRoaXMucm93cz8uW2FjdGl2ZUluZGV4XSB9O1xuICAgIChpc05leHQgPyB0aGlzLm5leHRTbGlkZSA6IHRoaXMucHJldmlvdXNTbGlkZSkuZW1pdChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgb25Td2lwZXJJbml0KHN3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMuX3Jlc2V0Wm9vbShzd2lwZXJFbGVtZW50KTtcblxuICAgIC8vIEdldCB0aGUgc3dpcGVyXG4gICAgY29uc3Qgc3dpcGVyID0gYXdhaXQgdGhpcy53YWl0Rm9yU3dpcGVyKHN3aXBlckVsZW1lbnQsIHt0aW1lb3V0OiAxMDAwfSk7XG5cbiAgICAvLyBUaGUgYGluaXRpYWxTbGlkZWAgYmluZGluZyBjYW4gTk9UIHdvcmsgaGVyZTogQW5ndWxhciBpbnNlcnRzIDxzd2lwZXItY29udGFpbmVyPiBpbnRvIHRoZSBET00gKHdoaWNoXG4gICAgLy8gc3luY2hyb25vdXNseSBydW5zIGl0cyBjb25uZWN0ZWRDYWxsYmFjaywgY29uc3RydWN0aW5nIHRoZSBTd2lwZXIgaW5zdGFuY2UgYW5kIHJlYWRpbmcgYGluaXRpYWxTbGlkZWBcbiAgICAvLyBvZmYgdGhlIGVsZW1lbnQpICpiZWZvcmUqIGl0IGFwcGxpZXMgcHJvcGVydHkgYmluZGluZ3MgaW4gaXRzIHVwZGF0ZSBwYXNzIC0tIHNvIFN3aXBlciBhbHdheXMgcmVhZHNcbiAgICAvLyBgaW5pdGlhbFNsaWRlYCBhcyB1bnNldCAoMCkuIEl0IG11c3QgYmUgY29ycmVjdGVkIGV4cGxpY2l0bHksIG9uY2UgU3dpcGVyIGFjdHVhbGx5IGV4aXN0cy5cbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4ID4gMCAmJiBzd2lwZXIgJiYgc3dpcGVyLmFjdGl2ZUluZGV4ICE9PSB0aGlzLnNlbGVjdGVkSW5kZXgpIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHRoaXMuc2VsZWN0ZWRJbmRleCwgMCAvKm5vIHRyYW5zaXRpb24sIHRvIGF2b2lkIGEgXCJyZXZlcnRcIiBlZmZlY3QqLyk7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZUluZGV4ID0gc3dpcGVyPy5hY3RpdmVJbmRleCA/PyB0aGlzLnNlbGVjdGVkSW5kZXg7XG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFtpbWFnZS1nYWxsZXJ5LXNsaWRlc2hvd10gSW5pdGlhbGl6aW5nIHNsaWRlc2hvdywgYWN0aXZlU2xpZGVJbmRleD0ke3RoaXMuX2FjdGl2ZUluZGV4fWApO1xuICAgIHRoaXMuX3NldHVwV2hlZWxab29tKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMuX3VwZGF0ZVN3aXBlclRvdWNoTW92ZShzd2lwZXJFbGVtZW50KTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlRWRpdEltYWdlU2l6ZShzd2lwZXJFbGVtZW50KTtcbiAgICAgIHRoaXMuX3VwZGF0ZUNyb3BPdmVybGF5UG9zaXRpb24oc3dpcGVyRWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3dpcGVyJ3Mgb3duIHRvdWNoL21vdXNlLWRyYWctdG8tc3dpcGUgZ2VzdHVyZSBpcyBjYXB0dXJlZCB2ZXJ5IGVhcmx5IChiZWZvcmUgb3VyIGNyb3Agb3ZlcmxheSdzXG4gICAqIG93biBtb3VzZWRvd24gaGFuZGxlciBjYW4gc3RvcCBpdCksIHNvIGl0IG11c3QgYmUgZGlzYWJsZWQgdXBmcm9udCB3aGVuZXZlciB0aGUgY3JvcCB0b29sIGlzIGFjdGl2ZVxuICAgKiAtLSBvdGhlcndpc2UgZHJhZ2dpbmcgaW5zaWRlIHRoZSBjcm9wIHNlbGVjdGlvbiBlbmRzIHVwIHNsaWRpbmcgdG8gdGhlIG5leHQvcHJldmlvdXMgaW1hZ2UgaW5zdGVhZC5cbiAgICogUHJldi9uZXh0IGFycm93IGJ1dHRvbnMga2VlcCB3b3JraW5nLCBzaW5jZSB0aGV5IGNhbGwgdGhlIFN3aXBlciBBUEkgZGlyZWN0bHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3VwZGF0ZVN3aXBlclRvdWNoTW92ZShzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBpZiAoIXN3aXBlcikgcmV0dXJuO1xuICAgIHN3aXBlci5hbGxvd1RvdWNoTW92ZSA9ICF0aGlzLl9jcm9wVG9vbEFjdGl2ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB6b29tKHN3aXBlckVsZW1lbnQ6IGFueSwgem9vbUluOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1tpbWFnZS1nYWxsZXJ5LXNsaWRlc2hvd10gem9vbSAnICsgKHpvb21JbiA/ICdpbicgOiAnb3V0JyksIHN3aXBlckVsZW1lbnQpO1xuICAgIGlmICh0aGlzLmVuYWJsZU1vdXNlWm9vbSkge1xuICAgICAgY29uc3QgZGVsdGEgPSB6b29tSW4gPyB0aGlzLndoZWVsWm9vbVN0ZXAgOiAtdGhpcy53aGVlbFpvb21TdGVwO1xuICAgICAgY29uc3QgbmV3U2NhbGUgPSBNYXRoLm1heCgxLCBNYXRoLm1pbih0aGlzLl96b29tU3RhdGUuc2NhbGUgKyBkZWx0YSwgdGhpcy5tYXhab29tUmF0aW8pKTtcbiAgICAgIGlmIChuZXdTY2FsZSA9PT0gdGhpcy5fem9vbVN0YXRlLnNjYWxlKSByZXR1cm47XG4gICAgICBpZiAobmV3U2NhbGUgPT09IDEpIHtcbiAgICAgICAgdGhpcy5fem9vbVN0YXRlID0geyBzY2FsZTogMSwgdHg6IDAsIHR5OiAwIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl96b29tU3RhdGUuc2NhbGUgPSBuZXdTY2FsZTtcbiAgICAgICAgdGhpcy5fY2xhbXBUcmFuc2xhdGlvbnMoc3dpcGVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9hcHBseVpvb20oc3dpcGVyRWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgICAgaWYgKHpvb21Jbikgc3dpcGVyLnpvb20uaW4oKTtcbiAgICAgIGVsc2Ugc3dpcGVyLnpvb20ub3V0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlcXVlc3REZWxldGUoc3dpcGVyRWxlbWVudDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3QgY3VycmVudFJvdyA9IHRoaXMucm93cy5maW5kKChyb3csIGluZGV4KSA9PiBpbmRleCA9PT0gc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICBpZiAoIWN1cnJlbnRSb3cpIHJldHVybiBmYWxzZTsgLy8gUm93IG5vdCBmb3VuZFxuXG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgZGVsZXRlZCA9IGF3YWl0IGVtaXRQcm9taXNlRXZlbnQodGhpcy5kZWxldGVSZXF1ZXN0ZWQsICdkZWxldGUnLCB7IGRldGFpbDogeyByb3c6IGN1cnJlbnRSb3cgfSB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgPT09ICdDQU5DRUxMRUQnKSByZXR1cm4gZmFsc2U7IC8vIFVzZXIgY2FuY2VsXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZWQpIHtcbiAgICAgIGlmICghdGhpcy5yb3dzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5jbG9zZVJlcXVlc3RlZC5lbWl0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXNldFpvb20oc3dpcGVyRWxlbWVudCk7XG4gICAgICAgIHN3aXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBhc3luYyBzbGlkZVByZXYoc3dpcGVyRWxlbWVudD86IGFueSkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGlmICghc3dpcGVyKSByZXR1cm47XG5cbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHN3aXBlcj8uYWN0aXZlSW5kZXggPz8gdGhpcy5zZWxlY3RlZEluZGV4O1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gMCkge1xuICAgICAgLy8gTm8gcHJldmlvdXMgcGFnZSBjb25jZXB0IChwYWdpbmF0aW9uIG9ubHkgZXZlciBsb2FkcyBmb3J3YXJkKToganVzdCBsb29wLCBvciBzdGF5IHB1dFxuICAgICAgaWYgKCF0aGlzLmVuYWJsZUxvb3ApIHJldHVybjtcbiAgICAgIHRoaXMuX3BlbmRpbmdTbGlkZURpcmVjdGlvbiA9ICdwcmV2JztcbiAgICAgIGF3YWl0IHN3aXBlci5zbGlkZVRvKHRoaXMucm93cy5sZW5ndGggLSAxLCAwIC8qbm8gdHJhbnNpdGlvbiwgdG8gYXZvaWQgYSBcInJldmVydFwiIGVmZmVjdCovKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGVuZGluZ1NsaWRlRGlyZWN0aW9uID0gJ3ByZXYnO1xuICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlUHJldigpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNsaWRlTmV4dChzd2lwZXJFbGVtZW50PzogYW55KSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgaWYgKCFzd2lwZXIpIHJldHVybjtcblxuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gdGhpcy5yb3dzLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIFRyeSBmZXRjaGluZyBhIGZ1cnRoZXIgcGFnZSBmaXJzdCwgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBsb29waW5nL3N0b3BwaW5nXG4gICAgICBpZiAodGhpcy5jYW5GZXRjaE1vcmUgJiYgdGhpcy5mZXRjaE1vcmUub2JzZXJ2ZWQpIHtcbiAgICAgICAgY29uc3Qgcm93Q291bnRCZWZvcmVGZXRjaCA9IHRoaXMucm93cy5sZW5ndGg7XG4gICAgICAgIGxldCBmZXRjaGVkID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmV0Y2hlZCA9IGF3YWl0IGVtaXRQcm9taXNlRXZlbnQodGhpcy5mZXRjaE1vcmUsICdmZXRjaE1vcmUnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVyciAhPT0gJ0NBTkNFTExFRCcpIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmV0Y2hlZCAmJiB0aGlzLnJvd3MubGVuZ3RoID4gcm93Q291bnRCZWZvcmVGZXRjaCkge1xuICAgICAgICAgIC8vIFRoZSBuZXcgPHN3aXBlci1zbGlkZT4gZWxlbWVudHMgY29tZSBmcm9tIHRoZSBgcm93c2AgaW5wdXQgcmUtcmVuZGVyaW5nLCB3aGljaCBtYXkgbm90IGhhdmVcbiAgICAgICAgICAvLyByZWFjaGVkIHRoZSBET00geWV0IGF0IHRoaXMgcG9pbnQ6IHdhaXQgZm9yIFN3aXBlciB0byBhY3R1YWxseSBzZWUgdGhlIGV4dHJhIHNsaWRlKHMpLlxuICAgICAgICAgIGF3YWl0IHRoaXMuX3dhaXRGb3JTbGlkZUNvdW50KHN3aXBlciwgcm93Q291bnRCZWZvcmVGZXRjaCArIDEpO1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdTbGlkZURpcmVjdGlvbiA9ICduZXh0JztcbiAgICAgICAgICBhd2FpdCBzd2lwZXIuc2xpZGVOZXh0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGhpbmcgbmV3IHdhcyBhY3R1YWxseSBhZGRlZDogZmFsbCB0aHJvdWdoIHRvIGxvb3Avc3RvcCBiZWxvd1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmVuYWJsZUxvb3ApIHJldHVybjtcbiAgICAgIHRoaXMuX3BlbmRpbmdTbGlkZURpcmVjdGlvbiA9ICduZXh0JztcbiAgICAgIGF3YWl0IHN3aXBlci5zbGlkZVRvKDAsIDAgLypubyB0cmFuc2l0aW9uLCB0byBhdm9pZCBhIFwicmV2ZXJ0XCIgZWZmZWN0Ki8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpZGVEaXJlY3Rpb24gPSAnbmV4dCc7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVOZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldEltYWdlU2l6ZVF1ZXJ5UGFyYW1zKCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGlmICghdGhpcy5pbWFnZVNpemVRdWVyeVBhcmFtIHx8IGlzTmlsT3JCbGFuayh0aGlzLm1vZGFsSW1hZ2VTaXplKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgW3RoaXMuaW1hZ2VTaXplUXVlcnlQYXJhbV06IHRoaXMubW9kYWxJbWFnZVNpemUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIC0tLSBDcm9wICYgcm90YXRlIHRvb2xzOiBhbHdheXMgYXZhaWxhYmxlIChubyBcImVudGVyIGVkaXQgbW9kZVwiIHN0ZXApIC0tLVxuICAvLyBWYWxpZGF0ZS9DYW5jZWwgb25seSBhcHBlYXIgb25jZSB0aGUgdXNlciBhY3R1YWxseSBjaGFuZ2VkIHNvbWV0aGluZyAoc2VlIGBoYXNQZW5kaW5nRWRpdGApLlxuXG4gIHByb3RlY3RlZCBkaXNjYXJkRWRpdChzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLl9yZXNldEVkaXRTdGF0ZShzd2lwZXJFbGVtZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldENyb3AoX3N3aXBlckVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMuX2Nyb3BSZWN0ID0gdGhpcy5fY3JlYXRlRGVmYXVsdENyb3BSZWN0KCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY3JlYXRlRGVmYXVsdENyb3BSZWN0KCk6IENyb3BSZWN0IHtcbiAgICBjb25zdCBpbnNldCA9IHRoaXMuX2RlZmF1bHRDcm9wSW5zZXQ7XG4gICAgcmV0dXJuIHsgeDogaW5zZXQsIHk6IGluc2V0LCB3aWR0aDogMSAtIDIgKiBpbnNldCwgaGVpZ2h0OiAxIC0gMiAqIGluc2V0IH07XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlQ3JvcFRvb2woc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUNyb3AgfHwgdGhpcy5yZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMuX2Nyb3BUb29sQWN0aXZlID0gIXRoaXMuX2Nyb3BUb29sQWN0aXZlO1xuICAgIGlmICh0aGlzLl9jcm9wVG9vbEFjdGl2ZSkge1xuICAgICAgLy8gU3RhcnQgd2l0aCBhbiBpbnNldCBzZWxlY3Rpb246IGhhbmRsZXMgcmlnaHQgYXQgdGhlIGltYWdlIGVkZ2VzIGFyZSBoYXJkIHRvIGdyYWJcbiAgICAgIHRoaXMuX2Nyb3BSZWN0ID0gdGhpcy5fY3JlYXRlRGVmYXVsdENyb3BSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERpc2NhcmQgYW55IHBlbmRpbmcgY3JvcCBzZWxlY3Rpb24gd2hlbiBoaWRpbmcgdGhlIHRvb2xcbiAgICAgIHRoaXMuX2Nyb3BSZWN0ID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMSwgaGVpZ2h0OiAxIH07XG4gICAgICB0aGlzLl9jcm9wRHJhZ1N0YXRlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlU3dpcGVyVG91Y2hNb3ZlKHN3aXBlckVsZW1lbnQpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgaWYgKHRoaXMuX2Nyb3BUb29sQWN0aXZlKSB7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgY3JvcCBvdmVybGF5IHRvIGJlIHJlbmRlcmVkLCB0aGVuIGNvbXB1dGUgaXRzIHBvc2l0aW9uXG4gICAgICBzZXRUaW1lb3V0KCgpID0+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+e3sgX2FjdGl2ZUluZGV4ICsgMSB9fSAvIHt7IGNvdW50IH19PC9pb24tbGFiZWw+XG4gIDwvZGl2PlxuXG4gIDwhLS0gem9vbSAvIHJvdGF0aW9uIC8gY3JvcCBidXR0b25zOiBhbGwgc2hvd24gdG9nZXRoZXIsIG5vIFwiZW50ZXIgZWRpdCBtb2RlXCIgc3RlcCBuZWVkZWQgLS0+XG4gIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICBAaWYgKCFtb2JpbGUpIHtcbiAgICAgIDxpb24tZmFiLWJ1dHRvbiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiem9vbShzd2lwZXJDb250YWluZXIsIHRydWUpXCIgY29sb3I9XCJsaWdodFwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cInNlYXJjaFwiPjwvaW9uLWljb24+XG4gICAgICAgIDxpb24taWNvbiBjbGFzcz1cImljb24tc2Vjb25kYXJ5XCIgbmFtZT1cImFkZFwiPjwvaW9uLWljb24+XG4gICAgICA8L2lvbi1mYWItYnV0dG9uPlxuICAgICAgPGlvbi1mYWItYnV0dG9uIHNpemU9XCJzbWFsbFwiIChjbGljayk9XCJ6b29tKHN3aXBlckNvbnRhaW5lciwgZmFsc2UpXCIgY29sb3I9XCJsaWdodFwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cInNlYXJjaFwiPjwvaW9uLWljb24+XG4gICAgICAgIDxpb24taWNvbiBjbGFzcz1cImljb24tc2Vjb25kYXJ5XCIgbmFtZT1cInJlbW92ZVwiPjwvaW9uLWljb24+XG4gICAgICA8L2lvbi1mYWItYnV0dG9uPlxuICAgIH1cbiAgICBAaWYgKCFyZWFkT25seSAmJiBlbmFibGVSb3RhdGUpIHtcbiAgICAgIDxpb24tZmFiLWJ1dHRvblxuICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAoY2xpY2spPVwicm90YXRlKHN3aXBlckNvbnRhaW5lciwgJ2xlZnQnKVwiXG4gICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdJTUFHRS5HQUxMRVJZLkJUTl9ST1RBVEVfTEVGVCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnSU1BR0UuR0FMTEVSWS5CVE5fUk9UQVRFX0xFRlQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPnJvdGF0ZV9sZWZ0PC9tYXQtaWNvbj5cbiAgICAgIDwvaW9uLWZhYi1idXR0b24+XG4gICAgICA8aW9uLWZhYi1idXR0b25cbiAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgKGNsaWNrKT1cInJvdGF0ZShzd2lwZXJDb250YWluZXIsICdyaWdodCcpXCJcbiAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0lNQUdFLkdBTExFUlkuQlROX1JPVEFURV9SSUdIVCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnSU1BR0UuR0FMTEVSWS5CVE5fUk9UQVRFX1JJR0hUJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5yb3RhdGVfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgPC9pb24tZmFiLWJ1dHRvbj5cbiAgICB9XG4gICAgQGlmICghcmVhZE9ubHkgJiYgZW5hYmxlQ3JvcCkge1xuICAgICAgPGlvbi1mYWItYnV0dG9uXG4gICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVDcm9wVG9vbChzd2lwZXJDb250YWluZXIpXCJcbiAgICAgICAgW2NvbG9yXT1cIl9jcm9wVG9vbEFjdGl2ZSA/ICd0ZXJ0aWFyeScgOiAnbGlnaHQnXCJcbiAgICAgICAgW3RpdGxlXT1cIlxuICAgICAgICAgICFzaG93VG9vbHRpcFxuICAgICAgICAgICAgPyAoKF9jcm9wVG9vbEFjdGl2ZSA/ICdJTUFHRS5HQUxMRVJZLkJUTl9DUk9QX0RFQUNUSVZBVEUnIDogJ0lNQUdFLkdBTExFUlkuQlROX0NST1BfQUNUSVZBVEUnKSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgIDogJydcbiAgICAgICAgXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgICAgc2hvd1Rvb2x0aXBcbiAgICAgICAgICAgID8gKChfY3JvcFRvb2xBY3RpdmUgPyAnSU1BR0UuR0FMTEVSWS5CVE5fQ1JPUF9ERUFDVElWQVRFJyA6ICdJTUFHRS5HQUxMRVJZLkJUTl9DUk9QX0FDVElWQVRFJykgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICA6ICcnXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5jcm9wPC9tYXQtaWNvbj5cbiAgICAgIDwvaW9uLWZhYi1idXR0b24+XG4gICAgICBAaWYgKF9jcm9wVG9vbEFjdGl2ZSkge1xuICAgICAgICA8aW9uLWZhYi1idXR0b25cbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIChjbGljayk9XCJyZXNldENyb3Aoc3dpcGVyQ29udGFpbmVyKVwiXG4gICAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICgnSU1BR0UuR0FMTEVSWS5CVE5fQ1JPUF9SRVNFVCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdJTUFHRS5HQUxMRVJZLkJUTl9DUk9QX1JFU0VUJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24+Y3JvcF9mcmVlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9pb24tZmFiLWJ1dHRvbj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDwhLS0gbmF2aWdhdGlvbiBzaWRlIGJ1dHRvbnMgbmV4dC9iYWNrOiBoaWRkZW4gd2hpbGUgYSBjcm9wL3JvdGF0aW9uIGVkaXQgaXMgcGVuZGluZywgdG8ga2VlcCB0aGUgZm9jdXMgb24gdmFsaWRhdGluZy9jYW5jZWxsaW5nIGl0IC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1vYmlsZSAmJiAhaGFzUGVuZGluZ0VkaXQgJiYgKHJvd3MgfCBpc0FycmF5TGVuZ3RoOiB7IGdyZWF0ZXJUaGFuOiAxIH0pXCI+XG4gICAgPGRpdiBjbGFzcz1cInNpZGUtYnV0dG9ucyBwcmV2XCIgW2NsYXNzLmRpc2FibGVkXT1cImlzUHJldkRpc2FibGVkXCIgKGNsaWNrKT1cInNsaWRlUHJldihzd2lwZXJDb250YWluZXIpXCI+XG4gICAgICA8aW9uLWljb24gbmFtZT1cImNoZXZyb24tYmFja1wiPjwvaW9uLWljb24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNpZGUtYnV0dG9ucyBuZXh0XCIgW2NsYXNzLmRpc2FibGVkXT1cImlzTmV4dERpc2FibGVkXCIgKGNsaWNrKT1cInNsaWRlTmV4dChzd2lwZXJDb250YWluZXIpXCI+XG4gICAgICA8aW9uLWljb24gbmFtZT1cImNoZXZyb24tZm9yd2FyZFwiPjwvaW9uLWljb24+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gaW1hZ2Ugc2xpZGVzIC0tPlxuICA8c3dpcGVyLWNvbnRhaW5lclxuICAgICNzd2lwZXJDb250YWluZXJcbiAgICBbbW9kdWxlc109XCJzd2lwZXJNb2R1bGVzXCJcbiAgICBbem9vbV09XCIhZW5hYmxlTW91c2Vab29tXCJcbiAgICBbaW5pdGlhbFNsaWRlXT1cInNlbGVjdGVkSW5kZXhcIlxuICAgIChzd2lwZXJzbGlkZWNoYW5nZSk9XCJvblNsaWRlQ2hhbmdlKHN3aXBlckNvbnRhaW5lcilcIlxuICAgIChzd2lwZXJpbml0KT1cIm9uU3dpcGVySW5pdChzd2lwZXJDb250YWluZXIpXCJcbiAgPlxuICAgIEBmb3IgKHJvdyBvZiByb3dzOyB0cmFjayByb3cuaWQ7IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNsaWRlVGVtcGxhdGU7IGNvbnRleHQ6IHsgaW1hZ2U6IHJvdy5jdXJyZW50RGF0YSwgaW5kZXggfVwiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgPC9zd2lwZXItY29udGFpbmVyPlxuPC9pb24tY29udGVudD5cblxuPGlvbi1mb290ZXI+XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cImxpZ2h0XCI+XG4gICAgQGlmICghaGFzUGVuZGluZ0VkaXQpIHtcbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiNFwiIGNsYXNzPVwiaW9uLXRleHQtc3RhcnRcIj5cbiAgICAgICAgICBAaWYgKCFyZWFkT25seSkge1xuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlcXVlc3REZWxldGUoc3dpcGVyQ29udGFpbmVyKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgICAgICAgIGNvbG9yPVwiZGFuZ2VyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIHNsb3Q9XCJzdGFydFwiPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIHt7ICdDT01NT04uQlROX0RFTEVURScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjRcIj48L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCI0XCIgY2xhc3M9XCJpb24tdGV4dC1lbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2VSZXF1ZXN0ZWQuZW1pdCgpXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiIGZpbGw9XCJjbGVhclwiICpuZ0lmPVwibW9iaWxlOyBlbHNlIGRlc2t0b3BcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwiY2xvc2VcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAge3sgJ0NPTU1PTi5CVE5fQ0xPU0UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVza3RvcD5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJjbG9zZVJlcXVlc3RlZC5lbWl0KClcIiBjb2xvcj1cInRlcnRpYXJ5XCI+XG4gICAgICAgICAgICAgIHt7ICdDT01NT04uQlROX0NMT1NFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDwhLS0gQSBjcm9wIG9yIHJvdGF0aW9uIGNoYW5nZSBpcyBwZW5kaW5nOiBhc2sgZm9yIGFuIGV4cGxpY2l0IHZhbGlkYXRpb24gYmVmb3JlIGV4cG9ydGluZyB0aGUgaW1hZ2UgLS0+XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjEyXCIgY2xhc3M9XCJpb24tdGV4dC1lbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cImRpc2NhcmRFZGl0KHN3aXBlckNvbnRhaW5lcilcIlxuICAgICAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdJTUFHRS5HQUxMRVJZLkJUTl9DQU5DRUxfRURJVCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0lNQUdFLkdBTExFUlkuQlROX0NBTkNFTF9FRElUJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJhcnJvdy11bmRvXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIHt7ICdDT01NT04uQlROX0NBTkNFTCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInZhbGlkYXRlRWRpdChzd2lwZXJDb250YWluZXIpXCIgY29sb3I9XCJkYW5nZXJcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwiY2hlY2ttYXJrXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIHt7ICdDT01NT04uQlROX1ZBTElEQVRFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIH1cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWZvb3Rlcj5cblxuPG5nLXRlbXBsYXRlICNzbGlkZVRlbXBsYXRlIGxldC1pbWFnZT1cImltYWdlXCIgbGV0LWluZGV4PVwiaW5kZXhcIj5cbiAgPHN3aXBlci1zbGlkZT5cbiAgICA8ZGl2IGNsYXNzPVwic3dpcGVyLXpvb20tY29udGFpbmVyXCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIV9zd2lwZXIgJiYgaW5kZXggIT09IHNlbGVjdGVkSW5kZXhcIj5cblxuICAgICAgPCEtLSB0aGUgaW1hZ2UgLS0+XG4gICAgICBAaWYgKGltYWdlPy51cmwpIHtcbiAgICAgICAgPGlvbi1pbWcgY2xhc3M9XCJzd2lwZXItem9vbS10YXJnZXRcIiBbc3JjXT1cImltYWdlLnVybCB8IGFwcGVuZFF1ZXJ5UGFyYW1zOiBnZXRJbWFnZVNpemVRdWVyeVBhcmFtcygpXCIgLz5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2UuZGF0YVVybFwiIFthbHRdPVwiaW1hZ2UudGl0bGVcIiAvPlxuICAgICAgfVxuXG4gICAgICA8IS0tIGNyb3Agb3ZlcmxheTogb25seSByZW5kZXJlZCBmb3IgdGhlIGFjdGl2ZSBzbGlkZSAtLT5cbiAgICAgIEBpZiAoIXJlYWRPbmx5ICYmIGVuYWJsZUNyb3AgJiYgX2Nyb3BUb29sQWN0aXZlICYmIGluZGV4ID09PSBfYWN0aXZlSW5kZXgpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY3JvcC1vdmVybGF5XCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ3JvcFBvaW50ZXJEb3duKCRldmVudCwgc3dpcGVyQ29udGFpbmVyLCAnbW92ZScpXCJcbiAgICAgICAgICAodG91Y2hzdGFydCk9XCJvbkNyb3BQb2ludGVyRG93bigkZXZlbnQsIHN3aXBlckNvbnRhaW5lciwgJ21vdmUnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIGRhcmtlbmVkIG1hc2sgYXJvdW5kIHRoZSBzZWxlY3Rpb246IGNsaXBwZWQgdG8gdGhlIGltYWdlIGJvdW5kcyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3JvcC1tYXNrXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiY3JvcC1tYXNrLXJlY3RcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cIl9jcm9wUmVjdC54ICogMTAwXCJcbiAgICAgICAgICAgICAgW3N0eWxlLnRvcC4lXT1cIl9jcm9wUmVjdC55ICogMTAwXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiX2Nyb3BSZWN0LndpZHRoICogMTAwXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC4lXT1cIl9jcm9wUmVjdC5oZWlnaHQgKiAxMDBcIlxuICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBpbnRlcmFjdGl2ZSBzZWxlY3Rpb24gYm9yZGVyLCBncmlkICYgZHJhZyBoYW5kbGVzOiBuZXZlciBjbGlwcGVkLCBzbyBjb3JuZXIvZWRnZSBoYW5kbGVzXG4gICAgICAgICAgICAgICByZW1haW4gZnVsbHkgZ3JhYmJhYmxlIGV2ZW4gd2hlbiB0aGUgc2VsZWN0aW9uIHRvdWNoZXMgdGhlIGltYWdlIGJvdW5kcyAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNyb3AtcmVjdFwiXG4gICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cIl9jcm9wUmVjdC54ICogMTAwXCJcbiAgICAgICAgICAgIFtzdHlsZS50b3AuJV09XCJfY3JvcFJlY3QueSAqIDEwMFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJfY3JvcFJlY3Qud2lkdGggKiAxMDBcIlxuICAgICAgICAgICAgW3N0eWxlLmhlaWdodC4lXT1cIl9jcm9wUmVjdC5oZWlnaHQgKiAxMDBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcm9wLWdyaWRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaW5lIHZcIiBzdHlsZT1cImxlZnQ6IDMzLjMzMyVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGluZSB2XCIgc3R5bGU9XCJsZWZ0OiA2Ni42NjYlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpbmUgaFwiIHN0eWxlPVwidG9wOiAzMy4zMzMlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpbmUgaFwiIHN0eWxlPVwidG9wOiA2Ni42NjYlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAZm9yIChoYW5kbGUgb2YgX2Nyb3BIYW5kbGVzOyB0cmFjayBoYW5kbGUpIHtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3JvcC1oYW5kbGUge3sgaGFuZGxlIH19XCJcbiAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ3JvcFBvaW50ZXJEb3duKCRldmVudCwgc3dpcGVyQ29udGFpbmVyLCBoYW5kbGUpXCJcbiAgICAgICAgICAgICAgICAodG91Y2hzdGFydCk9XCJvbkNyb3BQb2ludGVyRG93bigkZXZlbnQsIHN3aXBlckNvbnRhaW5lciwgaGFuZGxlKVwiXG4gICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvc3dpcGVyLXNsaWRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==