@guajiritos/image-picker 0.0.11 → 0.0.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.
@@ -1,6 +1,7 @@
1
1
  import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, signal, ViewChild, } from '@angular/core';
2
2
  import { ResizeObserver } from 'resize-observer';
3
3
  import { Subject } from 'rxjs';
4
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
4
5
  import { MatIconModule } from '@angular/material/icon';
5
6
  import { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
6
7
  import { MatTooltipModule } from '@angular/material/tooltip';
@@ -10,21 +11,21 @@ import { MatButtonModule } from '@angular/material/button';
10
11
  import { MatFormFieldModule } from '@angular/material/form-field';
11
12
  import { MatInputModule } from '@angular/material/input';
12
13
  import { MatSelectModule } from '@angular/material/select';
13
- import { NgForOf, NgIf, NgStyle } from '@angular/common';
14
14
  import { PipesModule } from '../utils/pipes/pipes.module';
15
15
  import * as i0 from "@angular/core";
16
- import * as i1 from "@angular/material/tooltip";
17
- import * as i2 from "@angular/material/icon";
18
- import * as i3 from "@angular/material/button";
19
- import * as i4 from "@angular/material/checkbox";
20
- import * as i5 from "@angular/material/slider";
21
- import * as i6 from "@angular/material/form-field";
22
- import * as i7 from "@angular/material/input";
23
- import * as i8 from "@angular/forms";
24
- import * as i9 from "@angular/material/select";
25
- import * as i10 from "@angular/material/core";
26
- import * as i11 from "../utils/pipes/i18n/i18n.pipe";
27
- import * as i12 from "../utils/pipes/calculate-size/calculate-size.pipe";
16
+ import * as i1 from "@angular/common";
17
+ import * as i2 from "@angular/material/tooltip";
18
+ import * as i3 from "@angular/material/icon";
19
+ import * as i4 from "@angular/material/button";
20
+ import * as i5 from "@angular/material/checkbox";
21
+ import * as i6 from "@angular/material/slider";
22
+ import * as i7 from "@angular/material/form-field";
23
+ import * as i8 from "@angular/material/input";
24
+ import * as i9 from "@angular/forms";
25
+ import * as i10 from "@angular/material/select";
26
+ import * as i11 from "@angular/material/core";
27
+ import * as i12 from "../utils/pipes/i18n/i18n.pipe";
28
+ import * as i13 from "../utils/pipes/calculate-size/calculate-size.pipe";
28
29
  export class GuajiritosImagePicker {
29
30
  constructor() {
30
31
  }
@@ -56,8 +57,8 @@ export class GuajiritosImagePicker {
56
57
  maintainAspectRatio = new UntypedFormControl({ value: true, disabled: false });
57
58
  quality = new UntypedFormControl({ value: 70, disabled: false });
58
59
  format = new UntypedFormControl({ value: 'webp', disabled: false });
59
- maxHeight = new UntypedFormControl({ value: 2000, disabled: false });
60
- maxWidth = new UntypedFormControl({ value: 2000, disabled: false });
60
+ maxHeight = signal(2000);
61
+ maxWidth = signal(2000);
61
62
  cropHeight = new UntypedFormControl({ value: 150, disabled: false });
62
63
  cropWidth = new UntypedFormControl({ value: 150, disabled: false });
63
64
  imageName = signal('download');
@@ -93,8 +94,8 @@ export class GuajiritosImagePicker {
93
94
  this.lastOriginSrc = null;
94
95
  this.$imageOriginal.next(null);
95
96
  this.format.setValue('jpeg');
96
- this.maxHeight.setValue(2000);
97
- this.maxWidth.setValue(2000);
97
+ this.maxHeight.set(2000);
98
+ this.maxWidth.set(2000);
98
99
  this.cropHeight.setValue(150);
99
100
  this.cropWidth.setValue(150);
100
101
  this.maintainAspectRatio.setValue(true);
@@ -128,8 +129,8 @@ export class GuajiritosImagePicker {
128
129
  this.arrayCopiedImages = [];
129
130
  this.arrayCopiedImages.push({
130
131
  lastImage: this.imageSrc(),
131
- width: this.maxWidth.value,
132
- height: this.maxHeight.value,
132
+ width: this.maxWidth(),
133
+ height: this.maxHeight(),
133
134
  quality: this.quality.value,
134
135
  });
135
136
  this.$imageOriginal.next(this.imageSrc());
@@ -174,13 +175,13 @@ export class GuajiritosImagePicker {
174
175
  });
175
176
  };
176
177
  }).then((data) => {
177
- this.maxHeight.setValue(data?.height);
178
- this.maxWidth.setValue(data?.width);
178
+ this.maxHeight = data?.height;
179
+ this.maxWidth = data?.width;
179
180
  if (this.arrayCopiedImages?.length <= 20) {
180
181
  this.arrayCopiedImages.push({
181
182
  lastImage: data?.dataUri,
182
- width: this.maxWidth.value,
183
- height: this.maxHeight.value,
183
+ width: this.maxWidth,
184
+ height: this.maxHeight,
184
185
  quality: this.quality.value,
185
186
  });
186
187
  }
@@ -273,17 +274,13 @@ export class GuajiritosImagePicker {
273
274
  }
274
275
  async onChangeQuality() {
275
276
  const qualityItem = this.quality.value / 100;
276
- if (!this.maxHeight.value) {
277
- this.maxHeight.setValue(2000);
278
- }
279
- if (!this.maxWidth.value) {
280
- this.maxWidth.setValue(2000);
281
- }
277
+ this.maxHeight.set(this.maxHeight() ?? 2000);
278
+ this.maxWidth.set(this.maxWidth() ?? 2000);
282
279
  await this.wait(250);
283
280
  try {
284
281
  const input = {
285
- height: this.maxHeight.value,
286
- width: this.maxWidth.value,
282
+ height: this.maxHeight(),
283
+ width: this.maxWidth(),
287
284
  dataType: this.format.value,
288
285
  quality: qualityItem,
289
286
  maintainRatio: this.maintainAspectRatio.value,
@@ -298,17 +295,13 @@ export class GuajiritosImagePicker {
298
295
  }
299
296
  async onChangeFormat() {
300
297
  let qualityItem = this.quality.value / 100;
301
- if (!this.maxHeight.value) {
302
- this.maxHeight.setValue(2000);
303
- }
304
- if (!this.maxWidth.value) {
305
- this.maxWidth.setValue(2000);
306
- }
298
+ this.maxHeight.set(this.maxHeight() ?? 2000);
299
+ this.maxWidth.set(this.maxWidth() ?? 2000);
307
300
  await this.wait(250);
308
301
  try {
309
302
  let input = {
310
- height: this.maxHeight.value,
311
- width: this.maxWidth.value,
303
+ height: this.maxHeight(),
304
+ width: this.maxWidth(),
312
305
  dataType: this.format.value,
313
306
  quality: qualityItem,
314
307
  maintainRatio: this.maintainAspectRatio.value,
@@ -323,17 +316,13 @@ export class GuajiritosImagePicker {
323
316
  }
324
317
  async onChangeSize(changeWidth, changeHeight) {
325
318
  let qualityItem = this.quality.value / 100;
326
- if (!this.maxHeight.value) {
327
- this.maxHeight.setValue(2000);
328
- }
329
- if (!this.maxWidth.value) {
330
- this.maxWidth.setValue(2000);
331
- }
319
+ this.maxHeight.set(this.maxHeight() ?? 2000);
320
+ this.maxWidth.set(this.maxWidth() ?? 2000);
332
321
  await this.wait(500);
333
322
  try {
334
323
  let input = {
335
- height: this.maxHeight.value,
336
- width: this.maxWidth.value,
324
+ height: this.maxHeight(),
325
+ width: this.maxWidth(),
337
326
  dataType: this.format.value,
338
327
  quality: qualityItem,
339
328
  maintainRatio: this.maintainAspectRatio.value,
@@ -441,8 +430,8 @@ export class GuajiritosImagePicker {
441
430
  this.imageSrc.set(dataUri);
442
431
  this.showCrop.setValue(false);
443
432
  this.onCropStateChange();
444
- this.maxWidth.setValue(canvas?.width);
445
- this.maxHeight.setValue(canvas?.height);
433
+ this.maxWidth.set(canvas?.width);
434
+ this.maxHeight.set(canvas?.height);
446
435
  this.lastOriginSrc = this.originImageSrc + '';
447
436
  this.originImageSrc = dataUri;
448
437
  this.$imageChanged.next(this.imageSrc());
@@ -455,8 +444,8 @@ export class GuajiritosImagePicker {
455
444
  if (this.arrayCopiedImages.length) {
456
445
  let lastState = this.arrayCopiedImages.pop();
457
446
  this.imageSrc.set(lastState.lastImage);
458
- this.maxWidth.setValue(lastState.width);
459
- this.maxHeight.setValue(lastState.height);
447
+ this.maxWidth.set(lastState.width);
448
+ this.maxHeight.set(lastState.height);
460
449
  this.originImageSrc = this.lastOriginSrc + '';
461
450
  this.noEdit.set(false);
462
451
  }
@@ -476,8 +465,8 @@ export class GuajiritosImagePicker {
476
465
  this.$imageOriginal.next(null);
477
466
  this.$imageChanged.next(null);
478
467
  this.format.setValue('jpeg');
479
- this.maxHeight.setValue(2000);
480
- this.maxWidth.setValue(2000);
468
+ this.maxHeight.set(2000);
469
+ this.maxWidth.set(2000);
481
470
  this.cropHeight.setValue(150);
482
471
  this.cropWidth.setValue(150);
483
472
  this.maintainAspectRatio.setValue(true);
@@ -488,14 +477,13 @@ export class GuajiritosImagePicker {
488
477
  this.unsubscribeAll$.next();
489
478
  this.unsubscribeAll$.complete();
490
479
  }
491
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: GuajiritosImagePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
492
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: GuajiritosImagePicker, isStandalone: true, selector: "guajiritos-image-picker", inputs: { appearance: "appearance", color: "color", imagesAllowed: "imagesAllowed", _imageSrc: "_imageSrc", _config: "_config" }, outputs: { $imageChanged: "$imageChanged", $imageOriginal: "$imageOriginal" }, viewQueries: [{ propertyName: "imagePicker", first: true, predicate: ["imagePicker"], descendants: true }], ngImport: i0, template: "<div *ngIf='!loadImage()' class='place-image'>\n <div class='image-holder'\n [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\n (click)='onUpload($event)'>\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n</div>\n\n<div *ngIf='loadImage()' class='place-image'>\n <div class='image-holder-loaded'\n [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\n </p>\n\n <div class='editing-bar-btn'>\n <button id='upload-img' *ngIf='!config()?.hideAddBtn' mat-icon-button (click)='onUpload($event)'\n [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n <button id='edit-img' *ngIf='!config()?.hideEditBtn && !noEdit()' mat-icon-button (click)='showEditPanel.set(true)'\n [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\n <mat-icon class='mat-18'>edit</mat-icon>\n </button>\n <a id='download-img' *ngIf='!config()?.hideDownloadBtn' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\n [href]='imageSrc()' mat-icon-button [download]='imageName'>\n <mat-icon class='mat-18'>cloud_download</mat-icon>\n </a>\n <button id='delete-img' *ngIf='!config()?.hideDeleteBtn' mat-icon-button (click)='onRemove()'\n [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>delete</mat-icon>\n </button>\n </div>\n</div>\n\n<div *ngIf='showEditPanel()' id='popup' class='popup'>\n <div class='popup-clear'>\n <button mat-icon-button (click)='onCloseEditPanel()'>\n <mat-icon class='mat-18'>clear</mat-icon>\n </button>\n </div>\n\n <div class='image-container'>\n <div class='image-holder-full'>\n <img id='image-full' [src]='imageSrc()' alt=''>\n <div id='image-cropper' class='image-cropper'>\n <div id='image-cropper-header'>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n </div>\n </div>\n\n <div class='control-panel'>\n <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\n <div class='quality-container'>\n <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\n [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\n <input matSliderThumb [formControl]='quality'>\n </mat-slider>\n </div>\n\n <div class='item-panel'>\n <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\n <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\n <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\n </mat-checkbox>\n </div>\n\n <div class='max-dimension-container'>\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(true, false)' matInput [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\n [formControl]='maxWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(false, true)' matInput [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\n [formControl]='maxHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n\n <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\n <div class='formats-selection'>\n <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\n <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\n <mat-option *ngFor='let format of allFormats' [value]='format'>\n {{ format }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class='refresh-container'>\n <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\n <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\n </mat-checkbox>\n <div class='d-flex '>\n <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\n <mat-icon>refresh</mat-icon>\n </button>\n <p *ngIf='showCrop.value'>\n <button mat-icon-button [color]='color' (click)='onCrop()'>\n <mat-icon>crop</mat-icon>\n </button>\n </p>\n </div>\n </div>\n\n <ng-container *ngIf='showCrop.value'>\n <div class='dimension-container'>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\n [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\n [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n </ng-container>\n\n <div class='save-container'>\n <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\n {{ 'SAVE' | i18n: config()?.language}}\n </button>\n\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption'\n [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\n </p>\n </div>\n </div>\n </div>\n</div>\n", styles: [".d-none{display:none}.d-flex{display:flex}.fw-600{font-weight:600}.w-100{width:100%}.mw-100{max-width:100%}.w-48{width:48%}.mw-48{max-width:48%}.float-right{float:right}p{margin:0!important;padding:0!important}.place-image{flex-direction:column;box-sizing:border-box;display:flex;place-content:flex-start;align-items:center}.place-image .image-holder{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;width:320px;height:240px;border-radius:16px;max-width:100%!important;background-color:#fff}@media (max-width: 599px){.place-image .image-holder{max-width:100%!important;max-height:250px!important}}.place-image .image-holder .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .image-holder-loaded{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;max-width:100%!important;width:320px;height:240px;border-radius:4px;padding:2px}.place-image .image-holder-loaded .image-caption{position:absolute;right:0;bottom:-22px}.place-image .image-holder-loaded img{height:100%;max-height:100%;width:100%;max-width:100%;object-fit:contain;object-position:center}@media (max-width: 599px){.place-image .image-holder-loaded{max-height:195px!important}}.place-image .image-holder-loaded .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder-loaded .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder-loaded:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .editing-bar-btn{margin-top:2px;display:flex;flex-direction:row;box-sizing:border-box;place-content:flex-start;align-items:flex-start}.place-image .editing-bar-btn .mat-icon-button{height:20px;line-height:20px;width:24px}.place-image .editing-bar-btn mat-icon{line-height:20px!important;font-size:20px!important;width:20px!important;height:20px!important}.place-image .editing-bar-btn button{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn button:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.place-image .editing-bar-btn a{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn a:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.popup{width:100vw;max-height:100%;height:100%;overflow:auto;position:fixed;top:0;left:0;z-index:1000;padding:24px;color:#fff;box-sizing:border-box;animation-name:show;animation-duration:.4s}.popup .popup-clear{flex-direction:row;box-sizing:border-box;display:flex;place-content:center flex-end;align-items:center}.popup .image-container{margin-top:50px;margin-bottom:50px;height:calc(100vh - 188px);min-height:calc(100vh - 188px);min-width:100%;width:100%;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start center;align-items:flex-start}.popup .image-container .image-holder-full{height:auto;width:auto;position:relative;display:contents}.popup img{max-height:600px;max-width:100%;object-fit:contain;object-position:center;margin:8px;transition:all .5s ease}@media (max-width: 1024px){.popup{background-color:#000000d9;padding:8px}.popup img{max-height:100%;max-width:100%}}@media (max-width: 599px){.popup img{margin:0}}.popup .control-panel{color:#000;background-color:#fff;margin:8px;padding:16px;max-width:100%;width:18rem;border-radius:8px;flex-direction:column;box-sizing:border-box;display:flex;place-content:stretch flex-start;align-items:stretch}@media (max-width: 599px){.popup .control-panel{margin:8px 0;width:100%}}.popup .control-panel .title-panel{padding:0 4px;font-size:16px;margin-bottom:16px!important}.popup .control-panel .item-panel{padding:0 4px!important;font-size:12px;display:flex;justify-content:space-between;align-items:center;gap:4px}.popup .control-panel .formats-selection{margin-top:8px!important;flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .max-dimension-container{margin-top:16px!important;flex-flow:row;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .dimension-container{margin-top:8px!important;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .save-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:center space-between;align-items:center}.popup .control-panel .save-container .save-button{padding:0 8px;height:34px;box-sizing:border-box;font-weight:600}.popup .control-panel .quality-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .refresh-container{display:flex;justify-content:space-between;align-items:center}.popup .control-panel .refresh-container div{display:flex;align-items:center}@keyframes show{0%{top:-100vh;opacity:0}to{top:0;opacity:1}}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-panel{background:white!important}input.mat-input-element{color:#000000d9}.mat-checkbox-background{background-color:#fff}.image-cropper{position:absolute;width:150px;height:150px;border:2.5px solid white;box-sizing:border-box;resize:both;overflow:auto;opacity:0}.image-cropper #image-cropper-header{padding:10px;cursor:move;z-index:10;background-color:transparent;height:85%}.image-cropper #image-cropper-header mat-icon{color:#fff}.btn{padding:4px 8px;border-radius:4px;cursor:pointer}.btn mat-icon{color:#000000d1}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconAnchor, selector: "a[mat-icon-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i5.MatSlider, selector: "mat-slider", inputs: ["color", "disableRipple", "disabled", "discrete", "showTickMarks", "min", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i5.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i8.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i9.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i8.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PipesModule }, { kind: "pipe", type: i11.I18nPipe, name: "i18n" }, { kind: "pipe", type: i12.CalculateSizePipe, name: "calculateSize" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
480
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: GuajiritosImagePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
481
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.4", type: GuajiritosImagePicker, isStandalone: true, selector: "guajiritos-image-picker", inputs: { appearance: "appearance", color: "color", imagesAllowed: "imagesAllowed", _imageSrc: "_imageSrc", _config: "_config" }, outputs: { $imageChanged: "$imageChanged", $imageOriginal: "$imageOriginal" }, viewQueries: [{ propertyName: "imagePicker", first: true, predicate: ["imagePicker"], descendants: true }], ngImport: i0, template: "<div *ngIf='!loadImage()' class='place-image'>\r\n <div class='image-holder'\r\n [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\r\n <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\r\n (click)='onUpload($event)'>\r\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\r\n </button>\r\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\r\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf='loadImage()' class='place-image'>\r\n <div class='image-holder-loaded'\r\n [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\r\n <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\r\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\r\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\r\n </div>\r\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\r\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\r\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\r\n </p>\r\n\r\n <div class='editing-bar-btn'>\r\n <button id='upload-img' *ngIf='!config()?.hideAddBtn' mat-icon-button (click)='onUpload($event)'\r\n [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\r\n </button>\r\n <button id='edit-img' *ngIf='!config()?.hideEditBtn && !noEdit()' mat-icon-button (click)='showEditPanel.set(true)'\r\n [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>edit</mat-icon>\r\n </button>\r\n <a id='download-img' *ngIf='!config()?.hideDownloadBtn' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\r\n [href]='imageSrc()' mat-icon-button [download]='imageName'>\r\n <mat-icon class='mat-18'>cloud_download</mat-icon>\r\n </a>\r\n <button id='delete-img' *ngIf='!config()?.hideDeleteBtn' mat-icon-button (click)='onRemove()'\r\n [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>delete</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf='showEditPanel()' id='popup' class='popup'>\r\n <div class='popup-clear'>\r\n <button mat-icon-button (click)='onCloseEditPanel()'>\r\n <mat-icon class='mat-18'>clear</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class='image-container'>\r\n <div class='image-holder-full'>\r\n <img id='image-full' [src]='imageSrc()' alt=''>\r\n <div id='image-cropper' class='image-cropper'>\r\n <div id='image-cropper-header'>\r\n <mat-icon>drag_indicator</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class='control-panel'>\r\n <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\r\n <div class='quality-container'>\r\n <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\r\n [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\r\n <input matSliderThumb [formControl]='quality'>\r\n </mat-slider>\r\n </div>\r\n\r\n <div class='item-panel'>\r\n <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\r\n <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\r\n <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class='max-dimension-container'>\r\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeSize(true, false)' matInput [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\r\n [(ngModel)]='maxWidth' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n\r\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeSize(false, true)' matInput [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\r\n [(ngModel)]='maxHeight' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n </div>\r\n\r\n <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\r\n <div class='formats-selection'>\r\n <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\r\n <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\r\n <mat-option *ngFor='let format of allFormats' [value]='format'>\r\n {{ format }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class='refresh-container'>\r\n <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\r\n <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\r\n </mat-checkbox>\r\n <div class='d-flex '>\r\n <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <p *ngIf='showCrop.value'>\r\n <button mat-icon-button [color]='color' (click)='onCrop()'>\r\n <mat-icon>crop</mat-icon>\r\n </button>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf='showCrop.value'>\r\n <div class='dimension-container'>\r\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\r\n [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\r\n [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n\r\n <div class='save-container'>\r\n <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\r\n {{ 'SAVE' | i18n: config()?.language}}\r\n </button>\r\n\r\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption'\r\n [class.warn]='(imageSrc()?.length | calculateSize) > 200'\r\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\r\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".d-none{display:none}.d-flex{display:flex}.fw-600{font-weight:600}.w-100{width:100%}.mw-100{max-width:100%}.w-48{width:48%}.mw-48{max-width:48%}.float-right{float:right}p{margin:0!important;padding:0!important}.place-image{flex-direction:column;box-sizing:border-box;display:flex;place-content:flex-start;align-items:center}.place-image .image-holder{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;width:320px;height:240px;border-radius:16px;max-width:100%!important;background-color:#fff}@media (max-width: 599px){.place-image .image-holder{max-width:100%!important;max-height:250px!important}}.place-image .image-holder .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .image-holder-loaded{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;max-width:100%!important;width:320px;height:240px;border-radius:4px;padding:2px}.place-image .image-holder-loaded .image-caption{position:absolute;right:0;bottom:-22px}.place-image .image-holder-loaded img{height:100%;max-height:100%;width:100%;max-width:100%;object-fit:contain;object-position:center}@media (max-width: 599px){.place-image .image-holder-loaded{max-height:195px!important}}.place-image .image-holder-loaded .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder-loaded .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder-loaded:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .editing-bar-btn{margin-top:2px;display:flex;flex-direction:row;box-sizing:border-box;place-content:flex-start;align-items:flex-start}.place-image .editing-bar-btn .mat-icon-button{height:20px;line-height:20px;width:24px}.place-image .editing-bar-btn mat-icon{line-height:20px!important;font-size:20px!important;width:20px!important;height:20px!important}.place-image .editing-bar-btn button{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn button:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.place-image .editing-bar-btn a{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn a:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.popup{width:100vw;max-height:100%;height:100%;overflow:auto;position:fixed;top:0;left:0;z-index:1000;padding:24px;color:#fff;box-sizing:border-box;animation-name:show;animation-duration:.4s}.popup .popup-clear{flex-direction:row;box-sizing:border-box;display:flex;place-content:center flex-end;align-items:center}.popup .image-container{margin-top:50px;margin-bottom:50px;height:calc(100vh - 188px);min-height:calc(100vh - 188px);min-width:100%;width:100%;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start center;align-items:flex-start}.popup .image-container .image-holder-full{height:auto;width:auto;position:relative;display:contents}.popup img{max-height:600px;max-width:100%;object-fit:contain;object-position:center;margin:8px;transition:all .5s ease}@media (max-width: 1024px){.popup{background-color:#000000d9;padding:8px}.popup img{max-height:100%;max-width:100%}}@media (max-width: 599px){.popup img{margin:0}}.popup .control-panel{color:#000;background-color:#fff;margin:8px;padding:16px;max-width:100%;width:18rem;border-radius:8px;flex-direction:column;box-sizing:border-box;display:flex;place-content:stretch flex-start;align-items:stretch}@media (max-width: 599px){.popup .control-panel{margin:8px 0;width:100%}}.popup .control-panel .title-panel{padding:0 4px;font-size:16px;margin-bottom:16px!important}.popup .control-panel .item-panel{padding:0 4px!important;font-size:12px;display:flex;justify-content:space-between;align-items:center;gap:4px}.popup .control-panel .formats-selection{margin-top:8px!important;flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .max-dimension-container{margin-top:16px!important;flex-flow:row;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .dimension-container{margin-top:8px!important;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .save-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:center space-between;align-items:center}.popup .control-panel .save-container .save-button{padding:0 8px;height:34px;box-sizing:border-box;font-weight:600}.popup .control-panel .quality-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .refresh-container{display:flex;justify-content:space-between;align-items:center}.popup .control-panel .refresh-container div{display:flex;align-items:center}@keyframes show{0%{top:-100vh;opacity:0}to{top:0;opacity:1}}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-panel{background:white!important}input.mat-input-element{color:#000000d9}.mat-checkbox-background{background-color:#fff}.image-cropper{position:absolute;width:150px;height:150px;border:2.5px solid white;box-sizing:border-box;resize:both;overflow:auto;opacity:0}.image-cropper #image-cropper-header{padding:10px;cursor:move;z-index:10;background-color:transparent;height:85%}.image-cropper #image-cropper-header mat-icon{color:#fff}.btn{padding:4px 8px;border-radius:4px;cursor:pointer}.btn mat-icon{color:#000000d1}\n"], dependencies: [{ kind: "ngmodule", type: BrowserAnimationsModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconAnchor, selector: "a[mat-icon-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i6.MatSlider, selector: "mat-slider", inputs: ["color", "disableRipple", "disabled", "discrete", "showTickMarks", "min", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i6.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i9.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i9.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PipesModule }, { kind: "pipe", type: i12.I18nPipe, name: "i18n" }, { kind: "pipe", type: i13.CalculateSizePipe, name: "calculateSize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
493
482
  }
494
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: GuajiritosImagePicker, decorators: [{
483
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: GuajiritosImagePicker, decorators: [{
495
484
  type: Component,
496
485
  args: [{ selector: 'guajiritos-image-picker', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
497
- NgIf,
498
- NgStyle,
486
+ BrowserAnimationsModule,
499
487
  MatTooltipModule,
500
488
  MatIconModule,
501
489
  MatButtonModule,
@@ -506,10 +494,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
506
494
  FormsModule,
507
495
  MatSelectModule,
508
496
  ReactiveFormsModule,
509
- FormsModule,
510
- PipesModule,
511
- NgForOf,
512
- ], template: "<div *ngIf='!loadImage()' class='place-image'>\n <div class='image-holder'\n [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\n (click)='onUpload($event)'>\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n</div>\n\n<div *ngIf='loadImage()' class='place-image'>\n <div class='image-holder-loaded'\n [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\n </p>\n\n <div class='editing-bar-btn'>\n <button id='upload-img' *ngIf='!config()?.hideAddBtn' mat-icon-button (click)='onUpload($event)'\n [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n <button id='edit-img' *ngIf='!config()?.hideEditBtn && !noEdit()' mat-icon-button (click)='showEditPanel.set(true)'\n [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\n <mat-icon class='mat-18'>edit</mat-icon>\n </button>\n <a id='download-img' *ngIf='!config()?.hideDownloadBtn' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\n [href]='imageSrc()' mat-icon-button [download]='imageName'>\n <mat-icon class='mat-18'>cloud_download</mat-icon>\n </a>\n <button id='delete-img' *ngIf='!config()?.hideDeleteBtn' mat-icon-button (click)='onRemove()'\n [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>delete</mat-icon>\n </button>\n </div>\n</div>\n\n<div *ngIf='showEditPanel()' id='popup' class='popup'>\n <div class='popup-clear'>\n <button mat-icon-button (click)='onCloseEditPanel()'>\n <mat-icon class='mat-18'>clear</mat-icon>\n </button>\n </div>\n\n <div class='image-container'>\n <div class='image-holder-full'>\n <img id='image-full' [src]='imageSrc()' alt=''>\n <div id='image-cropper' class='image-cropper'>\n <div id='image-cropper-header'>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n </div>\n </div>\n\n <div class='control-panel'>\n <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\n <div class='quality-container'>\n <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\n [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\n <input matSliderThumb [formControl]='quality'>\n </mat-slider>\n </div>\n\n <div class='item-panel'>\n <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\n <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\n <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\n </mat-checkbox>\n </div>\n\n <div class='max-dimension-container'>\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(true, false)' matInput [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\n [formControl]='maxWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(false, true)' matInput [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\n [formControl]='maxHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n\n <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\n <div class='formats-selection'>\n <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\n <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\n <mat-option *ngFor='let format of allFormats' [value]='format'>\n {{ format }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class='refresh-container'>\n <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\n <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\n </mat-checkbox>\n <div class='d-flex '>\n <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\n <mat-icon>refresh</mat-icon>\n </button>\n <p *ngIf='showCrop.value'>\n <button mat-icon-button [color]='color' (click)='onCrop()'>\n <mat-icon>crop</mat-icon>\n </button>\n </p>\n </div>\n </div>\n\n <ng-container *ngIf='showCrop.value'>\n <div class='dimension-container'>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\n [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\n [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n </ng-container>\n\n <div class='save-container'>\n <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\n {{ 'SAVE' | i18n: config()?.language}}\n </button>\n\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption'\n [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\n </p>\n </div>\n </div>\n </div>\n</div>\n", styles: [".d-none{display:none}.d-flex{display:flex}.fw-600{font-weight:600}.w-100{width:100%}.mw-100{max-width:100%}.w-48{width:48%}.mw-48{max-width:48%}.float-right{float:right}p{margin:0!important;padding:0!important}.place-image{flex-direction:column;box-sizing:border-box;display:flex;place-content:flex-start;align-items:center}.place-image .image-holder{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;width:320px;height:240px;border-radius:16px;max-width:100%!important;background-color:#fff}@media (max-width: 599px){.place-image .image-holder{max-width:100%!important;max-height:250px!important}}.place-image .image-holder .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .image-holder-loaded{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;max-width:100%!important;width:320px;height:240px;border-radius:4px;padding:2px}.place-image .image-holder-loaded .image-caption{position:absolute;right:0;bottom:-22px}.place-image .image-holder-loaded img{height:100%;max-height:100%;width:100%;max-width:100%;object-fit:contain;object-position:center}@media (max-width: 599px){.place-image .image-holder-loaded{max-height:195px!important}}.place-image .image-holder-loaded .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder-loaded .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder-loaded:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .editing-bar-btn{margin-top:2px;display:flex;flex-direction:row;box-sizing:border-box;place-content:flex-start;align-items:flex-start}.place-image .editing-bar-btn .mat-icon-button{height:20px;line-height:20px;width:24px}.place-image .editing-bar-btn mat-icon{line-height:20px!important;font-size:20px!important;width:20px!important;height:20px!important}.place-image .editing-bar-btn button{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn button:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.place-image .editing-bar-btn a{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn a:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.popup{width:100vw;max-height:100%;height:100%;overflow:auto;position:fixed;top:0;left:0;z-index:1000;padding:24px;color:#fff;box-sizing:border-box;animation-name:show;animation-duration:.4s}.popup .popup-clear{flex-direction:row;box-sizing:border-box;display:flex;place-content:center flex-end;align-items:center}.popup .image-container{margin-top:50px;margin-bottom:50px;height:calc(100vh - 188px);min-height:calc(100vh - 188px);min-width:100%;width:100%;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start center;align-items:flex-start}.popup .image-container .image-holder-full{height:auto;width:auto;position:relative;display:contents}.popup img{max-height:600px;max-width:100%;object-fit:contain;object-position:center;margin:8px;transition:all .5s ease}@media (max-width: 1024px){.popup{background-color:#000000d9;padding:8px}.popup img{max-height:100%;max-width:100%}}@media (max-width: 599px){.popup img{margin:0}}.popup .control-panel{color:#000;background-color:#fff;margin:8px;padding:16px;max-width:100%;width:18rem;border-radius:8px;flex-direction:column;box-sizing:border-box;display:flex;place-content:stretch flex-start;align-items:stretch}@media (max-width: 599px){.popup .control-panel{margin:8px 0;width:100%}}.popup .control-panel .title-panel{padding:0 4px;font-size:16px;margin-bottom:16px!important}.popup .control-panel .item-panel{padding:0 4px!important;font-size:12px;display:flex;justify-content:space-between;align-items:center;gap:4px}.popup .control-panel .formats-selection{margin-top:8px!important;flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .max-dimension-container{margin-top:16px!important;flex-flow:row;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .dimension-container{margin-top:8px!important;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .save-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:center space-between;align-items:center}.popup .control-panel .save-container .save-button{padding:0 8px;height:34px;box-sizing:border-box;font-weight:600}.popup .control-panel .quality-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .refresh-container{display:flex;justify-content:space-between;align-items:center}.popup .control-panel .refresh-container div{display:flex;align-items:center}@keyframes show{0%{top:-100vh;opacity:0}to{top:0;opacity:1}}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-panel{background:white!important}input.mat-input-element{color:#000000d9}.mat-checkbox-background{background-color:#fff}.image-cropper{position:absolute;width:150px;height:150px;border:2.5px solid white;box-sizing:border-box;resize:both;overflow:auto;opacity:0}.image-cropper #image-cropper-header{padding:10px;cursor:move;z-index:10;background-color:transparent;height:85%}.image-cropper #image-cropper-header mat-icon{color:#fff}.btn{padding:4px 8px;border-radius:4px;cursor:pointer}.btn mat-icon{color:#000000d1}\n"] }]
497
+ PipesModule
498
+ ], template: "<div *ngIf='!loadImage()' class='place-image'>\r\n <div class='image-holder'\r\n [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\r\n <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\r\n (click)='onUpload($event)'>\r\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\r\n </button>\r\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\r\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf='loadImage()' class='place-image'>\r\n <div class='image-holder-loaded'\r\n [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\r\n <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\r\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\r\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\r\n </div>\r\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\r\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\r\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\r\n </p>\r\n\r\n <div class='editing-bar-btn'>\r\n <button id='upload-img' *ngIf='!config()?.hideAddBtn' mat-icon-button (click)='onUpload($event)'\r\n [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\r\n </button>\r\n <button id='edit-img' *ngIf='!config()?.hideEditBtn && !noEdit()' mat-icon-button (click)='showEditPanel.set(true)'\r\n [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>edit</mat-icon>\r\n </button>\r\n <a id='download-img' *ngIf='!config()?.hideDownloadBtn' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\r\n [href]='imageSrc()' mat-icon-button [download]='imageName'>\r\n <mat-icon class='mat-18'>cloud_download</mat-icon>\r\n </a>\r\n <button id='delete-img' *ngIf='!config()?.hideDeleteBtn' mat-icon-button (click)='onRemove()'\r\n [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\r\n <mat-icon class='mat-18'>delete</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf='showEditPanel()' id='popup' class='popup'>\r\n <div class='popup-clear'>\r\n <button mat-icon-button (click)='onCloseEditPanel()'>\r\n <mat-icon class='mat-18'>clear</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class='image-container'>\r\n <div class='image-holder-full'>\r\n <img id='image-full' [src]='imageSrc()' alt=''>\r\n <div id='image-cropper' class='image-cropper'>\r\n <div id='image-cropper-header'>\r\n <mat-icon>drag_indicator</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class='control-panel'>\r\n <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\r\n <div class='quality-container'>\r\n <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\r\n [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\r\n <input matSliderThumb [formControl]='quality'>\r\n </mat-slider>\r\n </div>\r\n\r\n <div class='item-panel'>\r\n <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\r\n <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\r\n <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class='max-dimension-container'>\r\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeSize(true, false)' matInput [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\r\n [(ngModel)]='maxWidth' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n\r\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeSize(false, true)' matInput [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\r\n [(ngModel)]='maxHeight' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n </div>\r\n\r\n <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\r\n <div class='formats-selection'>\r\n <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\r\n <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\r\n <mat-option *ngFor='let format of allFormats' [value]='format'>\r\n {{ format }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class='refresh-container'>\r\n <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\r\n <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\r\n </mat-checkbox>\r\n <div class='d-flex '>\r\n <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <p *ngIf='showCrop.value'>\r\n <button mat-icon-button [color]='color' (click)='onCrop()'>\r\n <mat-icon>crop</mat-icon>\r\n </button>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf='showCrop.value'>\r\n <div class='dimension-container'>\r\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\r\n [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\r\n <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\r\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\r\n [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n\r\n <div class='save-container'>\r\n <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\r\n {{ 'SAVE' | i18n: config()?.language}}\r\n </button>\r\n\r\n <p *ngIf='imageSrc()?.length' class='mat-caption image-caption'\r\n [class.warn]='(imageSrc()?.length | calculateSize) > 200'\r\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\r\n {{\"SIZE\" | i18n: currentLanguage()}}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".d-none{display:none}.d-flex{display:flex}.fw-600{font-weight:600}.w-100{width:100%}.mw-100{max-width:100%}.w-48{width:48%}.mw-48{max-width:48%}.float-right{float:right}p{margin:0!important;padding:0!important}.place-image{flex-direction:column;box-sizing:border-box;display:flex;place-content:flex-start;align-items:center}.place-image .image-holder{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;width:320px;height:240px;border-radius:16px;max-width:100%!important;background-color:#fff}@media (max-width: 599px){.place-image .image-holder{max-width:100%!important;max-height:250px!important}}.place-image .image-holder .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .image-holder-loaded{flex-direction:column;box-sizing:border-box;display:flex;place-content:center;align-items:center;position:relative;max-width:100%!important;width:320px;height:240px;border-radius:4px;padding:2px}.place-image .image-holder-loaded .image-caption{position:absolute;right:0;bottom:-22px}.place-image .image-holder-loaded img{height:100%;max-height:100%;width:100%;max-width:100%;object-fit:contain;object-position:center}@media (max-width: 599px){.place-image .image-holder-loaded{max-height:195px!important}}.place-image .image-holder-loaded .image-upload-btn{transition:all .5s ease;position:relative;opacity:.85;width:50px;height:50px;box-sizing:content-box}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:50px;width:50px;height:50px;line-height:50px}@media (max-width: 599px){.place-image .image-holder-loaded .image-upload-btn{opacity:1;width:30px;height:30px}.place-image .image-holder-loaded .image-upload-btn mat-icon{font-size:30px;width:30px;height:30px;line-height:30px}}.place-image .image-holder-loaded:hover .image-upload-btn{opacity:1;transition:all .5s ease}.place-image .editing-bar-btn{margin-top:2px;display:flex;flex-direction:row;box-sizing:border-box;place-content:flex-start;align-items:flex-start}.place-image .editing-bar-btn .mat-icon-button{height:20px;line-height:20px;width:24px}.place-image .editing-bar-btn mat-icon{line-height:20px!important;font-size:20px!important;width:20px!important;height:20px!important}.place-image .editing-bar-btn button{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn button:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.place-image .editing-bar-btn a{margin:4px;transition:all .5s ease}.place-image .editing-bar-btn a:hover{transform:scale(1.25);margin:4px 8px;transition:all .25s ease-in}.popup{width:100vw;max-height:100%;height:100%;overflow:auto;position:fixed;top:0;left:0;z-index:1000;padding:24px;color:#fff;box-sizing:border-box;animation-name:show;animation-duration:.4s}.popup .popup-clear{flex-direction:row;box-sizing:border-box;display:flex;place-content:center flex-end;align-items:center}.popup .image-container{margin-top:50px;margin-bottom:50px;height:calc(100vh - 188px);min-height:calc(100vh - 188px);min-width:100%;width:100%;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start center;align-items:flex-start}.popup .image-container .image-holder-full{height:auto;width:auto;position:relative;display:contents}.popup img{max-height:600px;max-width:100%;object-fit:contain;object-position:center;margin:8px;transition:all .5s ease}@media (max-width: 1024px){.popup{background-color:#000000d9;padding:8px}.popup img{max-height:100%;max-width:100%}}@media (max-width: 599px){.popup img{margin:0}}.popup .control-panel{color:#000;background-color:#fff;margin:8px;padding:16px;max-width:100%;width:18rem;border-radius:8px;flex-direction:column;box-sizing:border-box;display:flex;place-content:stretch flex-start;align-items:stretch}@media (max-width: 599px){.popup .control-panel{margin:8px 0;width:100%}}.popup .control-panel .title-panel{padding:0 4px;font-size:16px;margin-bottom:16px!important}.popup .control-panel .item-panel{padding:0 4px!important;font-size:12px;display:flex;justify-content:space-between;align-items:center;gap:4px}.popup .control-panel .formats-selection{margin-top:8px!important;flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .max-dimension-container{margin-top:16px!important;flex-flow:row;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .dimension-container{margin-top:8px!important;flex-flow:row wrap;box-sizing:border-box;display:flex;place-content:flex-start space-between;align-items:flex-start}.popup .control-panel .save-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:center space-between;align-items:center}.popup .control-panel .save-container .save-button{padding:0 8px;height:34px;box-sizing:border-box;font-weight:600}.popup .control-panel .quality-container{flex-direction:row;box-sizing:border-box;display:flex;place-content:flex-start;align-items:flex-start}.popup .control-panel .refresh-container{display:flex;justify-content:space-between;align-items:center}.popup .control-panel .refresh-container div{display:flex;align-items:center}@keyframes show{0%{top:-100vh;opacity:0}to{top:0;opacity:1}}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-panel{background:white!important}input.mat-input-element{color:#000000d9}.mat-checkbox-background{background-color:#fff}.image-cropper{position:absolute;width:150px;height:150px;border:2.5px solid white;box-sizing:border-box;resize:both;overflow:auto;opacity:0}.image-cropper #image-cropper-header{padding:10px;cursor:move;z-index:10;background-color:transparent;height:85%}.image-cropper #image-cropper-header mat-icon{color:#fff}.btn{padding:4px 8px;border-radius:4px;cursor:pointer}.btn mat-icon{color:#000000d1}\n"] }]
513
499
  }], ctorParameters: function () { return []; }, propDecorators: { appearance: [{
514
500
  type: Input
515
501
  }], color: [{
@@ -528,4 +514,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImpor
528
514
  }], _config: [{
529
515
  type: Input
530
516
  }] } });
531
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VhY2hvcy1pbWFnZS1waWNrZXIvc3JjL2xpYi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWFjaG9zLWltYWdlLXBpY2tlci9zcmMvbGliL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMz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QkFDakIsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxXQUFXO3dCQUNYLE9BQU87cUJBQ1I7MEVBMkNRLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRXVDLFdBQVc7c0JBQXZELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFakMsYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVNLFNBQVM7c0JBQXJCLEtBQUs7Z0JBbUNPLE9BQU87c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgc2lnbmFsLFxuICBWaWV3Q2hpbGQsXG4gIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlc2l6ZU9ic2VydmVyIH0gZnJvbSAncmVzaXplLW9ic2VydmVyJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJlc2l6ZU9ic2VydmVyRW50cnkgfSBmcm9tICdyZXNpemUtb2JzZXJ2ZXIvbGliL1Jlc2l6ZU9ic2VydmVyRW50cnknO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXRTbGlkZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZXInO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsIE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTmdGb3JPZiwgTmdJZiwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IFBpcGVzTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvcGlwZXMvcGlwZXMubW9kdWxlJztcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZVBpY2tlckNvbmYge1xuICB3aWR0aD86IHN0cmluZztcbiAgaGVpZ2h0Pzogc3RyaW5nO1xuICBib3JkZXJSYWRpdXM/OiBzdHJpbmc7XG4gIGNvbXByZXNzSW5pdGlhbD86IGJvb2xlYW47XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBoaWRlRGVsZXRlQnRuPzogYm9vbGVhbjtcbiAgaGlkZURvd25sb2FkQnRuPzogYm9vbGVhbjtcbiAgaGlkZUVkaXRCdG4/OiBib29sZWFuO1xuICBoaWRlQWRkQnRuPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUNvbnZlcnRlcklucHV0IHtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgcXVhbGl0eT86IG51bWJlcjtcbiAgZGF0YVR5cGU/OiBzdHJpbmc7XG4gIG1haW50YWluUmF0aW8/OiBib29sZWFuO1xuICBjaGFuZ2VIZWlnaHQ/OiBib29sZWFuO1xuICBjaGFuZ2VXaWR0aD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEltYWdlQWxsb3dlZFR5cGVzID1cbiAgJ2ltYWdlLyonXG4gIHwgJy53ZWJwJ1xuICB8ICcucG5nJ1xuICB8ICcud2VicCwgLmpwZywgLmpwZWcnXG4gIHwgJy53ZWJwLCAucG5nJ1xuICB8ICcuanBnLCAuanBlZydcbiAgfCAnLnBuZywgLmpwZywgLmpwZWcnXG4gIHwgJy53ZWJwLCAucG5nLCAuanBnLCAuanBlZyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2d1YWppcml0b3MtaW1hZ2UtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0lmLFxuICAgIE5nU3R5bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICBNYXRTbGlkZXJNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFBpcGVzTW9kdWxlLFxuICAgIE5nRm9yT2YsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEd1YWppcml0b3NJbWFnZVBpY2tlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICB9XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZUFsbCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIG9ic2VydmVyOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIG9yaWdpbkltYWdlU3JjOiBhbnk7XG4gIHByaXZhdGUgZmlsZVR5cGU6IGFueTtcbiAgcHJpdmF0ZSB1cmxJbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGxhc3RPcmlnaW5TcmM6IGFueTtcblxuICBwcml2YXRlIGFycmF5Q29waWVkSW1hZ2VzOiBhbnlbXSA9IFtdO1xuXG4gIHB1YmxpYyByZWFkb25seSB1dWlkRmlsZVBpY2tlcjogc3RyaW5nID0gRGF0ZS5ub3coKS50b1N0cmluZygyMCk7XG4gIHB1YmxpYyByZWFkb25seSBhbGxGb3JtYXRzOiBzdHJpbmdbXSA9IFsnd2VicCcsICdqcGVnJywgJ3BuZyddO1xuICBwdWJsaWMgY29uZmlnOiBXcml0YWJsZVNpZ25hbDxJbWFnZVBpY2tlckNvbmY+ID0gc2lnbmFsKHtcbiAgICBoZWlnaHQ6ICcyNDBweCcsXG4gICAgd2lkdGg6ICczMjBweCcsXG4gICAgYm9yZGVyUmFkaXVzOiAnMTZweCcsXG4gICAgY29tcHJlc3NJbml0aWFsOiB0cnVlLFxuICAgIGxhbmd1YWdlOiAnZXMnLFxuICAgIGhpZGVEZWxldGVCdG46IGZhbHNlLFxuICAgIGhpZGVEb3dubG9hZEJ0bjogZmFsc2UsXG4gICAgaGlkZUVkaXRCdG46IGZhbHNlLFxuICAgIGhpZGVBZGRCdG46IGZhbHNlLFxuICB9KTtcbiAgcHVibGljIGltYWdlU3JjOiBXcml0YWJsZVNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKG51bGwpO1xuICBwdWJsaWMgc2hvd0Nyb3A6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogZmFsc2UsIGRpc2FibGVkOiBmYWxzZSB9KTtcbiAgcHVibGljIGxvYWRJbWFnZTogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xuICBwdWJsaWMgbm9FZGl0OiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XG4gIHB1YmxpYyBzaG93RWRpdFBhbmVsOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XG4gIHB1YmxpYyBtYWludGFpbkFzcGVjdFJhdGlvOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IHRydWUsIGRpc2FibGVkOiBmYWxzZSB9KTtcbiAgcHVibGljIHF1YWxpdHk6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogNzAsIGRpc2FibGVkOiBmYWxzZSB9KTtcbiAgcHVibGljIGZvcm1hdDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiAnd2VicCcsIGRpc2FibGVkOiBmYWxzZSB9KTtcbiAgcHVibGljIG1heEhlaWdodDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiAyMDAwLCBkaXNhYmxlZDogZmFsc2UgfSk7XG4gIHB1YmxpYyBtYXhXaWR0aDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiAyMDAwLCBkaXNhYmxlZDogZmFsc2UgfSk7XG4gIHB1YmxpYyBjcm9wSGVpZ2h0OiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IDE1MCwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuICBwdWJsaWMgY3JvcFdpZHRoOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IDE1MCwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuICBwdWJsaWMgaW1hZ2VOYW1lOiBXcml0YWJsZVNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKCdkb3dubG9hZCcpO1xuICBwdWJsaWMgY3VycmVudExhbmd1YWdlOiBXcml0YWJsZVNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKCdlcycpO1xuXG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgPSAnb3V0bGluZSc7XG4gIEBJbnB1dCgpIGNvbG9yOiBUaGVtZVBhbGV0dGUgPSAncHJpbWFyeSc7XG4gIEBJbnB1dCgpIGltYWdlc0FsbG93ZWQ6IEltYWdlQWxsb3dlZFR5cGVzID0gJ2ltYWdlLyonO1xuXG4gIEBWaWV3Q2hpbGQoJ2ltYWdlUGlja2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGltYWdlUGlja2VyOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXG4gIEBPdXRwdXQoKSAkaW1hZ2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgJGltYWdlT3JpZ2luYWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQElucHV0KCkgc2V0IF9pbWFnZVNyYyhpbWFnZTogc3RyaW5nKSB7XG4gICAgaWYgKGltYWdlKSB7XG4gICAgICBsZXQgdHlwZXM6IHN0cmluZ1tdID0gaW1hZ2Uuc3BsaXQoJy4nKTtcbiAgICAgIHRoaXMuZm9ybWF0LnNldFZhbHVlKHR5cGVzW3R5cGVzLmxlbmd0aCAtIDFdKTtcblxuICAgICAgaWYgKCF0aGlzLmZvcm1hdC52YWx1ZSB8fCAodGhpcy5mb3JtYXQudmFsdWUgIT09ICdwbmcnICYmIHRoaXMuZm9ybWF0LnZhbHVlICE9PSAnanBlZycgJiYgdGhpcy5mb3JtYXQudmFsdWUgIT09ICd3ZWJwJykpIHtcbiAgICAgICAgdGhpcy5mb3JtYXQuc2V0VmFsdWUoJ2pwZWcnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoaW1hZ2UpO1xuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcy5wdXNoKHRoaXMuaW1hZ2VTcmMpO1xuICAgICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IGltYWdlO1xuICAgICAgdGhpcy5sYXN0T3JpZ2luU3JjID0gaW1hZ2U7XG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQodGhpcy5vcmlnaW5JbWFnZVNyYyk7XG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLm5vRWRpdC5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KG51bGwpO1xuICAgICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IG51bGw7XG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMgPSBbXTtcbiAgICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IG51bGw7XG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQobnVsbCk7XG4gICAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSgnanBlZycpO1xuICAgICAgdGhpcy5tYXhIZWlnaHQuc2V0VmFsdWUoMjAwMCk7XG4gICAgICB0aGlzLm1heFdpZHRoLnNldFZhbHVlKDIwMDApO1xuICAgICAgdGhpcy5jcm9wSGVpZ2h0LnNldFZhbHVlKDE1MCk7XG4gICAgICB0aGlzLmNyb3BXaWR0aC5zZXRWYWx1ZSgxNTApO1xuICAgICAgdGhpcy5tYWludGFpbkFzcGVjdFJhdGlvLnNldFZhbHVlKHRydWUpO1xuICAgICAgdGhpcy5zaG93RWRpdFBhbmVsLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IF9jb25maWcodmFsdWU6IEltYWdlUGlja2VyQ29uZikge1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PSBPYmplY3QpIHtcbiAgICAgIHRoaXMuY29uZmlnLnNldCh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnKCksXG4gICAgICAgIC4uLnZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSZWFkZXJMb2FkZWQocmVhZGVyRXZ0OiB7IHRhcmdldDogeyByZXN1bHQ6IGFueTsgfTsgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJpbmFyeVN0cmluZzogc3RyaW5nID0gcmVhZGVyRXZ0LnRhcmdldC5yZXN1bHQ7XG4gICAgY29uc3QgYmFzZTY0dGV4dFN0cmluZzogc3RyaW5nID0gYnRvYShiaW5hcnlTdHJpbmcpO1xuICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSB0aGlzLnVybEltYWdlICsgYmFzZTY0dGV4dFN0cmluZztcbiAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSB0aGlzLnVybEltYWdlICsgYmFzZTY0dGV4dFN0cmluZztcbiAgICBpZiAodGhpcy5jb25maWcoKT8uY29tcHJlc3NJbml0aWFsKSB7XG4gICAgICB0aGlzLnF1YWxpdHkuc2V0VmFsdWUoNzApO1xuICAgICAgY29uc3QgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XG4gICAgICAgIGRhdGFUeXBlOiB0aGlzLmZvcm1hdC52YWx1ZSxcbiAgICAgICAgcXVhbGl0eTogMC43MCxcbiAgICAgICAgbWFpbnRhaW5SYXRpbzogdHJ1ZSxcbiAgICAgIH07XG4gICAgICB0aGlzLmltYWdlU3JjLnNldChhd2FpdCB0aGlzLnJlc2l6ZURhdGFVUkwodGhpcy51cmxJbWFnZSArIGJhc2U2NHRleHRTdHJpbmcsIGlucHV0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KHRoaXMudXJsSW1hZ2UgKyBiYXNlNjR0ZXh0U3RyaW5nKTtcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMgPSBbXTtcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucHVzaCh7XG4gICAgICAgIGxhc3RJbWFnZTogdGhpcy5pbWFnZVNyYygpLFxuICAgICAgICB3aWR0aDogdGhpcy5tYXhXaWR0aC52YWx1ZSxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodC52YWx1ZSxcbiAgICAgICAgcXVhbGl0eTogdGhpcy5xdWFsaXR5LnZhbHVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQodGhpcy5pbWFnZVNyYygpKTtcbiAgICB9XG4gICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQodGhpcy5pbWFnZVNyYygpKTtcbiAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2l6ZURhdGFVUkwoZGF0YXM6IHN0cmluZywgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbihyZXNvbHZlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBsZXQgaW1nOiBIVE1MSW1hZ2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICBpbWcuc3JjID0gZGF0YXMgKyAnJztcbiAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xuICAgICAgbGV0IHF1YWxpdHk6IG51bWJlciA9IGlucHV0Py5xdWFsaXR5ID8/IDEuMDtcbiAgICAgIGxldCBtYWludGFpblJhdGlvOiBib29sZWFuID0gaW5wdXQubWFpbnRhaW5SYXRpbyAhPT0gdW5kZWZpbmVkID8gaW5wdXQubWFpbnRhaW5SYXRpbyA6IHRydWU7XG5cbiAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjb25zdCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBsZXQgcmF0aW86IG51bWJlciA9IGltZy53aWR0aCAvIGltZy5oZWlnaHQ7XG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gaW5wdXQ/LndpZHRoID8/IGltZy53aWR0aDtcbiAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gaW5wdXQ/LmhlaWdodCA/PyBpbWcuaGVpZ2h0O1xuXG4gICAgICAgIGlmIChtYWludGFpblJhdGlvKSB7XG4gICAgICAgICAgaWYgKGlucHV0LmNoYW5nZUhlaWdodCkge1xuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaGVpZ2h0ICogcmF0aW87XG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSB3aWR0aCAvIHJhdGlvO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgY3R4Py5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICBsZXQgdHlwZTogc3RyaW5nID0gaW5wdXQ/LmRhdGFUeXBlID8/ICd3ZWJwJztcbiAgICAgICAgY29uc3QgZGF0YVVSSTogc3RyaW5nID0gY2FudmFzLnRvRGF0YVVSTChgaW1hZ2UvJHt0eXBlfWAsIHF1YWxpdHkpO1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBkYXRhVXJpOiBkYXRhVVJJLFxuICAgICAgICAgIHdpZHRoOiBjYW52YXMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBjYW52YXMuaGVpZ2h0LFxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSkudGhlbigoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLm1heEhlaWdodC5zZXRWYWx1ZShkYXRhPy5oZWlnaHQpO1xuICAgICAgdGhpcy5tYXhXaWR0aC5zZXRWYWx1ZShkYXRhPy53aWR0aCk7XG4gICAgICBpZiAodGhpcy5hcnJheUNvcGllZEltYWdlcz8ubGVuZ3RoIDw9IDIwKSB7XG4gICAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucHVzaCh7XG4gICAgICAgICAgbGFzdEltYWdlOiBkYXRhPy5kYXRhVXJpLFxuICAgICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoLnZhbHVlLFxuICAgICAgICAgIGhlaWdodDogdGhpcy5tYXhIZWlnaHQudmFsdWUsXG4gICAgICAgICAgcXVhbGl0eTogdGhpcy5xdWFsaXR5LnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGEuZGF0YVVyaTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd2FpdChtcz86IG51bWJlciB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55PiB7XG4gICAgbXMgPSBtcyA/PyAxMDAwO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKHRydWUpO1xuICAgICAgfSwgbXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmFnRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGxldCBwb3MxOiBudW1iZXIgPSAwLCBwb3MyOiBudW1iZXIgPSAwLCBwb3MzOiBudW1iZXIgPSAwLCBwb3M0OiBudW1iZXIgPSAwO1xuXG4gICAgbGV0IGVsOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQgKyAnLWhlYWRlcicpO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwub25tb3VzZWRvd24gPSBkcmFnTW91c2VEb3duO1xuICAgICAgZWwub250b3VjaHN0YXJ0ID0gZHJhZ01vdXNlRG93bjtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XG4gICAgICBlbGVtZW50Lm9udG91Y2hzdGFydCA9IGRyYWdNb3VzZURvd247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZHJhZ01vdXNlRG93bihlOiBhbnkpOiB2b2lkIHtcbiAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcbiAgICAgIGU/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBwb3MzID0gZT8uY2xpZW50WDtcbiAgICAgIHBvczQgPSBlPy5jbGllbnRZO1xuICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gY2xvc2VEcmFnRWxlbWVudDtcbiAgICAgIGRvY3VtZW50Lm9udG91Y2hlbmQgPSBjbG9zZURyYWdFbGVtZW50O1xuICAgICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBlbGVtZW50RHJhZztcbiAgICAgIGRvY3VtZW50Lm9udG91Y2htb3ZlID0gZWxlbWVudERyYWc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZWxlbWVudERyYWcoZTogYW55KTogdm9pZCB7XG4gICAgICBsZXQgaG9sZGVySW1hZ2U6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1mdWxsJyk7XG4gICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XG4gICAgICBlPy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcG9zMSA9IHBvczMgLSBlPy5jbGllbnRYO1xuICAgICAgcG9zMiA9IHBvczQgLSBlPy5jbGllbnRZO1xuICAgICAgcG9zMyA9IGU/LmNsaWVudFg7XG4gICAgICBwb3M0ID0gZT8uY2xpZW50WTtcblxuICAgICAgY29uc3QgbmV3VG9wOiBudW1iZXIgPSBlbGVtZW50Lm9mZnNldFRvcCAtIHBvczI7XG4gICAgICBjb25zdCBuZXdMZWZ0OiBudW1iZXIgPSBlbGVtZW50Lm9mZnNldExlZnQgLSBwb3MxO1xuICAgICAgY29uc3QgcmVjdEhvbGRlciA9IGhvbGRlckltYWdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgcmVjdEVsZW1lbnQ6IERPTVJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKG5ld1RvcCA+PSByZWN0SG9sZGVyLnkgKyA4KSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gTWF0aC5taW4obmV3VG9wLCByZWN0SG9sZGVyLnkgKyByZWN0SG9sZGVyLmhlaWdodCAtIHJlY3RFbGVtZW50LmhlaWdodCAtIDQpICsgJ3B4JztcbiAgICAgIH1cbiAgICAgIGlmIChuZXdMZWZ0ID4gcmVjdEhvbGRlci54ICsgNCAmJiByZWN0SG9sZGVyLnggKyByZWN0SG9sZGVyLndpZHRoID4gcmVjdEVsZW1lbnQueCArIHJlY3RFbGVtZW50LndpZHRoICsgMikge1xuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBNYXRoLm1pbihuZXdMZWZ0LCByZWN0SG9sZGVyLnggKyByZWN0SG9sZGVyLndpZHRoIC0gcmVjdEVsZW1lbnQud2lkdGggLSA0KSArICdweCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvc2VEcmFnRWxlbWVudCgpOiB2b2lkIHtcbiAgICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9IG51bGw7XG4gICAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG51bGw7XG4gICAgICBkb2N1bWVudC5vbnRvdWNoZW5kID0gbnVsbDtcbiAgICAgIGRvY3VtZW50Lm9udG91Y2htb3ZlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25VcGxvYWQoZXZlbnQ6IHsgcHJldmVudERlZmF1bHQ6ICgpID0+IHZvaWQ7IH0pOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuaW1hZ2VQaWNrZXI/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVGaWxlU2VsZWN0KGV2dDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZmlsZXMgPSBldnQ/LnRhcmdldD8uZmlsZXM7XG4gICAgaWYgKGZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNbMF07XG4gICAgICB0aGlzLmltYWdlTmFtZS5zZXQoZmlsZT8ubmFtZT8uc3BsaXQoJy4nKVswXSk7XG4gICAgICB0aGlzLmZpbGVUeXBlID0gZmlsZT8udHlwZTtcbiAgICAgIHRoaXMudXJsSW1hZ2UgPSBgZGF0YToke2ZpbGU/LnR5cGV9O2Jhc2U2NCxgO1xuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcblxuICAgICAgaWYgKGZpbGVzICYmIGZpbGUpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyOiBhbnkgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIub25sb2FkID0gdGhpcy5oYW5kbGVSZWFkZXJMb2FkZWQuYmluZCh0aGlzKTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25DbG9zZUVkaXRQYW5lbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vYnNlcnZlciBpbnN0YW5jZW9mIFJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICBsZXQgaW1hZ2VDcm9wcGVyOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xuICAgICAgbGV0IGltYWdlRnVsbDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIudW5vYnNlcnZlKGltYWdlQ3JvcHBlcik7XG4gICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShpbWFnZUZ1bGwpO1xuICAgIH1cbiAgICB0aGlzLnNob3dDcm9wLnNldFZhbHVlKGZhbHNlKTtcbiAgICB0aGlzLnNob3dFZGl0UGFuZWwuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZVF1YWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcXVhbGl0eUl0ZW06IG51bWJlciA9IHRoaXMucXVhbGl0eS52YWx1ZSAvIDEwMDtcbiAgICBpZiAoIXRoaXMubWF4SGVpZ2h0LnZhbHVlKSB7XG4gICAgICB0aGlzLm1heEhlaWdodC5zZXRWYWx1ZSgyMDAwKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm1heFdpZHRoLnZhbHVlKSB7XG4gICAgICB0aGlzLm1heFdpZHRoLnNldFZhbHVlKDIwMDApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2FpdCgyNTApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnB1dDogSW1hZ2VDb252ZXJ0ZXJJbnB1dCA9IHtcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodC52YWx1ZSxcbiAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgudmFsdWUsXG4gICAgICAgIGRhdGFUeXBlOiB0aGlzLmZvcm1hdC52YWx1ZSxcbiAgICAgICAgcXVhbGl0eTogcXVhbGl0eUl0ZW0sXG4gICAgICAgIG1haW50YWluUmF0aW86IHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby52YWx1ZSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGF3YWl0IHRoaXMucmVzaXplRGF0YVVSTCh0aGlzLm9yaWdpbkltYWdlU3JjLCBpbnB1dCkpO1xuICAgICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQodGhpcy5pbWFnZVNyYygpKTtcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZUZvcm1hdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcXVhbGl0eUl0ZW06IG51bWJlciA9IHRoaXMucXVhbGl0eS52YWx1ZSAvIDEwMDtcbiAgICBpZiAoIXRoaXMubWF4SGVpZ2h0LnZhbHVlKSB7XG4gICAgICB0aGlzLm1heEhlaWdodC5zZXRWYWx1ZSgyMDAwKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm1heFdpZHRoLnZhbHVlKSB7XG4gICAgICB0aGlzLm1heFdpZHRoLnNldFZhbHVlKDIwMDApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2FpdCgyNTApO1xuICAgIHRyeSB7XG4gICAgICBsZXQgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XG4gICAgICAgIGhlaWdodDogdGhpcy5tYXhIZWlnaHQudmFsdWUsXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoLnZhbHVlLFxuICAgICAgICBkYXRhVHlwZTogdGhpcy5mb3JtYXQudmFsdWUsXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlJdGVtLFxuICAgICAgICBtYWludGFpblJhdGlvOiB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8udmFsdWUsXG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMub3JpZ2luSW1hZ2VTcmMsIGlucHV0KSk7XG4gICAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIG9uQ2hhbmdlU2l6ZShjaGFuZ2VXaWR0aD86IGFueSwgY2hhbmdlSGVpZ2h0PzogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHF1YWxpdHlJdGVtOiBudW1iZXIgPSB0aGlzLnF1YWxpdHkudmFsdWUgLyAxMDA7XG4gICAgaWYgKCF0aGlzLm1heEhlaWdodC52YWx1ZSkge1xuICAgICAgdGhpcy5tYXhIZWlnaHQuc2V0VmFsdWUoMjAwMCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5tYXhXaWR0aC52YWx1ZSkge1xuICAgICAgdGhpcy5tYXhXaWR0aC5zZXRWYWx1ZSgyMDAwKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLndhaXQoNTAwKTtcblxuICAgIHRyeSB7XG4gICAgICBsZXQgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XG4gICAgICAgIGhlaWdodDogdGhpcy5tYXhIZWlnaHQudmFsdWUsXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoLnZhbHVlLFxuICAgICAgICBkYXRhVHlwZTogdGhpcy5mb3JtYXQudmFsdWUsXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlJdGVtLFxuICAgICAgICBtYWludGFpblJhdGlvOiB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8udmFsdWUsXG4gICAgICAgIGNoYW5nZUhlaWdodDogY2hhbmdlSGVpZ2h0LFxuICAgICAgICBjaGFuZ2VXaWR0aDogY2hhbmdlV2lkdGgsXG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMub3JpZ2luSW1hZ2VTcmMsIGlucHV0KSk7XG4gICAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlQ3JvcCgpOiB2b2lkIHtcbiAgICBjb25zdCBjcm9wcGVyOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xuICAgIGNyb3BwZXIuc3R5bGUud2lkdGggPSB0aGlzLmNyb3BXaWR0aC52YWx1ZSArICdweCc7XG4gICAgY3JvcHBlci5zdHlsZS5oZWlnaHQgPSB0aGlzLmNyb3BIZWlnaHQudmFsdWUgKyAncHgnO1xuICB9XG5cbiAgcHVibGljIG9uQ3JvcFN0YXRlQ2hhbmdlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNyb3BwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcbiAgICBjb25zdCBmdWxsSW1hZ2U6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcbiAgICBjb25zdCBhc3BlY3RSYXRpbzogbnVtYmVyID0gZnVsbEltYWdlLm9mZnNldFdpZHRoIC8gZnVsbEltYWdlLm9mZnNldEhlaWdodDtcblxuICAgIGlmICh0aGlzLnNob3dDcm9wLnZhbHVlKSB7XG4gICAgICBjcm9wcGVyLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcbiAgICAgIHRoaXMuZHJhZ0VsZW1lbnQoY3JvcHBlcik7XG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzOiBSZXNpemVPYnNlcnZlckVudHJ5W10pOiB2b2lkID0+IHtcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeTogUmVzaXplT2JzZXJ2ZXJFbnRyeSk6IHZvaWQgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnNob3dFZGl0UGFuZWwoKSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudENyb3BwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRGdWxsOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1mdWxsJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlY3RIb2xkZXI6IERPTVJlY3QgPSBlbGVtZW50RnVsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY3RFbGVtZW50OiBET01SZWN0ID0gZWxlbWVudENyb3BwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1heFdpZHRoOiBudW1iZXIgPSByZWN0SG9sZGVyLnggKyByZWN0SG9sZGVyLndpZHRoIC0gcmVjdEVsZW1lbnQueCAtIDQ7XG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQ6IG51bWJlciA9IHJlY3RIb2xkZXIueSArIHJlY3RIb2xkZXIuaGVpZ2h0IC0gcmVjdEVsZW1lbnQueSAtIDQ7XG5cbiAgICAgICAgICAgIC8vIE9idGVuZXIgZWwgdGFtYcOxbyBkZWwgw6FyZWEgZGUgcmVjb3J0ZSBzZWxlY2Npb25hZGEgcG9yIGVsIHVzdWFyaW9cbiAgICAgICAgICAgIGNvbnN0IGNyb3BXaWR0aDogbnVtYmVyID0gZWxlbWVudENyb3BwZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBjcm9wSGVpZ2h0OiBudW1iZXIgPSBlbGVtZW50Q3JvcHBlci5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGFyIGVsIGFuY2hvIHkgZWwgYWx0byBkZWwgw6FyZWEgZGUgcmVjb3J0ZSBtYW50ZW5pZW5kbyBsYSByZWxhY2nDs24gZGUgYXNwZWN0byBkZSBsYSBpbWFnZW4gb3JpZ2luYWxcbiAgICAgICAgICAgIGxldCBuZXdXaWR0aDogbnVtYmVyID0gY3JvcFdpZHRoO1xuICAgICAgICAgICAgbGV0IG5ld0hlaWdodDogbnVtYmVyID0gY3JvcEhlaWdodDtcblxuICAgICAgICAgICAgaWYgKHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby52YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoY3JvcFdpZHRoIC8gY3JvcEhlaWdodCA+IGFzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gY3JvcFdpZHRoIC8gYXNwZWN0UmF0aW87XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBjcm9wSGVpZ2h0ICogYXNwZWN0UmF0aW87XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWp1c3RhciBlbCBhbmNobyB5IGVsIGFsdG8gZGVsIMOhcmVhIGRlIHJlY29ydGUgc2kgc3VwZXJhIGxvcyBsw61taXRlc1xuICAgICAgICAgICAgbmV3V2lkdGggPSBNYXRoLm1pbihuZXdXaWR0aCwgbWF4V2lkdGgpO1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5taW4obmV3SGVpZ2h0LCBtYXhIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBFc3RhYmxlY2VyIGVsIHRhbWHDsW8geSBsYSBwb3NpY2nDs24gZGVsIMOhcmVhIGRlIHJlY29ydGVcbiAgICAgICAgICAgIGVsZW1lbnRDcm9wcGVyLnN0eWxlLndpZHRoID0gYCR7bmV3V2lkdGh9cHhgO1xuICAgICAgICAgICAgZWxlbWVudENyb3BwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7bmV3SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgdGhpcy5jcm9wV2lkdGguc2V0VmFsdWUocmVjdEVsZW1lbnQud2lkdGgpO1xuICAgICAgICAgICAgdGhpcy5jcm9wSGVpZ2h0LnNldFZhbHVlKHJlY3RFbGVtZW50LmhlaWdodCk7XG5cbiAgICAgICAgICAgIGlmIChlbnRyeS50YXJnZXQuaWQgPT0gJ2ltYWdlLWZ1bGwnKSB7XG4gICAgICAgICAgICAgIGlmIChyZWN0SG9sZGVyLnRvcCA+IDApIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50Q3JvcHBlci5zdHlsZS50b3AgPSByZWN0SG9sZGVyLnRvcCArIDQgKyAncHgnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsZW1lbnRDcm9wcGVyLnN0eWxlLmxlZnQgPSByZWN0SG9sZGVyLmxlZnQgKyA0ICsgJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKSk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNyb3BwZXIuc3R5bGUub3BhY2l0eSA9ICcwLjAnO1xuICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikge1xuICAgICAgICBjb25zdCBlbGVtZW50Q3JvcHBlcjogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xuICAgICAgICBjb25zdCBlbGVtZW50RnVsbDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xuICAgICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50Q3JvcHBlcik7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIudW5vYnNlcnZlKGVsZW1lbnRGdWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Dcm9wKHR5cGU/OiBhbnkpOiB2b2lkIHtcbiAgICB0eXBlID0gdHlwZSA/PyB0aGlzLmZvcm1hdC52YWx1ZTtcbiAgICBjb25zdCBjcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XG4gICAgY29uc3QgZWxlbWVudEZ1bGw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcbiAgICBjb25zdCByZWN0Q3JvcHBlcjogRE9NUmVjdCA9IGNyb3BwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZGF0YUhvbGRlclJlY3Q6IERPTVJlY3QgPSBlbGVtZW50RnVsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgbGV0IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgbGV0IGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50ID0gbmV3IEltYWdlKCk7XG4gICAgICBpbWFnZS5zcmMgPSB0aGlzLmltYWdlU3JjKCk7XG4gICAgICBpbWFnZS5vbmxvYWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGxldCByYXRpbzogbnVtYmVyID0gaW1hZ2UuaGVpZ2h0IC8gZGF0YUhvbGRlclJlY3QuaGVpZ2h0O1xuICAgICAgICBsZXQgbmV3V2lkdGg6IG51bWJlciA9IHJlY3RDcm9wcGVyLndpZHRoICogcmF0aW87XG4gICAgICAgIGxldCBuZXdIZWlnaHQ6IG51bWJlciA9IHJlY3RDcm9wcGVyLmhlaWdodCAqIHJhdGlvO1xuICAgICAgICBjYW52YXMud2lkdGggPSBuZXdXaWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgICAgY3R4Py5kcmF3SW1hZ2UoXG4gICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgTWF0aC5hYnMocmVjdENyb3BwZXIueCAqIHJhdGlvKSAtIE1hdGguYWJzKGRhdGFIb2xkZXJSZWN0LnggKiByYXRpbyksXG4gICAgICAgICAgTWF0aC5hYnMocmVjdENyb3BwZXIueSAqIHJhdGlvKSAtIE1hdGguYWJzKGRhdGFIb2xkZXJSZWN0LnkgKiByYXRpbyksXG4gICAgICAgICAgbmV3V2lkdGgsXG4gICAgICAgICAgbmV3SGVpZ2h0LFxuICAgICAgICAgIDAsXG4gICAgICAgICAgMCxcbiAgICAgICAgICBuZXdXaWR0aCxcbiAgICAgICAgICBuZXdIZWlnaHQsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVzb2x2ZShjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke3R5cGV9YCwgdGhpcy5xdWFsaXR5LnZhbHVlKSk7XG4gICAgICB9O1xuICAgICAgaW1hZ2Uub25lcnJvciA9IChlOiBzdHJpbmcgfCBFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9O1xuICAgIH0pXG4gICAgICAudGhlbigoZGF0YVVyaTogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGRhdGFVcmkpO1xuICAgICAgICB0aGlzLnNob3dDcm9wLnNldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5vbkNyb3BTdGF0ZUNoYW5nZSgpO1xuICAgICAgICB0aGlzLm1heFdpZHRoLnNldFZhbHVlKGNhbnZhcz8ud2lkdGgpO1xuICAgICAgICB0aGlzLm1heEhlaWdodC5zZXRWYWx1ZShjYW52YXM/LmhlaWdodCk7XG4gICAgICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IHRoaXMub3JpZ2luSW1hZ2VTcmMgKyAnJztcbiAgICAgICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IGRhdGFVcmk7XG4gICAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25SZXN0b3JlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFycmF5Q29waWVkSW1hZ2VzLmxlbmd0aCkge1xuICAgICAgbGV0IGxhc3RTdGF0ZSA9IHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucG9wKCk7XG4gICAgICB0aGlzLmltYWdlU3JjLnNldChsYXN0U3RhdGUubGFzdEltYWdlKTtcbiAgICAgIHRoaXMubWF4V2lkdGguc2V0VmFsdWUobGFzdFN0YXRlLndpZHRoKTtcbiAgICAgIHRoaXMubWF4SGVpZ2h0LnNldFZhbHVlKGxhc3RTdGF0ZS5oZWlnaHQpO1xuICAgICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IHRoaXMubGFzdE9yaWdpblNyYyArICcnO1xuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQodGhpcy5sYXN0T3JpZ2luU3JjKTtcbiAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSB0aGlzLmxhc3RPcmlnaW5TcmMgKyAnJztcbiAgICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XG4gICAgfVxuXG4gICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQodGhpcy5pbWFnZVNyYygpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW92ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlU3JjLnNldChudWxsKTtcbiAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gbnVsbDtcbiAgICB0aGlzLmxvYWRJbWFnZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMgPSBbXTtcbiAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSBudWxsO1xuICAgIHRoaXMuJGltYWdlT3JpZ2luYWwubmV4dChudWxsKTtcbiAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dChudWxsKTtcbiAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSgnanBlZycpO1xuICAgIHRoaXMubWF4SGVpZ2h0LnNldFZhbHVlKDIwMDApO1xuICAgIHRoaXMubWF4V2lkdGguc2V0VmFsdWUoMjAwMCk7XG4gICAgdGhpcy5jcm9wSGVpZ2h0LnNldFZhbHVlKDE1MCk7XG4gICAgdGhpcy5jcm9wV2lkdGguc2V0VmFsdWUoMTUwKTtcbiAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8uc2V0VmFsdWUodHJ1ZSk7XG4gICAgdGhpcy5zaG93RWRpdFBhbmVsLnNldChmYWxzZSk7XG4gICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmVBbGwkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQWxsJC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPSchbG9hZEltYWdlKCknIGNsYXNzPSdwbGFjZS1pbWFnZSc+XG4gIDxkaXYgY2xhc3M9J2ltYWdlLWhvbGRlcidcbiAgICAgICBbbmdTdHlsZV09J3sgd2lkdGg6IGNvbmZpZygpPy53aWR0aCxoZWlnaHQ6IGNvbmZpZygpPy5oZWlnaHQsYm9yZGVyUmFkaXVzOiBjb25maWcoKT8uYm9yZGVyUmFkaXVzfSc+XG4gICAgPGJ1dHRvbiBbbWF0VG9vbHRpcF09XCInVVBMT0FEX0FfSU1BR0UnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCIgY2xhc3M9J2ltYWdlLXVwbG9hZC1idG4nIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT0nb25VcGxvYWQoJGV2ZW50KSc+XG4gICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+YWRkX2FfcGhvdG88L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxpbnB1dCAjaW1hZ2VQaWNrZXIgdHlwZT0nZmlsZScgY2xhc3M9J2Qtbm9uZScgW2lkXT1cIidmaWxlUGlja2VyLScgKyB1dWlkRmlsZVBpY2tlclwiXG4gICAgICAgICAgIChjaGFuZ2UpPSdoYW5kbGVGaWxlU2VsZWN0KCRldmVudCknIFthY2NlcHRdPSdpbWFnZXNBbGxvd2VkJz5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj0nbG9hZEltYWdlKCknIGNsYXNzPSdwbGFjZS1pbWFnZSc+XG4gIDxkaXYgY2xhc3M9J2ltYWdlLWhvbGRlci1sb2FkZWQnXG4gICAgICAgW25nU3R5bGVdPSd7d2lkdGg6IGNvbmZpZygpPy53aWR0aCxoZWlnaHQ6IGNvbmZpZygpPy5oZWlnaHQsYm9yZGVyUmFkaXVzOiBjb25maWcoKT8uYm9yZGVyUmFkaXVzfSc+XG4gICAgPGltZyBbc3JjXT0naW1hZ2VTcmMoKScgYWx0PSdpbWFnZS1sb2FkZWQnIFtuZ1N0eWxlXT0neyBib3JkZXJSYWRpdXM6IGNvbmZpZygpPy5ib3JkZXJSYWRpdXMgfSc+XG4gICAgPGlucHV0ICNpbWFnZVBpY2tlciB0eXBlPSdmaWxlJyBjbGFzcz0nZC1ub25lJyBbaWRdPVwiJ2ZpbGVQaWNrZXItJyArIHV1aWRGaWxlUGlja2VyXCJcbiAgICAgICAgICAgKGNoYW5nZSk9J2hhbmRsZUZpbGVTZWxlY3QoJGV2ZW50KScgW2FjY2VwdF09J2ltYWdlc0FsbG93ZWQnPlxuICA8L2Rpdj5cbiAgPHAgKm5nSWY9J2ltYWdlU3JjKCk/Lmxlbmd0aCcgY2xhc3M9J21hdC1jYXB0aW9uIGltYWdlLWNhcHRpb24nIFtjbGFzcy53YXJuXT0nKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpID4gMjAwJ1xuICAgICBbY2xhc3MuZnctNjAwXT0nKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpID4gMjAwJz5cbiAgICB7e1wiU0laRVwiIHwgaTE4bjogY3VycmVudExhbmd1YWdlKCl9fToge3sgKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpIH19S2IgJm5ic3A7IHt7IGZvcm1hdC52YWx1ZSB9fVxuICA8L3A+XG5cbiAgPGRpdiBjbGFzcz0nZWRpdGluZy1iYXItYnRuJz5cbiAgICA8YnV0dG9uIGlkPSd1cGxvYWQtaW1nJyAqbmdJZj0nIWNvbmZpZygpPy5oaWRlQWRkQnRuJyBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT0nb25VcGxvYWQoJGV2ZW50KSdcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidVUExPQURfQV9JTUFHRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5hZGRfYV9waG90bzwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBpZD0nZWRpdC1pbWcnICpuZ0lmPSchY29uZmlnKCk/LmhpZGVFZGl0QnRuICYmICFub0VkaXQoKScgbWF0LWljb24tYnV0dG9uIChjbGljayk9J3Nob3dFZGl0UGFuZWwuc2V0KHRydWUpJ1xuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ09QRU5fRURJVE9SX1BBTkVMJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPSdtYXQtMTgnPmVkaXQ8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxhIGlkPSdkb3dubG9hZC1pbWcnICpuZ0lmPSchY29uZmlnKCk/LmhpZGVEb3dubG9hZEJ0bicgW21hdFRvb2x0aXBdPVwiJ0RPV05MT0FEJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiXG4gICAgICAgW2hyZWZdPSdpbWFnZVNyYygpJyBtYXQtaWNvbi1idXR0b24gW2Rvd25sb2FkXT0naW1hZ2VOYW1lJz5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5jbG91ZF9kb3dubG9hZDwvbWF0LWljb24+XG4gICAgPC9hPlxuICAgIDxidXR0b24gaWQ9J2RlbGV0ZS1pbWcnICpuZ0lmPSchY29uZmlnKCk/LmhpZGVEZWxldGVCdG4nIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPSdvblJlbW92ZSgpJ1xuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1JFTU9WRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5kZWxldGU8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPSdzaG93RWRpdFBhbmVsKCknIGlkPSdwb3B1cCcgY2xhc3M9J3BvcHVwJz5cbiAgPGRpdiBjbGFzcz0ncG9wdXAtY2xlYXInPlxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9J29uQ2xvc2VFZGl0UGFuZWwoKSc+XG4gICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+Y2xlYXI8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPSdpbWFnZS1jb250YWluZXInPlxuICAgIDxkaXYgY2xhc3M9J2ltYWdlLWhvbGRlci1mdWxsJz5cbiAgICAgIDxpbWcgaWQ9J2ltYWdlLWZ1bGwnIFtzcmNdPSdpbWFnZVNyYygpJyBhbHQ9Jyc+XG4gICAgICA8ZGl2IGlkPSdpbWFnZS1jcm9wcGVyJyBjbGFzcz0naW1hZ2UtY3JvcHBlcic+XG4gICAgICAgIDxkaXYgaWQ9J2ltYWdlLWNyb3BwZXItaGVhZGVyJz5cbiAgICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0nY29udHJvbC1wYW5lbCc+XG4gICAgICA8cCBjbGFzcz0naXRlbS1wYW5lbCBmdy02MDAnPnt7ICdRVUFMSVRZJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cbiAgICAgIDxkaXYgY2xhc3M9J3F1YWxpdHktY29udGFpbmVyJz5cbiAgICAgICAgPG1hdC1zbGlkZXIgbmdEZWZhdWx0Q29udHJvbCBbY29sb3JdPSdjb2xvcicgY2xhc3M9J3ctMTAwIG13LTEwMCcgKGNoYW5nZSk9J29uQ2hhbmdlUXVhbGl0eSgpJ1xuICAgICAgICAgICAgICAgICAgICBbbWF4XT0nMTAwJyBbbWluXT0nMCcgW3N0ZXBdPScxJyBbZGlzY3JldGVdPSd0cnVlJyBbc2hvd1RpY2tNYXJrc109J3RydWUnPlxuICAgICAgICAgIDxpbnB1dCBtYXRTbGlkZXJUaHVtYiBbZm9ybUNvbnRyb2xdPSdxdWFsaXR5Jz5cbiAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9J2l0ZW0tcGFuZWwnPlxuICAgICAgICA8c3BhbiBjbGFzcz0nZnctNjAwJz57eyAnTUFYX0RJTUVOU0lPTlMnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9zcGFuPlxuICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPSdmbG9hdC1yaWdodCcgW2Zvcm1Db250cm9sXT0nbWFpbnRhaW5Bc3BlY3RSYXRpbycgW2NvbG9yXT0nY29sb3InPlxuICAgICAgICAgIDxzcGFuPnt7ICdBU1BFQ1RfUkFUSU8nIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9zcGFuPlxuICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPSdtYXgtZGltZW5zaW9uLWNvbnRhaW5lcic+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy00OCcgW2FwcGVhcmFuY2VdPSdhcHBlYXJhbmNlJyBbY29sb3JdPSdjb2xvcic+XG4gICAgICAgICAgPG1hdC1sYWJlbD57eyAnTUFYX1dJRFRIX1BYJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT0nb25DaGFuZ2VTaXplKHRydWUsIGZhbHNlKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidNQVhfV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT0nbWF4V2lkdGgnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9J3ctNDgnIFthcHBlYXJhbmNlXT0nYXBwZWFyYW5jZScgW2NvbG9yXT0nY29sb3InPlxuICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ01BWF9IRUlHSFRfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0IChjaGFuZ2UpPSdvbkNoYW5nZVNpemUoZmFsc2UsIHRydWUpJyBtYXRJbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ01BWF9IRUlHSFRfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT0nbWF4SGVpZ2h0JyB0eXBlPSdudW1iZXInIFttaW5dPScwJyBbbWF4XT0nMjAwMCc+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHAgY2xhc3M9J2l0ZW0tcGFuZWwgZnctNjAwJz57eyAnRk9STUFUJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cbiAgICAgIDxkaXYgY2xhc3M9J2Zvcm1hdHMtc2VsZWN0aW9uJz5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTEwMCBtdy0xMDAnIFthcHBlYXJhbmNlXT0nYXBwZWFyYW5jZScgW2NvbG9yXT0nY29sb3InPlxuICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09J2Zvcm1hdCcgKHNlbGVjdGlvbkNoYW5nZSk9J29uQ2hhbmdlRm9ybWF0KCknPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPSdsZXQgZm9ybWF0IG9mIGFsbEZvcm1hdHMnIFt2YWx1ZV09J2Zvcm1hdCc+XG4gICAgICAgICAgICAgIHt7IGZvcm1hdCB9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPSdyZWZyZXNoLWNvbnRhaW5lcic+XG4gICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9J29uQ3JvcFN0YXRlQ2hhbmdlKCknIFtmb3JtQ29udHJvbF09J3Nob3dDcm9wJyBbY29sb3JdPSdjb2xvcic+XG4gICAgICAgICAgPHAgY2xhc3M9J2l0ZW0tcGFuZWwgZnctNjAwJz57eyAnQ1JPUCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L3A+XG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXggJz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSdmbG9hdC1yaWdodCcgbWF0LWljb24tYnV0dG9uIFtjb2xvcl09J2NvbG9yJyAoY2xpY2spPSdvblJlc3RvcmUoKSc+XG4gICAgICAgICAgICA8bWF0LWljb24+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHAgKm5nSWY9J3Nob3dDcm9wLnZhbHVlJz5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFtjb2xvcl09J2NvbG9yJyAoY2xpY2spPSdvbkNyb3AoKSc+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jcm9wPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj0nc2hvd0Nyb3AudmFsdWUnPlxuICAgICAgICA8ZGl2IGNsYXNzPSdkaW1lbnNpb24tY29udGFpbmVyJz5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9J3ctNDggbXctNDgnIFthcHBlYXJhbmNlXT0nYXBwZWFyYW5jZScgW2NvbG9yXT0nY29sb3InPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9J29uQ2hhbmdlQ3JvcCgpJyBtYXRJbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1dJRFRIX1BYJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiXG4gICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT0nY3JvcFdpZHRoJyB0eXBlPSdudW1iZXInIFttaW5dPScwJyBbbWF4XT0nMjAwMCc+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9J3ctNDggbXctNDgnIFthcHBlYXJhbmNlXT0nYXBwZWFyYW5jZScgW2NvbG9yXT0nY29sb3InPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnSEVJR0hUX1BYJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPSdvbkNoYW5nZUNyb3AoKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidIRUlHSFRfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPSdjcm9wSGVpZ2h0JyB0eXBlPSdudW1iZXInIFttaW5dPScwJyBbbWF4XT0nMjAwMCc+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPGRpdiBjbGFzcz0nc2F2ZS1jb250YWluZXInPlxuICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiAoY2xpY2spPSdvbkNsb3NlRWRpdFBhbmVsKCknIFtjb2xvcl09J2NvbG9yJyBjbGFzcz0nc2F2ZS1idXR0b24nPlxuICAgICAgICAgIHt7ICdTQVZFJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZX19XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxwICpuZ0lmPSdpbWFnZVNyYygpPy5sZW5ndGgnIGNsYXNzPSdtYXQtY2FwdGlvbiBpbWFnZS1jYXB0aW9uJ1xuICAgICAgICAgICBbY2xhc3Mud2Fybl09JyhpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSA+IDIwMCdcbiAgICAgICAgICAgW2NsYXNzLmZ3LTYwMF09JyhpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSA+IDIwMCc+XG4gICAgICAgICAge3tcIlNJWkVcIiB8IGkxOG46IGN1cnJlbnRMYW5ndWFnZSgpfX06IHt7IChpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSB9fUtiICZuYnNwOyB7eyBmb3JtYXQudmFsdWUgfX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
517
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VhY2hvcy1pbWFnZS1waWNrZXIvc3JjL2xpYi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWFjaG9zLWltYWdlLXBpY2tlci9zcmMvbGliL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRy9CLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FB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b25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBzaWduYWwsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFdyaXRhYmxlU2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlciB9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJFbnRyeSB9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci9saWIvUmVzaXplT2JzZXJ2ZXJFbnRyeSc7XHJcbmltcG9ydCB7IFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0U2xpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGVyJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSwgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5cclxuaW1wb3J0IHsgUGlwZXNNb2R1bGUgfSBmcm9tICcuLi91dGlscy9waXBlcy9waXBlcy5tb2R1bGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbWFnZVBpY2tlckNvbmYge1xyXG4gIHdpZHRoPzogc3RyaW5nO1xyXG4gIGhlaWdodD86IHN0cmluZztcclxuICBib3JkZXJSYWRpdXM/OiBzdHJpbmc7XHJcbiAgY29tcHJlc3NJbml0aWFsPzogYm9vbGVhbjtcclxuICBsYW5ndWFnZT86IHN0cmluZztcclxuICBoaWRlRGVsZXRlQnRuPzogYm9vbGVhbjtcclxuICBoaWRlRG93bmxvYWRCdG4/OiBib29sZWFuO1xyXG4gIGhpZGVFZGl0QnRuPzogYm9vbGVhbjtcclxuICBoaWRlQWRkQnRuPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUNvbnZlcnRlcklucHV0IHtcclxuICB3aWR0aD86IG51bWJlcjtcclxuICBoZWlnaHQ/OiBudW1iZXI7XHJcbiAgcXVhbGl0eT86IG51bWJlcjtcclxuICBkYXRhVHlwZT86IHN0cmluZztcclxuICBtYWludGFpblJhdGlvPzogYm9vbGVhbjtcclxuICBjaGFuZ2VIZWlnaHQ/OiBib29sZWFuO1xyXG4gIGNoYW5nZVdpZHRoPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSW1hZ2VBbGxvd2VkVHlwZXMgPVxyXG4gICdpbWFnZS8qJ1xyXG4gIHwgJy53ZWJwJ1xyXG4gIHwgJy5wbmcnXHJcbiAgfCAnLndlYnAsIC5qcGcsIC5qcGVnJ1xyXG4gIHwgJy53ZWJwLCAucG5nJ1xyXG4gIHwgJy5qcGcsIC5qcGVnJ1xyXG4gIHwgJy5wbmcsIC5qcGcsIC5qcGVnJ1xyXG4gIHwgJy53ZWJwLCAucG5nLCAuanBnLCAuanBlZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2d1YWppcml0b3MtaW1hZ2UtcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXRTbGlkZXJNb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIFBpcGVzTW9kdWxlXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEd1YWppcml0b3NJbWFnZVBpY2tlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVuc3Vic2NyaWJlQWxsJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHJpdmF0ZSBvYnNlcnZlcjogYW55ID0gbnVsbDtcclxuICBwcml2YXRlIG9yaWdpbkltYWdlU3JjOiBhbnk7XHJcbiAgcHJpdmF0ZSBmaWxlVHlwZTogYW55O1xyXG4gIHByaXZhdGUgdXJsSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGxhc3RPcmlnaW5TcmM6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBhcnJheUNvcGllZEltYWdlczogYW55W10gPSBbXTtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IHV1aWRGaWxlUGlja2VyOiBzdHJpbmcgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDIwKTtcclxuICBwdWJsaWMgcmVhZG9ubHkgYWxsRm9ybWF0czogc3RyaW5nW10gPSBbJ3dlYnAnLCAnanBlZycsICdwbmcnXTtcclxuICBwdWJsaWMgY29uZmlnOiBXcml0YWJsZVNpZ25hbDxJbWFnZVBpY2tlckNvbmY+ID0gc2lnbmFsKHtcclxuICAgIGhlaWdodDogJzI0MHB4JyxcclxuICAgIHdpZHRoOiAnMzIwcHgnLFxyXG4gICAgYm9yZGVyUmFkaXVzOiAnMTZweCcsXHJcbiAgICBjb21wcmVzc0luaXRpYWw6IHRydWUsXHJcbiAgICBsYW5ndWFnZTogJ2VzJyxcclxuICAgIGhpZGVEZWxldGVCdG46IGZhbHNlLFxyXG4gICAgaGlkZURvd25sb2FkQnRuOiBmYWxzZSxcclxuICAgIGhpZGVFZGl0QnRuOiBmYWxzZSxcclxuICAgIGhpZGVBZGRCdG46IGZhbHNlLFxyXG4gIH0pO1xyXG4gIHB1YmxpYyBpbWFnZVNyYzogV3JpdGFibGVTaWduYWw8c3RyaW5nPiA9IHNpZ25hbChudWxsKTtcclxuICBwdWJsaWMgc2hvd0Nyb3A6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogZmFsc2UsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgbG9hZEltYWdlOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcbiAgcHVibGljIG5vRWRpdDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHB1YmxpYyBzaG93RWRpdFBhbmVsOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcbiAgcHVibGljIG1haW50YWluQXNwZWN0UmF0aW86IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogdHJ1ZSwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gIHB1YmxpYyBxdWFsaXR5OiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IDcwLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcbiAgcHVibGljIGZvcm1hdDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiAnd2VicCcsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgbWF4SGVpZ2h0OiBXcml0YWJsZVNpZ25hbDxudW1iZXI+ID0gc2lnbmFsKDIwMDApO1xyXG4gIHB1YmxpYyBtYXhXaWR0aDogV3JpdGFibGVTaWduYWw8bnVtYmVyPiA9IHNpZ25hbCgyMDAwKTtcclxuICBwdWJsaWMgY3JvcEhlaWdodDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiAxNTAsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgY3JvcFdpZHRoOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IDE1MCwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gIHB1YmxpYyBpbWFnZU5hbWU6IFdyaXRhYmxlU2lnbmFsPHN0cmluZz4gPSBzaWduYWwoJ2Rvd25sb2FkJyk7XHJcbiAgcHVibGljIGN1cnJlbnRMYW5ndWFnZTogV3JpdGFibGVTaWduYWw8c3RyaW5nPiA9IHNpZ25hbCgnZXMnKTtcclxuXHJcbiAgQElucHV0KCkgYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSA9ICdvdXRsaW5lJztcclxuICBASW5wdXQoKSBjb2xvcjogVGhlbWVQYWxldHRlID0gJ3ByaW1hcnknO1xyXG4gIEBJbnB1dCgpIGltYWdlc0FsbG93ZWQ6IEltYWdlQWxsb3dlZFR5cGVzID0gJ2ltYWdlLyonO1xyXG5cclxuICBAVmlld0NoaWxkKCdpbWFnZVBpY2tlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBpbWFnZVBpY2tlcjogRWxlbWVudFJlZiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgQE91dHB1dCgpICRpbWFnZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpICRpbWFnZU9yaWdpbmFsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBASW5wdXQoKSBzZXQgX2ltYWdlU3JjKGltYWdlOiBzdHJpbmcpIHtcclxuICAgIGlmIChpbWFnZSkge1xyXG4gICAgICBsZXQgdHlwZXM6IHN0cmluZ1tdID0gaW1hZ2Uuc3BsaXQoJy4nKTtcclxuICAgICAgdGhpcy5mb3JtYXQuc2V0VmFsdWUodHlwZXNbdHlwZXMubGVuZ3RoIC0gMV0pO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmZvcm1hdC52YWx1ZSB8fCAodGhpcy5mb3JtYXQudmFsdWUgIT09ICdwbmcnICYmIHRoaXMuZm9ybWF0LnZhbHVlICE9PSAnanBlZycgJiYgdGhpcy5mb3JtYXQudmFsdWUgIT09ICd3ZWJwJykpIHtcclxuICAgICAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSgnanBlZycpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldChpbWFnZSk7XHJcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMgPSBbXTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcy5wdXNoKHRoaXMuaW1hZ2VTcmMpO1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gaW1hZ2U7XHJcbiAgICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IGltYWdlO1xyXG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQodGhpcy5vcmlnaW5JbWFnZVNyYyk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQobnVsbCk7XHJcbiAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSBudWxsO1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQoZmFsc2UpO1xyXG4gICAgICB0aGlzLm5vRWRpdC5zZXQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IG51bGw7XHJcbiAgICAgIHRoaXMuJGltYWdlT3JpZ2luYWwubmV4dChudWxsKTtcclxuICAgICAgdGhpcy5mb3JtYXQuc2V0VmFsdWUoJ2pwZWcnKTtcclxuICAgICAgdGhpcy5tYXhIZWlnaHQuc2V0KDIwMDApO1xyXG4gICAgICB0aGlzLm1heFdpZHRoLnNldCgyMDAwKTtcclxuICAgICAgdGhpcy5jcm9wSGVpZ2h0LnNldFZhbHVlKDE1MCk7XHJcbiAgICAgIHRoaXMuY3JvcFdpZHRoLnNldFZhbHVlKDE1MCk7XHJcbiAgICAgIHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby5zZXRWYWx1ZSh0cnVlKTtcclxuICAgICAgdGhpcy5zaG93RWRpdFBhbmVsLnNldChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgX2NvbmZpZyh2YWx1ZTogSW1hZ2VQaWNrZXJDb25mKSB7XHJcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IgPT0gT2JqZWN0KSB7XHJcbiAgICAgIHRoaXMuY29uZmlnLnNldCh7XHJcbiAgICAgICAgLi4udGhpcy5jb25maWcoKSxcclxuICAgICAgICAuLi52YWx1ZSxcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVhZGVyTG9hZGVkKHJlYWRlckV2dDogeyB0YXJnZXQ6IHsgcmVzdWx0OiBhbnk7IH07IH0pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGJpbmFyeVN0cmluZzogc3RyaW5nID0gcmVhZGVyRXZ0LnRhcmdldC5yZXN1bHQ7XHJcbiAgICBjb25zdCBiYXNlNjR0ZXh0U3RyaW5nOiBzdHJpbmcgPSBidG9hKGJpbmFyeVN0cmluZyk7XHJcbiAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gdGhpcy51cmxJbWFnZSArIGJhc2U2NHRleHRTdHJpbmc7XHJcbiAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSB0aGlzLnVybEltYWdlICsgYmFzZTY0dGV4dFN0cmluZztcclxuICAgIGlmICh0aGlzLmNvbmZpZygpPy5jb21wcmVzc0luaXRpYWwpIHtcclxuICAgICAgdGhpcy5xdWFsaXR5LnNldFZhbHVlKDcwKTtcclxuICAgICAgY29uc3QgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IDAuNzAsXHJcbiAgICAgICAgbWFpbnRhaW5SYXRpbzogdHJ1ZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMudXJsSW1hZ2UgKyBiYXNlNjR0ZXh0U3RyaW5nLCBpbnB1dCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQodGhpcy51cmxJbWFnZSArIGJhc2U2NHRleHRTdHJpbmcpO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucHVzaCh7XHJcbiAgICAgICAgbGFzdEltYWdlOiB0aGlzLmltYWdlU3JjKCksXHJcbiAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgoKSxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMubWF4SGVpZ2h0KCksXHJcbiAgICAgICAgcXVhbGl0eTogdGhpcy5xdWFsaXR5LnZhbHVlLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy4kaW1hZ2VPcmlnaW5hbC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZXNpemVEYXRhVVJMKGRhdGFzOiBzdHJpbmcsIGlucHV0OiBJbWFnZUNvbnZlcnRlcklucHV0KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZShhc3luYyBmdW5jdGlvbihyZXNvbHZlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgaW1nLnNyYyA9IGRhdGFzICsgJyc7XHJcbiAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xyXG4gICAgICBsZXQgcXVhbGl0eTogbnVtYmVyID0gaW5wdXQ/LnF1YWxpdHkgPz8gMS4wO1xyXG4gICAgICBsZXQgbWFpbnRhaW5SYXRpbzogYm9vbGVhbiA9IGlucHV0Lm1haW50YWluUmF0aW8gIT09IHVuZGVmaW5lZCA/IGlucHV0Lm1haW50YWluUmF0aW8gOiB0cnVlO1xyXG5cclxuICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBjb25zdCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgIGxldCByYXRpbzogbnVtYmVyID0gaW1nLndpZHRoIC8gaW1nLmhlaWdodDtcclxuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IGlucHV0Py53aWR0aCA/PyBpbWcud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gaW5wdXQ/LmhlaWdodCA/PyBpbWcuaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAobWFpbnRhaW5SYXRpbykge1xyXG4gICAgICAgICAgaWYgKGlucHV0LmNoYW5nZUhlaWdodCkge1xyXG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSBoZWlnaHQgKiByYXRpbztcclxuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gd2lkdGggLyByYXRpbztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3R4Py5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG4gICAgICAgIGxldCB0eXBlOiBzdHJpbmcgPSBpbnB1dD8uZGF0YVR5cGUgPz8gJ3dlYnAnO1xyXG4gICAgICAgIGNvbnN0IGRhdGFVUkk6IHN0cmluZyA9IGNhbnZhcy50b0RhdGFVUkwoYGltYWdlLyR7dHlwZX1gLCBxdWFsaXR5KTtcclxuICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgIGRhdGFVcmk6IGRhdGFVUkksXHJcbiAgICAgICAgICB3aWR0aDogY2FudmFzLndpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBjYW52YXMuaGVpZ2h0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG4gICAgfSkudGhlbigoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMubWF4SGVpZ2h0ID0gZGF0YT8uaGVpZ2h0O1xyXG4gICAgICB0aGlzLm1heFdpZHRoID0gZGF0YT8ud2lkdGg7XHJcbiAgICAgIGlmICh0aGlzLmFycmF5Q29waWVkSW1hZ2VzPy5sZW5ndGggPD0gMjApIHtcclxuICAgICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzLnB1c2goe1xyXG4gICAgICAgICAgbGFzdEltYWdlOiBkYXRhPy5kYXRhVXJpLFxyXG4gICAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMubWF4SGVpZ2h0LFxyXG4gICAgICAgICAgcXVhbGl0eTogdGhpcy5xdWFsaXR5LnZhbHVlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGF0YS5kYXRhVXJpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdhaXQobXM/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbXMgPSBtcyA/PyAxMDAwO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKTogdm9pZCA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9LCBtcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhZ0VsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGxldCBwb3MxOiBudW1iZXIgPSAwLCBwb3MyOiBudW1iZXIgPSAwLCBwb3MzOiBudW1iZXIgPSAwLCBwb3M0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGxldCBlbDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50LmlkICsgJy1oZWFkZXInKTtcclxuICAgIGlmIChlbCkge1xyXG4gICAgICBlbC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XHJcbiAgICAgIGVsLm9udG91Y2hzdGFydCA9IGRyYWdNb3VzZURvd247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlbGVtZW50Lm9ubW91c2Vkb3duID0gZHJhZ01vdXNlRG93bjtcclxuICAgICAgZWxlbWVudC5vbnRvdWNoc3RhcnQgPSBkcmFnTW91c2VEb3duO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYWdNb3VzZURvd24oZTogYW55KTogdm9pZCB7XHJcbiAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcclxuICAgICAgZT8ucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgcG9zMyA9IGU/LmNsaWVudFg7XHJcbiAgICAgIHBvczQgPSBlPy5jbGllbnRZO1xyXG4gICAgICBkb2N1bWVudC5vbm1vdXNldXAgPSBjbG9zZURyYWdFbGVtZW50O1xyXG4gICAgICBkb2N1bWVudC5vbnRvdWNoZW5kID0gY2xvc2VEcmFnRWxlbWVudDtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBlbGVtZW50RHJhZztcclxuICAgICAgZG9jdW1lbnQub250b3VjaG1vdmUgPSBlbGVtZW50RHJhZztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBlbGVtZW50RHJhZyhlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgbGV0IGhvbGRlckltYWdlOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcbiAgICAgIGU/LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHBvczEgPSBwb3MzIC0gZT8uY2xpZW50WDtcclxuICAgICAgcG9zMiA9IHBvczQgLSBlPy5jbGllbnRZO1xyXG4gICAgICBwb3MzID0gZT8uY2xpZW50WDtcclxuICAgICAgcG9zNCA9IGU/LmNsaWVudFk7XHJcblxyXG4gICAgICBjb25zdCBuZXdUb3A6IG51bWJlciA9IGVsZW1lbnQub2Zmc2V0VG9wIC0gcG9zMjtcclxuICAgICAgY29uc3QgbmV3TGVmdDogbnVtYmVyID0gZWxlbWVudC5vZmZzZXRMZWZ0IC0gcG9zMTtcclxuICAgICAgY29uc3QgcmVjdEhvbGRlciA9IGhvbGRlckltYWdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBjb25zdCByZWN0RWxlbWVudDogRE9NUmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGlmIChuZXdUb3AgPj0gcmVjdEhvbGRlci55ICsgOCkge1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gTWF0aC5taW4obmV3VG9wLCByZWN0SG9sZGVyLnkgKyByZWN0SG9sZGVyLmhlaWdodCAtIHJlY3RFbGVtZW50LmhlaWdodCAtIDQpICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgICBpZiAobmV3TGVmdCA+IHJlY3RIb2xkZXIueCArIDQgJiYgcmVjdEhvbGRlci54ICsgcmVjdEhvbGRlci53aWR0aCA+IHJlY3RFbGVtZW50LnggKyByZWN0RWxlbWVudC53aWR0aCArIDIpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBNYXRoLm1pbihuZXdMZWZ0LCByZWN0SG9sZGVyLnggKyByZWN0SG9sZGVyLndpZHRoIC0gcmVjdEVsZW1lbnQud2lkdGggLSA0KSArICdweCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbG9zZURyYWdFbGVtZW50KCk6IHZvaWQge1xyXG4gICAgICBkb2N1bWVudC5vbm1vdXNldXAgPSBudWxsO1xyXG4gICAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG51bGw7XHJcbiAgICAgIGRvY3VtZW50Lm9udG91Y2hlbmQgPSBudWxsO1xyXG4gICAgICBkb2N1bWVudC5vbnRvdWNobW92ZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25VcGxvYWQoZXZlbnQ6IHsgcHJldmVudERlZmF1bHQ6ICgpID0+IHZvaWQ7IH0pOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmltYWdlUGlja2VyPy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRmlsZVNlbGVjdChldnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZXMgPSBldnQ/LnRhcmdldD8uZmlsZXM7XHJcbiAgICBpZiAoZmlsZXMpIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzWzBdO1xyXG4gICAgICB0aGlzLmltYWdlTmFtZS5zZXQoZmlsZT8ubmFtZT8uc3BsaXQoJy4nKVswXSk7XHJcbiAgICAgIHRoaXMuZmlsZVR5cGUgPSBmaWxlPy50eXBlO1xyXG4gICAgICB0aGlzLnVybEltYWdlID0gYGRhdGE6JHtmaWxlPy50eXBlfTtiYXNlNjQsYDtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuXHJcbiAgICAgIGlmIChmaWxlcyAmJiBmaWxlKSB7XHJcbiAgICAgICAgY29uc3QgcmVhZGVyOiBhbnkgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSB0aGlzLmhhbmRsZVJlYWRlckxvYWRlZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsb3NlRWRpdFBhbmVsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikge1xyXG4gICAgICBsZXQgaW1hZ2VDcm9wcGVyOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xyXG4gICAgICBsZXQgaW1hZ2VGdWxsOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShpbWFnZUNyb3BwZXIpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShpbWFnZUZ1bGwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93Q3JvcC5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB0aGlzLnNob3dFZGl0UGFuZWwuc2V0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZVF1YWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBxdWFsaXR5SXRlbTogbnVtYmVyID0gdGhpcy5xdWFsaXR5LnZhbHVlIC8gMTAwO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KHRoaXMubWF4SGVpZ2h0KCkgPz8gMjAwMCk7XHJcbiAgICB0aGlzLm1heFdpZHRoLnNldCh0aGlzLm1heFdpZHRoKCkgPz8gMjAwMCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy53YWl0KDI1MCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbnB1dDogSW1hZ2VDb252ZXJ0ZXJJbnB1dCA9IHtcclxuICAgICAgICBoZWlnaHQ6IHRoaXMubWF4SGVpZ2h0KCksXHJcbiAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgoKSxcclxuICAgICAgICBkYXRhVHlwZTogdGhpcy5mb3JtYXQudmFsdWUsXHJcbiAgICAgICAgcXVhbGl0eTogcXVhbGl0eUl0ZW0sXHJcbiAgICAgICAgbWFpbnRhaW5SYXRpbzogdGhpcy5tYWludGFpbkFzcGVjdFJhdGlvLnZhbHVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMub3JpZ2luSW1hZ2VTcmMsIGlucHV0KSk7XHJcbiAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZUZvcm1hdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBxdWFsaXR5SXRlbTogbnVtYmVyID0gdGhpcy5xdWFsaXR5LnZhbHVlIC8gMTAwO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KHRoaXMubWF4SGVpZ2h0KCkgPz8gMjAwMCk7XHJcbiAgICB0aGlzLm1heFdpZHRoLnNldCh0aGlzLm1heFdpZHRoKCkgPz8gMjAwMCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy53YWl0KDI1MCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCgpLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoKCksXHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlJdGVtLFxyXG4gICAgICAgIG1haW50YWluUmF0aW86IHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby52YWx1ZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMub3JpZ2luSW1hZ2VTcmMsIGlucHV0KSk7XHJcbiAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZVNpemUoY2hhbmdlV2lkdGg/OiBhbnksIGNoYW5nZUhlaWdodD86IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHF1YWxpdHlJdGVtOiBudW1iZXIgPSB0aGlzLnF1YWxpdHkudmFsdWUgLyAxMDA7XHJcbiAgICB0aGlzLm1heEhlaWdodC5zZXQodGhpcy5tYXhIZWlnaHQoKSA/PyAyMDAwKTtcclxuICAgIHRoaXMubWF4V2lkdGguc2V0KHRoaXMubWF4V2lkdGgoKSA/PyAyMDAwKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLndhaXQoNTAwKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCgpLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoKCksXHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlJdGVtLFxyXG4gICAgICAgIG1haW50YWluUmF0aW86IHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby52YWx1ZSxcclxuICAgICAgICBjaGFuZ2VIZWlnaHQ6IGNoYW5nZUhlaWdodCxcclxuICAgICAgICBjaGFuZ2VXaWR0aDogY2hhbmdlV2lkdGgsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGF3YWl0IHRoaXMucmVzaXplRGF0YVVSTCh0aGlzLm9yaWdpbkltYWdlU3JjLCBpbnB1dCkpO1xyXG4gICAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaGFuZ2VDcm9wKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY3JvcHBlcjogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgIGNyb3BwZXIuc3R5bGUud2lkdGggPSB0aGlzLmNyb3BXaWR0aC52YWx1ZSArICdweCc7XHJcbiAgICBjcm9wcGVyLnN0eWxlLmhlaWdodCA9IHRoaXMuY3JvcEhlaWdodC52YWx1ZSArICdweCc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Dcm9wU3RhdGVDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICBjb25zdCBmdWxsSW1hZ2U6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgIGNvbnN0IGFzcGVjdFJhdGlvOiBudW1iZXIgPSBmdWxsSW1hZ2Uub2Zmc2V0V2lkdGggLyBmdWxsSW1hZ2Uub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgIGlmICh0aGlzLnNob3dDcm9wLnZhbHVlKSB7XHJcbiAgICAgIGNyb3BwZXIuc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xyXG4gICAgICB0aGlzLmRyYWdFbGVtZW50KGNyb3BwZXIpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzOiBSZXNpemVPYnNlcnZlckVudHJ5W10pOiB2b2lkID0+IHtcclxuICAgICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5OiBSZXNpemVPYnNlcnZlckVudHJ5KTogdm9pZCA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zaG93RWRpdFBhbmVsKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudENyb3BwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudEZ1bGw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3RIb2xkZXI6IERPTVJlY3QgPSBlbGVtZW50RnVsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgcmVjdEVsZW1lbnQ6IERPTVJlY3QgPSBlbGVtZW50Q3JvcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1heFdpZHRoOiBudW1iZXIgPSByZWN0SG9sZGVyLnggKyByZWN0SG9sZGVyLndpZHRoIC0gcmVjdEVsZW1lbnQueCAtIDQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1heEhlaWdodDogbnVtYmVyID0gcmVjdEhvbGRlci55ICsgcmVjdEhvbGRlci5oZWlnaHQgLSByZWN0RWxlbWVudC55IC0gNDtcclxuXHJcbiAgICAgICAgICAgIC8vIE9idGVuZXIgZWwgdGFtYcOxbyBkZWwgw6FyZWEgZGUgcmVjb3J0ZSBzZWxlY2Npb25hZGEgcG9yIGVsIHVzdWFyaW9cclxuICAgICAgICAgICAgY29uc3QgY3JvcFdpZHRoOiBudW1iZXIgPSBlbGVtZW50Q3JvcHBlci5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgY3JvcEhlaWdodDogbnVtYmVyID0gZWxlbWVudENyb3BwZXIub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsY3VsYXIgZWwgYW5jaG8geSBlbCBhbHRvIGRlbCDDoXJlYSBkZSByZWNvcnRlIG1hbnRlbmllbmRvIGxhIHJlbGFjacOzbiBkZSBhc3BlY3RvIGRlIGxhIGltYWdlbiBvcmlnaW5hbFxyXG4gICAgICAgICAgICBsZXQgbmV3V2lkdGg6IG51bWJlciA9IGNyb3BXaWR0aDtcclxuICAgICAgICAgICAgbGV0IG5ld0hlaWdodDogbnVtYmVyID0gY3JvcEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW50YWluQXNwZWN0UmF0aW8udmFsdWUpIHtcclxuICAgICAgICAgICAgICBpZiAoY3JvcFdpZHRoIC8gY3JvcEhlaWdodCA+IGFzcGVjdFJhdGlvKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBjcm9wV2lkdGggLyBhc3BlY3RSYXRpbztcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBjcm9wSGVpZ2h0ICogYXNwZWN0UmF0aW87XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBBanVzdGFyIGVsIGFuY2hvIHkgZWwgYWx0byBkZWwgw6FyZWEgZGUgcmVjb3J0ZSBzaSBzdXBlcmEgbG9zIGzDrW1pdGVzXHJcbiAgICAgICAgICAgIG5ld1dpZHRoID0gTWF0aC5taW4obmV3V2lkdGgsIG1heFdpZHRoKTtcclxuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5taW4obmV3SGVpZ2h0LCBtYXhIZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgLy8gRXN0YWJsZWNlciBlbCB0YW1hw7FvIHkgbGEgcG9zaWNpw7NuIGRlbCDDoXJlYSBkZSByZWNvcnRlXHJcbiAgICAgICAgICAgIGVsZW1lbnRDcm9wcGVyLnN0eWxlLndpZHRoID0gYCR7bmV3V2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBlbGVtZW50Q3JvcHBlci5zdHlsZS5oZWlnaHQgPSBgJHtuZXdIZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jcm9wV2lkdGguc2V0VmFsdWUocmVjdEVsZW1lbnQud2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLmNyb3BIZWlnaHQuc2V0VmFsdWUocmVjdEVsZW1lbnQuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbnRyeS50YXJnZXQuaWQgPT0gJ2ltYWdlLWZ1bGwnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlY3RIb2xkZXIudG9wID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudENyb3BwZXIuc3R5bGUudG9wID0gcmVjdEhvbGRlci50b3AgKyA0ICsgJ3B4JztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxlbWVudENyb3BwZXIuc3R5bGUubGVmdCA9IHJlY3RIb2xkZXIubGVmdCArIDQgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKSk7XHJcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNyb3BwZXIuc3R5bGUub3BhY2l0eSA9ICcwLjAnO1xyXG4gICAgICBpZiAodGhpcy5vYnNlcnZlciBpbnN0YW5jZW9mIFJlc2l6ZU9ic2VydmVyKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudENyb3BwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgICAgICBjb25zdCBlbGVtZW50RnVsbDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIudW5vYnNlcnZlKGVsZW1lbnRDcm9wcGVyKTtcclxuICAgICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50RnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNyb3AodHlwZT86IGFueSk6IHZvaWQge1xyXG4gICAgdHlwZSA9IHR5cGUgPz8gdGhpcy5mb3JtYXQudmFsdWU7XHJcbiAgICBjb25zdCBjcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICBjb25zdCBlbGVtZW50RnVsbDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgY29uc3QgcmVjdENyb3BwZXI6IERPTVJlY3QgPSBjcm9wcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgZGF0YUhvbGRlclJlY3Q6IERPTVJlY3QgPSBlbGVtZW50RnVsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcclxuICAgICAgbGV0IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICBsZXQgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1hZ2Uuc3JjID0gdGhpcy5pbWFnZVNyYygpO1xyXG4gICAgICBpbWFnZS5vbmxvYWQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgbGV0IHJhdGlvOiBudW1iZXIgPSBpbWFnZS5oZWlnaHQgLyBkYXRhSG9sZGVyUmVjdC5oZWlnaHQ7XHJcbiAgICAgICAgbGV0IG5ld1dpZHRoOiBudW1iZXIgPSByZWN0Q3JvcHBlci53aWR0aCAqIHJhdGlvO1xyXG4gICAgICAgIGxldCBuZXdIZWlnaHQ6IG51bWJlciA9IHJlY3RDcm9wcGVyLmhlaWdodCAqIHJhdGlvO1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IG5ld1dpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBuZXdIZWlnaHQ7XHJcbiAgICAgICAgY3R4Py5kcmF3SW1hZ2UoXHJcbiAgICAgICAgICBpbWFnZSxcclxuICAgICAgICAgIE1hdGguYWJzKHJlY3RDcm9wcGVyLnggKiByYXRpbykgLSBNYXRoLmFicyhkYXRhSG9sZGVyUmVjdC54ICogcmF0aW8pLFxyXG4gICAgICAgICAgTWF0aC5hYnMocmVjdENyb3BwZXIueSAqIHJhdGlvKSAtIE1hdGguYWJzKGRhdGFIb2xkZXJSZWN0LnkgKiByYXRpbyksXHJcbiAgICAgICAgICBuZXdXaWR0aCxcclxuICAgICAgICAgIG5ld0hlaWdodCxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgbmV3V2lkdGgsXHJcbiAgICAgICAgICBuZXdIZWlnaHQsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZShjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke3R5cGV9YCwgdGhpcy5xdWFsaXR5LnZhbHVlKSk7XHJcbiAgICAgIH07XHJcbiAgICAgIGltYWdlLm9uZXJyb3IgPSAoZTogc3RyaW5nIHwgRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgIH07XHJcbiAgICB9KVxyXG4gICAgICAudGhlbigoZGF0YVVyaTogYW55KTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoZGF0YVVyaSk7XHJcbiAgICAgICAgdGhpcy5zaG93Q3JvcC5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5vbkNyb3BTdGF0ZUNoYW5nZSgpO1xyXG4gICAgICAgIHRoaXMubWF4V2lkdGguc2V0KGNhbnZhcz8ud2lkdGgpO1xyXG4gICAgICAgIHRoaXMubWF4SGVpZ2h0LnNldChjYW52YXM/LmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5sYXN0T3JpZ2luU3JjID0gdGhpcy5vcmlnaW5JbWFnZVNyYyArICcnO1xyXG4gICAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSBkYXRhVXJpO1xyXG4gICAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZSk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblJlc3RvcmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hcnJheUNvcGllZEltYWdlcy5sZW5ndGgpIHtcclxuICAgICAgbGV0IGxhc3RTdGF0ZSA9IHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucG9wKCk7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGxhc3RTdGF0ZS5sYXN0SW1hZ2UpO1xyXG4gICAgICB0aGlzLm1heFdpZHRoLnNldChsYXN0U3RhdGUud2lkdGgpO1xyXG4gICAgICB0aGlzLm1heEhlaWdodC5zZXQobGFzdFN0YXRlLmhlaWdodCk7XHJcbiAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSB0aGlzLmxhc3RPcmlnaW5TcmMgKyAnJztcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KHRoaXMubGFzdE9yaWdpblNyYyk7XHJcbiAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSB0aGlzLmxhc3RPcmlnaW5TcmMgKyAnJztcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uUmVtb3ZlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbWFnZVNyYy5zZXQobnVsbCk7XHJcbiAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gbnVsbDtcclxuICAgIHRoaXMubG9hZEltYWdlLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSBudWxsO1xyXG4gICAgdGhpcy4kaW1hZ2VPcmlnaW5hbC5uZXh0KG51bGwpO1xyXG4gICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQobnVsbCk7XHJcbiAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSgnanBlZycpO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KDIwMDApO1xyXG4gICAgdGhpcy5tYXhXaWR0aC5zZXQoMjAwMCk7XHJcbiAgICB0aGlzLmNyb3BIZWlnaHQuc2V0VmFsdWUoMTUwKTtcclxuICAgIHRoaXMuY3JvcFdpZHRoLnNldFZhbHVlKDE1MCk7XHJcbiAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8uc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICB0aGlzLnNob3dFZGl0UGFuZWwuc2V0KGZhbHNlKTtcclxuICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVBbGwkLm5leHQoKTtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVBbGwkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgKm5nSWY9JyFsb2FkSW1hZ2UoKScgY2xhc3M9J3BsYWNlLWltYWdlJz5cclxuICA8ZGl2IGNsYXNzPSdpbWFnZS1ob2xkZXInXHJcbiAgICAgICBbbmdTdHlsZV09J3sgd2lkdGg6IGNvbmZpZygpPy53aWR0aCxoZWlnaHQ6IGNvbmZpZygpPy5oZWlnaHQsYm9yZGVyUmFkaXVzOiBjb25maWcoKT8uYm9yZGVyUmFkaXVzfSc+XHJcbiAgICA8YnV0dG9uIFttYXRUb29sdGlwXT1cIidVUExPQURfQV9JTUFHRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIiBjbGFzcz0naW1hZ2UtdXBsb2FkLWJ0bicgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgIChjbGljayk9J29uVXBsb2FkKCRldmVudCknPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+YWRkX2FfcGhvdG88L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8aW5wdXQgI2ltYWdlUGlja2VyIHR5cGU9J2ZpbGUnIGNsYXNzPSdkLW5vbmUnIFtpZF09XCInZmlsZVBpY2tlci0nICsgdXVpZEZpbGVQaWNrZXJcIlxyXG4gICAgICAgICAgIChjaGFuZ2UpPSdoYW5kbGVGaWxlU2VsZWN0KCRldmVudCknIFthY2NlcHRdPSdpbWFnZXNBbGxvd2VkJz5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPSdsb2FkSW1hZ2UoKScgY2xhc3M9J3BsYWNlLWltYWdlJz5cclxuICA8ZGl2IGNsYXNzPSdpbWFnZS1ob2xkZXItbG9hZGVkJ1xyXG4gICAgICAgW25nU3R5bGVdPSd7d2lkdGg6IGNvbmZpZygpPy53aWR0aCxoZWlnaHQ6IGNvbmZpZygpPy5oZWlnaHQsYm9yZGVyUmFkaXVzOiBjb25maWcoKT8uYm9yZGVyUmFkaXVzfSc+XHJcbiAgICA8aW1nIFtzcmNdPSdpbWFnZVNyYygpJyBhbHQ9J2ltYWdlLWxvYWRlZCcgW25nU3R5bGVdPSd7IGJvcmRlclJhZGl1czogY29uZmlnKCk/LmJvcmRlclJhZGl1cyB9Jz5cclxuICAgIDxpbnB1dCAjaW1hZ2VQaWNrZXIgdHlwZT0nZmlsZScgY2xhc3M9J2Qtbm9uZScgW2lkXT1cIidmaWxlUGlja2VyLScgKyB1dWlkRmlsZVBpY2tlclwiXHJcbiAgICAgICAgICAgKGNoYW5nZSk9J2hhbmRsZUZpbGVTZWxlY3QoJGV2ZW50KScgW2FjY2VwdF09J2ltYWdlc0FsbG93ZWQnPlxyXG4gIDwvZGl2PlxyXG4gIDxwICpuZ0lmPSdpbWFnZVNyYygpPy5sZW5ndGgnIGNsYXNzPSdtYXQtY2FwdGlvbiBpbWFnZS1jYXB0aW9uJyBbY2xhc3Mud2Fybl09JyhpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSA+IDIwMCdcclxuICAgICBbY2xhc3MuZnctNjAwXT0nKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpID4gMjAwJz5cclxuICAgIHt7XCJTSVpFXCIgfCBpMThuOiBjdXJyZW50TGFuZ3VhZ2UoKX19OiB7eyAoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgfX1LYiAmbmJzcDsge3sgZm9ybWF0LnZhbHVlIH19XHJcbiAgPC9wPlxyXG5cclxuICA8ZGl2IGNsYXNzPSdlZGl0aW5nLWJhci1idG4nPlxyXG4gICAgPGJ1dHRvbiBpZD0ndXBsb2FkLWltZycgKm5nSWY9JyFjb25maWcoKT8uaGlkZUFkZEJ0bicgbWF0LWljb24tYnV0dG9uIChjbGljayk9J29uVXBsb2FkKCRldmVudCknXHJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidVUExPQURfQV9JTUFHRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIj5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPSdtYXQtMTgnPmFkZF9hX3Bob3RvPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBpZD0nZWRpdC1pbWcnICpuZ0lmPSchY29uZmlnKCk/LmhpZGVFZGl0QnRuICYmICFub0VkaXQoKScgbWF0LWljb24tYnV0dG9uIChjbGljayk9J3Nob3dFZGl0UGFuZWwuc2V0KHRydWUpJ1xyXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInT1BFTl9FRElUT1JfUEFORUwnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5lZGl0PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGEgaWQ9J2Rvd25sb2FkLWltZycgKm5nSWY9JyFjb25maWcoKT8uaGlkZURvd25sb2FkQnRuJyBbbWF0VG9vbHRpcF09XCInRE9XTkxPQUQnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcclxuICAgICAgIFtocmVmXT0naW1hZ2VTcmMoKScgbWF0LWljb24tYnV0dG9uIFtkb3dubG9hZF09J2ltYWdlTmFtZSc+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5jbG91ZF9kb3dubG9hZDwvbWF0LWljb24+XHJcbiAgICA8L2E+XHJcbiAgICA8YnV0dG9uIGlkPSdkZWxldGUtaW1nJyAqbmdJZj0nIWNvbmZpZygpPy5oaWRlRGVsZXRlQnRuJyBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT0nb25SZW1vdmUoKSdcclxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1JFTU9WRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIj5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPSdtYXQtMTgnPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPSdzaG93RWRpdFBhbmVsKCknIGlkPSdwb3B1cCcgY2xhc3M9J3BvcHVwJz5cclxuICA8ZGl2IGNsYXNzPSdwb3B1cC1jbGVhcic+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPSdvbkNsb3NlRWRpdFBhbmVsKCknPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9J2ltYWdlLWNvbnRhaW5lcic+XHJcbiAgICA8ZGl2IGNsYXNzPSdpbWFnZS1ob2xkZXItZnVsbCc+XHJcbiAgICAgIDxpbWcgaWQ9J2ltYWdlLWZ1bGwnIFtzcmNdPSdpbWFnZVNyYygpJyBhbHQ9Jyc+XHJcbiAgICAgIDxkaXYgaWQ9J2ltYWdlLWNyb3BwZXInIGNsYXNzPSdpbWFnZS1jcm9wcGVyJz5cclxuICAgICAgICA8ZGl2IGlkPSdpbWFnZS1jcm9wcGVyLWhlYWRlcic+XHJcbiAgICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9J2NvbnRyb2wtcGFuZWwnPlxyXG4gICAgICA8cCBjbGFzcz0naXRlbS1wYW5lbCBmdy02MDAnPnt7ICdRVUFMSVRZJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cclxuICAgICAgPGRpdiBjbGFzcz0ncXVhbGl0eS1jb250YWluZXInPlxyXG4gICAgICAgIDxtYXQtc2xpZGVyIG5nRGVmYXVsdENvbnRyb2wgW2NvbG9yXT0nY29sb3InIGNsYXNzPSd3LTEwMCBtdy0xMDAnIChjaGFuZ2UpPSdvbkNoYW5nZVF1YWxpdHkoKSdcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT0nMTAwJyBbbWluXT0nMCcgW3N0ZXBdPScxJyBbZGlzY3JldGVdPSd0cnVlJyBbc2hvd1RpY2tNYXJrc109J3RydWUnPlxyXG4gICAgICAgICAgPGlucHV0IG1hdFNsaWRlclRodW1iIFtmb3JtQ29udHJvbF09J3F1YWxpdHknPlxyXG4gICAgICAgIDwvbWF0LXNsaWRlcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPSdpdGVtLXBhbmVsJz5cclxuICAgICAgICA8c3BhbiBjbGFzcz0nZnctNjAwJz57eyAnTUFYX0RJTUVOU0lPTlMnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9zcGFuPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9J2Zsb2F0LXJpZ2h0JyBbZm9ybUNvbnRyb2xdPSdtYWludGFpbkFzcGVjdFJhdGlvJyBbY29sb3JdPSdjb2xvcic+XHJcbiAgICAgICAgICA8c3Bhbj57eyAnQVNQRUNUX1JBVElPJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPSdtYXgtZGltZW5zaW9uLWNvbnRhaW5lcic+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTQ4JyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ01BWF9XSURUSF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT0nb25DaGFuZ2VTaXplKHRydWUsIGZhbHNlKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidNQVhfV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT0nbWF4V2lkdGgnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9J3ctNDgnIFthcHBlYXJhbmNlXT0nYXBwZWFyYW5jZScgW2NvbG9yXT0nY29sb3InPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57eyAnTUFYX0hFSUdIVF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT0nb25DaGFuZ2VTaXplKGZhbHNlLCB0cnVlKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidNQVhfSEVJR0hUX1BYJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09J21heEhlaWdodCcgdHlwZT0nbnVtYmVyJyBbbWluXT0nMCcgW21heF09JzIwMDAnPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPHAgY2xhc3M9J2l0ZW0tcGFuZWwgZnctNjAwJz57eyAnRk9STUFUJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cclxuICAgICAgPGRpdiBjbGFzcz0nZm9ybWF0cy1zZWxlY3Rpb24nPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy0xMDAgbXctMTAwJyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09J2Zvcm1hdCcgKHNlbGVjdGlvbkNoYW5nZSk9J29uQ2hhbmdlRm9ybWF0KCknPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9J2xldCBmb3JtYXQgb2YgYWxsRm9ybWF0cycgW3ZhbHVlXT0nZm9ybWF0Jz5cclxuICAgICAgICAgICAgICB7eyBmb3JtYXQgfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz0ncmVmcmVzaC1jb250YWluZXInPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9J29uQ3JvcFN0YXRlQ2hhbmdlKCknIFtmb3JtQ29udHJvbF09J3Nob3dDcm9wJyBbY29sb3JdPSdjb2xvcic+XHJcbiAgICAgICAgICA8cCBjbGFzcz0naXRlbS1wYW5lbCBmdy02MDAnPnt7ICdDUk9QJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXggJz5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9J2Zsb2F0LXJpZ2h0JyBtYXQtaWNvbi1idXR0b24gW2NvbG9yXT0nY29sb3InIChjbGljayk9J29uUmVzdG9yZSgpJz5cclxuICAgICAgICAgICAgPG1hdC1pY29uPnJlZnJlc2g8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8cCAqbmdJZj0nc2hvd0Nyb3AudmFsdWUnPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbY29sb3JdPSdjb2xvcicgKGNsaWNrKT0nb25Dcm9wKCknPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jcm9wPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj0nc2hvd0Nyb3AudmFsdWUnPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9J2RpbWVuc2lvbi1jb250YWluZXInPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTQ4IG13LTQ4JyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT0nb25DaGFuZ2VDcm9wKCknIG1hdElucHV0IFtwbGFjZWhvbGRlcl09XCInV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcclxuICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09J2Nyb3BXaWR0aCcgdHlwZT0nbnVtYmVyJyBbbWluXT0nMCcgW21heF09JzIwMDAnPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy00OCBtdy00OCcgW2FwcGVhcmFuY2VdPSdhcHBlYXJhbmNlJyBbY29sb3JdPSdjb2xvcic+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ0hFSUdIVF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPSdvbkNoYW5nZUNyb3AoKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidIRUlHSFRfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcclxuICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09J2Nyb3BIZWlnaHQnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz0nc2F2ZS1jb250YWluZXInPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIChjbGljayk9J29uQ2xvc2VFZGl0UGFuZWwoKScgW2NvbG9yXT0nY29sb3InIGNsYXNzPSdzYXZlLWJ1dHRvbic+XHJcbiAgICAgICAgICB7eyAnU0FWRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2V9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8cCAqbmdJZj0naW1hZ2VTcmMoKT8ubGVuZ3RoJyBjbGFzcz0nbWF0LWNhcHRpb24gaW1hZ2UtY2FwdGlvbidcclxuICAgICAgICAgICBbY2xhc3Mud2Fybl09JyhpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSA+IDIwMCdcclxuICAgICAgICAgICBbY2xhc3MuZnctNjAwXT0nKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpID4gMjAwJz5cclxuICAgICAgICAgIHt7XCJTSVpFXCIgfCBpMThuOiBjdXJyZW50TGFuZ3VhZ2UoKX19OiB7eyAoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgfX1LYiAmbmJzcDsge3sgZm9ybWF0LnZhbHVlIH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19